fixed some edge cases
diff --git a/mavibot/src/main/java/org/apache/directory/mavibot/btree/RecordManager.java b/mavibot/src/main/java/org/apache/directory/mavibot/btree/RecordManager.java
index 961df2e..d4e77da 100644
--- a/mavibot/src/main/java/org/apache/directory/mavibot/btree/RecordManager.java
+++ b/mavibot/src/main/java/org/apache/directory/mavibot/btree/RecordManager.java
@@ -3950,7 +3950,7 @@
{
if( page instanceof PersistedNode )
{
- page = ( AbstractPage ) page.children[-(pos+1)].getValue();
+ page = ( AbstractPage ) page.children[-(pos+1) + 1].getValue();
pos = page.findPos( key );
stack.push( new ParentPos( page, pos ) );
}
@@ -4017,6 +4017,14 @@
pageHolder = ( PersistedPageHolder ) writePage( tree, newLeaf, revision );
leftKey = newLeaf.keys[0];
}
+ else
+ {
+ if ( page.offset == root.offset )
+ {
+ PersistedLeaf newLeaf = ( PersistedLeaf ) BTreeFactory.createLeaf( tree, revision, nbElems );
+ pageHolder = ( PersistedPageHolder ) writePage( tree, newLeaf, revision );
+ }
+ }
if( tree.isAllowDuplicates() )
{
@@ -4044,7 +4052,7 @@
actPos = -( actPos + 1 );
}
- int nbElems = node.nbElems - actPos - 1;
+ int nbElems = node.nbElems;
int copyStartPos = actPos;
// no child to point to
@@ -4053,6 +4061,19 @@
nbElems--;
copyStartPos = actPos + 1;
}
+ else if ( pp.pos < 0 )
+ {
+ nbElems = node.nbElems - actPos - 1;
+ copyStartPos = actPos + 1;
+ }
+
+ if ( ( pageHolder != null ) && ( nbElems == 0 ) )
+ {
+ if( node.children.length == 2 )
+ {
+ nbElems = 1;
+ }
+ }
if( nbElems != 0 )
{
@@ -4069,10 +4090,22 @@
pageHolder = ( PersistedPageHolder ) writePage( tree, newNode, revision );
leftKey = newNode.keys[0];
+
+ free( page.offset );
}
else
{
free( page.offset );
+
+ if ( page.offset == root.offset )
+ {
+ pageHolder = new PersistedPageHolder( tree, page.children[actPos + 1].getValue() );
+ }
+ else
+ {
+ PersistedNode newNode = ( PersistedNode ) BTreeFactory.createNode( tree, revision, 1 );
+ //newNode.keys[0].key = leftKey;
+ }
}
}
}
@@ -4099,6 +4132,9 @@
}
+ /**
+ * counts the number of keys present upto and including the given key
+ */
/** no qualifier */ long countKeysUpto( Object key, BTree tree )
{
// count number of keys to be removed