📄 schemafile.cpp
字号:
// SchemaFile.cpp: implementation of the CSchemaFile class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Database.h"
#include "SchemaFile.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CSchemaFile::CSchemaFile()
{
}
CSchemaFile::CSchemaFile(int hFile):CFile(hFile)
{
}
CSchemaFile::CSchemaFile(LPCTSTR lpszFileName, UINT nOpenFlags,UINT id)
:CFile(lpszFileName, nOpenFlags)
{
if(GetLength()==0)
{
SetLength(2*MAIN_BLOCK);
ID=id;
end=MAIN_BLOCK;
SeekToBegin();
Write(&ID,sizeof(UINT));
Write(&end,sizeof(UINT));
}
else
{
SeekToBegin();
Read(&ID,sizeof(UINT));
Read(&end,sizeof(UINT));
}
}
CSchemaFile::~CSchemaFile()
{
if (m_hFile != (UINT)hFileNull && m_bCloseOnDelete)
Close();
}
PDB CSchemaFile::Location(Relationship *R)//定位
{
ASSERT(R->wtag);
PDB Ret=(PDB(ID)<<32)+PDB(end);
if((end+R->length) > GetLength())
SetLength(GetLength()+MAIN_BLOCK);
end+=R->length;
return Ret;
}
Relationship * CSchemaFile::ReadSchema(PDB db_addr)
{
CAttribute A;
WORD i;
BYTE exist;
UINT offset=UINT(db_addr&0xFFFFFFFF);
Relationship *R=new Relationship;
char name[11];//????????????????????????????????
memset(name,0,10);
Seek(offset,CFile::begin);
Read(&exist,sizeof(BYTE));
if(!exist)
return NULL;
Read(&R->length,sizeof(WORD));
Read(&R->name_length,sizeof(BYTE));
Read(name,R->name_length);
R->name=CString(name);
Read(&R->ID,sizeof(UINT));
Read(&R->attr_num,sizeof(WORD));
Read(&R->idx_num,sizeof(WORD));
Read(&R->MultiNum,sizeof(WORD));//++++++++++++++++
Read(&R->DataFileNo,sizeof(UINT));
Read(&R->db_addr,sizeof(PDB));
Read(&R->IndexMainFile,sizeof(UINT));
Read(&R->time,sizeof(int));
//读MultiIdx
if(R->MultiNum>0)
{
CString filename;
filename.Format("D:\\DB\\%d.mdx",R->IndexMainFile);//R的B+树主文件
CFile f(filename,CFile::modeRead);
f.Seek(INDEX_MAIN_HEAD,CFile::begin);//跳过B+树的信息
if(R->MultiNum<=2)
R->MultiIdx=new CMultiIdx[2];
else
R->MultiIdx=new CMultiIdx[R->MultiNum];
for(i=0;i<R->MultiNum;i++)
{
f.Read(&R->MultiIdx[i].Dup,sizeof(BYTE));
f.Read(&R->MultiIdx[i].AttrNo[0],sizeof(WORD));
f.Read(&R->MultiIdx[i].AttrNo[1],sizeof(WORD));
}
f.Close();
}
else
R->MultiIdx=new CMultiIdx[2];
//读字段
R->at=new CAttribute[R->attr_num+1];
for(i=1;i<=R->attr_num;i++)
{
Read(&(A.name_length),sizeof(BYTE));
Read(name,A.name_length);
A.name=CString(name);
Read(&(A.type),sizeof(BYTE));
Read(&A.idx,sizeof(BYTE));
Read(&A.unq,sizeof(BYTE));
Read(&A.ispk,sizeof(BYTE));
Read(&A.can_null,sizeof(BYTE));
Read(&(A.rf_relationship),sizeof(UINT));
Read(&(A.rf_Attribute),sizeof(WORD));
Read(&(A.length),sizeof(WORD));
Read(&(A.IndexMainFile),sizeof(UINT));
Read(&(A.offset),sizeof(UINT));
R->at[i]=A;
}
return R;
}
BOOL CSchemaFile::Open(LPCTSTR lpszFilename, UINT nOpenFlags,UINT id)
{
CFile::Open(lpszFilename,nOpenFlags);
if(GetLength()==0)
{
SetLength(2*MAIN_BLOCK);
ID=id;
end=MAIN_BLOCK;
SeekToBegin();
Write(&ID,sizeof(UINT));
Write(&end,sizeof(UINT));
}
else
{
SeekToBegin();
Read(&ID,sizeof(UINT));
Read(&end,sizeof(UINT));
}
return TRUE;
}
void CSchemaFile::Close()
{
this->SeekToBegin();
Write(&ID,sizeof(UINT));
Write(&end,sizeof(UINT));
CFile::Close();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -