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

📄 schemafile.cpp

📁 有计算机图形学、图像处理、dbms、sniffer、中游俄罗斯外挂、othello、遗传算法、舌苔分析等程序。
💻 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 + -