📄 hashtable.cpp
字号:
// HashTable.cpp: implementation of the CHashTable class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Database.h"
#include "HashTable.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CHashTable::CHashTable()
{
end=MAIN_BLOCK;
ID=0;
RcdLength=0;
::memset(pHashBlock,0,HASH*sizeof(CHashBlock *));
}
CHashTable::CHashTable(UINT RcdLen,UINT id)
{
CString s;
s.Format("D:\\DB\\%d.hash",id);
CFile file(LPCTSTR(s),CFile::modeCreate|CFile::modeReadWrite);
UINT filelength=file.GetLength();
if(filelength==0)//是新文件
{
const char *magic="Has";
file.SetLength(MAIN_BLOCK);//初始4096字节
ID=id;
end=MAIN_BLOCK;//2048*4096
RcdLength=RcdLen;
::memset(pHashBlock,0,HASH*sizeof(CHashBlock *));
file.SeekToBegin();
file.Write(magic,MAGIC);
file.Write(&ID,sizeof(UINT));
file.Write(&end,sizeof(UINT));
file.Write(&RcdLength,sizeof(UINT));
}
else
{
char *magic[4];
file.SeekToBegin();
file.Read(magic,MAGIC);
//if(strcmp(magic,"Has"))
//::AfxThrowFileException(
file.Read(&ID,sizeof(UINT));
file.Read(&end,sizeof(UINT));
file.Read(&RcdLength,sizeof(UINT));
::memset(pHashBlock,0,HASH*sizeof(CHashBlock *));
}
}
CHashTable::~CHashTable()
{
if(RcdLength!=0)
{
UINT i;
for(i=0;i<HASH;i++)
delete pHashBlock[i];
}
}
BOOL CHashTable::InsertRecord(Record *rcd,bool Dup)
{
ASSERT(rcd->m_length==this->RcdLength);
WORD HashCode=rcd->Hash();
ASSERT(HashCode>=0 && HashCode<=2046);
if(!pHashBlock[HashCode])
{
BYTE *buf=new BYTE[MAIN_BLOCK];
pHashBlock[HashCode]=new CHashBlock(buf,MAIN_BLOCK,DB_NULL,RcdLength,FALSE);//dirty
}
if(pHashBlock[HashCode]->MemCompare(rcd,Dup)==TRUE && !Dup)
{
return FALSE;
}
BOOL finish=FALSE;
CString s;
s.Format("D:\\DB\\%d.hash",ID);
CFile f(LPCTSTR(s),CFile::modeReadWrite);
UINT FileLength=f.GetLength();
PDB newblock=0;
CHashBlock *phblk=pHashBlock[HashCode];
do
{
do
{
finish=phblk->AppendRecord(rcd);
if(!finish)
{
phblk=CMemory::ReadHashBlock(phblk->NextBlock,RcdLength,TRUE);//clean
}
}
while(!finish && pHashBlock);
if(!finish)
{
f.SetLength(FileLength+MAIN_BLOCK);
newblock=(PDB(ID)<<32)+PDB(end);
phblk->NextBlock=newblock;
end+=MAIN_BLOCK;
phblk=CMemory::ReadHashBlock(newblock,RcdLength,FALSE);//dirty
}
}
while(!finish);
f.Close();
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -