📄 xkmemcoordinator.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 + -