// // getRcd - 获取一条记录 // RC RMFileHandle::getRcd(const RID &rid, RMRecord &rcd) { if (!isValidRID(rid)) return RM_BAD_RID; Page num = rid.page(); Slot pos = rid.slot(); PFPageHandle page = PFGetPage(pffile_, num); Ptr addr = page.rawPtr(); RMPageHdr hdr(capacity_, addr); if (hdr.map.available(pos)) return RM_NORECATRID; // 该pos必定不会空闲 addr = addr + hdr.lenOfHdr() + pos * rcdlen_; rcd.set(addr, rmhdr_.rcdlen, rid); // 设定记录 return 0; }
RC RMFileHandle::deleteRcd(const RID &rid) { if (!isValidRID(rid)) return RM_BAD_RID; Page num = rid.page(); Slot pos = rid.slot(); PFPageHandle page = PFGetPage(pffile_, num); // 获取对应的页面 Ptr addr = page.rawPtr(); RMPageHdr hdr(capacity_, addr); if (hdr.map.available(pos)) return RM_NORECATRID; // 早已经为free hdr.map.set(pos); // 将对应的pos设置为0 int remain = hdr.remain(); if (hdr.remain() == 0) { hdr.setNext(rmhdr_.free); rmhdr_.free = num; } hdr.setRemain(hdr.remain() + 1); page.setDirty(); return 0; }
// // updateRcd 更新一条记录, rcd中记录了记录在磁盘中的位置 // RC RMFileHandle::updateRcd(const RMRecord &rcd) { RID rid; rcd.getRid(rid); if (!isValidRID(rid)) return RM_BAD_RID; Page num = rid.page(); Slot pos = rid.slot(); Ptr src; PFPageHandle page = PFGetPage(pffile_, num); Ptr dst = page.rawPtr(); RMPageHdr hdr(capacity_, dst); if (hdr.map.available(pos)) return RM_NORECATRID; rcd.getData(src); dst = dst + hdr.lenOfHdr() + pos * rcdlen_; memcpy(dst, src, rcdlen_); page.setDirty(); return 0; }
bool RMFileHandle::isValidRID(const RID& rid) const { Slot slot = rid.slot(); return isValidPage(rid.page()) && slot >= 0; }