• 大小: 1.11MB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2023-08-27
  • 语言: C/C++
  • 标签: c++  

资源简介

Storage and Buffer Manager C++ code.在别人的基础上做的,应该说除了lru都是重做的.模拟数据库文件的实现.

资源截图

代码片段和文件信息

#include “StdAfx.h“
#include “BMgr.h“
#include “DSMgr.h“
//Implementation of BMgr
DSMgr dss;
//LRU Element List
struct LRUEle * lru;
struct LRUEle * mru;
//
LRUEle::LRUEle()
{
frameid = -1;
time = 0.0;
less = nullptr;
more = nullptr;
}

BCB::BCB()
{
next = NULL;
latch = -1;
count = -1;
page_id = -1;
frame_id = -1;
stime =-1;
ftime=-1;
dirty=-1;

}
//

BMgr::BMgr(void)
{
int i = 0;
for(i = 0; i < BUFFERSIZE; i++)
{
//
ptof[i] = nullptr;
ftop[i] = -1;
}
dss.OpenFile(“data.dbf“);
}


BMgr::~BMgr(void)
{
}
//If the page is not resident in the buffer yet it selects a victim page
int BMgr::FixPage(int page_id int prot)
{
//prot means protection
int fid = -1;
int num=Hash(page_id);
BCB * bcb =ptof[num];

while(bcb!=nullptr)
{
if(bcb->page_id == page_id)
{
break;
}
bcb = bcb->next;
}
if(bcb != nullptr)
{
if(bcb->stime != -1)
{
bcb->ftime=bcb->stime;
}
DoLRUList(bcb bcb->frame_id);
return bcb->frame_id;
}
else
{
bcb = ptof[num];
fid = SelectVictim();
buf[fid] = dss.ReadPage(page_id);
ftop[fid] = page_id;
if(bcb != nullptr)
{
while(bcb->next != nullptr)
{
bcb = bcb->next;
}
bcb->next = new BCB();
bcb = bcb->next;
}
else
{
bcb = new BCB();
ptof[num] = bcb; 
}
//重新设置bcb//
bcb->next = nullptr;
bcb->page_id = page_id;
bcb->frame_id = fid;
bcb->latch = 0;
bcb->count = 0;
bcb->ftime = static_cast(time(0));
//cout<ftime< bcb->stime = -1;
DoLRUList(bcb fid);
}
return fid;
}
NewPage BMgr::FixNewPage()
{
//find a newpage;
int offset=0;
int i=0;
while(i {
dss.Seek(offsetSEEK_SET);
if(dss.GetUse(i)!=0)break;
i++;
offset+=frameSIZE;
}
if(i==MAXPAGES){
printf(“\t$> error:disk is fullpress enter to exit“);
getchar();
exit(0);
}

NewPage np;
np.page_id=i;
//
np.frame_id=FixPage(i0);
return np;
}
int BMgr::UnfixPage(int page_id)
{
int num=Hash(page_id);
if(ptof[num]->count>0)
ptof[num]->count--;
if(ptof[num]->count==0)
ptof[num]->latch=0;
return ptof[num]->frame_id;
}
int BMgr::NumFreeframes()
{
//return the num of free frame
int i = 0j = 0num = 0Free = 0;
BCB * bcb = nullptr;
for(i = 0; i < BUFFERSIZE; i++)
{

j = ftop[i];
if(j == -1)
{
Free++;
}
else
{
num = Hash(j);
int frame_id = num;
bcb = ptof[num];
while(bcb != nullptr && bcb->frame_id != j)
{
bcb = bcb->next;
}
if(bcb != nullptr && bcb->frame_id == j)
{
if(bcb->count == 0 && bcb->latch == 0)
{
Free++;
}
}
}
}
return Free;
}
int BMgr::SelectVictim()
{
int vframe = 0pid = 0fid=0;
BCB * bcb = nullptr;
bool found = false;
LRUEle * temp = lru;
if(temp == nullptr)
{
return 0;
}
for(int i = 0; i < BUFFERSIZE; i++)
{
if(ftop[i] == -1)
{
return i;
}

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       7681  2013-11-23 22:30  dbprj\BMgr.cpp

     文件       1291  2013-11-23 19:28  dbprj\BMgr.h

     文件    3690270  2013-11-23 20:59  dbprj\data-5w-50w-zipf.txt

     文件       3194  2014-03-23 13:31  dbprj\dbprj.cpp

     文件       4512  2013-10-31 19:37  dbprj\dbprj.vcxproj

     文件       1659  2013-10-31 19:37  dbprj\dbprj.vcxproj.filters

     文件        143  2013-10-27 22:23  dbprj\dbprj.vcxproj.user

     文件       2045  2013-11-23 19:25  dbprj\DSMgr.cpp

     文件       1159  2013-11-23 19:25  dbprj\DSMgr.h

     文件       1354  2013-11-23 22:10  dbprj\ReadMe.txt

     文件        245  2013-11-23 22:18  dbprj\stdafx.cpp

     文件        927  2013-11-23 21:45  dbprj\stdafx.h

     文件        234  2013-10-27 22:25  dbprj\targetver.h

     目录          0  2014-03-23 13:31  dbprj

----------- ---------  ---------- -----  ----

              3714714                    14


评论

共有 条评论