/** * Searches through the pages loking for a page with enough space to store r. If no space * is found, it grows the segment * * @param r: the record * * @return rtrn: TID identifying the location where r was stored */ TID SPSegment::insert(Record& r) { TID rtrn; SlottedPage* spHolder = NULL; // instantiate new record pointer by given r Record* newRec = new Record(r.getLen(), r.getData()); // try to find slotted page which can hold record for (auto it = spMap.begin(); it != spMap.end(); ++it) { if (it->second->getFreeSpace() >= (newRec->getLen() + (2 * sizeof(uint16_t)) + sizeof(bool))) { spHolder = it->second; rtrn.pageId = it->first; break; } } // page to hold record found if (spHolder != NULL) { // insert record into slotted page rtrn.slotId = spHolder->insertRecord(*newRec); // write changes back to disk if (!writeToFrame(spHolder, rtrn.pageId)) { cerr << "Cannot write slotted page into frame" << endl; } } // no page found to hold record, so increase the segment else { // just need one more page vector<uint64_t> neededExtents; // grow by 10 pages vector<uint64_t> newExtents = grow(10); // create new slotted page SlottedPage* sp = new SlottedPage(); sp->getHeader()->freeSpace = bm->getPageSize() - sizeof(Header); rtrn.pageId = newExtents.front(); // insert record into slotted page rtrn.slotId = sp->insertRecord(*newRec); // write changes back to disk if (writeToFrame(sp, rtrn.pageId)) { spMap[rtrn.pageId] = sp; } else { cerr << "Cannot write slotted page into frame" << endl; } } return rtrn; }
/** * Constructor: initializes slotted pages */ SPSegment::SPSegment(vector<uint64_t> freeExtents, uint64_t segId, FSISegment *fsi,BufferManager * bm) : Segment(freeExtents, segId, fsi, bm) { for (unsigned i = 0; i < getSize(); i++) { SlottedPage* sp = new SlottedPage(); sp->getHeader()->freeSpace = bm->getPageSize() - sizeof(Header); uint64_t pageId = at(i); // write slottet page to disk if (writeToFrame(sp, pageId)) { spMap.insert(make_pair(pageId, sp)); } else { cerr << "Cannot write slotted page into frame" << endl; } } cout << "SPSegment extents: " << std::endl; for (unsigned i = 0; i < extents.size(); ++i) { std::cout << "value: " << i << ": " << extents.at(i) << std::endl; } }