607c224716976855955947c30bb6e525d0c79daa braney Wed May 22 10:27:40 2019 -0700 check in a fix that Daniel Zerbino made to keep offsets in 64 bit land rather than casting them down to shorts diff --git src/lib/bPlusTree.c src/lib/bPlusTree.c index 50bc929..1275f3e 100644 --- src/lib/bPlusTree.c +++ src/lib/bPlusTree.c @@ -418,33 +418,33 @@ } static int bptCountLevels(int maxBlockSize, int itemCount) /* Count up number of levels needed in tree of given maximum block size. */ { int levels = 1; while (itemCount > maxBlockSize) { itemCount = (itemCount + maxBlockSize - 1) / maxBlockSize; levels += 1; } return levels; } -static bits32 writeIndexLevel(bits16 blockSize, +static bits64 writeIndexLevel(bits16 blockSize, void *itemArray, int itemSize, long itemCount, - bits32 indexOffset, int level, + bits64 indexOffset, int level, void (*fetchKey)(const void *va, char *keyBuf), bits32 keySize, bits32 valSize, FILE *f) /* Write out a non-leaf level. */ { char *items = itemArray; /* Calculate number of nodes to write at this level. */ long slotSizePer = xToY(blockSize, level); // Number of items per slot in node long nodeSizePer = slotSizePer * blockSize; // Number of items per node long nodeCount = (itemCount + nodeSizePer - 1)/nodeSizePer; /* Calculate sizes and offsets. */ long bytesInIndexBlock = (bptBlockHeaderSize + blockSize * (keySize+sizeof(bits64))); long bytesInLeafBlock = (bptBlockHeaderSize + blockSize * (keySize+valSize)); @@ -553,31 +553,31 @@ bits32 reserved = 0; writeOne(f, magic); writeOne(f, blockSize); writeOne(f, keySize); writeOne(f, valSize); writeOne(f, itemCount); writeOne(f, reserved); writeOne(f, reserved); bits64 indexOffset = ftell(f); /* Write non-leaf nodes. */ int levels = bptCountLevels(blockSize, itemCount); int i; for (i=levels-1; i > 0; --i) { - bits32 endLevelOffset = writeIndexLevel(blockSize, itemArray, itemSize, itemCount, indexOffset, + bits64 endLevelOffset = writeIndexLevel(blockSize, itemArray, itemSize, itemCount, indexOffset, i, fetchKey, keySize, valSize, f); indexOffset = ftell(f); if (endLevelOffset != indexOffset) internalErr(); } /* Write leaf nodes */ writeLeafLevel(blockSize, itemArray, itemSize, itemCount, fetchKey, keySize, fetchVal, valSize, f); } void bptFileCreate( void *itemArray, /* Sorted array of things to index. */ int itemSize, /* Size of each element in array. */ bits64 itemCount, /* Number of elements in array. */