📄 hashblock.cpp
字号:
// HashBlock.cpp: implementation of the CHashBlock class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Database.h"
#include "HashBlock.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CHashBlock::CHashBlock()
{
NextBlock=ID=DB_NULL;
Buffer=NULL;
rtag=wtag=0x0;
RcdLength=0;
RecordNum=0;
}
CHashBlock::~CHashBlock()
{
delete []Buffer;
}
CHashBlock *CHashBlock::GetNextBlock()
{
if(NextBlock==DB_NULL)
return NULL;
CHashBlock *pBlock=CMemory::ReadHashBlock(NextBlock,RcdLength,TRUE);
return pBlock;
}
BOOL CHashBlock::MemCompare(Record *rcd,bool Dup)
{
WORD i=0;
BOOL cmp=0;
WORD RcdNum=this->RecordNum;
CHashBlock *pBlock=this;
BYTE *body=new BYTE[RcdLength];
ASSERT(rcd->m_length==this->RcdLength);
UINT RecordCount=0;
do
{
while(i<RcdNum)
{
pBlock->Seek(sizeof(WORD)+sizeof(PDB),CFile::begin);
pBlock->Read(&RecordCount,sizeof(UINT));
pBlock->Read(body,RcdLength);
cmp=::memcmp(body,rcd->body,RcdLength);
if(cmp==0)//发现相等
{
if(Dup)//允许重复
{
pBlock->wtag=0x1;
RecordCount++;
pBlock->Seek(-int(RcdLength)-sizeof(UINT),CFile::current);
pBlock->Write(&RecordCount,sizeof(UINT));
}
delete body;
return TRUE;
}
i++;
}
//i>=RcdNum
pBlock=pBlock->GetNextBlock();
if(pBlock)
{
i=0;
RcdNum=pBlock->RecordNum;
}
}
while(pBlock);
delete body;
return FALSE;
}
CHashBlock::CHashBlock(BYTE* lpBuffer, UINT nBufferSize,PDB id, UINT RL,BOOL clean)
:ID(id),RcdLength(RL),CMemFile(lpBuffer,nBufferSize,0)
{
SeekToBegin();
if(clean)
{
Read(&RecordNum,sizeof(WORD));
Read(&NextBlock,sizeof(PDB));
}
else
{
RecordNum=0;
NextBlock=0;
Write(&RecordNum,sizeof(WORD));
Write(&NextBlock,sizeof(PDB));
}
Buffer=lpBuffer;
rtag=0x0;
wtag=0x0;
}
void CHashBlock::Attach(BYTE *lpBuffer, UINT nBufferSize
, PDB db_addr, UINT RcdLen,BOOL clean)
{
CMemFile::Attach(lpBuffer,nBufferSize,0);
SeekToBegin();
if(clean)
{
Read(&RecordNum,sizeof(WORD));
Read(&NextBlock,sizeof(PDB));
}
else
{
RecordNum=0;
NextBlock=0;
Write(&RecordNum,sizeof(WORD));
Write(&NextBlock,sizeof(PDB));
}
ID=db_addr;
RcdLength=RcdLen;
rtag=0x0;
wtag=0x0;
Buffer=lpBuffer;
}
BOOL CHashBlock::AppendRecord(Record *rcd)
{
ASSERT(rcd->m_length==this->RcdLength);
UINT MaxRcd=(MAIN_BLOCK-sizeof(WORD)-sizeof(PDB))/(RcdLength+sizeof(UINT));
if(RecordNum==MaxRcd)
return FALSE;//溢出
//否则
wtag=0x1;
const UINT count=1;
WORD end=sizeof(WORD)+sizeof(PDB)+RecordNum*(RcdLength+sizeof(UINT));
Seek(end,CFile::begin);
Write(&count,sizeof(UINT));
Write(rcd->body,RcdLength);
RecordNum++;
return TRUE;
}
void CHashBlock::WriteBack()
{
CString s;
UINT file_id=FILE(ID);
UINT offset=UINT(ID&0xFFFFFFFF);
CFile f;
s.Format("D:\\DB\\%d.hash",file_id);
f.Open(LPCTSTR(s),CFile::modeReadWrite);
f.Seek(offset,CFile::begin);
f.Write(&RecordNum,sizeof(WORD));
f.Write(&NextBlock,sizeof(PDB));
f.Write(Buffer+sizeof(WORD)+sizeof(PDB),RecordNum*(RcdLength+sizeof(UINT)));
f.Close();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -