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

📄 hashblock.cpp

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