GCIPage.cpp
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:4k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #include "GCIPage.hpp"
  14. #include "assert.h"
  15. #include <new>
  16. GCIPage::GCIPage(Uint32 gci) 
  17. {
  18.   m_first = NULL;
  19.   m_last = NULL;
  20.   m_gci = gci;
  21.   m_full = false;
  22.   m_currentPagePos=m_page;
  23.   m_usedBytes = 0;
  24. }
  25. /*****************************************************************************
  26.  * Insert
  27.  *****************************************************************************/
  28. /**
  29.  * Store a new log record on this page.
  30.  * @return True if success, false otherwise
  31.  */
  32. bool 
  33. GCIPage::insertLogRecord(Uint32 tableId, Uint32 operation,
  34.  class LinearSectionPtr ptr[3]) 
  35. {
  36.   /**
  37.    * Calculate size of new logrecord in bytes
  38.    */
  39.   assert(m_page!=NULL);
  40.   Uint32 size = 4*ptr[0].sz + 4*ptr[1].sz + sizeof(LogRecord);
  41.   if(!((m_currentPagePos + size ) < (m_page + m_pageBSize))) {
  42.     m_full = true;
  43.     return false;  // No free space. GCIBuffer must allocate a new page
  44.   }
  45.   LogRecord * lr = new(m_currentPagePos) LogRecord();
  46.   if (lr==0) REPABORT("Could not allocate new log record");
  47.   
  48.   lr->recordType = Record::LOG;
  49.   lr->recordLen = size;
  50.   lr->operation = operation; 
  51.   lr->tableId = tableId;
  52.   lr->attributeHeaderWSize = ptr[0].sz;
  53.   lr->attributeDataWSize = ptr[1].sz;
  54.   
  55.   m_currentPagePos += sizeof(LogRecord);
  56.   
  57.   lr->attributeHeader = (Uint32*)m_currentPagePos;
  58.   memcpy(lr->attributeHeader, ptr[0].p, lr->attributeHeaderWSize * 4);
  59.   
  60.   m_currentPagePos += lr->attributeHeaderWSize * 4;
  61.   
  62.   lr->attributeData = (Uint32*)m_currentPagePos;
  63.   memcpy(lr->attributeData, ptr[1].p, lr->attributeDataWSize * 4);
  64.   
  65.   m_currentPagePos += lr->attributeDataWSize * 4;
  66.   m_usedBytes+=size;  
  67.   return true;
  68. }
  69. /**
  70.  * Store a new log record on this page.
  71.  * @return True if sucessful, false otherwise.
  72.  */
  73. bool 
  74. GCIPage::insertMetaRecord(Uint32 tableId, class LinearSectionPtr ptr[3]) 
  75. {
  76.   /**
  77.    * Calculate size of new logrecord in bytes
  78.    */
  79.   Uint32 size = 4*ptr[0].sz + sizeof(MetaRecord);
  80.   
  81.   if(!((m_currentPagePos + size ) < (m_page + m_pageBSize))) {
  82.     m_full = true;
  83.     return false;  // No free space. GCIBuffer must allocate a new page
  84.   }
  85.   MetaRecord *  mr = new(m_currentPagePos) MetaRecord();
  86.   if (mr==0) REPABORT("Could not allocate new meta record");
  87.   //  mr->operation = operation; 
  88.   mr->recordType = Record::META;
  89.   mr->recordLen = size;
  90.   mr->tableId = tableId;
  91.   mr->dataLen = ptr[0].sz;
  92.   
  93.   m_currentPagePos += sizeof(MetaRecord);
  94.   
  95.   mr->data = (Uint32*)m_currentPagePos;
  96.   memcpy(mr->data, ptr[0].p, mr->dataLen * 4);
  97.   
  98.   m_currentPagePos += mr->dataLen * 4;
  99.   m_usedBytes+=size;
  100.   return true;
  101. }
  102. /**
  103.  * copy function
  104.  */
  105. void 
  106. GCIPage::copyDataToPage(char * dataPtr, Uint32 dataBLen)
  107. {
  108.   assert (dataBLen < m_pageBSize);
  109.   memcpy(m_page, dataPtr, dataBLen);
  110.   m_currentPagePos=m_page + dataBLen;
  111.   m_usedBytes = dataBLen;
  112.   m_full = true;
  113.   m_first = (Record * )m_page;
  114.   dataPtr = 0;
  115. }
  116. /*****************************************************************************
  117.  * Iterator
  118.  *****************************************************************************/
  119. GCIPage::iterator::iterator(const GCIPage* page) 
  120. {
  121.   m_gciPage = page;
  122.   m_data = m_gciPage->m_page;
  123.   m_currentRecord = (Record*)m_data;
  124. }
  125. Record * 
  126. GCIPage::iterator::first() 
  127. {
  128.   return m_currentRecord;
  129. }  
  130. Record * 
  131. GCIPage::iterator::next() 
  132. {
  133.   m_currentRecord =  (Record*) 
  134.     ((char*)(m_currentRecord)+ m_currentRecord->recordLen);
  135.   if((char*)m_currentRecord < (char*)(m_data + m_gciPage->m_usedBytes))
  136.     return m_currentRecord;
  137.   else {
  138.     return 0;
  139.   }
  140. }
  141. bool 
  142. GCIPage::iterator::exists() 
  143. {
  144.   return ((char*)m_currentRecord < (m_data + m_gciPage->m_usedBytes));
  145. }