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

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 DICT_TAB_INFO_HPP
  14. #define DICT_TAB_INFO_HPP
  15. #include "SignalData.hpp"
  16. #include <AttributeDescriptor.hpp>
  17. #include <SimpleProperties.hpp>
  18. #include <ndb_limits.h>
  19. #include <trigger_definitions.h>
  20. #include <NdbSqlUtil.hpp>
  21. #define DTIMAP(x, y, z) 
  22.   { DictTabInfo::y, offsetof(x, z), SimpleProperties::Uint32Value, 0, (~0), 0 }
  23. #define DTIMAP2(x, y, z, u, v) 
  24.   { DictTabInfo::y, offsetof(x, z), SimpleProperties::Uint32Value, u, v, 0 }
  25. #define DTIMAPS(x, y, z, u, v) 
  26.   { DictTabInfo::y, offsetof(x, z), SimpleProperties::StringValue, u, v, 0 }
  27. #define DTIMAPB(x, y, z, u, v, l) 
  28.   { DictTabInfo::y, offsetof(x, z), SimpleProperties::BinaryValue, u, v, 
  29.                      offsetof(x, l) }
  30. #define DTIBREAK(x) 
  31.   { DictTabInfo::x, 0, SimpleProperties::InvalidValue, 0, 0, 0 }
  32. class DictTabInfo {
  33.   /**
  34.    * Sender(s) / Reciver(s)
  35.    */
  36.   // Blocks
  37.   friend class Backup;
  38.   friend class Dbdict;
  39.   friend class Ndbcntr;
  40.   friend class Trix;
  41.   friend class DbUtil;
  42.   // API
  43.   friend class NdbSchemaOp;
  44.   
  45.   /**
  46.    * For printing
  47.    */
  48.   friend bool printDICTTABINFO(FILE * output, 
  49.                                const Uint32 * theData, 
  50.                                Uint32 len, 
  51.                                Uint16 receiverBlockNo);
  52. public:
  53.   enum RequestType {
  54.     CreateTableFromAPI  = 1,
  55.     AddTableFromDict    = 2, // Between DICT's
  56.     CopyTable           = 3, // Between DICT's
  57.     ReadTableFromDiskSR = 4, // Local in DICT
  58.     GetTabInfoConf      = 5,
  59.     AlterTableFromAPI  = 6
  60.   };
  61.   enum KeyValues {
  62.     TableName          = 1,  // String, Mandatory
  63.     TableId            = 2,  //Mandatory between DICT's otherwise not allowed
  64.     TableVersion       = 3,  //Mandatory between DICT's otherwise not allowed
  65.     TableLoggedFlag    = 4,  //Default Logged
  66.     NoOfKeyAttr        = 5,  //Default 1
  67.     NoOfAttributes     = 6,  //Mandatory
  68.     NoOfNullable       = 7,  //Deafult 0
  69.     NoOfVariable       = 8,  //Default 0
  70.     TableKValue        = 9,  //Default 6
  71.     MinLoadFactor      = 10, //Default 70
  72.     MaxLoadFactor      = 11, //Default 80
  73.     KeyLength          = 12, //Default 1  (No of words in primary key)
  74.     FragmentTypeVal    = 13, //Default AllNodesSmallTable
  75.     TableStorageVal    = 14, //Default StorageType::MainMemory
  76.     ScanOptimised      = 15, //Default updateOptimised
  77.     FragmentKeyTypeVal = 16, //Default PrimaryKey
  78.     SecondTableId      = 17, //Mandatory between DICT's otherwise not allowed
  79.     TableTypeVal       = 18, //Default TableType::UserTable
  80.     PrimaryTable       = 19, //Mandatory for index otherwise RNIL
  81.     PrimaryTableId     = 20, //ditto
  82.     IndexState         = 21,
  83.     InsertTriggerId    = 22,
  84.     UpdateTriggerId    = 23,
  85.     DeleteTriggerId    = 24,
  86.     CustomTriggerId    = 25,
  87.     FrmLen             = 26,
  88.     FrmData            = 27,
  89.     FragmentCount      = 128, // No of fragments in table (!fragment replicas)
  90.     TableEnd           = 999,
  91.     
  92.     AttributeName          = 1000, // String, Mandatory
  93.     AttributeId        = 1001, //Mandatory between DICT's otherwise not allowed
  94.     AttributeType          = 1002, //Default UnSignedType
  95.     AttributeSize          = 1003, //Default DictTabInfo::a32Bit
  96.     AttributeArraySize     = 1005, //Default 1
  97.     AttributeKeyFlag       = 1006, //Default noKey
  98.     AttributeStorage       = 1007, //Default MainMemory
  99.     AttributeNullableFlag  = 1008, //Default NotNullable
  100.     AttributeDGroup        = 1009, //Default NotDGroup
  101.     AttributeDKey          = 1010, //Default NotDKey
  102.     AttributeStoredInd     = 1011, //Default NotStored
  103.     AttributeGroup         = 1012, //Default 0
  104.     AttributeExtType       = 1013, //Default 0 (undefined)
  105.     AttributeExtPrecision  = 1014, //Default 0
  106.     AttributeExtScale      = 1015, //Default 0
  107.     AttributeExtLength     = 1016, //Default 0
  108.     AttributeAutoIncrement = 1017, //Default false
  109.     AttributeDefaultValue  = 1018, //Default value (printable string)
  110.     AttributeEnd           = 1999  //
  111.   };
  112.   // ----------------------------------------------------------------------
  113.   // Part of the protocol is that we only transfer parameters which do not
  114.   // have a default value. Thus the default values are part of the protocol.
  115.   // ----------------------------------------------------------------------
  116.   // FragmentKeyType constants
  117.   enum FragmentKeyType { 
  118.     PrimaryKey = 0,
  119.     DistributionKey = 1,
  120.     DistributionGroup = 2
  121.   };
  122.   
  123.   // FragmentType constants
  124.   enum FragmentType {
  125.     AllNodesSmallTable = 0,
  126.     AllNodesMediumTable = 1,
  127.     AllNodesLargeTable = 2,
  128.     SingleFragment = 3
  129.   };
  130.   
  131.   // TableStorage AND AttributeStorage constants
  132.   enum StorageType {
  133.     MainMemory = 0,
  134.     DiskMemory = 1
  135.   };
  136.   // TableType constants + objects
  137.   enum TableType {
  138.     UndefTableType = 0,
  139.     SystemTable = 1,
  140.     UserTable = 2,
  141.     UniqueHashIndex = 3,
  142.     HashIndex = 4,
  143.     UniqueOrderedIndex = 5,
  144.     OrderedIndex = 6,
  145.     // constant 10 hardcoded in Dbdict.cpp
  146.     HashIndexTrigger = 10 + TriggerType::SECONDARY_INDEX,
  147.     SubscriptionTrigger = 10 + TriggerType::SUBSCRIPTION,
  148.     ReadOnlyConstraint = 10 + TriggerType::READ_ONLY_CONSTRAINT,
  149.     IndexTrigger = 10 + TriggerType::ORDERED_INDEX
  150.   };
  151.   static inline bool
  152.   isTable(int tableType) {
  153.     return
  154.       tableType == SystemTable ||
  155.       tableType == UserTable;
  156.   }
  157.   static inline bool
  158.   isIndex(int tableType) {
  159.     return
  160.       tableType == UniqueHashIndex ||
  161.       tableType == HashIndex ||
  162.       tableType == UniqueOrderedIndex ||
  163.       tableType == OrderedIndex;
  164.   }
  165.   static inline bool
  166.   isUniqueIndex(int tableType) {
  167.     return
  168.       tableType == UniqueHashIndex ||
  169.       tableType == UniqueOrderedIndex;
  170.   }
  171.   static inline bool
  172.   isNonUniqueIndex(int tableType) {
  173.     return
  174.       tableType == HashIndex ||
  175.       tableType == OrderedIndex;
  176.   }
  177.   static inline bool
  178.   isHashIndex(int tableType) {
  179.     return
  180.       tableType == UniqueHashIndex ||
  181.       tableType == HashIndex;
  182.   }
  183.   static inline bool
  184.   isOrderedIndex(int tableType) {
  185.     return
  186.       tableType == UniqueOrderedIndex ||
  187.       tableType == OrderedIndex;
  188.   }
  189.   // Object state for translating from/to API
  190.   enum ObjectState {
  191.     StateUndefined = 0,
  192.     StateOffline = 1,
  193.     StateBuilding = 2,
  194.     StateDropping = 3,
  195.     StateOnline = 4,
  196.     StateBackup = 5,
  197.     StateBroken = 9
  198.   };
  199.   // Object store for translating from/to API
  200.   enum ObjectStore {
  201.     StoreUndefined = 0,
  202.     StoreTemporary = 1,
  203.     StorePermanent = 2
  204.   };
  205.   
  206.   // ScanOptimised constants
  207.   STATIC_CONST( updateOptimised = 0 );
  208.   STATIC_CONST( scanOptimised = 1 );
  209.   
  210.   // AttributeType constants
  211.   STATIC_CONST( SignedType = 0 );
  212.   STATIC_CONST( UnSignedType = 1 );
  213.   STATIC_CONST( FloatingPointType = 2 );
  214.   STATIC_CONST( StringType = 3 );
  215.   
  216.   // AttributeSize constants
  217.   STATIC_CONST( an8Bit = 3 );
  218.   STATIC_CONST( a16Bit = 4 );
  219.   STATIC_CONST( a32Bit = 5 );
  220.   STATIC_CONST( a64Bit = 6 );
  221.   STATIC_CONST( a128Bit = 7 );
  222.   
  223.   // AttributeDGroup constants
  224.   STATIC_CONST( NotDGroup = 0 );
  225.   STATIC_CONST( DGroup = 1 );
  226.   
  227.   // AttributeDKey constants
  228.   STATIC_CONST( NotDKey = 0 );
  229.   STATIC_CONST( DKey = 1 );
  230.   
  231.   // AttributeStoredInd constants
  232.   STATIC_CONST( NotStored = 0 );
  233.   STATIC_CONST( Stored = 1 );
  234.  
  235.   // Table data interpretation
  236.   struct Table {
  237.     char   TableName[MAX_TAB_NAME_SIZE];
  238.     Uint32 TableId;
  239.     Uint32 SecondTableId;
  240.     char   PrimaryTable[MAX_TAB_NAME_SIZE]; // Only used when "index"
  241.     Uint32 PrimaryTableId;
  242.     Uint32 TableLoggedFlag;
  243.     Uint32 NoOfKeyAttr;
  244.     Uint32 NoOfAttributes;
  245.     Uint32 NoOfNullable;
  246.     Uint32 NoOfVariable;
  247.     Uint32 TableKValue;
  248.     Uint32 MinLoadFactor;
  249.     Uint32 MaxLoadFactor;
  250.     Uint32 KeyLength;
  251.     Uint32 FragmentType;
  252.     Uint32 TableStorage;
  253.     Uint32 ScanOptimised;
  254.     Uint32 FragmentKeyType;
  255.     Uint32 TableType;
  256.     Uint32 TableVersion;
  257.     Uint32 IndexState;
  258.     Uint32 InsertTriggerId;
  259.     Uint32 UpdateTriggerId;
  260.     Uint32 DeleteTriggerId;
  261.     Uint32 CustomTriggerId;
  262.     Uint32 FrmLen;
  263.     char   FrmData[MAX_FRM_DATA_SIZE];
  264.     Uint32 FragmentCount;
  265.     void init();
  266.   };
  267.   static const
  268.   SimpleProperties::SP2StructMapping TableMapping[];
  269.   static const Uint32 TableMappingSize;
  270.   // AttributeExtType values
  271.   enum ExtType {
  272.     ExtUndefined = NdbSqlUtil::Type::Undefined,
  273.     ExtTinyint = NdbSqlUtil::Type::Tinyint,
  274.     ExtTinyunsigned = NdbSqlUtil::Type::Tinyunsigned,
  275.     ExtSmallint = NdbSqlUtil::Type::Smallint,
  276.     ExtSmallunsigned = NdbSqlUtil::Type::Smallunsigned,
  277.     ExtMediumint = NdbSqlUtil::Type::Mediumint,
  278.     ExtMediumunsigned = NdbSqlUtil::Type::Mediumunsigned,
  279.     ExtInt = NdbSqlUtil::Type::Int,
  280.     ExtUnsigned = NdbSqlUtil::Type::Unsigned,
  281.     ExtBigint = NdbSqlUtil::Type::Bigint,
  282.     ExtBigunsigned = NdbSqlUtil::Type::Bigunsigned,
  283.     ExtFloat = NdbSqlUtil::Type::Float,
  284.     ExtDouble = NdbSqlUtil::Type::Double,
  285.     ExtOlddecimal = NdbSqlUtil::Type::Olddecimal,
  286.     ExtOlddecimalunsigned = NdbSqlUtil::Type::Olddecimalunsigned,
  287.     ExtChar = NdbSqlUtil::Type::Char,
  288.     ExtVarchar = NdbSqlUtil::Type::Varchar,
  289.     ExtBinary = NdbSqlUtil::Type::Binary,
  290.     ExtVarbinary = NdbSqlUtil::Type::Varbinary,
  291.     ExtDatetime = NdbSqlUtil::Type::Datetime,
  292.     ExtDate = NdbSqlUtil::Type::Date,
  293.     ExtBlob = NdbSqlUtil::Type::Blob,
  294.     ExtText = NdbSqlUtil::Type::Text,
  295.     ExtTime = NdbSqlUtil::Type::Time,
  296.     ExtYear = NdbSqlUtil::Type::Year,
  297.     ExtTimestamp = NdbSqlUtil::Type::Timestamp
  298.   };
  299.   // Attribute data interpretation
  300.   struct Attribute {
  301.     char   AttributeName[MAX_TAB_NAME_SIZE];
  302.     Uint32 AttributeId;
  303.     Uint32 AttributeType;
  304.     Uint32 AttributeSize;
  305.     Uint32 AttributeArraySize;
  306.     Uint32 AttributeKeyFlag;
  307.     Uint32 AttributeStorage;
  308.     Uint32 AttributeNullableFlag;
  309.     Uint32 AttributeDGroup;
  310.     Uint32 AttributeDKey;
  311.     Uint32 AttributeStoredInd;
  312.     Uint32 AttributeGroup;
  313.     Uint32 AttributeExtType;
  314.     Uint32 AttributeExtPrecision;
  315.     Uint32 AttributeExtScale;
  316.     Uint32 AttributeExtLength;
  317.     Uint32 AttributeAutoIncrement;
  318.     char   AttributeDefaultValue[MAX_ATTR_DEFAULT_VALUE_SIZE];
  319.     
  320.     void init();
  321.     inline
  322.     Uint32 sizeInWords()
  323.     {
  324.       return ((1 << AttributeSize) * AttributeArraySize + 31) >> 5;
  325.     }
  326.     // translate to old kernel types and sizes
  327.     inline bool
  328.     translateExtType() {
  329.       switch (AttributeExtType) {
  330.       case DictTabInfo::ExtUndefined:
  331.         break;
  332.       case DictTabInfo::ExtTinyint:
  333.         AttributeType = DictTabInfo::SignedType;
  334.         AttributeSize = DictTabInfo::an8Bit;
  335.         AttributeArraySize = AttributeExtLength;
  336. return true;
  337.       case DictTabInfo::ExtTinyunsigned:
  338.         AttributeType = DictTabInfo::UnSignedType;
  339.         AttributeSize = DictTabInfo::an8Bit;
  340.         AttributeArraySize = AttributeExtLength;
  341. return true;
  342.       case DictTabInfo::ExtSmallint:
  343.         AttributeType = DictTabInfo::SignedType;
  344.         AttributeSize = DictTabInfo::a16Bit;
  345.         AttributeArraySize = AttributeExtLength;
  346. return true;
  347.       case DictTabInfo::ExtSmallunsigned:
  348.         AttributeType = DictTabInfo::UnSignedType;
  349.         AttributeSize = DictTabInfo::a16Bit;
  350.         AttributeArraySize = AttributeExtLength;
  351. return true;
  352.       case DictTabInfo::ExtMediumint:
  353.         AttributeType = DictTabInfo::SignedType;
  354.         AttributeSize = DictTabInfo::an8Bit;
  355.         AttributeArraySize = 3 * AttributeExtLength;
  356. return true;
  357.       case DictTabInfo::ExtMediumunsigned:
  358.         AttributeType = DictTabInfo::UnSignedType;
  359.         AttributeSize = DictTabInfo::an8Bit;
  360.         AttributeArraySize = 3 * AttributeExtLength;
  361. return true;
  362.       case DictTabInfo::ExtInt:
  363.         AttributeType = DictTabInfo::SignedType;
  364.         AttributeSize = DictTabInfo::a32Bit;
  365.         AttributeArraySize = AttributeExtLength;
  366.         return true;
  367.       case DictTabInfo::ExtUnsigned:
  368.         AttributeType = DictTabInfo::UnSignedType;
  369.         AttributeSize = DictTabInfo::a32Bit;
  370.         AttributeArraySize = AttributeExtLength;
  371.         return true;
  372.       case DictTabInfo::ExtBigint:
  373.         AttributeType = DictTabInfo::SignedType;
  374.         AttributeSize = DictTabInfo::a64Bit;
  375.         AttributeArraySize = AttributeExtLength;
  376.         return true;
  377.       case DictTabInfo::ExtBigunsigned:
  378.         AttributeType = DictTabInfo::UnSignedType;
  379.         AttributeSize = DictTabInfo::a64Bit;
  380.         AttributeArraySize = AttributeExtLength;
  381.         return true;
  382.       case DictTabInfo::ExtFloat:
  383.         AttributeType = DictTabInfo::FloatingPointType;
  384.         AttributeSize = DictTabInfo::a32Bit;
  385.         AttributeArraySize = AttributeExtLength;
  386.         return true;
  387.       case DictTabInfo::ExtDouble:
  388.         AttributeType = DictTabInfo::FloatingPointType;
  389.         AttributeSize = DictTabInfo::a64Bit;
  390.         AttributeArraySize = AttributeExtLength;
  391.         return true;
  392.       case DictTabInfo::ExtOlddecimal:
  393.         AttributeType = DictTabInfo::StringType;
  394.         AttributeSize = DictTabInfo::an8Bit;
  395.         AttributeArraySize =
  396.           (1 + AttributeExtPrecision + (int(AttributeExtScale) > 0)) *
  397.           AttributeExtLength;
  398.         return true;
  399.       case DictTabInfo::ExtOlddecimalunsigned:
  400.         AttributeType = DictTabInfo::StringType;
  401.         AttributeSize = DictTabInfo::an8Bit;
  402.         AttributeArraySize =
  403.           (0 + AttributeExtPrecision + (int(AttributeExtScale) > 0)) *
  404.           AttributeExtLength;
  405.         return true;
  406.       case DictTabInfo::ExtChar:
  407.       case DictTabInfo::ExtBinary:
  408.         AttributeType = DictTabInfo::StringType;
  409.         AttributeSize = DictTabInfo::an8Bit;
  410.         AttributeArraySize = AttributeExtLength;
  411.         return true;
  412.       case DictTabInfo::ExtVarchar:
  413.       case DictTabInfo::ExtVarbinary:
  414.         AttributeType = DictTabInfo::StringType;
  415.         AttributeSize = DictTabInfo::an8Bit;
  416.         AttributeArraySize = AttributeExtLength + 2;
  417.         return true;
  418.       case DictTabInfo::ExtDatetime:
  419.         AttributeType = DictTabInfo::StringType;
  420.         AttributeSize = DictTabInfo::an8Bit;
  421.         AttributeArraySize = 8 * AttributeExtLength;
  422.         return true;
  423.       case DictTabInfo::ExtDate:
  424.         AttributeType = DictTabInfo::StringType;
  425.         AttributeSize = DictTabInfo::an8Bit;
  426.         AttributeArraySize = 3 * AttributeExtLength;
  427.         return true;
  428.       case DictTabInfo::ExtBlob:
  429.       case DictTabInfo::ExtText:
  430.         AttributeType = DictTabInfo::StringType;
  431.         AttributeSize = DictTabInfo::an8Bit;
  432.         // head + inline part [ attr precision lower half ]
  433.         AttributeArraySize = (NDB_BLOB_HEAD_SIZE << 2) + (AttributeExtPrecision & 0xFFFF);
  434.         return true;
  435.       case DictTabInfo::ExtTime:
  436.         AttributeType = DictTabInfo::StringType;
  437.         AttributeSize = DictTabInfo::an8Bit;
  438.         AttributeArraySize = 3 * AttributeExtLength;
  439.         return true;
  440.       case DictTabInfo::ExtYear:
  441.         AttributeType = DictTabInfo::StringType;
  442.         AttributeSize = DictTabInfo::an8Bit;
  443.         AttributeArraySize = 1 * AttributeExtLength;
  444.         return true;
  445.       case DictTabInfo::ExtTimestamp:
  446.         AttributeType = DictTabInfo::StringType;
  447.         AttributeSize = DictTabInfo::an8Bit;
  448.         AttributeArraySize = 4 * AttributeExtLength;
  449.         return true;
  450.       };
  451.       return false;
  452.     }
  453.     
  454.     inline void print(FILE *out) {
  455.       fprintf(out, "AttributeId = %dn", AttributeId);
  456.       fprintf(out, "AttributeType = %dn", AttributeType);
  457.       fprintf(out, "AttributeSize = %dn", AttributeSize);
  458.       fprintf(out, "AttributeArraySize = %dn", AttributeArraySize);
  459.       fprintf(out, "AttributeKeyFlag = %dn", AttributeKeyFlag);
  460.       fprintf(out, "AttributeStorage = %dn", AttributeStorage);
  461.       fprintf(out, "AttributeNullableFlag = %dn", AttributeNullableFlag);
  462.       fprintf(out, "AttributeDGroup = %dn", AttributeDGroup);
  463.       fprintf(out, "AttributeDKey = %dn", AttributeDKey);
  464.       fprintf(out, "AttributeStoredInd = %dn", AttributeStoredInd);
  465.       fprintf(out, "AttributeGroup = %dn", AttributeGroup);
  466.       fprintf(out, "AttributeAutoIncrement = %dn", AttributeAutoIncrement);
  467.       fprintf(out, "AttributeExtType = %dn", AttributeExtType);
  468.       fprintf(out, "AttributeExtPrecision = %dn", AttributeExtPrecision);
  469.       fprintf(out, "AttributeExtScale = %dn", AttributeExtScale);
  470.       fprintf(out, "AttributeExtLength = %dn", AttributeExtLength);
  471.       fprintf(out, "AttributeDefaultValue = "%s"n",
  472.         AttributeDefaultValue ? AttributeDefaultValue : "");
  473.     }
  474.   };
  475.   
  476.   static const
  477.   SimpleProperties::SP2StructMapping AttributeMapping[];
  478.   static const Uint32 AttributeMappingSize;
  479.   // Signal constants
  480.   STATIC_CONST( DataLength = 20 );
  481.   STATIC_CONST( HeaderLength = 5 );
  482. private:  
  483.   Uint32 senderRef;
  484.   Uint32 senderData;
  485.   Uint32 requestType;
  486.   Uint32 totalLen; 
  487.   Uint32 offset; 
  488.   
  489.   /**
  490.    * Length of this data = signal->length() - HeaderLength
  491.    * Sender block ref = signal->senderBlockRef()
  492.    */
  493.   
  494.   Uint32 tabInfoData[DataLength];
  495. };
  496. #endif