001: /**
002: * JDBM LICENSE v1.00
003: *
004: * Redistribution and use of this software and associated documentation
005: * ("Software"), with or without modification, are permitted provided
006: * that the following conditions are met:
007: *
008: * 1. Redistributions of source code must retain copyright
009: * statements and notices. Redistributions must also contain a
010: * copy of this document.
011: *
012: * 2. Redistributions in binary form must reproduce the
013: * above copyright notice, this list of conditions and the
014: * following disclaimer in the documentation and/or other
015: * materials provided with the distribution.
016: *
017: * 3. The name "JDBM" must not be used to endorse or promote
018: * products derived from this Software without prior written
019: * permission of Cees de Groot. For written permission,
020: * please contact cg@cdegroot.com.
021: *
022: * 4. Products derived from this Software may not be called "JDBM"
023: * nor may "JDBM" appear in their names without prior written
024: * permission of Cees de Groot.
025: *
026: * 5. Due credit should be given to the JDBM Project
027: * (http://jdbm.sourceforge.net/).
028: *
029: * THIS SOFTWARE IS PROVIDED BY THE JDBM PROJECT AND CONTRIBUTORS
030: * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
031: * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
032: * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
033: * CEES DE GROOT OR ANY CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
034: * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
035: * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
036: * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
037: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
038: * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
039: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
040: * OF THE POSSIBILITY OF SUCH DAMAGE.
041: *
042: * Copyright 2000 (C) Cees de Groot. All Rights Reserved.
043: * Contributions are (C) Copyright 2000 by their associated contributors.
044: *
045: */package jdbm.htree;
046:
047: import jdbm.RecordManager;
048: import jdbm.helper.FastIterator;
049: import java.io.IOException;
050:
051: /**
052: * Persistent hashtable implementation for PageManager.
053: * Implemented as an H*Tree structure.
054: *
055: * WARNING! If this instance is used in a transactional context, it
056: * *must* be discarded after a rollback.
057: *
058: * @author <a href="mailto:boisvert@intalio.com">Alex Boisvert</a>
059: * @version $Id: HTree.java,v 1.3 2005/06/25 23:12:32 doomdark Exp $
060: */
061: public class HTree {
062:
063: /**
064: * Root hash directory.
065: */
066: private HashDirectory _root;
067:
068: /**
069: * Private constructor
070: *
071: * @param root Root hash directory.
072: */
073: private HTree(HashDirectory root) {
074: _root = root;
075: }
076:
077: /**
078: * Create a persistent hashtable.
079: *
080: * @param recman Record manager used for persistence.
081: */
082: public static HTree createInstance(RecordManager recman)
083: throws IOException {
084: HashDirectory root;
085: long recid;
086:
087: root = new HashDirectory((byte) 0);
088: recid = recman.insert(root);
089: root.setPersistenceContext(recman, recid);
090:
091: return new HTree(root);
092: }
093:
094: /**
095: * Load a persistent hashtable
096: *
097: * @param recman RecordManager used to store the persistent hashtable
098: * @param root_recid Record id of the root directory of the HTree
099: */
100: public static HTree load(RecordManager recman, long root_recid)
101: throws IOException {
102: HTree tree;
103: HashDirectory root;
104:
105: root = (HashDirectory) recman.fetch(root_recid);
106: root.setPersistenceContext(recman, root_recid);
107: tree = new HTree(root);
108: return tree;
109: }
110:
111: /**
112: * Associates the specified value with the specified key.
113: *
114: * @param key key with which the specified value is to be assocated.
115: * @param value value to be associated with the specified key.
116: */
117: public synchronized void put(Object key, Object value)
118: throws IOException {
119: _root.put(key, value);
120: }
121:
122: /**
123: * Returns the value which is associated with the given key. Returns
124: * <code>null</code> if there is not association for this key.
125: *
126: * @param key key whose associated value is to be returned
127: */
128: public synchronized Object get(Object key) throws IOException {
129: return _root.get(key);
130: }
131:
132: /**
133: * Remove the value which is associated with the given key. If the
134: * key does not exist, this method simply ignores the operation.
135: *
136: * @param key key whose associated value is to be removed
137: */
138: public synchronized void remove(Object key) throws IOException {
139: _root.remove(key);
140: }
141:
142: /**
143: * Returns an enumeration of the keys contained in this
144: */
145: public synchronized FastIterator keys() throws IOException {
146: return _root.keys();
147: }
148:
149: /**
150: * Returns an enumeration of the values contained in this
151: */
152: public synchronized FastIterator values() throws IOException {
153: return _root.values();
154: }
155:
156: /**
157: * Get the record identifier used to load this hashtable.
158: */
159: public long getRecid() {
160: return _root.getRecid();
161: }
162:
163: }
|