]> pd.if.org Git - btree/blobdiff - threadskv1.c
Fix errors in threadskv1 and threadskv3
[btree] / threadskv1.c
index c127f812ff84808126014efdc13a51576841cd6c..3ce5b8a6d9c58fd020d4ba6ecb756ad4cefbefa4 100644 (file)
@@ -742,7 +742,7 @@ uint slot;
                pool = mgr->pool + slot;
                if( pool->slot )
 #ifdef unix
-                       munmap (pool->map, (mgr->poolmask+1) << mgr->page_bits);
+                       munmap (pool->map, (uid)(mgr->poolmask+1) << mgr->page_bits);
 #else
                {
                        FlushViewOfFile(pool->map, 0);
@@ -1125,7 +1125,7 @@ int flag;
 
 #ifdef unix
        flag = PROT_READ | ( bt->mgr->mode == BT_ro ? 0 : PROT_WRITE );
-       pool->map = mmap (0, (bt->mgr->poolmask+1) << bt->mgr->page_bits, flag, MAP_SHARED, bt->mgr->idx, off);
+       pool->map = mmap (0, (uid)(bt->mgr->poolmask+1) << bt->mgr->page_bits, flag, MAP_SHARED, bt->mgr->idx, off);
        if( pool->map == MAP_FAILED )
                return bt->err = BTERR_map;
 
@@ -1136,7 +1136,7 @@ int flag;
                return bt->err = BTERR_map;
 
        flag = ( bt->mgr->mode == BT_ro ? FILE_MAP_READ : FILE_MAP_WRITE );
-       pool->map = MapViewOfFile(pool->hmap, flag, (DWORD)(off >> 32), (DWORD)off, (bt->mgr->poolmask+1) << bt->mgr->page_bits);
+       pool->map = MapViewOfFile(pool->hmap, flag, (DWORD)(off >> 32), (DWORD)off, (uid)(bt->mgr->poolmask+1) << bt->mgr->page_bits);
        if( !pool->map )
                return bt->err = BTERR_map;
 #endif
@@ -1272,7 +1272,7 @@ BtPool *pool, *node, *next;
 
                //      remove old file mapping
 #ifdef unix
-               munmap (pool->map, (bt->mgr->poolmask+1) << bt->mgr->page_bits);
+               munmap (pool->map, (uid)(bt->mgr->poolmask+1) << bt->mgr->page_bits);
 #else
 //             FlushViewOfFile(pool->map, 0);
                UnmapViewOfFile(pool->map);
@@ -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,10 +1787,10 @@ 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( !keycmp (ptr, key, keylen) ) {
+       if( !slotptr(set->page, slot)->dead && !keycmp (ptr, key, keylen) ) {
                val = valptr (set->page,slot);
                if( valmax > val->len )
                        valmax = val->len;
@@ -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++;
@@ -2077,7 +2077,7 @@ BtVal val;
                        return bt->err;
                }
 
-               // if key already exists, update id and return
+               // if key already exists, update value and return
 
                if( reuse = !keycmp (ptr, key, keylen) )
                  if( val = valptr(set->page, slot), val->len >= vallen ) {
@@ -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;