SqlitePage::BlockAreas SqlitePage::freeBlocks() { BlockAreas freeBlockAreaList; CellList cellList = this->cellList(); // FIXIT if (cellList.empty()) { return freeBlockAreaList; } BlockArea firstBlock; PageHeader header = pageHeader(); // FIXIT: 8 is not good firstBlock.begin = header.numOfCells * 2 + 8; firstBlock.end = cellList[cellList.size() - 1].offset - 1; freeBlockAreaList.push_back(firstBlock); if (cellList.size() > 1) { // Cell List 是自底向上增长的,所以这里使用反向迭代器遍历 CellList::reverse_iterator rpos; for (rpos = cellList.rbegin(); rpos != cellList.rend(); ++rpos) { BlockArea block; block.begin = rpos->offset; block.end = rpos->offset + rpos->length; CellList::reverse_iterator tmp_rpos = rpos + 1; if (block.end < tmp_rpos->offset - kMinFreeBlockSize && block.end < page_.size() - kMinFreeBlockSize) { freeBlockAreaList.push_back(block); } } } return freeBlockAreaList; }