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

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 NdbSchemaOp_H
  14. #define NdbSchemaOp_H
  15. #include <NdbDictionary.hpp>
  16. #ifndef DOXYGEN_SHOULD_SKIP_DEPRECATED
  17.   /**
  18.    * Type of attribute
  19.    *
  20.    * NOTE! AttrType is deprecated, use NdbDictionary::Column::Type instead!
  21.    */
  22.   enum AttrType { 
  23.     Signed,           ///< Attributes of this type can be read with:
  24.                       ///< NdbRecAttr::int64_value, 
  25.                       ///< NdbRecAttr::int32_value,
  26.                       ///< NdbRecAttr::short_value, 
  27.                       ///< NdbRecAttr::char_value
  28.     UnSigned,         ///< Attributes of this type can be read with:
  29.                       ///< NdbRecAttr::u_64_value, 
  30.                       ///< NdbRecAttr::u_32_value,
  31.                       ///< NdbRecAttr::u_short_value, 
  32.                       ///< NdbRecAttr::u_char_value
  33.     Float,            ///< Attributes of this type can be read with:
  34.                       ///< NdbRecAttr::float_value and 
  35.                       ///< NdbRecAttr::double_value
  36.     String,           ///< Attributes of this type can be read with:
  37.                       ///< NdbRecAttr::aRef, 
  38.                       ///< NdbRecAttr::getAttributeObject
  39.     NoAttrTypeDef     ///< Used for debugging only
  40.   };
  41.   /**
  42.    * @deprecated
  43.    */
  44.   enum NullAttributeType { 
  45.     NoNullTypeDefined = -1,
  46.     NotNullAttribute, 
  47.     NullAttribute,
  48.     AttributeDefined 
  49.   };
  50.   /**
  51.    * Indicates whether the attribute is part of a primary key or not
  52.    */
  53.   enum KeyType { 
  54.     Undefined = -1,               ///< Used for debugging only
  55.     NoKey,                        ///< Attribute is not part of primary key 
  56.                                   ///< or tuple identity
  57.     TupleKey,                     ///< Attribute is part of primary key
  58.     TupleId                       ///< Attribute is part of tuple identity 
  59.                                   ///< (This type of attribute is created 
  60.                                   ///< internally, and should not be 
  61.                                   ///< manually created.)
  62.   };
  63.   /**
  64.    * Indicate whether the attribute should be stored on disk or not
  65.    */
  66.   enum StorageMode { 
  67.     MMBased = 0,                  ///< Main memory 
  68.     DiskBased = 1,                ///< Disk (Not yet supported.)
  69.     NoStorageTypeDef              ///< Used for debugging only
  70.   };
  71.   
  72.   /**
  73.    * Where attribute is stored.
  74.    *
  75.    * This is used to indicate whether a primary key
  76.    * should only be stored in the index storage and not in the data storage
  77.    * or if it should be stored in both places.
  78.    * The first alternative makes the attribute take less space, 
  79.    * but makes it impossible to scan using attribute.
  80.    *
  81.    * @note  Use NormalStorageAttribute for most cases.
  82.    *        (IndexStorageAttribute should only be used on primary key 
  83.    *        attributes and only if you do not want to scan using the attribute.)
  84.    */
  85.   enum StorageAttributeType { 
  86.     NoStorageAttributeTypeDefined = -1,  ///< <i>Missing explanation</i>
  87.     IndexStorageAttribute,               ///< Attribute is only stored in 
  88.                                          ///< index storage (ACC)
  89.     NormalStorageAttribute               ///< Attribute values are stored 
  90.                                          ///< both in the index (ACC) and 
  91.                                          ///< in the data storage (TUP)
  92.   };
  93.   
  94.   
  95.   /**
  96.    *  Type of fragmentation used for a table
  97.    */
  98.   enum FragmentType { 
  99.     Default = 0,                  ///<  (All is default!)
  100.     Single = 1,                   ///< Only one fragment
  101.     All = 2,                      ///< Default value.  One fragment per node group
  102.     DistributionGroup = 3,        ///< Distribution Group used for fragmentation.
  103.                                   ///< One fragment per node group
  104.     DistributionKey = 4,          ///< Distribution Key used for fragmentation.
  105.                                   ///< One fragment per node group.
  106.     AllLarge = 5,                 ///< Sixten fragments per node group.
  107.     DGroupLarge = 6,              ///< Distribution Group used for fragmentation.
  108.                                   ///< Sixten fragments per node group
  109.     DKeyLarge = 7                 ///< Distribution Key used for fragmentation.
  110.                                   ///< Sixten fragments per node group
  111.   };
  112.   
  113.   /**
  114.    *  Type of table or index.
  115.    */
  116.   enum TableType {
  117.     UndefTableType = 0,
  118.     SystemTable = 1,              ///< Internal.Table cannot be updated by user
  119.     UserTable = 2,                  ///< Normal application table
  120.     UniqueHashIndex = 3,          ///< Unique un-ordered hash index
  121.     HashIndex = 4,                ///< Non-unique un-ordered hash index
  122.     UniqueOrderedIndex = 5,       ///< Unique ordered index
  123.     OrderedIndex = 6              ///< Non-unique ordered index
  124.   };
  125. class NdbSchemaCon;
  126. class Ndb;
  127.   
  128. /** 
  129.  * @class NdbSchemaOp
  130.  * @brief Represents various operations for use in schema transactions
  131.  *
  132.  * This class is used for schema operations, e.g. creating tables and
  133.  * attributes.
  134.  *
  135.  * The NdbSchemaOp object is created using NdbSchemaCon::getNdbSchemaOp.
  136.  * 
  137.  * @note  This class is depricated and is now replaced with the class
  138.  *        NdbDictionary.
  139.  */
  140. class NdbSchemaOp 
  141. {
  142.   friend class Ndb;
  143.   friend class NdbSchemaCon;
  144. public:
  145.   
  146.   /**
  147.    * Create a new table in the database.
  148.    * 
  149.    * @note The NdbSchemaCon should be closed with 
  150.    *       Ndb::closeSchemaTransaction, even if this method fails.
  151.    *
  152.    * @param  aTableName   Table name.  Should not be NULL.
  153.    * @param  aTableSize   (Performance parameter.)
  154.    *                      Initial size of the data part of the table
  155.    *                      expressed in kByte. 
  156.    *                      The database handles
  157.    *    bad parameter setting but at a certain 
  158.    *                      loss in performance.
  159.    *                      The size given here is
  160.    *    the initial size allocated for the table 
  161.    *                      storage (the data part).
  162.    *    When calculating the data storage one should 
  163.    *                      add the size of all attributes (each attribute
  164.    *                      consumes at least 4 bytes) and also an overhead
  165.    *                      of 12 byte. 
  166.    *                      Variable size attributes (not supported yet)
  167.    *    will have a size of 12 bytes plus the actual 
  168.    *                      data storage parts where there is an 
  169.    *                      additional overhead based on the size of the
  170.    *    variable part.
  171.    *                      <br>
  172.    *                    An example table with 5 attributes: 
  173.    *                      one 64 bit attribute, one 32 bit attribute, 
  174.    *                      two 16 bit attributes and one array of 64 8 bits. 
  175.    *                      This table will consume 
  176.    *                        12 (overhead) + 8 + 4 + 2*4 (4 is minimum) + 64 = 
  177.    *                        96 bytes per record.
  178.    *                    Additionally an overhead of about 2 % as page 
  179.    *                      headers and waste should be allocated. 
  180.    *                      Thus, 1 million records should consume 96 MBytes
  181.    *                    plus the overhead 2 MByte and rounded up to 
  182.    *                      100 000 kBytes.
  183.    *                      <br><em>
  184.    *                      This parameter is currently not used.
  185.    *                      </em>
  186.    * @param  aTupleKey   Indicates if the table has a primary key or not.
  187.    *    <br>
  188.    *                        <b>TupleKey</b> means that a <em>primary key</em> 
  189.    *                        consisting of one to four attributes
  190.    *      (at most one of variable size) 
  191.    *                        uniquely identifies each record in the created
  192.    *                        table.
  193.    *      <br>
  194.    *                        <b>TupleId</b> means that a <em>tuple identity</em>
  195.    *                        is used.  The tuple identity is 
  196.    *                        a unique key indentifying each record of the 
  197.    *                        created table.
  198.    *                        The tuple identity is a (non-stored)
  199.    *                        64 bit attribute named <b>NDB$TID</b>.
  200.    *      <br>
  201.    *                        When inserting a record (tuple), the method 
  202.    *                        NdbOperation::setTupleId 
  203.    *                        will generate a unique tuple identity
  204.    *                        and return it to the user. 
  205.    *                        <br>
  206.    *                        When reading, updating or deleting a record
  207.    *                        in a table with <b>TupleId</b>,
  208.    *                        NdbOperation::equal("NDB$TID", value_Uint64)
  209.    *                        can be used to identify the record.
  210.    *                        <br>
  211.    *                        Legal values: TupleKey or TupleId.
  212.    * @param aNrOfPages   (Performance parameter.)
  213.    *                      Specifies the initial size of the index storage. 
  214.    *                      When calculating the index storage,
  215.    *    each key has approximately 14 byte of 
  216.    *                      overhead plus the size of the key. 
  217.    *                      Each key attribute takes up at least 4 bytes 
  218.    *                      of storage. 
  219.    *                      Thus a mixed key consisting of a 
  220.    *                      64 bit attribute, a 32 bit attribute
  221.    *    and a 16 bit attribute will 
  222.    *                      consume approx. 30 bytes per key.
  223.    *    Thus, the if initial size is to be 1 million rows,
  224.    *                      then aNrOfPages should be set to 
  225.    *                      30 M / 8k = 2670 pages.
  226.    *                      <br><em>
  227.    *                      This parameter is currently not used.
  228.    *                       </em>
  229.    * @param aFragmentType Type of fragmentation.<br>
  230.    *                      <b>All</b> (default) means that the 
  231.    *                      table fragments are automatically 
  232.    *                      distributed on all nodes in the system.<br>
  233.    *                      <b>DistributionGroup</b> and 
  234.    *                      <b>DistributionKey</b> are 
  235.    *                      also supported. For further details about
  236.    *                      these types see the documentation of 
  237.    *                      Ndb::startTransaction.
  238.    * @param aKValue   (Hash parameter.)
  239.    *                      Only allowed value is 6.
  240.    *                      Later implementations might add flexibility
  241.    *    in this parameter.
  242.    * @param aMinLoadFactor  (Hash parameter.)
  243.    *                        This value specifies the load factor when 
  244.    *                        starting to shrink the hash table. 
  245.    *                        It must be smaller than aMaxLoadFactor.
  246.    *                        Both these factors are given in percentage.
  247.    * @param aMaxLoadFactor  (Hash parameter.)
  248.    *                        This value specifies the load factor when 
  249.    *                        starting to split the containers in the local
  250.    *                        hash tables. 100 is the maximum which will
  251.    *            optimize memory usage (this is the figure 
  252.    *                        used for the above calculations).
  253.    *              A lower figure will store less information in 
  254.    *                        each container and thus
  255.    *              find the key faster but consume more memory.
  256.    * @param aMemoryType     Currently only 1 is allowed which specifies 
  257.    *                        storage of table in main memory. 
  258.    *                        Later 2 will be added where the table is stored
  259.    *              completely on disk 
  260.    *                        and 3 where the index is in main memory but
  261.    *              data is on disk. 
  262.    *                        If 1 is chosen an individual attribute can
  263.    *              still be specified as a disk attribute.
  264.    * @param aStoredTable    If set to false it indicates that the table is 
  265.    *                        a temporary table and should not be logged 
  266.    *                        to disk.
  267.    *                        In case of a system restart the table will still
  268.    *                 be defined and exist but will be empty. 
  269.    *                        Thus no checkpointing and
  270.    *              no logging is performed on the table.
  271.    *      The default value is true and indicates a 
  272.    *                        normal table with full checkpointing and 
  273.    *                        logging activated.
  274.    * @return                Returns 0 when successful and returns -1 otherwise.
  275.    */
  276.   int createTable( const char* aTableName, 
  277. Uint32 aTableSize = 8, 
  278. KeyType aTupleKey = TupleKey,
  279. int aNrOfPages = 2, 
  280. FragmentType aFragmentType = All, 
  281. int aKValue = 6,
  282. int aMinLoadFactor = 78,
  283. int aMaxLoadFactor = 80,
  284. int aMemoryType = 1,
  285. bool aStoredTable = true);
  286.   /** 
  287.    * This is the old function declaration, don't use.
  288.    *
  289.    * @deprecated do not use!
  290.    */
  291. #ifndef NDB_WIN32
  292.   inline int createTable( const char* aTableName, 
  293. Uint32 aTableSize, 
  294. KeyType aTupleKey,
  295. int aNrOfPages, 
  296. FragmentType aFragmentType, 
  297. int aKValue,
  298. int aMinLoadFactor,
  299. int aMaxLoadFactor,
  300. int aMemoryType,
  301. int aStoredTable){
  302.     return createTable(aTableName, 
  303.                        aTableSize, 
  304.                        aTupleKey,                        
  305.                        aNrOfPages, 
  306.                        aFragmentType, 
  307.                        aKValue, 
  308.                        aMinLoadFactor, 
  309.                        aMaxLoadFactor, 
  310.                        aMemoryType, 
  311.                        (aStoredTable == 1 ? true : false));
  312.   }
  313. #endif
  314.   /**
  315.    * Add a new attribute to a database table.
  316.    *
  317.    * Attributes can only be added to a table in the same transaction
  318.    * as the transaction creating the table.
  319.    *
  320.    * @note The NdbSchemaCon transaction should be closed with 
  321.    *       Ndb::closeSchemaTransaction, even if this method fails.
  322.    *
  323.    * Example creating an unsigned int attribute belonging to the primary key
  324.    * of the table it is created in:
  325.    * @code 
  326.    *   MySchemaOp->createAttribute("Attr1",   // Attribute name
  327.    *                               TupleKey,  // Belongs to primary key
  328.    *                               32,        // 32 bits
  329.    *                               1,         // Not an array attribute
  330.    *                               UnSigned,  // Unsigned type
  331.    *                              );
  332.    * @endcode 
  333.    * 
  334.    * Example creating a string attribute belonging to the primary key
  335.    * of the table it is created in:
  336.    * @code
  337.    *   MySchemaOp->createAttribute("Attr1",       // Attribute name
  338.    *                               TupleKey,      // Belongs to primary key
  339.    *                               8,             // Each character is 8 bits
  340.    *                               12,            // Max 12 chars in string
  341.    *                               String,        // Attribute if of type string
  342.    *                              );
  343.    * @endcode
  344.    *
  345.    * A <em>distribution key</em> is a set of attributes which are used
  346.    * to distribute the tuples onto the NDB nodes.
  347.    * A <em>distribution group</em> is a part (currently 16 bits) 
  348.    * of an attribute used to distribute the tuples onto the NDB nodes.
  349.    * The distribution key uses the NDB Cluster hashing function,
  350.    * while the distribution group uses a simpler function.
  351.    *
  352.    * @param  aAttrName   Attribute name.  Should not be NULL.
  353.    * @param  aTupleKey  This parameter specifies whether the 
  354.    *                     attribute is part of the primary key or not.
  355.    *                     Floats are not allowed in the primary key.
  356.    *                     <br>
  357.    *                     Legal values: NoKey, TupleKey
  358.    * @param  aAttrSize  Specifies the size of the elements of the 
  359.    *                     attribute.  (An attribute can consist
  360.    *                     of an array of elements.)
  361.    *                     <br>
  362.    *                     Legal values: 8, 16, 32, 64 and 128 bits.
  363.    * @param  aArraySize  Size of array.
  364.    *                     <br>
  365.    *                     Legal values:
  366.    *                     0 = variable-sized array, 
  367.    *                     1 = no array, and
  368.    *                     2- = fixed size array.
  369.    *                     <br>
  370.    *                     <em>
  371.    *                     Variable-sized array attributes are 
  372.    *                     not yet supported.
  373.    *                     </em>
  374.    *                     <br>
  375.    *                     There is no upper limit of the array size
  376.    *                     for a single attribute. 
  377.    * @param  aAttrType   The attribute type.
  378.    *   This is only of interest if calculations are 
  379.    *                     made within NDB.
  380.    *                     <br>
  381.    *                     Legal values: UnSigned, Signed, Float, String
  382.    * @param aStorageMode    Main memory based or disk based attribute.<br>
  383.    *                     Legal values: MMBased, DiskBased
  384.    *                     <br>
  385.    *                     <em>
  386.    *                     Disk-based attributes are not yet supported.
  387.    *                     </em>
  388.    * @param nullable     Set to true if NULL is a correct value for
  389.    *                     the attribute.
  390.    *                     <br>
  391.    *                     Legal values: true, false
  392.    * @param aStType      Stored in both index and data storage or 
  393.    *                     only store in index data storage.
  394.    *                     <br>
  395.    *                     This parameter is only of interest for tuple 
  396.    *                     key attributes.
  397.    *   All tuple key attributes values are always stored 
  398.    *                     in the index storage part.
  399.    *                     If this parameter is set to 
  400.    *                     IndexStorageAttribute, then the attribute values 
  401.    *                     will <em>only</em> be stored in the index 
  402.    *                     storage part and <em>not</em> in the data 
  403.    *                     storage part. 
  404.    *                     <br>
  405.    *                     If there will be no scans using the primary
  406.    *                     key attribute and if the size of the attribute 
  407.    *                     is large, then this might be of interest.
  408.    *                     A typical example is a table where 
  409.    *                     http-addresses are used as primary key.
  410.    *                     <br>
  411.    *                     Legal values: NormalStorageAttribute, 
  412.    *                                   IndexStorageAttribute
  413.    * @param aDistributionKey    Sometimes it is preferable to use a subset
  414.    *                            of the primary key as the distribution key. 
  415.    *                            An example is TPC-C where it might be
  416.    *                            good to use the warehouse id and district id 
  417.    *                            as the distribution key. 
  418.    *                            <br>
  419.    *                            Locally in the fragments the full primary key 
  420.    *                            will still be used with the hashing algorithm.
  421.    *                            Set to 1 if this attribute is part of the 
  422.    *                            distribution key.
  423.    *                            All distribution key attributes must be 
  424.    *                            defined before
  425.    *                            any other attributes are defined.
  426.    * @param aDistributionGroup    In other applications it is desirable to use 
  427.    *                              only a part of an attribute to create the 
  428.    *                              distribution key.
  429.    *                              This is applicable for some telecom
  430.    *                              applications.
  431.    *                              <br>
  432.    *                              In these situations one must provide how many 
  433.    *                              bits of the attribute that is to
  434.    *                              be used as the distribution hash value.
  435.    *                              <br>
  436.    *                              This provides some control to the
  437.    *                              application of the distribution. 
  438.    *                              It still needs to be part of a primary key
  439.    *                              the attribute and must be defined as the 
  440.    *                              first attribute.
  441.    * @param  aDistributionGroupNoOfBits
  442.    *                              Number of bits to use of the 
  443.    *                              distribution group attribute in the
  444.    *                              distribution hash value.
  445.    *                              <br>
  446.    *                              Currently, only 16 bits is supported. It will
  447.    *                              always be the last 16 bits in the attribute
  448.    *                              which is used for the distribution group.
  449.    * @param aAutoIncrement        Set to autoincrement attribute.
  450.    * @param aDefaultValue         Set a default value of attribute.
  451.    *
  452.    * @return Returns 0 when successful and returns -1 otherwise.
  453.    ****************************************************************************/
  454.   int createAttribute(const char* aAttrName,
  455.       KeyType aTupleKey = NoKey,
  456.       int aAttrSize = 32,
  457.       int aArraySize = 1,
  458.       AttrType aAttrType = UnSigned,
  459.       StorageMode aStorageMode = MMBased,
  460.       bool nullable = false,
  461.       StorageAttributeType aStType= NormalStorageAttribute,
  462.       int aDistributionKey = 0,
  463.       int aDistributionGroup = 0,
  464.       int aDistributionGroupNoOfBits = 16,
  465.                       bool aAutoIncrement = false,
  466.                       const char* aDefaultValue = 0);
  467.   /**
  468.    * @deprecated do not use!
  469.    */
  470.   int createAttribute(const char* aAttrName,
  471.       KeyType aTupleKey,
  472.       int aAttrSize,
  473.       int aArraySize,
  474.       AttrType aAttrType,
  475.       StorageMode aStorageMode,
  476.       NullAttributeType aNullAttr,
  477.       StorageAttributeType aStType = NormalStorageAttribute,
  478.       int aDistributionKey = 0,
  479.       int aDistributionGroup = 0,
  480.       int aDistributionGroupNoOfBits = 16){
  481.     return createAttribute(aAttrName,
  482.    aTupleKey,
  483.    aAttrSize,
  484.    aArraySize,
  485.    aAttrType,
  486.    aStorageMode,
  487.    aNullAttr == NullAttribute,
  488.    aStType,
  489.    aDistributionKey,
  490.    aDistributionGroup,
  491.    aDistributionGroupNoOfBits);
  492.   }
  493.   const NdbError & getNdbError() const;
  494. protected:
  495. /*****************************************************************************
  496.  *   These are the methods used to create and delete the NdbOperation objects.
  497.  ****************************************************************************/
  498.    NdbSchemaOp(Ndb* aNdb);
  499.    ~NdbSchemaOp();     
  500. /******************************************************************************
  501.  * These methods are service routines used by the other NDBAPI classes.
  502.  *****************************************************************************/
  503.   void release(); // Release all memory connected
  504.          // to the operations object.     
  505. /****************************************************************************
  506.  * The methods below is the execution part of the NdbSchemaOp class. 
  507.  *****************************************************************************/
  508.   int sendRec();
  509.   int sendSignals(Uint32 aNodeId, bool HaveMutex);
  510.   int init(NdbSchemaCon* aSchemaCon);
  511.   /**************************************************************************
  512.    * These are the private variables that are defined in the operation 
  513.    * objects.
  514.    **************************************************************************/
  515.   Ndb* theNdb; // Point back to the Ndb object.      
  516.   NdbSchemaCon*  theSchemaCon; // Point back to the connection object.
  517.   
  518.   class NdbDictionary::Table * m_currentTable;
  519. };
  520. /**
  521.  * Get old attribute type from new type
  522.  * 
  523.  * NOTE! attrType is deprecated, use getType instead!
  524.  *
  525.  * @return Type of attribute: { Signed, UnSigned, Float,a String }
  526.  */
  527. inline 
  528. AttrType 
  529. convertColumnTypeToAttrType(NdbDictionary::Column::Type _type)
  530. {      
  531.   
  532.   switch(_type){
  533.   case NdbDictionary::Column::Bigint:
  534.   case NdbDictionary::Column::Int:
  535.     return Signed;
  536.   case NdbDictionary::Column::Bigunsigned:
  537.   case NdbDictionary::Column::Unsigned:
  538.     return UnSigned;
  539.   case NdbDictionary::Column::Float:
  540.   case NdbDictionary::Column::Olddecimal:
  541.   case NdbDictionary::Column::Olddecimalunsigned:
  542.   case NdbDictionary::Column::Double:
  543.     return Float;
  544.   case NdbDictionary::Column::Char:
  545.   case NdbDictionary::Column::Varchar:
  546.   case NdbDictionary::Column::Binary:
  547.   case NdbDictionary::Column::Varbinary:
  548.     return String;
  549.   default:
  550.     return NoAttrTypeDef;
  551.   }
  552. }
  553. #endif
  554. #endif