in mavibot/src/main/java/org/apache/directory/mavibot/btree/RecordManager.java [1005:1106]
/* no qualifier */<K, V> void loadBtree( PageIO[] pageIos, BTree btree, BTree<K, V> parentBTree )
throws EndOfFileExceededException,
IOException, ClassNotFoundException, IllegalAccessException, InstantiationException, IllegalArgumentException,
SecurityException, NoSuchFieldException
{
long dataPos = 0L;
// Process the B-tree header
BTreeHeader<K, V> btreeHeader = new BTreeHeader<K, V>();
btreeHeader.setBtree( btree );
// The BtreeHeader offset
btreeHeader.setBTreeHeaderOffset( pageIos[0].getOffset() );
// The B-tree current revision
long revision = readLong( pageIos, dataPos );
btreeHeader.setRevision( revision );
dataPos += LONG_SIZE;
// The nb elems in the tree
long nbElems = readLong( pageIos, dataPos );
btreeHeader.setNbElems( nbElems );
dataPos += LONG_SIZE;
// The B-tree rootPage offset
long rootPageOffset = readLong( pageIos, dataPos );
btreeHeader.setRootPageOffset( rootPageOffset );
dataPos += LONG_SIZE;
// The B-tree information offset
long btreeInfoOffset = readLong( pageIos, dataPos );
// Now, process the common informations
PageIO[] infoPageIos = readPageIOs( btreeInfoOffset, Long.MAX_VALUE );
( ( PersistedBTree<K, V> ) btree ).setBtreeInfoOffset( infoPageIos[0].getOffset() );
dataPos = 0L;
// The B-tree page size
int btreePageSize = readInt( infoPageIos, dataPos );
BTreeFactory.setPageSize( btree, btreePageSize );
dataPos += INT_SIZE;
// The tree name
ByteBuffer btreeNameBytes = readBytes( infoPageIos, dataPos );
dataPos += INT_SIZE + btreeNameBytes.limit();
String btreeName = Strings.utf8ToString( btreeNameBytes );
BTreeFactory.setName( btree, btreeName );
// The keySerializer FQCN
ByteBuffer keySerializerBytes = readBytes( infoPageIos, dataPos );
dataPos += INT_SIZE + keySerializerBytes.limit();
String keySerializerFqcn = "";
if ( keySerializerBytes != null )
{
keySerializerFqcn = Strings.utf8ToString( keySerializerBytes );
}
BTreeFactory.setKeySerializer( btree, keySerializerFqcn );
// The valueSerialier FQCN
ByteBuffer valueSerializerBytes = readBytes( infoPageIos, dataPos );
String valueSerializerFqcn = "";
dataPos += INT_SIZE + valueSerializerBytes.limit();
if ( valueSerializerBytes != null )
{
valueSerializerFqcn = Strings.utf8ToString( valueSerializerBytes );
}
BTreeFactory.setValueSerializer( btree, valueSerializerFqcn );
// The B-tree allowDuplicates flag
int allowDuplicates = readInt( infoPageIos, dataPos );
( ( PersistedBTree<K, V> ) btree ).setAllowDuplicates( allowDuplicates != 0 );
dataPos += INT_SIZE;
// Set the recordManager in the btree
( ( PersistedBTree<K, V> ) btree ).setRecordManager( this );
// Set the current revision to the one stored in the B-tree header
// Here, we have to tell the BTree to keep this revision in the
// btreeRevisions Map, thus the 'true' parameter at the end.
( ( PersistedBTree<K, V> ) btree ).storeRevision( btreeHeader, true );
// Now, init the B-tree
( ( PersistedBTree<K, V> ) btree ).init( parentBTree );
// Update the BtreeHeaders Maps
currentBTreeHeaders.put( btree.getName(), ( ( PersistedBTree<K, V> ) btree ).getBtreeHeader() );
newBTreeHeaders.put( btree.getName(), ( ( PersistedBTree<K, V> ) btree ).getBtreeHeader() );
// Read the rootPage pages on disk
PageIO[] rootPageIos = readPageIOs( rootPageOffset, Long.MAX_VALUE );
Page<K, V> btreeRoot = readPage( btree, rootPageIos );
BTreeFactory.setRecordManager( btree, this );
BTreeFactory.setRootPage( btree, btreeRoot );
}