예제 #1
0
/**
 * 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;
}
예제 #2
0
/**
 * 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;
	}
}