| 920 | } |
| 921 | |
| 922 | auto BTreeDatabase::readFreeIndexBlock(BlockIndex blockIndex) -> FreeIndexBlock { |
| 923 | checkBlockIndex(blockIndex); |
| 924 | |
| 925 | ByteArray magic(2, 0); |
| 926 | rawReadBlock(blockIndex, 0, magic.ptr(), 2); |
| 927 | if (magic != ByteArray(FreeIndexMagic, 2)) |
| 928 | throw DBException::format("Internal exception! block {} missing free index block marker!", blockIndex); |
| 929 | |
| 930 | FreeIndexBlock freeIndexBlock; |
| 931 | DataStreamBuffer buffer(max(sizeof(BlockIndex), (size_t)4)); |
| 932 | |
| 933 | rawReadBlock(blockIndex, 2, buffer.ptr(), sizeof(BlockIndex)); |
| 934 | buffer.seek(0); |
| 935 | freeIndexBlock.nextFreeBlock = buffer.read<BlockIndex>(); |
| 936 | |
| 937 | rawReadBlock(blockIndex, 2 + sizeof(BlockIndex), buffer.ptr(), 4); |
| 938 | buffer.seek(0); |
| 939 | size_t numFree = buffer.read<uint32_t>(); |
| 940 | |
| 941 | for (size_t i = 0; i < numFree; ++i) { |
| 942 | rawReadBlock(blockIndex, 6 + sizeof(BlockIndex) + sizeof(BlockIndex) * i, buffer.ptr(), sizeof(BlockIndex)); |
| 943 | buffer.seek(0); |
| 944 | freeIndexBlock.freeBlocks.append(buffer.read<BlockIndex>()); |
| 945 | } |
| 946 | |
| 947 | return freeIndexBlock; |
| 948 | } |
| 949 | |
| 950 | void BTreeDatabase::writeFreeIndexBlock(BlockIndex blockIndex, FreeIndexBlock indexBlock) { |
| 951 | checkBlockIndex(blockIndex); |