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

📄 btnode.cpp

📁 有计算机图形学、图像处理、dbms、sniffer、中游俄罗斯外挂、othello、遗传算法、舌苔分析等程序。
💻 CPP
字号:
// BTNODE.cpp: implementation of the BTNODE class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Database.h"
#include "BTNODE.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

BTNODE::BTNODE()
{

}
BTNODE::BTNODE(BOOL t,unsigned short m,BYTE KeyType,WORD KeyLength)
{
    rtag=0x0;
	wtag=0x1;
	this->KeyLength=KeyLength;
	this->keynum=0;
	unsigned short i;
	tag=BYTE(t);////////////////////////////////////////////////////错
	parent=DB_NULL;
	key=new KEY[m+1];
    for(i=0;i<m+1;++i)
		key[i]=KEY(KeyType);
	
	if(t==TERMINAL)
	{
		pointer.address1.recptr=new PDB[m+1];
		pointer.address1.left=DB_NULL;
		pointer.address1.right=DB_NULL;
	}
	else 
		pointer.ptr=new PDB[m+2];
}
BTNODE::BTNODE(PDB db_addr,BYTE *buf,unsigned short m,BYTE KeyType,WORD KeyLength)
{
	rtag=0x0;
	this->KeyLength=KeyLength;
	unsigned short i;
	CMemFile cmf;
    BYTE tag1;
	key=new KEY[m+1];
	for(i=0;i<m+1;++i)
	{
		key[i]=KEY(KeyType);
		memset(&key[i].VAL,0,KEY_LENGTH);/////////////////////////////////////////////////
	}

    this->DB_THIS=db_addr;
	cmf.Attach(buf,MAIN_BLOCK);
	cmf.SeekToBegin();
	cmf.Read(&tag1,sizeof(BYTE));
	tag=tag1;
	cmf.Read(&keynum,sizeof(unsigned short));
	cmf.Read(&parent,sizeof(PDB));
	if(tag==TERMINAL)
	{
		
		cmf.Read(&pointer.address1.left,sizeof(PDB));
		cmf.Read(&pointer.address1.right,sizeof(PDB));
	}
	//读key 
	for(i=0;i<keynum;++i)
	{
		cmf.Read(&key[i].plus,sizeof(BYTE));//KeyLength+2);////////KeyLength不包括头两个字节
	    cmf.Read(&key[i].type,sizeof(BYTE));
		cmf.Read(&key[i].VAL,KeyLength);
    }
	//读指针
    if(tag==TERMINAL)
	{
		pointer.address1.recptr=new PDB[m+1];
		cmf.Read(pointer.address1.recptr,keynum*sizeof(PDB));
	}
	else
	{
		pointer.ptr=new PDB[m+2];
		cmf.Read(pointer.ptr,(keynum+1)*sizeof(PDB));
    }
	cmf.Detach();
	delete []buf;
}
/*BTNODE *BTNODE::ReadChild(const CFile &f,unsigned int pos,unsigned short m)
{
    CMemFile cmf;
	BYTE *buf=new BYTE[BLOCK];//!!
	BTNODE *pRet=new BTNODE(tag,m);
	PDB pdb=pointer.ptr[pos];
	pRet->DB_THIS=pdb;
	//LPCTSTR filename=FindFile(pdb.fID);//此时ptr[pos]是PDB
	//CFile f(filename,CFile::modeReadWrite);
	f.Seek(pdb.bID*BLOCK,CFile::begin);//????
	f.Read(buf,BLOCK);
    cmf.Attach(buf,BLOCK);
	cmf.SeekToBegin();
    cmf.Read(&(pRet->tag),sizeof(BYTE));
	cmf.Read(&(pRet->keynum),sizeof(unsigned int));
	cmf.Seek(sizeof(PDB),CFile::current);
    pRet->parent=this;
	if(pRet->tag==TERMINAL)
	{
		cmf.Read(pRet->pointer.address1.left,sizeof(PDB));
		cmf.Read(pRet->pointer.address1.right,sizeof(PDB));
	}
    cmf.Read(pRet->key,(pRet->keynum)*sizeof(KEY <T> ));
	if(pRet->tag==NO_TERMINAL)
	    cmf.Read(pRet->pointer.ptr,(pRet->keynum+1)*sizeof(PDB));
	else
		cmf.Read(pRet->pointer.address1.recptr,(pRet->keynum)*sizeof(PDB));

	//delete [](cmf.Detach());
}
BTNODE *BTNODE::ReadBrother(const CFile &f,BOOL type,unsigned short m)
{
	ASSERT(tag==TERMINAL);
    CMemFile cmf;
	BYTE *buf=new BYTE[BLOCK];//!!
	BTNODE *pRet=new BTNODE(tag,m);
    PDB pdb=   (type==RIGHT)  ?  (pointer.address1.right)  :   (pointer.address1.left);
	pRet->DB_THIS=pdb;
	
	//LPCTSTR filename=FindFile(pdb.fID);//此时ptr[pos]是PDB
	//CFile f(filename,CFile::modeReadWrite);
	f.Seek(pdb.bID*BLOCK,CFile::begin);//????
	f.Read(buf,BLOCK);
    cmf.Attach(buf,BLOCK);
	cmf.SeekToBegin();
    cmf.Read(&(pRet->tag),sizeof(BYTE));
	cmf.Read(&(pRet->keynum),sizeof(unsigned int));
	cmf.Seek(sizeof(PDB),CFile::current);
    pRet->parent=NULL;///////////////////////////////////////////attention!!!!
	if(pRet->tag==TERMINAL)
	{
		cmf.Read(pRet->pointer.address1.left,sizeof(PDB));
		cmf.Read(pRet->pointer.address1.right,sizeof(PDB));
	}
    cmf.Read(pRet->key,(pRet->keynum)*sizeof(KEY <T> ));
	cmf.Read(pRet->pointer.address1.recptr,(pRet->keynum)*sizeof(PDB));

	delete [](cmf.Detach());
	
	return pRet;
}*/
BOOL BTNODE::WriteDisk()
{
	BYTE tag1;
	unsigned short i;
	CString s;
	s.Format("D:\\DB\\%d",FILE(DB_THIS));
	s+=".index";
	CFile f(LPCTSTR(s),CFile::modeReadWrite);
	
	WORD blockno=BLOCK(DB_THIS);
	f.Seek(blockno*MAIN_BLOCK,CFile::begin);//????????????????????

	tag1=tag;
	f.Write(&tag1,sizeof(BYTE));
	f.Write(&keynum,sizeof(unsigned short));
	f.Write(&parent,sizeof(PDB));//指向父结点的数据库指针
	
	if(tag==TERMINAL)
	{
		f.Write(&pointer.address1.left,sizeof(PDB));
		f.Write(&pointer.address1.right,sizeof(PDB));
	}
	for(i=0;i<keynum;++i)
	{
        f.Write(&key[i].plus,sizeof(BYTE));//KeyLength+2);////////KeyLength不包括头两个字节
	    f.Write(&key[i].type,sizeof(BYTE));
		f.Write(&key[i].VAL,KeyLength);
	}
	if(tag==NO_TERMINAL)
		f.Write(pointer.ptr,(keynum+1)*sizeof(PDB));
	else
	    f.Write(pointer.address1.recptr,keynum*sizeof(PDB));
    
	return TRUE;
}
BTNODE::~BTNODE()
{
    delete []key;
	if(tag==TERMINAL)
	{
		delete [](pointer.address1.recptr);
	}
	else
	{
	    delete [](pointer.ptr);
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -