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

📄 xkmemcoordinator.h

📁 简单数据库管理系统
💻 H
字号:
// xkMemCoordinator.h: interface for the xkMemCoordinator class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_XKMEMCOORDINATOR_H__F3CD610E_0D0F_4EFD_B56F_810E727A8A7E__INCLUDED_)
#define AFX_XKMEMCOORDINATOR_H__F3CD610E_0D0F_4EFD_B56F_810E727A8A7E__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "xktype.h"
#include "xkDict.h"
#include "xkHashtable.h"



//内模式--管理内存中各表的数据,并能进行查询、删除、更新记录,新建、删除表的功能。
typedef struct __xkPageItem 
{
	__xkPageItem():record_count_(0), pagenumber_(0), next_(0), flag_(0){}
	size_t record_count_;
	size_t pagenumber_;
	__xkPageItem *next_;
	unsigned short    flag_;//有待扩展
}xkPageItem, *LPxkPageItem;

typedef struct __xkRecordItem
{
	__xkRecordItem & operator = (const __xkRecordItem & r)
	{
		if(this != &r)
		{
			pageno_ = r.pageno_;
			recordno_ = r.recordno_;
		}
		return *this;
	}
	bool operator == (const __xkRecordItem & r)
	{
		if(pageno_ == r.pageno_ && recordno_ == r.recordno_)
			return true;
		return false;
	}
	__xkRecordItem()
		:pageno_(0), recordno_(0)
	{
	}
	size_t pageno_;//the page which the record resides
	size_t recordno_;//the actual record position in the page
}xkRecordItem, *LPxkRecordItem;
//--这是概念模式到内模式的映射--
//为数据字典中各关系在内存中的映射,用来管理各关系在内存中的数据并进行相关数据操作。
class xkTable             
{
public:
	void DeleteAllRecords();
	xkTable()
		:RID_(0), tablename_(0), firstpage_(0), allocated_pages_(0), curpage_(0), cursor_(0), rcount_(0)
	{
		hashtable_.AllocateBucketSize(BUCKETSIZE);
	}
	
	virtual ~xkTable()
	{
		if(tablename_)
			delete[] tablename_;
	}
	
	bool	GetSelectedRecord(const xkAttribute & attr_, const void* value_, void* desired_, char* mem_);
	bool	UpdateRecord(const xkAttribute & attr_, const char* originalval_, const void* value_, char* mem_);//通过该属性的值查找记录
	bool    DeleteRecord(const xkAttribute & attr_, const char* originalval_, char* mem_);
	bool	InsertRecord(const void* source_, const size_t size_, char* mem_);
	char*    GetTableAllRecords(char* mem_);
	size_t     RID_;
	char*	 tablename_;
	int		 cursor_;
	int      rcount_;//表示已经取走的记录个数
	LPxkPageItem curpage_;
	LPxkPageItem firstpage_;
	size_t     allocated_pages_;
	//哈希表的键为记录关键字的值
	xkHashtable<char*,LPxkRecordItem> hashtable_;//hashtable can be only used for this application
};

//有该对象向操作系统申请内存,并进行页式内存管理,同时登记数据字典中各关系在内存中的使用情况
class xkMemCoordinator
{
public:
	void DeleteAllRecords(const size_t rid_);
	xkMemCoordinator()
	{
		//for(size_t i = 0; i < PAGECOUNT; i++)
		//	pagemap_[i] = 0;
		memset(pagemap_, 0, sizeof(pagemap_));
		freepages_ = PAGECOUNT;
		memset(mem_, 0, sizeof(mem_));
	}
	virtual ~xkMemCoordinator();
//	void	CreateTable(const size_t RID_, const Char* tablename_); 
	void	CreateTable(const size_t RID_);
//	void	DropTable(const size_t RID_, const Char* tablename_);
	void	DropTable(const size_t RID_);
	char*   GetTableAllRecords(const size_t rid_);

	void    SaveTable(const size_t RID_);//将该表从内存保存到外存
	void    LoadTable(const size_t RID_);//将该表从外存加载到内存
	void	LoadAll();
	void    SaveAll();
	int  	GetPage();
	xkTable* GetTable(const size_t RID_);
	void	SetFreePage(size_t i)
	{
		assert(i >= 0 && i < 1024);
		if(pagemap_[i])
		{
			pagemap_[i] = 0;
			freepages_++;
		}
	}
	char* GetMem() {return mem_;};
private:
	Vector<xkTable*> tableset_;
	char 	mem_[PAGECOUNT*PAGESIZE];
	bool	pagemap_[PAGECOUNT]; //0:unused, 1:used
	size_t	freepages_;
};

#endif // !defined(AFX_XKMEMCOORDINATOR_H__F3CD610E_0D0F_4EFD_B56F_810E727A8A7E__INCLUDED_)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -