// find key on page at this level
// and descend to requested level
- if( !set->page->kill )
- if( slot = bt_findslot (set, key, len) ) {
+ if( set->page->kill )
+ goto slideright;
+
+ if( slot = bt_findslot (set, key, len) ) {
if( drill == lvl )
return slot;
page_no = bt_getid(valptr(set->page, slot)->value);
drill--;
continue;
- }
+ }
// or slide right into next page
{
unsigned char leftkey[256], rightkey[256];
unsigned char value[BtId];
-uid page_no;
BtKey ptr;
// remove the old fence value
ptr = keyptr(set->page, set->page->cnt);
memcpy (leftkey, ptr, ptr->len + 1);
- page_no = set->page_no;
bt_lockpage (BtLockParent, set->latch);
bt_unlockpage (BtLockWrite, set->latch);
// insert new (now smaller) fence key
- bt_putid (value, page_no);
+ bt_putid (value, set->page_no);
if( bt_insertkey (bt, leftkey+1, *leftkey, lvl+1, value, BtId) )
return bt->err;
if( cnt < max && slotptr(bt->frame,cnt)->dead )
continue;
- // copy the key across
-
- key = keyptr(bt->frame, cnt);
- nxt -= key->len + 1;
- memcpy ((unsigned char *)page + nxt, key, key->len + 1);
-
// copy the value across
val = valptr(bt->frame, cnt);
((unsigned char *)page)[nxt] = val->len;
memcpy ((unsigned char *)page + nxt + 1, val->value, val->len);
+ // copy the key across
+
+ key = keyptr(bt->frame, cnt);
+ nxt -= key->len + 1;
+ memcpy ((unsigned char *)page + nxt, key, key->len + 1);
+
// set up the slot
slotptr(page, ++idx)->off = nxt;
// find key on page at this level
// and descend to requested level
- if( !set->page->kill )
- if( slot = bt_findslot (set, key, len) ) {
+ if( set->page->kill )
+ goto slideright;
+
+ if( slot = bt_findslot (set, key, len) ) {
if( drill == lvl )
return slot;
page_no = bt_getid(valptr(set->page, slot)->value);
drill--;
continue;
- }
+ }
// or slide right into next page
{
unsigned char leftkey[256], rightkey[256];
unsigned char value[BtId];
-uid page_no;
BtKey ptr;
BtVal val;
// remove the old fence value
ptr = keyptr(set->page, set->page->cnt);
+ val = valptr(set->page, set->page->cnt);
memcpy (rightkey, ptr, ptr->len + 1);
set->page->garbage += ptr->len + val->len + 2;
memset (slotptr(set->page, set->page->cnt--), 0, sizeof(BtSlot));
ptr = keyptr(set->page, set->page->cnt);
memcpy (leftkey, ptr, ptr->len + 1);
- page_no = set->page_no;
bt_lockpage (BtLockParent, set->latch);
bt_unlockpage (BtLockWrite, set->latch);
// insert new (now smaller) fence key
- bt_putid (value, page_no);
+ bt_putid (value, set->page_no);
if( bt_insertkey (bt, leftkey+1, *leftkey, lvl+1, value, BtId) )
return bt->err;
set->page->garbage += ptr->len + val->len + 2;
set->page->act--;
- // collapse empty slots
+ // collapse empty slots beneath our slot
while( idx = set->page->cnt - 1 )
if( slotptr(set->page, idx)->dead ) {
if( cnt < max && slotptr(bt->frame,cnt)->dead )
continue;
- // copy the key across
-
- key = keyptr(bt->frame, cnt);
- nxt -= key->len + 1;
- memcpy ((unsigned char *)page + nxt, key, key->len + 1);
-
// copy the value across
val = valptr(bt->frame, cnt);
((unsigned char *)page)[nxt] = val->len;
memcpy ((unsigned char *)page + nxt + 1, val->value, val->len);
+ // copy the key across
+
+ key = keyptr(bt->frame, cnt);
+ nxt -= key->len + 1;
+ memcpy ((unsigned char *)page + nxt, key, key->len + 1);
+
// make a librarian slot
slotptr(page, ++idx)->off = nxt;