Record.cpp
上传用户:lkd6667
上传日期:2015-05-13
资源大小:1448k
文件大小:13k
源码类别:

其他数据库

开发平台:

C/C++

  1. #include"Buffer.h"
  2. #include"Glob_Var.h"
  3. #include"Record.h"
  4. #include <string.h>
  5. extern _M_Buffer Buffer;
  6. /////////////////////////////////////////////////////////////////////////////////////
  7. //构建 Record 
  8. Record::Record()
  9. {
  10. char address[256];  //存放文件地址
  11. strcpy(address,CurLocation);
  12.     strcat(address,CurRelationName);
  13.     strcat(address,".dbf");     //扩展名
  14. _M_File TargetF = Buffer[address];
  15. this->m_DbfFile=&TargetF;
  16.   this->m_DelList = (_F_DELLIST*)(TargetF.GetDelListCond().MemAddr());
  17. }
  18. ////////////////////////////////////////////////////////////////////////////////////
  19. //函数
  20. //插入一个TUPLE语句
  21. _F_FileAddr Record::Insert(Rec_Info& RecInfo)
  22. {
  23. //将Buffer指针指向当前文件
  24. char address[256];
  25. strcpy(address,CurLocation);
  26. strcat(address,CurRelationName);
  27. strcat(address,".dbf");
  28. _M_File targettb = Buffer[address];
  29. Cell_Info* temp = RecInfo.head;               //存改指向单个Column 的信息
  30. _F_FileAddr InsertPlace,TargetPlace;          //存放临时头信息
  31. if(this->m_DelList->DelFirst.uiOffset==0)     //Have no DelList 
  32. {
  33. TargetPlace=InsertPlace=this->m_DelList->NewInsert;  //取头地址
  34. this->m_DelList->NewInsert = MemWriteTest(RecInfo.RecordLength + sizeof(_F_FileAddr),&InsertPlace);
  35. }
  36. else if(this->m_DelList->DelFirst==this->m_DelList->DelLast)//Just have one tuple have being delete 
  37. {
  38. TargetPlace=InsertPlace=this->m_DelList->DelFirst;   //取头地址
  39. this->m_DelList->DelFirst.Initialize();              
  40. this->m_DelList->DelLast.Initialize();
  41. }
  42. else
  43. {
  44. TargetPlace=InsertPlace=this->m_DelList->DelFirst;   //取头地址
  45. this->m_DelList->DelFirst=*(_F_FileAddr*)(this->m_DelList->DelFirst.MemAddr());
  46. }
  47. //InsertPlace.Status='u';TargetPlace=InsertPlace;如果有遍历整个文件功能 
  48. InsertPlace = MemWrite((void*)&InsertPlace,sizeof(_F_FileAddr),&TargetPlace);//Write the head of one tuple
  49. //Write the cell information插入数据
  50. while(temp)                       
  51. {
  52. switch(temp->ColType)
  53.    {
  54. case  I:     //int 型数据  写信息
  55. InsertPlace = MemWrite((void*)&temp->value.IntValue,temp->ColLength,&InsertPlace);
  56. break;
  57.         case  F: //float 型数据  写信息
  58. InsertPlace = MemWrite((void*)&temp->value.FloatValue,temp->ColLength,&InsertPlace);
  59. break;
  60.         case  C: //char 型数据  写信息
  61. InsertPlace = MemWrite((void*)temp->value.pCharValue,temp->ColLength,&InsertPlace);
  62. break;
  63. }
  64. temp = temp->next;//到下一个Column
  65. }
  66. return TargetPlace;//返回地址合INDEXT
  67. }
  68. //删除一个tuple语句
  69. void Record::Delete(_F_FileAddr& DFAddr)
  70. {
  71. //将Buffer指针指向当前文件
  72. char address[256];
  73. strcpy(address,CurLocation);
  74. strcat(address,CurRelationName);
  75. strcat(address,".dbf");
  76. _M_File targettb = Buffer[address];
  77. _F_FileAddr * FPTemp;
  78. //DFAddr.Status='l';如果有遍历整个文件功能
  79. FPTemp = (_F_FileAddr*)DFAddr.MemAddr();//取得文件中的单语句头信息
  80. if(*FPTemp!= DFAddr )//信息与所要Delete的不一样
  81. {
  82. cout<<"Already deleted or Required record does not exsit.n";
  83. return;
  84. }
  85. _F_FileAddr ZPtr;
  86. ZPtr.Initialize();
  87. //ZPtr.Status='l';如果有遍历整个文件功能
  88. MemWrite(&ZPtr,sizeof(_F_FileAddr),FPTemp);//将被删除处的头信息写空
  89.     if(this->m_DelList->DelFirst.uiOffset==0)//如果Dellist为空
  90. {
  91. this->m_DelList->DelFirst=DFAddr;
  92. this->m_DelList->DelLast=DFAddr;  
  93. }
  94. else
  95. {//将当前删除语句的头信息写入前一删除语句的头地址以使删除空间链在一起
  96. MemWrite((void*)&DFAddr,sizeof(_F_FileAddr),&this->m_DelList->DelLast);
  97. this->m_DelList->DelLast = DFAddr;
  98. }
  99. }
  100. //查找一个TUPLE语句
  101. Rec_Info* Record::Select(_F_FileAddr& FAddr,Select_Rec_Info& SelRecInfo) const
  102. {
  103. //将Buffer指针指向当前文件
  104. char address[256];
  105. strcpy(address,CurLocation);
  106. strcat(address,CurRelationName);
  107. strcat(address,".dbf");
  108. _M_File targettb = Buffer[address];
  109.     Rec_Info* RPRecInfo = new class Rec_Info;//存放Select出来的信息
  110. TCell_Info* CPTemp =NULL;
  111. TCell_Info* CPTemp1= NULL;
  112. RPRecInfo->head=NULL;
  113. //向Rec_Info 写信息
  114. RPRecInfo->ColNum=SelRecInfo.ColumnNum;//所选Column(列数)number
  115. RPRecInfo->RecordLength=SelRecInfo.RecordLength;//所选记录长度
  116. Select_Cell* SPTemp=SelRecInfo.head;
  117. _F_FileAddr temp=*(_F_FileAddr*)FAddr.MemAddr();//取该语句存放地址
  118. if(temp!=FAddr)//与要选择的信息不一致,返回
  119. return 0;
  120.     temp.ShiftOffset(sizeof(_F_FileAddr));
  121. while(SPTemp)
  122. {
  123. CPTemp = new Cell_Info;
  124. if(SPTemp == SelRecInfo.head)//第一个Column要链到整条信息的头信息
  125.    RPRecInfo->head=CPTemp;
  126. else 
  127. {
  128.    CPTemp1->next = CPTemp;
  129. }
  130. //对Cell_Info符值
  131. CPTemp1=CPTemp;
  132. CPTemp->ColLength = SPTemp->ColLength;
  133. CPTemp->next = NULL;
  134. CPTemp->ColType = SPTemp->ColType;
  135. CPTemp->PriorLength = SPTemp->PriorLength;
  136. temp.ShiftOffset(SPTemp->PriorLength);//移动OFFSET指针到要读的数据位置
  137. //不同类数据的读取
  138. switch(SPTemp->ColType)
  139. {
  140. case I: CPTemp->value.IntValue = * (int*) temp.MemAddr();
  141.       break;
  142. case C: CPTemp->value.pCharValue = new char(SPTemp->ColLength+1);
  143.         strcpy(CPTemp->value.pCharValue,(char*)temp.MemAddr());
  144.   break;
  145. case F: CPTemp->value.FloatValue = * (float*) temp.MemAddr();
  146.   break;
  147. }
  148. temp.ShiftOffset( -SPTemp->PriorLength);//将OFFSET指返回初始值,以便下次便用
  149. SPTemp=SPTemp->next;
  150. }
  151. return RPRecInfo;
  152. }
  153. //更新数据
  154. void Record::Update(_F_FileAddr& UpdateFAddr,Rec_Info& UpdateInfo)
  155. {
  156. //将Buffer指针指向当前文件
  157. char address[256];
  158. strcpy(address,CurLocation);
  159. strcat(address,CurRelationName);
  160. strcat(address,".dbf");
  161. _M_File targettb = Buffer[address];
  162. Cell_Info* temp = UpdateInfo.head;
  163. _F_FileAddr UFATemp = UpdateFAddr;
  164. UFATemp.ShiftOffset(sizeof(_F_FileAddr));
  165. while(temp)                       //Write the cell information
  166. {
  167. UFATemp.ShiftOffset(temp->PriorLength);
  168. switch(temp->ColType)
  169.    {
  170. case  I:
  171. MemWrite((void*)&temp->value.IntValue,temp->ColLength,&UFATemp);
  172. break;
  173.         case  F: 
  174.     MemWrite((void*)&temp->value.FloatValue,temp->ColLength,&UFATemp);
  175. break;
  176.         case  C: 
  177. MemWrite((void*)temp->value.pCharValue,temp->ColLength,&UFATemp);
  178. break;
  179. }
  180. UFATemp.ShiftOffset(-temp->PriorLength);
  181. temp = temp->next;
  182. }
  183. }
  184. //打印头信息
  185. void Record::PrintHead(Select_Rec_Info& SelRecInfo) const
  186. {
  187. Select_Cell* SPTemp = SelRecInfo.head;
  188. int k = 0;
  189. cout.setf(ios::left,ios::adjustfield);//调整打印宽度
  190. for(k=0;k<SelRecInfo.RecordLength + SelRecInfo.ColumnNum*4;k++)
  191. cout<<"*";
  192. cout<<"*n* ";
  193. cout.width(SPTemp->ColLength +2);
  194.     cout<<SPTemp->ColumnName;
  195.     SPTemp = SPTemp->next;
  196.     while(SPTemp)
  197.     {
  198. cout<<"| ";
  199. cout.width(SPTemp->ColLength +2);//调整打印宽度
  200. cout<<SPTemp->ColumnName;//打印属性名
  201. SPTemp = SPTemp->next;
  202.     }
  203. cout<<"*n";
  204. }
  205. //打印所查到的记录(RECORD)
  206. void Record::Print(_F_FileAddr& pritarget,Select_Rec_Info& prilist) const
  207. {
  208.     Rec_Info* temp = this->Select(pritarget,prilist);//调用Select
  209. if(!temp)   throw 1030;
  210.     Cell_Info* node = temp->head;
  211. cout.setf(ios::left,ios::adjustfield);
  212. cout<<"*";
  213. for(int k=0;k<prilist.RecordLength + prilist.ColumnNum*4 -1;k++)
  214. cout<<"-";
  215. cout<<"*n* ";
  216.     while( node )//打印值 
  217.     {
  218.         switch( node->ColType )
  219.         {
  220.             
  221.             case I:
  222. if(node!=temp->head)
  223.     cout<<"| ";
  224. cout.width(node->ColLength+2);
  225.                 cout<<node->value.IntValue;
  226.                 break;
  227.             
  228.             case C:
  229. if(node!=temp->head)
  230.     cout<<"| ";
  231. cout.width(node->ColLength+2);
  232.                 cout<<node->value.pCharValue;
  233.                 break;
  234.             
  235.             case F:
  236. if(node!=temp->head)
  237.     cout<<"| ";
  238. cout.width(node->ColLength+2);
  239.                 cout<<node->value.FloatValue;
  240.                 break;
  241.         }
  242.         node = node->next;
  243.     }
  244. cout<<"*n";
  245. return;
  246. }
  247. //打印表末尾
  248. void Record::PrintEnd(Select_Rec_Info& SelRecInfo) const
  249. {
  250. cout.setf(ios::left,ios::adjustfield);
  251. for(int k=0;k<SelRecInfo.RecordLength + SelRecInfo.ColumnNum*4;k++)
  252. cout<<"*";
  253. cout<<"*n";
  254. }
  255. /*  表的形式
  256. **********************************************************************
  257. *          |                |              |            |            *
  258. *--------------------------------------------------------------------*
  259. *          |                |              |            |            *
  260. **********************************************************************
  261. //下面是遍历整个文件的代码
  262. int Record::Print(Select_Rec_Info& prilist,Select_Cond_Info &SelCondInfo)
  263. {
  264. //将Buffer指针指向当前文件
  265. char address[256];
  266. strcpy(address,CurLocation);
  267. strcat(address,CurRelationName);
  268. strcat(address,".dbf");
  269. _M_File targettb = Buffer[address];
  270. _F_FileAddr *pFile;
  271. _F_FileAddr  FileAddr;
  272. int TotalLength=sizeof(_F_FileAddr)+SelCondInfo.RecordLength;//每条记录的总长度
  273. //所有页进行查找
  274. for(unsigned long i=0;i<targettb.GetPageTotal();i++)
  275. {
  276. //设置每页第一条语句的页数人ID和偏移地址以取得文件指针
  277. if(i==0)
  278. {
  279. //第一页包含了一个文件头信息和一个页头信息
  280. FileAddr.ShiftOffset(sizeof(_TB_FILECOND)+sizeof(_TB_PAGEHEAD));
  281. FileAddr.ulFilePageID=0;
  282. pFile =(_F_FileAddr*)FileAddr.MemAddr();
  283. }
  284. else 
  285. {//其它页只有一个页头信息
  286. FileAddr.ShiftOffset(sizeof(_TB_PAGEHEAD));
  287. FileAddr.ulFilePageID=i;
  288. pFile =(_F_FileAddr*) FileAddr.MemAddr();
  289. }
  290. //页内搜索,
  291. while((pFile->uiOffset+TotalLength)<FILE_PAGESIZE)//记录是否溢出,溢出则跳出循环
  292. {
  293. int IfCatch=0;//标记该语句是否为所要找的语句
  294. FileAddr = *pFile;
  295. if(pFile==&this->m_DelList->NewInsert)//到文件尾结整搜索
  296. return 1;
  297. pFile=(_F_FileAddr *)((char*)pFile+TotalLength);//指到下一语句地址
  298. if(FileAddr.Status=='l')//判断该语句是否已删除
  299. continue;
  300. TSelect_Cond_Cell* SCCT=SelCondInfo.head;//搜索条件
  301. Column_Value TempVal;//用于存放临时读取的数据 
  302. while(SCCT)//多条件循环
  303. {
  304. FileAddr.ShiftOffset(sizeof(_F_FileAddr)+SCCT->PriorLength);//文件指针移到要读取值的位置
  305. switch(SCCT->ColType)//类型判断
  306. {
  307. case I:TempVal.IntValue=*(int*)FileAddr.MemAddr();
  308. switch(SCCT->OperType)//操作符判断
  309. {
  310. case E:if((TempVal.IntValue-SCCT->ColSelValue.IntValue)==0)
  311.    IfCatch=1;
  312. else IfCatch=0;
  313. break;
  314. case B:if((TempVal.IntValue-SCCT->ColSelValue.IntValue)>0)
  315.    IfCatch=1;
  316. else IfCatch=0;
  317. break;
  318. case BE:
  319. if((TempVal.IntValue-SCCT->ColSelValue.IntValue)>=0)
  320.    IfCatch=1;
  321. else IfCatch=0;
  322. break;
  323. case L:if((TempVal.IntValue-SCCT->ColSelValue.IntValue)<0)
  324.    IfCatch=1;
  325. else IfCatch=0;
  326. break;
  327. case LE:if((TempVal.IntValue-SCCT->ColSelValue.IntValue)<=0)
  328.    IfCatch=1;
  329. else IfCatch=0;
  330. break;
  331.     //default
  332. }break;
  333. case F:TempVal.FloatValue=*(float*)FileAddr.MemAddr();
  334. switch(SCCT->OperType)//操作符判断
  335. {
  336. case E:if((TempVal.FloatValue-SCCT->ColSelValue.FloatValue)==0)
  337.    IfCatch=1;
  338. else IfCatch=0;
  339. break;
  340. case B:if((TempVal.FloatValue-SCCT->ColSelValue.FloatValue)>0)
  341.    IfCatch=1;
  342. else IfCatch=0;
  343. break;
  344. case BE:
  345. if((TempVal.FloatValue-SCCT->ColSelValue.FloatValue)>=0)
  346.    IfCatch=1;
  347. else IfCatch=0;
  348. break;
  349. case L:if((TempVal.FloatValue-SCCT->ColSelValue.FloatValue)<0)
  350.    IfCatch=1;
  351. else IfCatch=0;
  352. break;
  353. case LE:if((TempVal.FloatValue-SCCT->ColSelValue.FloatValue)<=0)
  354.    IfCatch=1;
  355. else IfCatch=0;
  356. break;
  357.     //default
  358. }break;
  359. case C:TempVal.pCharValue=(char*)FileAddr.MemAddr();
  360. switch(SCCT->OperType)//操作符判断
  361. {
  362. case E:
  363. if(strcmp(TempVal.pCharValue,SCCT->ColSelValue.pCharValue)==0)
  364.    IfCatch=1;
  365. else IfCatch=0;
  366. break;
  367. case B:
  368. if(strcmp(TempVal.pCharValue,SCCT->ColSelValue.pCharValue)==1)
  369.    IfCatch=1;
  370. else IfCatch=0;
  371. break;
  372. case BE:
  373. if((strcmp(TempVal.pCharValue,SCCT->ColSelValue.pCharValue)==0)||(strcmp(TempVal.pCharValue,SCCT->ColSelValue.pCharValue)==1))
  374.    IfCatch=1;
  375. else IfCatch=0;
  376. break;
  377. case L:
  378. if(strcmp(TempVal.pCharValue,SCCT->ColSelValue.pCharValue)==-1)
  379.    IfCatch=1;
  380. else IfCatch=0;
  381. break;
  382. case LE:
  383. if((strcmp(TempVal.pCharValue,SCCT->ColSelValue.pCharValue)==0)||(strcmp(TempVal.pCharValue,SCCT->ColSelValue.pCharValue)==-1))
  384.    IfCatch=1;
  385. else IfCatch=0;
  386. break;
  387.     //default
  388. }break;
  389. //default
  390. }
  391. FileAddr.ShiftOffset(-(sizeof(_F_FileAddr)+SCCT->PriorLength));//文件指针回复到初始状态 
  392. SCCT=SCCT->next;//下一个条件
  393. }
  394. if(IfCatch)//如果找到符合条件的语句
  395. {
  396. this->Print(FileAddr,prilist);
  397. }
  398. }
  399. }
  400. return 1;
  401. }
  402. */