亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? buffer.cpp

?? 實現一個精簡型單用戶SQL引擎(DBMS)MiniSQL
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
/****************************************************************** 

** 文件名: Buffer.cpp

** Copyright (c) 2001-2002 計算機99F MiniSQL開發小組其一 

** 創建人: 郭振宇

** 日  期: 2001-11-28

** 修改人: 郭振宇

** 日  期: 2002-01-05

** 描  述: 定義了MiniSQL buffer模塊所有類和結構

** 版  本: 1.00

******************************************************************/

#include"Buffer.h"

//-------------------------------------------------------

_M_Buffer Buffer;
unsigned int SizeOfPageHead = sizeof(_TB_PAGEHEAD);
unsigned int BTreeNodeSize = (FILE_PAGESIZE - SizeOfPageHead)/4;

//-------------------------------------------------------

// 初始化
void _TB_PAGEHEAD::Initial(unsigned long mypageid,bool myisfixed)
{
    this->ulPageID = mypageid;
    this->bIsFixed = myisfixed;
}

//-------------------------------------------------------

// 初始化
void _TB_FILECOND::InitialFileCond()
{
    this->ulPageTotal = 1;
    this->DelFirst.Initialize();
    this->DelLast.Initialize();
    this->NewInsert.ulFilePageID = 1;
    this->NewInsert.uiOffset = SizeOfPageHead;
}

//-------------------------------------------------------

// 文件頭信息(若頁PageID==0,則有,否則返回空)
_TB_FILECOND* _M_Page::Ptr2FileCond()
{
    return (_TB_FILECOND* )((char*)this->Ptr2PageBegin + SizeOfPageHead);
}

//-------------------------------------------------------

// 成員初始化,開辟內存空間
_M_Page::_M_Page()
{
	this->Ptr2PageBegin = malloc(FILE_PAGESIZE);
    if(!this->Ptr2PageBegin)  throw 1000;   // 內存開辟失敗
	this->Ptr2Head = (_TB_PAGEHEAD*)this->Ptr2PageBegin;
	this->ulFilePageID = 0;
	this->uiFileID = 0;
}

//-------------------------------------------------------

// 釋放內存空間
_M_Page::~_M_Page()
{
    this->ulFilePageID = 0;
	this->uiFileID = 0;
	free(this->Ptr2PageBegin);
    this->Ptr2Head = 0;
    this->Ptr2PageBegin = 0;
}

//-------------------------------------------------------

//**從文件中調入頁至開辟好的內存空間中
void _M_Page::LoadFromFile(unsigned int fileid,unsigned long filepageid)
{
    this->uiFileID = fileid;
    this->ulFilePageID = filepageid;

    if( Buffer.GetIsNew(fileid) )   //  文件新建
    {
        this->Ptr2Head->Initial(filepageid,1);   // 初始化頁頭信息
        this->Ptr2FileCond()->InitialFileCond(); // 初始化文件頭信息
        Buffer.SetIsNew(fileid,0);               // 設置使文件不再為新建狀態(以免下次訪問這個內存頁又要進行頭信息初始化)
    }
    else if( filepageid >= Buffer.GetPageTotal(fileid) ) // 比現有文件總頁面要多,那么開辟新的頁面加到文件末尾
    {
        if( filepageid - Buffer.GetPageTotal(fileid) > 0) throw 1004; // 頁編號比現有文件最后一個頁編號+1 還要大(浪費磁盤空間)
        this->Ptr2Head->Initial(filepageid,0);   // 初始化頁頭信息
        Buffer.AddPageTotal(fileid,1);           // 使文件總頁數加1
    }
    else     // 其他情況
    {
	    lseek(Buffer.GetPtr2File(fileid),filepageid*FILE_PAGESIZE,0);  // 定位到將要取出的文件頁的首地址
	    int temp = read(Buffer.GetPtr2File(fileid),this->Ptr2PageBegin,FILE_PAGESIZE); // 讀到內存中
        if( temp!= FILE_PAGESIZE )  throw 1031; // 讀失敗
    }
}

//-------------------------------------------------------

//**把內存中的頁寫回到文件中
void _M_Page::Back2File() const
{
    int temp = 0;
	temp = lseek(Buffer.GetPtr2File(this->uiFileID),this->ulFilePageID*FILE_PAGESIZE,0);
    if(temp==-1L) throw 1005; 
	temp = write(Buffer.GetPtr2File(this->uiFileID),this->Ptr2PageBegin,FILE_PAGESIZE); // 寫回文件
    if(temp!= FILE_PAGESIZE) throw 1002;  // 寫失敗
}

//-------------------------------------------------------

// 成員初始化
_M_PageInfo::_M_PageInfo()
{
	this->bIsLastUsed = 0;
	this->bIsModified = 0;
	this->Ptr2Page = 0;
}

//-------------------------------------------------------

// 析構,根據bIsModified決定是否需要寫會文件
_M_PageInfo::~_M_PageInfo()
{
    if(this->Ptr2Page){
        if(this->Ptr2Page->uiFileID && this->Ptr2Page->ulFilePageID==0)
            // 把文件頁總數寫到磁盤中,已備下次讀取
            this->Ptr2Page->Ptr2FileCond()->ulPageTotal = Buffer.GetPageTotal(this->Ptr2Page->uiFileID);
        if(this->Ptr2Page->uiFileID && this->bIsModified){ // 若為臟頁,寫回
            this->Ptr2Page->Back2File();
        }
        delete this->Ptr2Page;
        this->Ptr2Page = 0;
    }
    this->bIsLastUsed = 0;
    this->bIsModified = 0;
}

//-------------------------------------------------------

// 頁替換、開辟等
void _M_PageInfo::UpdatePageInfo(unsigned int fileid,unsigned long filepageid)
{
	if( this->bIsModified) // 若為臟頁,寫回
		this->Ptr2Page->Back2File();

	this->bIsLastUsed = 1;
	this->bIsModified = 0;
    if( !this->Ptr2Page ){ // 尚未開辟內存空間
		this->Ptr2Page = new _M_Page; // 新的內存頁對象
    }
    
    // 若文件新建 或者 該頁為文件第0頁 后者 該頁在原來文件中不存在 則要求寫回
    if( Buffer.GetIsNew(fileid) || filepageid >= Buffer.GetPageTotal(fileid) || filepageid==0 )
        this->bIsModified = 1;
    
	this->Ptr2Page->LoadFromFile(fileid,filepageid);  // 讀到內存中
}

//-------------------------------------------------------

// 取得文件頭信息地址
_TB_FILECOND* _M_PageInfo::GetPtr2FileCond() const
{
    return this->Ptr2Page->Ptr2FileCond();
}

//-------------------------------------------------------

// 取得頁頭信息地址
_TB_PAGEHEAD* _M_PageInfo::GetPtr2Head() const
{
    return this->Ptr2Page->Ptr2Head;
}

//-------------------------------------------------------

// 取得所分配的內存頁目前內容所屬的文件編號
unsigned int _M_PageInfo::GetFileID() const
{
    return this->Ptr2Page->uiFileID;
}

//-------------------------------------------------------

// 設置新的文件編號(拋棄頁時設為0即可)
void _M_PageInfo::SetFileID(unsigned int fileid)
{
  this->Ptr2Page->uiFileID = fileid;
}

//-------------------------------------------------------

// 取得所分配的內存頁目前內容在文件中的頁編號
unsigned long _M_PageInfo::GetFilePageID() const
{
    return this->Ptr2Page->ulFilePageID;
}

//-------------------------------------------------------

// 成員初始化
_M_Clock::_M_Clock()
{
	this->uiClockSize = MEM_PAGEAMOUNT;
	this->uiCurrClockPtr = 1;
	for(unsigned int i=0;i<=this->uiClockSize;i++)
	{
		this->Ptr2MemPageInfo[i] = new _M_PageInfo;
	}
}

//-------------------------------------------------------

// 析構
_M_Clock::~_M_Clock()
{
	for(unsigned int i=0;i<=this->uiClockSize;i++)
		delete this->Ptr2MemPageInfo[i] ;
}

//-------------------------------------------------------

//**查找Clock中尚未分配內存空間的頁
unsigned int _M_Clock::GetNullPage()
{
    for(unsigned int i=this->uiCurrClockPtr;i<=this->uiClockSize;i++)
    {
        if( !this->Ptr2MemPageInfo[i]->Ptr2Page ) // 尚未分配內存頁
        {
            this->uiCurrClockPtr = i;
            return this->uiCurrClockPtr;
        }
    }
    return 0;
}

//-------------------------------------------------------

//**查找Clock中已經被拋棄的頁
unsigned int _M_Clock::GetFreePage()
{
    for(unsigned int i=1;i<=this->uiClockSize;i++)
    {
        // 被拋棄內存頁已經把文件編號置為 0 做為標記
        if( this->Ptr2MemPageInfo[i]->Ptr2Page && !this->Ptr2MemPageInfo[i]->GetFileID() )
        {
            this->uiCurrClockPtr = i;
            return this->uiCurrClockPtr;
        }
    }
    return 0;
}

//-------------------------------------------------------

// 查找Clock中最近一頁可被替換的頁
unsigned int _M_Clock::GetSwapPage(unsigned int fileid)
{
    if(! this->GetFreePage() )   // 查找被拋棄的內存頁
        // 查找Clock中最早打開的文件所占用的內存頁,如果是常駐內存頁則關閉該文件(該寫回的寫回)
	    if(! this->NR_Search(fileid) )
		    if(! this->U_M_Search(0,0,0) ) // 上次沒有用,沒有被修改,不變動bIsLastUsed,返回符合這樣條件的內存頁
			    if(! this->U_M_Search(0,1,1) ) // 上次沒有用,有被修改,變動bIsLastUsed,返回符合這樣條件的內存頁
				    if(! this->U_M_Search(0,0,0) ) // 上次沒有用,沒有被修改,不變動bIsLastUsed,返回符合這樣條件的內存頁
					    	this->U_M_Search(0,1,1);  // 上次沒有用,有被修改,變動bIsLastUsed,返回符合這樣條件的內存頁
	return this->uiCurrClockPtr;
}			

//-------------------------------------------------------

// 查找Clock中最早打開的文件所占用的內存頁,如果是常駐內存頁則關閉該文件(該寫回的寫回)
// 所有打開的文件已經由_M_Buffer類組織成鏈表
unsigned int _M_Clock::NR_Search(unsigned int tarfileid)
{
    unsigned int NR_FileIDTemp = 0;     // 臨時文件編號
    unsigned int NR_FileID = 20000;     // 欲替換的內存頁所屬文件編號(程序運行期分配),20000為不可能的一個數字(打開20000個文件方有可能)
    unsigned int ClockPtr = 0;          // 與替換的頁編號
    unsigned int relativefileid = Buffer[tarfileid]->GetRelativeFileID(); // 取得關聯文件編號
	for(unsigned int i=1;i<=this->uiClockSize;i++)
	{
        NR_FileIDTemp = this->Ptr2MemPageInfo[i]->GetFileID();
        // 文件編號不能為當前文件編號及其關聯文件的編號,在符合這個條件的基礎上,文件編號越小,越早打開,所以更適合被替換
		if( NR_FileIDTemp < NR_FileID && NR_FileIDTemp != tarfileid && NR_FileIDTemp != relativefileid )
        {
            NR_FileID = NR_FileIDTemp;
            ClockPtr = i;
        }
	}
    if( NR_FileID != 20000 )
    {
        // 如果被替換頁是第 0 頁,則關閉該文件及其關聯文件
        if( this->Ptr2MemPageInfo[ClockPtr]->GetFilePageID() == 0 )
            Buffer[NR_FileID]->Close();
        this->uiCurrClockPtr = ClockPtr;
        return this->uiCurrClockPtr;
    }
    else
	    return 0;
}

//-------------------------------------------------------

// Clock算法實現,通過U_M_Search()四次調用,完成Clock算法
unsigned int _M_Clock::U_M_Search(bool islastused,bool ismodified,bool changeused)
{
	for(unsigned int i=1;i<=this->uiClockSize;i++)
	{		
		if( this->Ptr2MemPageInfo[this->uiCurrClockPtr]->GetPtr2Head()->bIsFixed == 0 &&
			this->Ptr2MemPageInfo[this->uiCurrClockPtr]->bIsLastUsed == islastused &&
			this->Ptr2MemPageInfo[this->uiCurrClockPtr]->bIsModified == ismodified )
				return this->uiCurrClockPtr;
		else
		{	
			if( changeused ) this->Ptr2MemPageInfo[this->uiCurrClockPtr]->bIsLastUsed = 0;
			this->uiCurrClockPtr = (this->uiCurrClockPtr+1)%this->uiClockSize;
			if(!this->uiCurrClockPtr)
				this->uiCurrClockPtr = this->uiClockSize;
		}
	}
	return 0;
}

//-------------------------------------------------------

// 查找已經存在的頁(假設要找的頁已經存在的話)
unsigned int _M_Clock::GetExsitPage(unsigned int fileid,unsigned long filepageid)
{
	if( this->Ptr2MemPageInfo[this->uiCurrClockPtr]->Ptr2Page &&
		this->Ptr2MemPageInfo[this->uiCurrClockPtr]->GetFileID() == fileid &&
		this->Ptr2MemPageInfo[this->uiCurrClockPtr]->GetFilePageID() == filepageid )
		return this->uiCurrClockPtr;

	for(unsigned int i=1;i<=this->uiClockSize;i++)
	{
        if(!this->Ptr2MemPageInfo[i]->Ptr2Page) break;
		if( this->Ptr2MemPageInfo[i]->GetFileID() == fileid &&
			this->Ptr2MemPageInfo[i]->GetFilePageID() == filepageid )
		{
			this->uiCurrClockPtr = i;
			return this->uiCurrClockPtr;
		}
	}

	return 0;
}

//-------------------------------------------------------

// 根據文件編號和頁號取得內存頁(通過上面各種方法)
_M_PageInfo* _M_Clock::GetTargetPage(unsigned int fileid,unsigned long filepageid)
{
    unsigned int tempint = this->GetExsitPage(fileid,filepageid);  // 先找內存頁是否已經存在
	if(tempint)	return this->Ptr2MemPageInfo[tempint];

	tempint = this->GetNullPage();         // 看看有沒有空的內存頁尚未開辟使用
    if(!tempint) tempint = this->GetSwapPage(fileid); // 得到替換頁
	this->Ptr2MemPageInfo[tempint]->UpdatePageInfo(fileid,filepageid); // 調入文件頁至內存,并更新相關信息

    return this->Ptr2MemPageInfo[tempint];
}

//-------------------------------------------------------

// 拋棄文件所屬內存頁(適用于欲刪除一個文件的時候)
void _M_Clock::CloseFilePages(unsigned int fileid)
{
	for(unsigned int i=1;i<=this->uiClockSize;i++)
	{
        if( !this->Ptr2MemPageInfo[i]->Ptr2Page ) break;
		if( this->Ptr2MemPageInfo[i]->GetFileID() == fileid )
		{
            if( this->Ptr2MemPageInfo[i]->bIsModified )
                this->Ptr2MemPageInfo[i]->Ptr2Page->Back2File();
			this->Ptr2MemPageInfo[i]->bIsModified = 0;
            this->Ptr2MemPageInfo[i]->SetFileID(0);
		}
	}
	return;	
}

//-------------------------------------------------------

// 設置當前頁使之為臟頁
void _M_Clock::SetPageModified()
{
    this->Ptr2MemPageInfo[this->uiCurrClockPtr]->bIsModified = 1;
}

//-------------------------------------------------------

// 初始化,打開和新建文件,若當前文件開的太多,導致無法再打開新文件,可自動關閉最早打開的文件
_M_File::_M_File(const char *name,unsigned int fileid)
{
		this->uiFileID = fileid;
        this->IsNew = 0;
        this->ulPageTotal = 1;
		strcpy(this->FileName,name);
		this->Ptr2File = open(name,_O_BINARY|O_RDWR,0664); 
        if(this->Ptr2File==-1){ // 文件不存在
            this->Ptr2File = open(name,_O_BINARY|O_RDWR|O_CREAT,0664); // 新建文件(打開文件)
            if(this->Ptr2File==-1)  // 文件不能被打開(新建)
            {
                if( Buffer._F_First) 
                    Buffer._F_First->Close(); // 關閉最早打開的文件
                this->Ptr2File = open(name,_O_BINARY|O_RDWR|O_CREAT,0664); // 新建文件(打開文件)
			    if(this->Ptr2File==-1)  // 文件不能被新建(打開)
                    throw 1006; // 文件還是不能被打開(新建),可能為磁盤空間不足等意外
            }
            this->IsNew = 1;
        }
		this->_F_Next = 0;
}

//-------------------------------------------------------

// 取得相關文件,由于一個表包含兩個文件(.idx,.dbf),故查找關聯的文件編號
unsigned int _M_File::GetRelativeFileID() const
{

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美国产成人精品| 色婷婷一区二区三区四区| 日韩你懂的在线观看| 免费三级欧美电影| 精品国产麻豆免费人成网站| 久久精品免费观看| 精品av综合导航| 国产成人精品综合在线观看 | 99国产精品国产精品久久| 国产精品久久久99| av在线不卡电影| 一区二区三区日韩欧美精品| 欧美日韩中文国产| 麻豆中文一区二区| 国产婷婷精品av在线| 97久久久精品综合88久久| 国产精品综合一区二区| 久久久高清一区二区三区| 成人app网站| 亚洲国产精品尤物yw在线观看| 欧美理论片在线| 国产一区欧美一区| 亚洲日本欧美天堂| 欧美年轻男男videosbes| 六月丁香综合在线视频| 国产精品久久免费看| 欧美性受xxxx| 国产一区二区三区四| 亚洲老妇xxxxxx| 日韩精品一区二区三区三区免费 | 国产高清不卡二三区| 亚洲色欲色欲www在线观看| 欧美日韩美少妇 | 国产99久久精品| 亚洲国产精品久久艾草纯爱| 日韩欧美国产成人一区二区| 成人午夜免费电影| 日韩精品免费视频人成| 中日韩av电影| 日韩丝袜美女视频| av午夜一区麻豆| 久久国产生活片100| 一区二区日韩av| 久久美女艺术照精彩视频福利播放 | 日韩经典一区二区| 国产精品夫妻自拍| 欧美成人精品3d动漫h| 久久精品视频一区| 在线精品视频免费播放| 久久 天天综合| 亚洲韩国精品一区| 国产精品的网站| 精品国产乱码久久久久久浪潮| 在线国产亚洲欧美| 99久久99久久综合| 精油按摩中文字幕久久| 日日夜夜精品视频天天综合网| 国产精品美女久久久久久2018 | 6080日韩午夜伦伦午夜伦| 成人一区二区视频| 激情六月婷婷综合| 奇米四色…亚洲| 亚洲成a人片在线不卡一二三区 | 91视频免费看| 成人精品国产福利| 国产在线国偷精品产拍免费yy| 三级影片在线观看欧美日韩一区二区| 最新国产の精品合集bt伙计| 国产三级精品视频| 2023国产精品| 精品成人a区在线观看| 日韩欧美一区二区久久婷婷| 欧美日韩一区二区在线视频| 91黄色免费版| 91小视频免费观看| 91视频精品在这里| 色就色 综合激情| 欧洲在线/亚洲| 欧美三级视频在线观看| 在线精品视频一区二区| 欧美午夜精品一区二区蜜桃| 国产精品萝li| 中文字幕av资源一区| 欧美国产成人在线| 亚洲色图制服丝袜| 亚洲最色的网站| 亚洲高清一区二区三区| 亚洲国产成人porn| 亚洲成人av福利| 日本aⅴ免费视频一区二区三区| 日日夜夜精品视频免费| 日韩精品午夜视频| 国产乱一区二区| 国产999精品久久| 97久久超碰国产精品| 99视频有精品| 欧美午夜精品免费| 日韩精品一区二区三区视频播放| 久久这里都是精品| 亚洲欧洲www| 亚洲超碰精品一区二区| 蜜臀av亚洲一区中文字幕| 国产尤物一区二区在线| av不卡在线观看| 欧美日韩精品一二三区| 日韩一区二区电影| 韩国女主播一区二区三区| 国产精品99久久久久久宅男| 国产成人综合亚洲91猫咪| aaa亚洲精品| 欧美在线一二三四区| 51精品国自产在线| 国产亚洲一二三区| 亚洲黄一区二区三区| 日本不卡的三区四区五区| 国产盗摄女厕一区二区三区| 色乱码一区二区三区88| 717成人午夜免费福利电影| 26uuu色噜噜精品一区二区| 亚洲国产精品二十页| 亚洲第一福利一区| 国产真实乱子伦精品视频| 国产欧美视频一区二区| 亚洲综合激情网| 国产在线播精品第三| 欧美亚洲另类激情小说| 久久久久国色av免费看影院| 午夜精品成人在线视频| 国产精品乡下勾搭老头1| 在线精品亚洲一区二区不卡| 久久综合九色综合97婷婷| 亚洲综合区在线| 国产成人啪免费观看软件| 欧美日韩国产综合一区二区| 中文字幕欧美日本乱码一线二线 | 久久综合狠狠综合久久综合88 | 亚洲成人激情综合网| 国产不卡一区视频| 欧美精品99久久久**| 国产精品久久久爽爽爽麻豆色哟哟| 亚洲一级二级在线| 成人黄色av网站在线| 日韩视频123| 亚洲综合成人在线| 成人动漫在线一区| 久久这里只精品最新地址| 日韩精品一二三| 欧美日韩性生活| 亚洲美女一区二区三区| 成人久久视频在线观看| 欧美大度的电影原声| 午夜视黄欧洲亚洲| 一本久道中文字幕精品亚洲嫩| 久久久99久久| 久久精品国产秦先生| 9191久久久久久久久久久| 亚洲视频中文字幕| 成人精品鲁一区一区二区| 国产清纯在线一区二区www| 精品一二三四区| 日韩欧美成人一区| 天天色天天爱天天射综合| 欧美日韩综合不卡| 亚洲综合清纯丝袜自拍| 在线看不卡av| 樱花影视一区二区| 91国偷自产一区二区使用方法| 亚洲欧洲精品天堂一级| 99久久久久免费精品国产| 欧美国产激情一区二区三区蜜月 | 日本中文字幕一区| 欧美人伦禁忌dvd放荡欲情| 亚洲一二三区在线观看| 欧美色欧美亚洲另类二区| 洋洋av久久久久久久一区| 中文字幕亚洲在| 成人激情视频网站| 中文字幕亚洲不卡| 91麻豆高清视频| 亚洲一区二区三区美女| 欧美视频一区在线| 五月天一区二区三区| 日韩三级视频在线看| 国产麻豆视频一区| 国产精品久久久久久久久久久免费看| 成人听书哪个软件好| 亚洲欧美一区二区不卡| 欧美日韩一级黄| 久久国产精品区| 国产欧美中文在线| 色综合久久中文综合久久97| 亚洲大片精品永久免费| 欧美电影免费观看高清完整版 | 日韩精品免费专区| 欧美精品一区在线观看| 不卡的av在线| 亚洲成人精品在线观看| 久久久亚洲精品一区二区三区 | 精品久久久久香蕉网| 国产剧情一区二区|