AttributeOffset.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 ATTRIBUTE_OFFSET_HPP
  14. #define ATTRIBUTE_OFFSET_HPP
  15. class AttributeOffset {
  16.   friend class Dbtup;
  17.   
  18. private:
  19.   static void   setOffset(Uint32 & desc, Uint32 offset);
  20.   static void   setCharsetPos(Uint32 & desc, Uint32 offset);
  21.   static void   setNullFlagPos(Uint32 & desc, Uint32 offset);
  22.   static Uint32 getOffset(const Uint32 &);
  23.   static bool   getCharsetFlag(const Uint32 &);
  24.   static Uint32 getCharsetPos(const Uint32 &);
  25.   static Uint32 getNullFlagPos(const Uint32 &);
  26.   static Uint32 getNullFlagOffset(const Uint32 &);
  27.   static Uint32 getNullFlagBitOffset(const Uint32 &);
  28.   static bool   isNULL(const Uint32 &, const Uint32 &);
  29. };
  30. /**
  31.  * Allow for 4096 attributes, all nullable, and for 128 different
  32.  * character sets.
  33.  *
  34.  * a = Attribute offset         - 11 bits  0-10 ( addr word in 8 kb )
  35.  * c = Has charset flag           1  bits 11-11
  36.  * s = Charset pointer position - 7  bits 12-18 ( in table descriptor )
  37.  * f = Null flag offset in word - 5  bits 20-24 ( address 32 bits )
  38.  * w = Null word offset         - 7  bits 25-32 ( f+w addr 4096 attrs )
  39.  *
  40.  *           1111111111222222222233
  41.  * 01234567890123456789012345678901
  42.  * aaaaaaaaaaacsssssss fffffwwwwwww
  43.  */
  44. #define AO_ATTRIBUTE_OFFSET_SHIFT       0
  45. #define AO_ATTRIBUTE_OFFSET_MASK        0x7ff
  46. #define AO_CHARSET_FLAG_SHIFT           11
  47. #define AO_CHARSET_POS_SHIFT            12
  48. #define AO_CHARSET_POS_MASK             127
  49. #define AO_NULL_FLAG_POS_MASK           0xfff   // f+w
  50. #define AO_NULL_FLAG_POS_SHIFT          20
  51. #define AO_NULL_FLAG_WORD_MASK          31      // f
  52. #define AO_NULL_FLAG_OFFSET_SHIFT       5
  53. inline
  54. void
  55. AttributeOffset::setOffset(Uint32 & desc, Uint32 offset){
  56.   ASSERT_MAX(offset, AO_ATTRIBUTE_OFFSET_MASK, "AttributeOffset::setOffset");
  57.   desc |= (offset << AO_ATTRIBUTE_OFFSET_SHIFT);
  58. }
  59. inline
  60. void
  61. AttributeOffset::setCharsetPos(Uint32 & desc, Uint32 offset) {
  62.   ASSERT_MAX(offset, AO_CHARSET_POS_MASK, "AttributeOffset::setCharsetPos");
  63.   desc |= (1 << AO_CHARSET_FLAG_SHIFT);
  64.   desc |= (offset << AO_CHARSET_POS_SHIFT);
  65. }
  66. inline
  67. void
  68. AttributeOffset::setNullFlagPos(Uint32 & desc, Uint32 pos){
  69.   ASSERT_MAX(pos, AO_NULL_FLAG_POS_MASK, "AttributeOffset::setNullFlagPos");
  70.   desc |= (pos << AO_NULL_FLAG_POS_SHIFT);
  71. }
  72. inline
  73. Uint32
  74. AttributeOffset::getOffset(const Uint32 & desc)
  75. {
  76.   return (desc >> AO_ATTRIBUTE_OFFSET_SHIFT) & AO_ATTRIBUTE_OFFSET_MASK;
  77. }
  78. inline
  79. bool
  80. AttributeOffset::getCharsetFlag(const Uint32 & desc)
  81. {
  82.   return (desc >> AO_CHARSET_FLAG_SHIFT) & 1;
  83. }
  84. inline
  85. Uint32
  86. AttributeOffset::getCharsetPos(const Uint32 & desc)
  87. {
  88.   return (desc >> AO_CHARSET_POS_SHIFT) & AO_CHARSET_POS_MASK;
  89. }
  90. inline 
  91. Uint32
  92. AttributeOffset::getNullFlagPos(const Uint32 & desc)
  93. {
  94.   return ((desc >> AO_NULL_FLAG_POS_SHIFT) & AO_NULL_FLAG_POS_MASK);
  95. }
  96. inline
  97. Uint32
  98. AttributeOffset::getNullFlagOffset(const Uint32 & desc)
  99. {
  100.   return (getNullFlagPos(desc) >> AO_NULL_FLAG_OFFSET_SHIFT);
  101. }
  102. inline
  103. Uint32
  104. AttributeOffset::getNullFlagBitOffset(const Uint32 & desc)
  105. {
  106.   return (getNullFlagPos(desc) & AO_NULL_FLAG_WORD_MASK);
  107. }
  108. inline
  109. bool
  110. AttributeOffset::isNULL(const Uint32 & pageWord, const Uint32 & desc)
  111. {
  112.   return (((pageWord >> getNullFlagBitOffset(desc)) & 1) == 1);
  113. }
  114. #endif