Exemplo n.º 1
0
//
// 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;
}
Exemplo n.º 2
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;
}
Exemplo n.º 3
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;
}
Exemplo n.º 4
0
bool RMFileHandle::isValidRID(const RID& rid) const
{
	Slot slot = rid.slot();
	return isValidPage(rid.page()) && slot >= 0;
}