GCIPage.hpp
上传用户: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. #ifndef GCI_PAGE_HPP
  14. #define GCI_PAGE_HPP
  15. #include "LogRecord.hpp"
  16. #include <TransporterDefinitions.hpp>
  17. #include <rep/rep_version.hpp>
  18. /**
  19.  * @class GCIPage
  20.  * @brief A GCIPage contains a number of LogRecords for a certain GCI.
  21.  */
  22. class GCIPage 
  23. {
  24. public:
  25.   GCIPage(Uint32 gci);
  26.   GCIPage(Uint32 gci, char * dataPtr, Uint32 szBytes);
  27.   /**
  28.    *  @fn      insertLogRecord
  29.    *  @param   tableId    the table this will be LogRecord applies to.
  30.    *  @param   operation  the operation this LogRecord represents
  31.    *  @param   ptr        A LinearSectionPtr p'tr that contains the data.
  32.    *  @return             PAGE_FULL if the page is full, otherwise "true"
  33.    */ 
  34.   bool insertLogRecord(Uint32 tableId, Uint32 operation,
  35.        class LinearSectionPtr ptr[3]);
  36.   /**
  37.    *  @fn      insertMetaRecord
  38.    */
  39.   bool insertMetaRecord(Uint32 tableId, class LinearSectionPtr ptr[3]);
  40.   /**
  41.    *  @fn      getFirstRecord
  42.    *  @return  First record (or NULL if no record is stored on page)
  43.    */
  44.   Record * getFirstRecord() { return m_first; };
  45.   /**
  46.    *  @fn getStorage
  47.    */
  48.   Uint32 *  getStoragePtr() const {return (Uint32*)m_page;} ;
  49.   Uint32    getStorageByteSize() const {return m_usedBytes;} ;
  50.   Uint32    getStorageWordSize() const {return m_usedBytes >> 2;};
  51.   
  52.   /**
  53.    * @fn copyDataToPage
  54.    * @info copy dataPtr to Page
  55.    * @param dataPtr - data to copy
  56.    * @param dataBLen - size in bytes to copy.
  57.    */
  58.   void copyDataToPage(char * dataPtr, Uint32 szBytes);
  59.   
  60.   /**
  61.    * Iterator for records (Not yet used!  Maybe should not be used.)
  62.    */
  63.   class iterator {
  64.   public:
  65.     iterator(const GCIPage* page);
  66.     Record *  first();   ///< @return First record (or NULL if no page exists)
  67.     Record *  next();    ///< @return Next record (or NULL if no more records)
  68.     bool      exists();  ///< @return true if another record exists-for next()
  69.   private:
  70.     Record *         m_currentRecord;
  71.     const char *     m_data;
  72.     const GCIPage *  m_gciPage;
  73.   };
  74.   friend class GCIPage::iterator;
  75.   
  76.   /**
  77.    *  @fn      getGCI
  78.    *           Get the GCI of all log records stored on this page.
  79.    */
  80.   Uint32 getGCI()           { return m_gci; };
  81.   /**
  82.    *  @fn      isFull
  83.    *  @return  true if page is full, i.e. is one attempt to add a record
  84.    *           has failed, false otherwise.
  85.    */
  86.   bool  isFull()            { return m_full; };
  87. private:
  88.   Uint32        m_gci;                 ///< GCI for this page
  89.   Record *             m_first;               ///< Pointer to first log record
  90.   Record *             m_last;                ///< Pointer to last log record
  91.   
  92.   bool        m_full;
  93.   static const Uint32  m_pageBSize = 8192;    ///< Page size in bytes
  94.   char                 m_page[m_pageBSize];   ///< Storage for pages
  95.   char *               m_currentPagePos;
  96.   Uint32               m_usedBytes;
  97. };
  98. #endif