📄 record.cpp
字号:
/******************************************************************
** 文件名: record.cpp
** Copyright (c) 2001-2002 计算机99F MiniSQL开发小组其一
** 创建人: 何遥
** 日 期: 2001-12-18
** 修改人: 郭振宇
** 日 期: 2002-01-05
** 描 述: 定义了MiniSQL record模块所有类和结构
** 版 本: 1.00
******************************************************************/
#include "record.h"
extern _M_Buffer Buffer;
//-------------------------------------------------------------
Record::Record()
{
char address[256];
strcpy(address,CurLocation);
strcat(address,CurRelationName);
strcat(address,".dbf");
_M_File target = Buffer[address];
this->DelList = (_F_DELLIST*)target.GetDelListCond().MemAddr();
}
//-------------------------------------------------------------
_F_FileAddr Record::Insert(Rec_Info& insertlist) //记录的插入
{
char address[256];
strcpy(address,CurLocation);
strcat(address,CurRelationName);
strcat(address,".dbf");
_M_File targettb = Buffer[address];
_F_FileAddr targetinsert,target;
Cell_Info* node = insertlist.head;
if( this->DelList->DelFirst.uiOffset == 0 )
{
targetinsert = this->DelList->NewInsert; //如果中间没有被删除的记录,那么就把要插入的记录放在最后
this->DelList->NewInsert = MemWriteTest(insertlist.RecordLength + sizeof(_F_FileAddr),&targetinsert);
target = targetinsert;
}
else
{
target = targetinsert = this->DelList->DelFirst;//插入到第一个被删除的记录的位置
if( targetinsert == this->DelList->DelLast )
{
this->DelList->DelFirst.Initialize();
this->DelList->DelLast.Initialize();
}//如果中间只有一个被删除,
else
this->DelList->DelFirst = *(_F_FileAddr*)this->DelList->DelFirst.MemAddr();
}
targetinsert = MemWrite((void*)&targetinsert,sizeof(_F_FileAddr),&targetinsert);
while(node)
{
switch( node->ColType )
{
case I:
targetinsert = MemWrite((void*)&node->value.IntValue,node->ColLength,&targetinsert);
break;
case C:
targetinsert = MemWrite((void*)node->value.pCharValue,node->ColLength,&targetinsert);
break;
case F:
targetinsert = MemWrite((void*)&node->value.FloatValue,node->ColLength,&targetinsert);
break;
default:
throw 1029;//error code
}
node = node->next;
}
return target;
}
//-------------------------------------------------------------
void Record::Delete(_F_FileAddr& DelTarget)
{
char address[256];
strcpy(address,CurLocation);
strcat(address,CurRelationName);
strcat(address,".dbf");
_M_File target = Buffer[address];
_F_FileAddr* temp=(_F_FileAddr*)DelTarget.MemAddr();
if(*temp != DelTarget )
{
cout<<"Already deleted or Required record does not exsit.\n";
return;
}
_F_FileAddr ZPtr;
ZPtr.Initialize();
MemWrite((void*)&ZPtr,sizeof(_F_FileAddr),temp);
if( this->DelList->DelFirst.uiOffset==0 )
this->DelList->DelFirst = DelTarget;
else
MemWrite((void*)&DelTarget,sizeof(_F_FileAddr),&this->DelList->DelLast);
this->DelList->DelLast = DelTarget;
}
//-------------------------------------------------------------
void Record::Update(_F_FileAddr & targetup,Rec_Info& uplist)
{
char address[256];
strcpy(address,CurLocation);
strcat(address,CurRelationName);
strcat(address,".dbf");
_M_File target = Buffer[address];
Cell_Info* node = uplist.head;
targetup.ShiftOffset(sizeof(_F_FileAddr));
while(node)
{
targetup.ShiftOffset(node->PriorLength);
switch( node->ColType )
{
case I:
MemWrite((void*)&node->value.IntValue,node->ColLength,&targetup);
break;
case C:
MemWrite((void*)node->value.pCharValue,node->ColLength,&targetup);
break;
case F:
MemWrite((void*)&node->value.FloatValue,node->ColLength,&targetup);
break;
default:
throw 1029;//error code
}
targetup.ShiftOffset(-node->PriorLength);
node = node->next;
}
}
//-------------------------------------------------------------
Rec_Info* Record::Select(_F_FileAddr& seltarget,Select_Rec_Info& sellist) const
{
char address[256];
strcpy(address,CurLocation);
strcat(address,CurRelationName);
strcat(address,".dbf");
_M_File target = Buffer[address];
Rec_Info * returnvalue = new Rec_Info;
returnvalue->ColNum = sellist.ColumnNum;
returnvalue->RecordLength = sellist.RecordLength;
Cell_Info* cell = 0;
Cell_Info* tempcell = 0;
Select_Cell* SelectCell = sellist.head;
_F_FileAddr targetaddr = *(_F_FileAddr *)seltarget.MemAddr();
if( targetaddr.uiOffset != seltarget.uiOffset || targetaddr.ulFilePageID != seltarget.ulFilePageID )
return 0;
seltarget.ShiftOffset(sizeof(_F_FileAddr));
while(SelectCell)
{
cell = new Cell_Info;
if(SelectCell == sellist.head)
returnvalue->head = cell;
else
{
tempcell->next = cell;
}
tempcell = cell;
seltarget.ShiftOffset( SelectCell->PriorLength);
cell->ColLength = SelectCell->ColLength;
cell->next = 0;
cell->ColType = SelectCell->ColType;
cell->PriorLength = SelectCell->PriorLength;
switch(cell->ColType)
{
case I:
cell->value.IntValue = * (int*) seltarget.MemAddr();
break;
case C: //*************
cell->value.pCharValue = new char(cell->ColLength+1);
strcpy(cell->value.pCharValue,(char*)seltarget.MemAddr());
break;
case F:
cell->value.FloatValue = * (float*) seltarget.MemAddr();
break;
default:
throw 1029;//error message
}
seltarget.ShiftOffset( -SelectCell->PriorLength);
//--------------------------------------------------------
SelectCell = SelectCell->next;
}
return returnvalue;
}
//-------------------------------------------------------------
void Record::PrintHead(Select_Rec_Info& pritarget) const
{
//根据Rec_Info的信息进行解析并打印
Select_Cell* node = pritarget.head;
int k = 0;
cout.setf(ios::left,ios::adjustfield);
cout<<"+";
for(k=0;k<pritarget.RecordLength + pritarget.ColumnNum*4 -1;k++)
cout<<"-";
cout<<"+\n";
while(node)
{
cout<<"| ";
cout.width(node->ColLength +2);
cout<<node->ColumnName;
node = node->next;
}
cout<<"|\n+";
for(k=0;k<pritarget.RecordLength + pritarget.ColumnNum*4 -1;k++)
cout<<"-";
cout<<"+\n";
}
//-------------------------------------------------------------
void Record::Print(_F_FileAddr& pritarget,Select_Rec_Info& prilist) const
{
Rec_Info* temp = this->Select(pritarget,prilist);
if(!temp) throw 1030;
Cell_Info* node = temp->head;
cout.setf(ios::left,ios::adjustfield);
while( node )
{
switch( node->ColType )
{
case I:
cout<<"| ";
cout.width(node->ColLength+2);
cout<<node->value.IntValue;
break;
case C:
cout<<"| ";
cout.width(node->ColLength+2);
cout<<node->value.pCharValue;
break;
case F:
cout<<"| ";
cout.width(node->ColLength+2);
cout<<node->value.FloatValue;
break;
default:
throw 1029;//error message
}
node = node->next;
}
cout<<"|\n+";
for(int k = 0;k<temp->RecordLength-1 + temp->ColNum*4;k++)
cout<<"-";
cout<<"+\n";
return;
}
//-------------------------------------------------------------
//-------------------------------------------------------------
//-------------------------------------------------------------
//-------------------------------------------------------------
//-------------------------------------------------------------
//-------------------------------------------------------------
//-------------------------------------------------------------
//-------------------------------------------------------------
//-------------------------------------------------------------
//-------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -