X-Git-Url: https://pd.if.org/git/?a=blobdiff_plain;f=threadskv1.c;h=3ce5b8a6d9c58fd020d4ba6ecb756ad4cefbefa4;hb=3f5d6ea226a37eab34f5da0c9561540d2451b56a;hp=1bbe7792aab2643b033cb542d62cd866fe331e16;hpb=246c81476d1ada6fc73ffd182cecd5b6192670ef;p=btree diff --git a/threadskv1.c b/threadskv1.c index 1bbe779..3ce5b8a 100644 --- a/threadskv1.c +++ b/threadskv1.c @@ -1504,8 +1504,10 @@ BtPool *prevpool; // 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; @@ -1518,7 +1520,7 @@ BtPool *prevpool; page_no = bt_getid(valptr(set->page, slot)->value); drill--; continue; - } + } // or slide right into next page @@ -1566,7 +1568,6 @@ BTERR bt_fixfence (BtDb *bt, BtPageSet *set, uint lvl) { unsigned char leftkey[256], rightkey[256]; unsigned char value[BtId]; -uid page_no; BtKey ptr; // remove the old fence value @@ -1579,14 +1580,13 @@ BtKey ptr; 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; @@ -1787,8 +1787,8 @@ int ret; else return 0; - // if key exists, return TRUE - // otherwise return FALSE + // if key exists, return >= 0 value bytes copied + // otherwise return (-1) if( !slotptr(set->page, slot)->dead && !keycmp (ptr, key, keylen) ) { val = valptr (set->page,slot); @@ -1844,12 +1844,6 @@ BtVal val; 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); @@ -1857,9 +1851,15 @@ BtVal val; ((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; + slotptr(page, ++idx)->off = nxt; if( !(slotptr(page, idx)->dead = slotptr(bt->frame, cnt)->dead) ) page->act++; @@ -2364,7 +2364,8 @@ BtKey ptr; } typedef struct { - char type, idx; + char idx; + char *type; char *infile; BtMgr *mgr; int num; @@ -2391,7 +2392,7 @@ FILE *in; bt = bt_open (args->mgr); - switch(args->type | 0x20) + switch(args->type[0] | 0x20) { case 'a': fprintf(stderr, "started latch mgr audit\n"); @@ -2452,6 +2453,8 @@ FILE *in; else if( args->num ) sprintf((char *)key+len, "%.9d", line + args->idx * args->num), len += 9; + if( (args->type[1] | 0x20) == 'p' ) + len = 10; if( bt_deletekey (bt, key, len, 0) ) fprintf(stderr, "Error %d Line: %d\n", bt->err, line), exit(0); len = 0; @@ -2474,6 +2477,8 @@ FILE *in; else if( args->num ) sprintf((char *)key+len, "%.9d", line + args->idx * args->num), len += 9; + if( (args->type[1] | 0x20) == 'p' ) + len = 10; if( bt_findkey (bt, key, len, NULL, 0) == 0 ) found++; else if( bt->err ) @@ -2629,7 +2634,7 @@ BtDb *bt; for( idx = 0; idx < cnt; idx++ ) { args[idx].infile = argv[idx + 7]; - args[idx].type = argv[2][0]; + args[idx].type = argv[2]; args[idx].mgr = mgr; args[idx].num = num; args[idx].idx = idx;