資源簡介
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? {
//
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? {
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? {
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
評論
共有 條評論