| 579 | } |
| 580 | |
| 581 | auto BTreeDatabase::BTreeImpl::storeIndex(Index index) -> Pointer { |
| 582 | if (index->self != InvalidBlockIndex) { |
| 583 | if (!parent->m_uncommitted.contains(index->self)) { |
| 584 | parent->freeBlock(index->self); |
| 585 | parent->m_indexCache.remove(index->self); |
| 586 | index->self = InvalidBlockIndex; |
| 587 | } |
| 588 | } |
| 589 | |
| 590 | if (index->self == InvalidBlockIndex) |
| 591 | index->self = parent->reserveBlock(); |
| 592 | |
| 593 | DataStreamBuffer buffer(parent->m_blockSize); |
| 594 | buffer.writeData(IndexMagic, 2); |
| 595 | |
| 596 | buffer.write<uint8_t>(index->level); |
| 597 | buffer.write<uint32_t>(index->pointers.size()); |
| 598 | buffer.write<BlockIndex>(*index->beginPointer); |
| 599 | for (auto i = index->pointers.begin(); i != index->pointers.end(); ++i) { |
| 600 | starAssert(i->key.size() == parent->m_keySize); |
| 601 | buffer.writeBytes(i->key); |
| 602 | buffer.write<BlockIndex>(i->pointer); |
| 603 | } |
| 604 | |
| 605 | parent->updateBlock(index->self, buffer.data()); |
| 606 | |
| 607 | parent->m_indexCache.set(index->self, index); |
| 608 | return index->self; |
| 609 | } |
| 610 | |
| 611 | void BTreeDatabase::BTreeImpl::deleteIndex(Index index) { |
| 612 | parent->m_indexCache.remove(index->self); |
no test coverage detected