📄 blockusage.cpp
字号:
// BlockUsage.cpp: implementation of the BlockUsage class.
//
//////////////////////////////////////////////////////////////////////
#include <memory.h>
#include "BlockUsage.h"
#include "api_inte_struct.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
BlockUsage::BlockUsage()
{
}
BlockUsage::~BlockUsage()
{
}
int BlockUsage::add() //找到第一个空的block号码
{
char* CurrentBlock;
int page = 0;
int i;
int next_BlockNo = BLOCKUSAGE_BLOCKNO ;
int last_BlockNo =0 ;
do
{
CurrentBlock = BM->readBlock(next_BlockNo);
if ( -1 == BM->lockBlock(next_BlockNo))
return -1;
for ( i = 0 ; i <= BLOCKMAXSIZE; i++)
if ( *(int*)(CurrentBlock + 4*i) == 0)
{
int* newBlockNo = (int*)(CurrentBlock + i*sizeof(int));
*newBlockNo = 1;
BM->writeBlock(next_BlockNo);
BM->unlockBlock(next_BlockNo);
//初始化新block
int j = page*BLOCKMAXSIZE + i;
BM->readBlock(j);
BM->writeBlock(j);
return j;
}
last_BlockNo = next_BlockNo;
next_BlockNo = *(int*)(CurrentBlock + BLOCK_NEXT_POINTER_POS);
BM->unlockBlock(next_BlockNo);
page++;
}while(next_BlockNo != 0); // check all the BlockUsage Blocks to find a emtpy position
if ( i > BLOCKMAXSIZE ) // new a Block to put BlockUsage
{
CurrentBlock = BM->readBlock(last_BlockNo); //在最后一个block加上到新block的连接
if ( -1 == BM->lockBlock(last_BlockNo))
return -1;
int new_BlockNo = page*BLOCKMAXSIZE + 1;
*(int*)(CurrentBlock + BLOCK_NEXT_POINTER_POS) = new_BlockNo;
BM->writeBlock(last_BlockNo);
BM->unlockBlock(last_BlockNo);
char* NEW = BM->readBlock(new_BlockNo); //在新block里加上使用标记1
*(int*)(NEW) = 1;
*(int*)(NEW + 1) = 1;
BM->writeBlock(new_BlockNo);
//初始化新block
BM->readBlock(new_BlockNo + 1);
return new_BlockNo+1;
} //may be not safe here
return -1;
}
void BlockUsage::delete_block_list(int count,int list[])
{
int i;
for (i = 0 ; i <= count ; i++)
delete_a_block(list[i]);
}
void BlockUsage::set_BufferManager(BufferManager *Buffer_Manager)
{
BM = Buffer_Manager;
}
void BlockUsage::GetBlockHead()
{
Block_head = BM->readBlock( BLOCKUSAGE_BLOCKNO );
//check whether it is the first time run
if ( *(int*)Block_head == 0)
{
add(); //add first blockusage block
add(); //add first table block
add(); //add first index block
}
}
void BlockUsage::delete_a_block(int BlockNo)
{
char* CurrentBlock;
int page = 0;
int next_BlockNo = BLOCKUSAGE_BLOCKNO ;
do
{
CurrentBlock = BM->readBlock(next_BlockNo);
if ( -1 == BM->lockBlock(next_BlockNo))
return; //side effect
if ( BlockNo < (page+1)*BLOCKMAXSIZE) //找到要删的block号码所在块
{
*(int*)(CurrentBlock + BlockNo * 4) = 0;
BM->writeBlock(next_BlockNo);
BM->unlockBlock(next_BlockNo);
return;
}
next_BlockNo = *(int*)(CurrentBlock + BLOCK_NEXT_POINTER_POS);
BM->unlockBlock(next_BlockNo);
page++;
}while(next_BlockNo != 0); // check all the BlockUsage Blocks
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -