📄 btnode.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 + -