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

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_DESCRIPTOR_HPP
  14. #define ATTRIBUTE_DESCRIPTOR_HPP
  15. class AttributeDescriptor {
  16.   friend class Dbdict;
  17.   friend class Dbtup;
  18.   friend class Dbtux;
  19.   
  20. private:
  21.   static void setType(Uint32 &, Uint32 type);
  22.   static void setSize(Uint32 &, Uint32 size);
  23.   static void setArray(Uint32 &, Uint32 arraySize);
  24.   static void setOriginal(Uint32 &, Uint32 original);
  25.   static void setNullable(Uint32 &, Uint32 nullable);
  26.   static void setDGroup(Uint32 &, Uint32 dgroup);
  27.   static void setDKey(Uint32 &, Uint32 dkey);
  28.   static void setPrimaryKey(Uint32 &, Uint32 dkey);
  29.   static void setStoredInTup(Uint32 &, Uint32 storedInTup);
  30.   static void setDynamic(Uint32 &, Uint32 dynamicInd);
  31.   
  32.   static Uint32 getType(const Uint32 &);
  33.   static Uint32 getSize(const Uint32 &);
  34.   static Uint32 getSizeInBytes(const Uint32 &);
  35.   static Uint32 getSizeInWords(const Uint32 &);
  36.   static Uint32 getArrayType(const Uint32 &);
  37.   static Uint32 getArraySize(const Uint32 &);
  38.   static Uint32 getOriginal(const Uint32 &);
  39.   static Uint32 getNullable(const Uint32 &);
  40.   static Uint32 getDGroup(const Uint32 &);
  41.   static Uint32 getDKey(const Uint32 &);
  42.   static Uint32 getPrimaryKey(const Uint32 &);
  43.   static Uint32 getStoredInTup(const Uint32 &);
  44.   static Uint32 getDynamic(const Uint32 &);
  45. };
  46. /**
  47.  *
  48.  * a = Array type            - 2  Bits -> Max 3  (Bit 0-1)
  49.  * t = Attribute type        - 2  Bits -> Max 3  (Bit 2-3)
  50.  * s = Attribute size        - 3  Bits -> Max 7  (Bit 4-6)
  51.  * o = Original attribute    - 1  Bit 7
  52.  * n = Nullable              - 1  Bit 8
  53.  * ? = Stored in tup         - 1  Bit 9 
  54.  * d = Disk based            - 1  Bit 10
  55.  * g = Distribution Group Ind- 1  Bit 11
  56.  * k = Distribution Key Ind  - 1  Bit 12
  57.  * r = Distribution group sz - 1  Bit 13
  58.  * p = Primary key attribute - 1  Bit 14
  59.  * y = Dynamic attribute     - 1  Bit 15
  60.  * z = Array size            - 16 Bits -> Max 65535 (Bit 16-31)
  61.  *
  62.  *           1111111111222222222233
  63.  * 01234567890123456789012345678901
  64.  * aattsss n dgkrpyzzzzzzzzzzzzzzzz
  65.  *               
  66.  */
  67. #define AD_ARRAY_TYPE_SHIFT (0)
  68. #define AD_ARRAY_TYPE_MASK  (3)
  69. #define AD_TYPE_SHIFT       (2)
  70. #define AD_TYPE_MASK        (3)
  71. #define AD_SIZE_SHIFT       (4)
  72. #define AD_SIZE_MASK        (7)
  73. #define AD_SIZE_IN_BYTES_SHIFT (3)
  74. #define AD_SIZE_IN_WORDS_OFFSET (31)
  75. #define AD_SIZE_IN_WORDS_SHIFT  (5)
  76. #define AD_ORIGINAL_SHIFT   (8)
  77. #define AD_NULLABLE_SHIFT   (8)
  78. #define AD_TUP_STORED_SHIFT (9)
  79. #define AD_DISTR_GROUP_SHIFT (11)
  80. #define AD_DISTR_KEY_SHIFT   (12)
  81. #define AD_DISTR_GROUP_SZ    (13)
  82. #define AD_PRIMARY_KEY       (14)
  83. #define AD_DYNAMIC           (15)
  84. #define AD_ARRAY_SIZE_SHIFT  (16)
  85. #define AD_ARRAY_SIZE_MASK   (65535)
  86. inline
  87. void
  88. AttributeDescriptor::setType(Uint32 & desc, Uint32 type){
  89.   ASSERT_MAX(type, AD_TYPE_MASK, "AttributeDescriptor::setType");
  90.   desc |= (type << AD_TYPE_SHIFT);
  91. }
  92. inline
  93. void
  94. AttributeDescriptor::setSize(Uint32 & desc, Uint32 size){
  95.   ASSERT_MAX(size, AD_SIZE_MASK, "AttributeDescriptor::setSize");
  96.   desc |= (size << AD_SIZE_SHIFT);
  97. }
  98. inline
  99. void
  100. AttributeDescriptor::setArray(Uint32 & desc, Uint32 size){
  101.   ASSERT_MAX(size, AD_ARRAY_SIZE_MASK, "AttributeDescriptor::setArray");
  102.   desc |= (size << AD_ARRAY_SIZE_SHIFT);
  103.   if(size <= 1){
  104.     desc |= (size << AD_ARRAY_TYPE_SHIFT);
  105.   } else {
  106.     desc |= (2 << AD_ARRAY_TYPE_SHIFT);
  107.   }
  108. }
  109. inline
  110. void
  111. AttributeDescriptor::setNullable(Uint32 & desc, Uint32 nullable){
  112.   ASSERT_BOOL(nullable, "AttributeDescriptor::setNullable");
  113.   desc |= (nullable << AD_NULLABLE_SHIFT);
  114. }
  115. inline
  116. void
  117. AttributeDescriptor::setOriginal(Uint32 & desc, Uint32 original){
  118.   ASSERT_BOOL(original, "AttributeDescriptor::setOriginal");
  119.   desc |= (original << AD_ORIGINAL_SHIFT);
  120. }
  121. inline
  122. void
  123. AttributeDescriptor::setDGroup(Uint32 & desc, Uint32 dgroup){
  124.   ASSERT_BOOL(dgroup, "AttributeDescriptor::setDGroup");
  125.   desc |= (dgroup << AD_DISTR_GROUP_SHIFT);
  126. }
  127. inline
  128. void
  129. AttributeDescriptor::setDKey(Uint32 & desc, Uint32 dkey){
  130.   ASSERT_BOOL(dkey, "AttributeDescriptor::setDKey");
  131.   desc |= (dkey << AD_DISTR_KEY_SHIFT);
  132. }
  133. inline
  134. void
  135. AttributeDescriptor::setPrimaryKey(Uint32 & desc, Uint32 dkey){
  136.   ASSERT_BOOL(dkey, "AttributeDescriptor::setPrimaryKey");
  137.   desc |= (dkey << AD_PRIMARY_KEY);
  138. }
  139. inline
  140. void
  141. AttributeDescriptor::setStoredInTup(Uint32 & desc, Uint32 storedInTup){
  142.   ASSERT_BOOL(storedInTup, "AttributeDescriptor::setStoredInTup");
  143.   desc |= (storedInTup << AD_TUP_STORED_SHIFT);
  144. }
  145. inline
  146. void
  147. AttributeDescriptor::setDynamic(Uint32 & desc, Uint32 dynamic){
  148.   ASSERT_BOOL(dynamic, "AttributeDescriptor::setDynamic");
  149.   desc |= (dynamic << AD_DYNAMIC);
  150. }
  151. /**
  152.  * Getters
  153.  */
  154. inline
  155. Uint32
  156. AttributeDescriptor::getType(const Uint32 & desc){
  157.   return (desc >> AD_TYPE_SHIFT) & AD_TYPE_MASK;
  158. }
  159. inline
  160. Uint32
  161. AttributeDescriptor::getSize(const Uint32 & desc){
  162.   return (desc >> AD_SIZE_SHIFT) & AD_SIZE_MASK;
  163. }
  164. inline
  165. Uint32
  166. AttributeDescriptor::getSizeInBytes(const Uint32 & desc){
  167.   return (getArraySize(desc) << getSize(desc)) 
  168.                              >> AD_SIZE_IN_BYTES_SHIFT;
  169. }
  170. inline
  171. Uint32
  172. AttributeDescriptor::getSizeInWords(const Uint32 & desc){
  173.   return ((getArraySize(desc) << getSize(desc)) 
  174.           + AD_SIZE_IN_WORDS_OFFSET) 
  175.                               >> AD_SIZE_IN_WORDS_SHIFT;
  176. }
  177. inline
  178. Uint32
  179. AttributeDescriptor::getArrayType(const Uint32 & desc){
  180.   return (desc >> AD_ARRAY_TYPE_SHIFT) & AD_ARRAY_TYPE_MASK;
  181. }
  182. inline
  183. Uint32
  184. AttributeDescriptor::getArraySize(const Uint32 & desc){
  185.   return (desc >> AD_ARRAY_SIZE_SHIFT) & AD_ARRAY_SIZE_MASK;
  186. }
  187. inline
  188. Uint32
  189. AttributeDescriptor::getNullable(const Uint32 & desc){
  190.   return (desc >> AD_NULLABLE_SHIFT) & 1;
  191. }
  192. inline
  193. Uint32
  194. AttributeDescriptor::getOriginal(const Uint32 & desc){
  195.   return (desc >> AD_ORIGINAL_SHIFT) & 1;
  196. }
  197. inline
  198. Uint32
  199. AttributeDescriptor::getDGroup(const Uint32 & desc){
  200.   return (desc >> AD_DISTR_GROUP_SHIFT) & 1;
  201. }
  202. inline
  203. Uint32
  204. AttributeDescriptor::getDKey(const Uint32 & desc){
  205.   return (desc >> AD_DISTR_KEY_SHIFT) & 1;
  206. }
  207. inline
  208. Uint32
  209. AttributeDescriptor::getPrimaryKey(const Uint32 & desc){
  210.   return (desc >> AD_PRIMARY_KEY) & 1;
  211. }
  212. inline
  213. Uint32
  214. AttributeDescriptor::getDynamic(const Uint32 & desc){
  215.   return (desc >> AD_DYNAMIC) & 1;
  216. }
  217. inline
  218. Uint32
  219. AttributeDescriptor::getStoredInTup(const Uint32 & desc){
  220.   return (desc >> AD_TUP_STORED_SHIFT) & 1;
  221. }
  222. #endif