GCIContainer.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_CONTAINER_HPP
  14. #define GCI_CONTAINER_HPP
  15. #include <Vector.hpp>
  16. #include "LogRecord.hpp"
  17. #include "GCIBuffer.hpp"
  18. #undef swap
  19. #include <list>
  20. #include <iterator>
  21. /**
  22.  * @class GCIContainer
  23.  * @brief Responsible for storing LogRecord:s in GCIBuffer:s
  24.  *
  25.  * Each GCIBuffer stored in the GCIContainer is named by a pair <GCI, id>.
  26.  * (On PS REP the id is the nodeId, on SS REP the id is the node group).
  27.  */
  28. class GCIContainer {
  29. public:
  30.   GCIContainer(Uint32 maxNoOfIds);
  31.   ~GCIContainer();
  32.   
  33.   /***************************************************************************
  34.    * GCIBuffer interface
  35.    ***************************************************************************/
  36.   /**
  37.    * @return    GCIBuffer if success, NULL otherwise
  38.    */
  39.   GCIBuffer * createGCIBuffer(Uint32 gci, Uint32 id);
  40.   /**
  41.    *  Destroy all buffers with GCI strictly less than gci.
  42.    */
  43.   void destroyGCIBuffersBeforeGCI(Uint32 gci, Uint32 id);
  44.   /**
  45.    *  Destroy all buffers with GCI gci.
  46.    *  @return   true if buffer was deleted, false if no buffer exists
  47.    */
  48.   bool destroyGCIBuffer(Uint32 gci, Uint32 id);
  49.   /**
  50.    * Fetch buffer
  51.    * @return    GCIBuffer for gci, or NULL if no buffer found
  52.    */
  53.   GCIBuffer * getGCIBuffer(Uint32 gci, Uint32 id);
  54.   /**
  55.    * Set that buffer is completed, i.e. no more records are to be inserted
  56.    */
  57.   void setCompleted(Uint32 gci, Uint32 id);
  58.   /**
  59.    * @fn        insertPage
  60.    * @param gci        GCI this page belongs to.
  61.    * @param id         Id this page belongs to.
  62.    * @param dataPtr    Pointer originating from Page::m_page
  63.    * @param     dataBLen   Length in bytes of data following dataptr.
  64.    */
  65.   void insertPage(Uint32 gci, Uint32 id, char * dataPtr, Uint32 dataBLen);
  66.   /***************************************************************************
  67.    * Record interface
  68.    ***************************************************************************/
  69.   void insertLogRecord(Uint32 id, Uint32 tableId, Uint32 operation,
  70.        class LinearSectionPtr ptr[3], Uint32 gci);
  71.   
  72.   void insertMetaRecord(Uint32 id, Uint32 tableId, 
  73. class LinearSectionPtr ptr[3], Uint32 gci);
  74.   /** 
  75.    * Get available (complete) GCI Buffers that exists in the container.
  76.    * first == last means that there is one complete buffer
  77.    * @param id     Id for which to as for available gci buffers.
  78.    * @param first  First complete gci buffer
  79.    * @param last   Last complete gci buffer
  80.    */
  81.   void getAvailableGCIBuffers(Uint32 id, Uint32 * first, Uint32 * last);
  82.   /**
  83.    * Resets the gcicontainer to its original state (initial state and empty)
  84.    * I.e., same state as when the object was first constructed.
  85.    * @return   true if reset was ok
  86.    */
  87.   bool reset();
  88. private: 
  89.   NdbMutex*                  theMutexPtr;
  90.   MutexVector <GCIBuffer *>  m_bufferList;   ///< All GCIBuffers stored
  91.   typedef struct GCIRange {    
  92.     Uint32 m_firstGCI;
  93.     Uint32 m_lastGCI;
  94.   };
  95.   
  96.   Uint32                     m_maxNoOfIds;
  97.   GCIRange *  gciRange;                   ///< Array of GCI ranges for each id
  98. };
  99. #endif