⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 blockusage.cpp

📁 我们自己写的miniSQL代码
💻 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 + -