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

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 ATTRIBUTE_HEADER
  14. #define ATTRIBUTE_HEADER
  15. /**
  16.  * @class AttributeHeader
  17.  * @brief Header passed in front of every attribute value in AttrInfo signal
  18.  */
  19. class AttributeHeader {
  20.   friend class Dbtup;
  21.   friend class Backup;
  22.   friend class NdbOperation;
  23.   friend class DbUtil;
  24.   friend class Suma;
  25. public:
  26.   /**
  27.    * Psuedo columns
  28.    */
  29.   STATIC_CONST( PSUEDO       = 0x8000 );
  30.   STATIC_CONST( FRAGMENT     = 0xFFFE );
  31.   STATIC_CONST( ROW_COUNT    = 0xFFFD );
  32.   STATIC_CONST( COMMIT_COUNT = 0xFFFC );
  33.   
  34.   /** Initialize AttributeHeader at location aHeaderPtr */
  35.   static AttributeHeader& init(void* aHeaderPtr, Uint32 anAttributeId, 
  36.        Uint32 aDataSize);
  37.   /** Returns size of AttributeHeader (usually one or two words) */
  38.   Uint32 getHeaderSize() const; // In 32-bit words
  39.   /** Store AttributeHeader in location given as argument */
  40.   void insertHeader(Uint32*);
  41.   /** Get next attribute header (if there is one) */
  42.   AttributeHeader* getNext() const;             
  43.   /** Get location of attribute value */
  44.   Uint32* getDataPtr() const;
  45.   /** Getters and Setters */
  46.   Uint32  getAttributeId() const;
  47.   void    setAttributeId(Uint32);
  48.   Uint32  getDataSize() const;   // In 32-bit words
  49.   void    setDataSize(Uint32);
  50.   bool    isNULL() const;
  51.   void    setNULL();
  52.   /** Print **/
  53.   //void    print(NdbOut&);
  54.   void    print(FILE*);
  55.   static Uint32 getDataSize(Uint32);
  56.   
  57. public:
  58.   AttributeHeader(Uint32 = 0);
  59.   AttributeHeader(Uint32 anAttributeId, Uint32 aDataSize);
  60.   ~AttributeHeader();
  61.   
  62.   Uint32 m_value;
  63. };
  64. /**
  65.  *           1111111111222222222233
  66.  * 01234567890123456789012345678901
  67.  * ssssssssssssss eiiiiiiiiiiiiiiii
  68.  *
  69.  * i = Attribute Id
  70.  * s = Size of current "chunk" - 14 Bits -> 16384 (words) = 65k
  71.  *     Including optional extra word(s).
  72.  * e - Element data/Blob, read element of array
  73.  *     If == 0 next data word contains attribute value.
  74.  *     If == 1 next data word contains:
  75.  *       For Array of Fixed size Elements
  76.  *         Start Index (16 bit), Stop Index(16 bit)
  77.  *       For Blob
  78.  *         Start offset (32 bit) (length is defined in previous word)
  79.  * 
  80.  * An attribute value equal to "null" is represented by setting s == 0.
  81.  * 
  82.  * Bit 14 is not yet used.
  83.  */
  84. inline
  85. AttributeHeader& AttributeHeader::init(void* aHeaderPtr, Uint32 anAttributeId, 
  86.        Uint32 aDataSize)
  87. {
  88.   return * new (aHeaderPtr) AttributeHeader(anAttributeId, aDataSize);
  89. }
  90. inline
  91. AttributeHeader::AttributeHeader(Uint32 aHeader)
  92. {
  93.   m_value = aHeader;
  94. }
  95. inline
  96. AttributeHeader::AttributeHeader(Uint32 anAttributeId, Uint32 aDataSize)
  97. {
  98.   m_value = 0;
  99.   this->setAttributeId(anAttributeId);
  100.   this->setDataSize(aDataSize);
  101. }
  102. inline
  103. AttributeHeader::~AttributeHeader()
  104. {}
  105. inline
  106. Uint32 AttributeHeader::getHeaderSize() const
  107. {
  108.   // Should check 'e' bit here
  109.   return 1;
  110. }
  111. inline
  112. Uint32 AttributeHeader::getAttributeId() const
  113. {
  114.   return (m_value & 0xFFFF0000) >> 16;
  115. }
  116. inline
  117. void AttributeHeader::setAttributeId(Uint32 anAttributeId)
  118. {
  119.   m_value &= 0x0000FFFF; // Clear attribute id
  120.   m_value |= (anAttributeId << 16);
  121. }
  122. inline
  123. Uint32 AttributeHeader::getDataSize() const
  124. {
  125.   return (m_value & 0x3FFF);
  126. }
  127. inline
  128. void AttributeHeader::setDataSize(Uint32 aDataSize)
  129. {
  130.   m_value &= (~0x3FFF);
  131.   m_value |= aDataSize;
  132. }
  133. inline
  134. bool AttributeHeader::isNULL() const
  135. {
  136.   return (getDataSize() == 0);
  137. }
  138. inline
  139. void AttributeHeader::setNULL()
  140. {
  141.   setDataSize(0);
  142. }
  143. inline
  144. Uint32* AttributeHeader::getDataPtr() const
  145. {
  146.   return (Uint32*)&m_value + getHeaderSize();
  147. }
  148. inline
  149. void AttributeHeader::insertHeader(Uint32* target)
  150. {
  151.   *target = m_value;
  152. }
  153. inline
  154. AttributeHeader* 
  155. AttributeHeader::getNext() const {
  156.   return (AttributeHeader*)(getDataPtr() + getDataSize());
  157. }
  158. inline
  159. void
  160. //AttributeHeader::print(NdbOut& output) {
  161. AttributeHeader::print(FILE* output) {
  162.   fprintf(output, "AttributeId: H'%.8x (D'%d), DataSize: H'%.8x (D'%d), "
  163.   "isNULL: %dn", 
  164.   getAttributeId(), getAttributeId(), 
  165.   getDataSize(), getDataSize(), 
  166.   isNULL());
  167. }
  168. inline
  169. Uint32
  170. AttributeHeader::getDataSize(Uint32 m_value){
  171.   return (m_value & 0x3FFF);  
  172. }
  173. #endif