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

📄 viewdata.cpp

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