📄 viewdata.cpp
字号:
// ViewData.cpp: implementation of the CViewData class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Database.h"
#include "ViewData.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CViewData::CViewData()
{
ID=0;
end=MAIN_BLOCK;
NextFile=0;
wBlockNum=1;
}
CViewData::CViewData(LPCTSTR lpszFileName, UINT nOpenFlags,UINT id)
{
CFile file(lpszFileName,nOpenFlags);
UINT filelength=file.GetLength();
if(filelength==0)//是新文件
{
const char *magic="VEW";
file.SetLength(2*MAIN_BLOCK);//初始8192字节
ID=id;
end=MAIN_BLOCK;//4096
wBlockNum=1;//!!!!!!!!!!!!!!!!!!
NextFile=0;
file.SeekToBegin();
file.Write(magic,MAGIC);
file.Write(&ID,sizeof(UINT));
file.Write(&wBlockNum,sizeof(WORD));
file.Write(&end,sizeof(UINT));
file.Write(&NextFile,sizeof(UINT));
}
else
{
char *magic[4];
file.SeekToBegin();
file.Read(magic,MAGIC);
//if(strcmp(magic,"VEW"))
//::AfxThrowFileException(
file.Read(&ID,sizeof(UINT));
file.Read(&wBlockNum,sizeof(WORD));
//Read(&PriorFile,sizeof(UINT));
file.Read(&end,sizeof(UINT));
file.Read(&NextFile,sizeof(UINT));
}
}
void CViewData::Close()
{
if(ID!=0)
{
CString filename("");
filename.Format("D:\\DB\\%d.view",ID);
CFile file(LPCTSTR(filename),CFile::modeReadWrite);
file.Seek(MAGIC,CFile::begin);
//if(strcmp(magic,"VEW"))
//::AfxThrowFileException(
file.Write(&ID,sizeof(UINT));
file.Write(&wBlockNum,sizeof(WORD));
//Read(&PriorFile,sizeof(UINT));
file.Write(&end,sizeof(UINT));
file.Write(&NextFile,sizeof(UINT));
}
}
PDB CViewData::AppendRecord(Record *r,PDB addr1,PDB addr2)//要改变文件尾
{
CBlock *cb=NULL;
PDB db_addr=PDB(ID);
UINT RcdLength=r->m_length;
WORD wBlockNum1=wBlockNum;
CString filename("");
filename.Format("D:\\DB\\%d.view",ID);
CFile file(LPCTSTR(filename),CFile::modeReadWrite);
UINT FileLength=file.GetLength();
file.Close();
while( ((end+VIEW_RECORD_HEAD+RcdLength) > FileLength) )
{
if(wBlockNum1 < FILE_MAX/MAIN_BLOCK)
{
file.Open(LPCTSTR(filename),CFile::modeReadWrite);
file.SetLength(FileLength+MAIN_BLOCK);
FileLength=file.GetLength();
wBlockNum1++;
file.Close();
}
else
{
return DB_NULL;
}
}
wBlockNum=wBlockNum1;
//写记录
db_addr=(db_addr<<32) + PDB(end);
cb=CMemory::ReadDBBlock(db_addr,true);
cb->WriteRecord(r,OFFSET(db_addr),addr1,addr2);
this->end+=RcdLength+VIEW_RECORD_HEAD;//视图记录头部为PDB+UINT(db_addr+length)
return db_addr;
}
CViewData::~CViewData()
{
Close();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -