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

📄 record.cpp

📁 实现一个精简型单用户SQL引擎(DBMS)MiniSQL
💻 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 + -