void bptFileBulkIndexToOpenFile(void *itemArray, int itemSize, bits64 itemCount, bits32 blockSize, void (*fetchKey)(const void *va, char *keyBuf), bits32 keySize, void* (*fetchVal)(const void *va), bits32 valSize, FILE *f) /* Create a b+ tree index from a sorted array, writing output starting at current position * of an already open file. See bptFileCreate for explanation of parameters. */ { bits32 magic = bptSig; 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, 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 writeIndex(struct chromInfo *chromList, int chromCount, char *fileName) /* Write index file - a b+ tree. */ { /* Open file and write out header. */ FILE *f = mustOpen(fileName, "w"); bits32 magic = chromSizeIndexSig; bits32 count = chromCount; bits16 bSize = blockSize; bits16 reserved16 = 0; bits32 reserved32 = 0; writeOne(f, magic); writeOne(f, chromCount); writeOne(f, bSize); writeOne(f, reserved16); writeOne(f, reserved32); bits32 indexOffset = ftell(f); /* Make array for all chromosomes. */ struct chromInfo *chrom, **chromArray; AllocArray(chromArray, chromCount); int i; for (i=0, chrom=chromList; i<chromCount; ++i, chrom=chrom->next) chromArray[i] = chrom; /* Figure out how many levels in B tree, and number of chroms between items at highest level. */ int levels = countLevels(blockSize, chromCount); verbose(1, "%d levels with blockSize %d covers %d items\n", levels, blockSize, chromCount); /* Write non-leaf nodes. */ for (i=levels-1; i > 0; --i) { bits32 endLevelOffset = writeIndexLevel(chromArray, chromCount, indexOffset, i, f); indexOffset = ftell(f); if (endLevelOffset != indexOffset) errAbort("internal err: mismatch endLevelOffset=%u vs indexOffset=%u", endLevelOffset, indexOffset); } /* Write leaf nodes */ writeLeafLevel(chromArray, chromCount, f); /* Clean up and go home. */ freez(&chromArray); carefulClose(&f); }