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

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. /*****************************************************************************
  14.  * Name:          NdbDictionary.hpp
  15.  * Include:
  16.  * Link:
  17.  * Author:        Jonas Oreland
  18.  * Date:          2003-05-14
  19.  * Version:       0.1
  20.  * Description:   Data dictionary support
  21.  * Documentation:
  22.  * Adjust:  2003-05-14  Jonas Oreland   First version.
  23.  ****************************************************************************/
  24. #ifndef NdbDictionary_H
  25. #define NdbDictionary_H
  26. #include <ndb_types.h>
  27. class Ndb;
  28. struct charset_info_st;
  29. typedef struct charset_info_st CHARSET_INFO;
  30. /**
  31.  * @class NdbDictionary
  32.  * @brief Data dictionary class
  33.  * 
  34.  * This class supports all schema data definition and enquiry such as:
  35.  * -# Creating tables (Dictionary::createTable) and table columns
  36.  * -# Dropping tables (Dictionary::dropTable)
  37.  * -# Creating secondary indexes (Dictionary::createIndex)
  38.  * -# Dropping secondary indexes (Dictionary::dropIndex)
  39.  * -# Enquiries about tables
  40.  *    (Dictionary::getTable, Table::getNoOfColumns, 
  41.  *    Table::getPrimaryKey, and Table::getNoOfPrimaryKeys)
  42.  * -# Enquiries about indexes
  43.  *    (Dictionary::getIndex, Index::getNoOfColumns, 
  44.  *    and Index::getColumn)
  45.  *
  46.  * NdbDictionary has several help (inner) classes:
  47.  * -# NdbDictionary::Table for creating tables
  48.  * -# NdbDictionary::Column for creating table columns
  49.  * -# NdbDictionary::Index for creating secondary indexes
  50.  * 
  51.  * See @ref ndbapi_example4.cpp for details of usage.
  52.  */
  53. class NdbDictionary {
  54. public:
  55.   /**
  56.    * @class Object
  57.    * @brief Meta information about a database object (a table, index, etc)
  58.    */
  59.   class Object {
  60.   public:
  61.     /**
  62.      * Status of object
  63.      */
  64.     enum Status {
  65.       New,                    ///< The object only exist in memory and 
  66.                               ///< has not been created in the NDB Kernel
  67.       Changed,                ///< The object has been modified in memory 
  68.                               ///< and has to be commited in NDB Kernel for 
  69.                               ///< changes to take effect
  70.       Retrieved,              ///< The object exist and has been read 
  71.                               ///< into main memory from NDB Kernel
  72.       Invalid,                ///< The object has been invalidated
  73.                               ///< and should not be used
  74.       Altered                 ///< Table has been altered in NDB kernel
  75.                               ///< but is still valid for usage
  76.     };
  77.     /**
  78.      * Get status of object
  79.      */
  80.     virtual Status getObjectStatus() const = 0;
  81.     /**
  82.      * Get version of object
  83.      */
  84.     virtual int getObjectVersion() const = 0;
  85.     /**
  86.      * Object type
  87.      */
  88.     enum Type {
  89.       TypeUndefined = 0,      ///< Undefined
  90.       SystemTable = 1,        ///< System table
  91.       UserTable = 2,          ///< User table (may be temporary)
  92.       UniqueHashIndex = 3,    ///< Unique un-ordered hash index
  93.       HashIndex = 4,          ///< Non-unique un-ordered hash index
  94.       UniqueOrderedIndex = 5, ///< Unique ordered index
  95.       OrderedIndex = 6,       ///< Non-unique ordered index
  96.       HashIndexTrigger = 7,   ///< Index maintenance, internal
  97.       IndexTrigger = 8,       ///< Index maintenance, internal
  98.       SubscriptionTrigger = 9,///< Backup or replication, internal
  99.       ReadOnlyConstraint = 10 ///< Trigger, internal
  100.     };
  101.     /**
  102.      * Object state
  103.      */
  104.     enum State {
  105.       StateUndefined = 0,     ///< Undefined
  106.       StateOffline = 1,       ///< Offline, not usable
  107.       StateBuilding = 2,      ///< Building, not yet usable
  108.       StateDropping = 3,      ///< Offlining or dropping, not usable
  109.       StateOnline = 4,        ///< Online, usable
  110.       StateBackup = 5,        ///< Online, being backuped, usable
  111.       StateBroken = 9         ///< Broken, should be dropped and re-created
  112.     };
  113.     /**
  114.      * Object store
  115.      */
  116.     enum Store {
  117.       StoreUndefined = 0,     ///< Undefined
  118.       StoreTemporary = 1,     ///< Object or data deleted on system restart
  119.       StorePermanent = 2      ///< Permanent. logged to disk
  120.     };
  121.     /**
  122.      * Type of fragmentation.
  123.      *
  124.      * This parameter specifies how data in the table or index will
  125.      * be distributed among the db nodes in the cluster.<br>
  126.      * The bigger the table the more number of fragments should be used.
  127.      * Note that all replicas count as same "fragment".<br>
  128.      * For a table, default is FragAllMedium.  For a unique hash index,
  129.      * default is taken from underlying table and cannot currently
  130.      * be changed.
  131.      */
  132.     enum FragmentType { 
  133.       FragUndefined = 0,      ///< Fragmentation type undefined or default
  134.       FragSingle = 1,         ///< Only one fragment
  135.       FragAllSmall = 2,       ///< One fragment per node, default
  136.       FragAllMedium = 3,      ///< two fragments per node
  137.       FragAllLarge = 4        ///< Four fragments per node.
  138.     };
  139.   };
  140.   class Table; // forward declaration
  141.   
  142.   /**
  143.    * @class Column
  144.    * @brief Represents an column in an NDB Cluster table
  145.    *
  146.    * Each column has a type. The type of a column is determind by a number 
  147.    * of type specifiers.
  148.    * The type specifiers are:
  149.    * - Builtin type
  150.    * - Array length or max length
  151.    * - Precision and scale
  152.    */
  153.   class Column {
  154.   public:
  155.     /**
  156.      * The builtin column types
  157.      */
  158.     enum Type {
  159.       Undefined=0,///< Undefined 
  160.       Tinyint,       ///< 8 bit. 1 byte signed integer, can be used in array
  161.       Tinyunsigned,  ///< 8 bit. 1 byte unsigned integer, can be used in array
  162.       Smallint,      ///< 16 bit. 2 byte signed integer, can be used in array
  163.       Smallunsigned, ///< 16 bit. 2 byte unsigned integer, can be used in array
  164.       Mediumint,     ///< 24 bit. 3 byte signed integer, can be used in array
  165.       Mediumunsigned,///< 24 bit. 3 byte unsigned integer, can be used in array
  166.       Int,           ///< 32 bit. 4 byte signed integer, can be used in array
  167.       Unsigned,      ///< 32 bit. 4 byte unsigned integer, can be used in array
  168.       Bigint,        ///< 64 bit. 8 byte signed integer, can be used in array
  169.       Bigunsigned,   ///< 64 Bit. 8 byte signed integer, can be used in array
  170.       Float,         ///< 32-bit float. 4 bytes float, can be used in array
  171.       Double,        ///< 64-bit float. 8 byte float, can be used in array
  172.       Olddecimal,    ///< MySQL < 5.0 signed decimal,  Precision, Scale
  173.       Char,          ///< Len. A fixed array of 1-byte chars
  174.       Varchar,       ///< Max len
  175.       Binary,        ///< Len
  176.       Varbinary,     ///< Max len
  177.       Datetime,    ///< Precision down to 1 sec (sizeof(Datetime) == 8 bytes )
  178.       Date,        ///< Precision down to 1 day(sizeof(Date) == 4 bytes )
  179.       Blob,        ///< Binary large object (see NdbBlob)
  180.       Text,        ///< Text blob
  181.       Time = 25,   ///< Time without date
  182.       Year = 26,   ///< Year 1901-2155 (1 byte)
  183.       Timestamp = 27, ///< Unix time
  184.       Olddecimalunsigned = 28
  185.     };
  186.     /** 
  187.      * @name General 
  188.      * @{
  189.      */
  190.     /**
  191.      * Constructor
  192.      * @param   name   Name of column
  193.      */
  194.     Column(const char * name = "");
  195.     /**
  196.      * Copy constructor
  197.      * @param  column  Column to be copied
  198.      */
  199.     Column(const Column& column); 
  200.     ~Column();
  201.     
  202.     /**
  203.      * Set name of column
  204.      * @param  name  Name of the column
  205.      */
  206.     void setName(const char * name);
  207.     /**
  208.      * Get name of column
  209.      * @return  Name of the column
  210.      */
  211.     const char* getName() const;
  212.     /**
  213.      * Set whether column is nullable or not
  214.      */
  215.     void setNullable(bool);
  216.     /**
  217.      * Get if the column is nullable or not
  218.      */
  219.     bool getNullable() const;
  220.     
  221.     /**
  222.      * Set that column is part of primary key
  223.      */
  224.     void setPrimaryKey(bool);
  225.     /**
  226.      * Check if column is part of primary key
  227.      */
  228.     bool getPrimaryKey() const;
  229.     /**
  230.      *  Get number of column (horizontal position within table)
  231.      */
  232.     int getColumnNo() const;
  233.     /**
  234.      * Check if column is equal to some other column
  235.      * @param  column  Column to compare with
  236.      * @return  true if column is equal to some other column otherwise false.
  237.      */
  238.     bool equal(const Column& column) const;
  239.     /** @} *******************************************************************/
  240.     /** 
  241.      * @name Type Specifiers
  242.      * @{
  243.      */
  244.     /**
  245.      * Set type of column
  246.      * @param  type  Type of column
  247.      *
  248.      * @note setType resets <em>all</em> column attributes
  249.      *       to (type dependent) defaults and should be the first
  250.      *       method to call.  Default type is Unsigned.
  251.      */
  252.     void setType(Type type);
  253.     /**
  254.      * Get type of column
  255.      */
  256.     Type getType() const;
  257.     /**
  258.      * Set precision of column.
  259.      * @note Only applicable for decimal types
  260.      */
  261.     void setPrecision(int);
  262.     /**
  263.      * Get precision of column.
  264.      * @note Only applicable for decimal types
  265.      */
  266.     int getPrecision() const;
  267.     /**
  268.      * Set scale of column.
  269.      * @note Only applicable for decimal types
  270.      */
  271.     void setScale(int);
  272.     /**
  273.      * Get scale of column.
  274.      * @note Only applicable for decimal types
  275.      */
  276.     int getScale() const;
  277.     /**
  278.      * Set length for column
  279.      * Array length for column or max length for variable length arrays.
  280.      */
  281.     void setLength(int length);
  282.     /**
  283.      * Get length for column
  284.      * Array length for column or max length for variable length arrays.
  285.      */
  286.     int getLength() const;
  287.     /**
  288.      * For Char or Varchar or Text, set or get MySQL CHARSET_INFO.  This
  289.      * specifies both character set and collation.  See get_charset()
  290.      * etc in MySQL.  (The cs is not "const" in MySQL).
  291.      */
  292.     void setCharset(CHARSET_INFO* cs);
  293.     CHARSET_INFO* getCharset() const;
  294.     /**
  295.      * For blob, set or get "inline size" i.e. number of initial bytes
  296.      * to store in table's blob attribute.  This part is normally in
  297.      * main memory and can be indexed and interpreted.
  298.      */
  299.     void setInlineSize(int size);
  300.     int getInlineSize() const;
  301.     /**
  302.      * For blob, set or get "part size" i.e. number of bytes to store in
  303.      * each tuple of the "blob table".  Can be set to zero to omit parts
  304.      * and to allow only inline bytes ("tinyblob").
  305.      */
  306.     void setPartSize(int size);
  307.     int getPartSize() const;
  308.     /**
  309.      * For blob, set or get "stripe size" i.e. number of consecutive
  310.      * <em>parts</em> to store in each node group.
  311.      */
  312.     void setStripeSize(int size);
  313.     int getStripeSize() const;
  314.     /**
  315.      * Get size of element
  316.      */
  317.     int getSize() const;
  318.     /** 
  319.      * Set distribution key
  320.      *
  321.      * A <em>distribution key</em> is a set of attributes which are used
  322.      * to distribute the tuples onto the NDB nodes.
  323.      * The distribution key uses the NDB Cluster hashing function.
  324.      *
  325.      * An example where this is useful is TPC-C where it might be
  326.      * good to use the warehouse id and district id as the distribution key. 
  327.      * This would place all data for a specific district and warehouse 
  328.      * in the same database node.
  329.      *
  330.      * Locally in the fragments the full primary key 
  331.      * will still be used with the hashing algorithm.
  332.      *
  333.      * @param  enable  If set to true, then the column will be part of 
  334.      *                 the distribution key.
  335.      */
  336.     void setDistributionKey(bool enable);
  337.     /**
  338.      * Check if column is part of distribution key
  339.      * @see setDistributionKey
  340.      */
  341.     bool getDistributionKey() const;
  342.     /** @} *******************************************************************/
  343. #ifndef DOXYGEN_SHOULD_SKIP_INTERNAL
  344.     void setTupleKey(bool);
  345.     bool getTupleKey() const;
  346.     
  347.     void setDistributionGroup(bool, int bits = 16);
  348.     bool getDistributionGroup() const;
  349.     int getDistributionGroupBits() const;
  350.     
  351.     void setIndexOnlyStorage(bool);
  352.     bool getIndexOnlyStorage() const;
  353.     const Table * getBlobTable() const;
  354.     /** 
  355.      * @name ODBC Specific methods 
  356.      * @{
  357.      */
  358.     void setAutoIncrement(bool);         
  359.     bool getAutoIncrement() const;
  360.     void setAutoIncrementInitialValue(Uint64 val);
  361.     void setDefaultValue(const char*);   
  362.     const char* getDefaultValue() const;
  363.     /** @} *******************************************************************/
  364.     static const Column * FRAGMENT;
  365.     static const Column * ROW_COUNT;
  366.     static const Column * COMMIT_COUNT;
  367. #endif
  368.     
  369.   private:
  370.     friend class NdbRecAttr;
  371.     friend class NdbColumnImpl;
  372.     class NdbColumnImpl & m_impl;
  373.     Column(NdbColumnImpl&);
  374.     Column& operator=(const Column&);
  375.   };
  376. #ifndef DOXYGEN_SHOULD_SKIP_INTERNAL
  377.   /**
  378.    * ???
  379.    */
  380.   typedef Column Attribute;
  381. #endif
  382.   
  383.   /**
  384.    * @brief Represents a table in NDB Cluster
  385.    *
  386.    * <em>TableSize</em><br>
  387.    * When calculating the data storage one should add the size of all 
  388.    * attributes (each attributeconsumes at least 4 bytes) and also an overhead
  389.    * of 12 byte. Variable size attributes (not supported yet) will have a 
  390.    * size of 12 bytes plus the actual data storage parts where there is an 
  391.    * additional overhead based on the size of the variable part.<br>
  392.    * An example table with 5 attributes: 
  393.    * one 64 bit attribute, one 32 bit attribute, 
  394.    * two 16 bit attributes and one array of 64 8 bits. 
  395.    * This table will consume 
  396.    * 12 (overhead) + 8 + 4 + 2*4 (4 is minimum) + 64 = 96 bytes per record.
  397.    * Additionally an overhead of about 2 % as page headers and waste should 
  398.    * be allocated. Thus, 1 million records should consume 96 MBytes
  399.    * plus the overhead 2 MByte and rounded up to 100 000 kBytes.<br>
  400.    *
  401.    */
  402.   class Table : public Object {
  403.   public:
  404.     /** 
  405.      * @name General
  406.      * @{
  407.      */
  408.     /**
  409.      * Constructor
  410.      * @param  name   Name of table
  411.      */
  412.     Table(const char * name = "");
  413.     /** 
  414.      * Copy constructor 
  415.      * @param  table  Table to be copied
  416.      */
  417.     Table(const Table& table); 
  418.     virtual ~Table();
  419.     
  420.     /**
  421.      * Assignment operator, deep copy
  422.      * @param  table  Table to be copied
  423.      */
  424.     Table& operator=(const Table&);
  425.     /**
  426.      * Name of table
  427.      * @param  name  Name of table
  428.      */
  429.     void setName(const char * name);
  430.     /**
  431.      * Get table name
  432.      */
  433.     const char * getName() const;
  434.     /**
  435.      * Get table id
  436.      */ 
  437.     int getTableId() const;
  438.     
  439.     /**
  440.      * Add a column definition to a table
  441.      * @note creates a copy
  442.      */
  443.     void addColumn(const Column &);
  444.     
  445.     /**
  446.      * Get column definition via name.
  447.      * @return null if none existing name
  448.      */
  449.     const Column* getColumn(const char * name) const;
  450.     
  451.     /**
  452.      * Get column definition via index in table.
  453.      * @return null if none existing name
  454.      */
  455.     Column* getColumn(const int attributeId);
  456.     /**
  457.      * Get column definition via name.
  458.      * @return null if none existing name
  459.      */
  460.     Column* getColumn(const char * name);
  461.     
  462.     /**
  463.      * Get column definition via index in table.
  464.      * @return null if none existing name
  465.      */
  466.     const Column* getColumn(const int attributeId) const;
  467.     
  468.     /** @} *******************************************************************/
  469.     /**
  470.      * @name Storage
  471.      * @{
  472.      */
  473.     /**
  474.      * If set to false, then the table is a temporary 
  475.      * table and is not logged to disk.
  476.      *
  477.      * In case of a system restart the table will still
  478.      * be defined and exist but will be empty. 
  479.      * Thus no checkpointing and no logging is performed on the table.
  480.      *
  481.      * The default value is true and indicates a normal table 
  482.      * with full checkpointing and logging activated.
  483.      */
  484.     void setLogging(bool); 
  485.     /**
  486.      * @see NdbDictionary::Table::setLogging.
  487.      */
  488.     bool getLogging() const;
  489.    
  490.     /**
  491.      * Set fragmentation type
  492.      */
  493.     void setFragmentType(FragmentType);
  494.     /**
  495.      * Get fragmentation type
  496.      */
  497.     FragmentType getFragmentType() const;
  498.     
  499.     /**
  500.      * Set KValue (Hash parameter.)
  501.      * Only allowed value is 6.
  502.      * Later implementations might add flexibility in this parameter.
  503.      */
  504.     void setKValue(int kValue);
  505.     
  506.     /**
  507.      * Get KValue (Hash parameter.)
  508.      * Only allowed value is 6.
  509.      * Later implementations might add flexibility in this parameter.
  510.      */
  511.     int getKValue() const;
  512.     /**
  513.      * Set MinLoadFactor  (Hash parameter.)
  514.      * This value specifies the load factor when starting to shrink 
  515.      * the hash table. 
  516.      * It must be smaller than MaxLoadFactor.
  517.      * Both these factors are given in percentage.
  518.      */
  519.     void setMinLoadFactor(int);
  520.     /**
  521.      * Get MinLoadFactor  (Hash parameter.)
  522.      * This value specifies the load factor when starting to shrink 
  523.      * the hash table. 
  524.      * It must be smaller than MaxLoadFactor.
  525.      * Both these factors are given in percentage.
  526.      */
  527.     int getMinLoadFactor() const;
  528.     /**
  529.      * Set MaxLoadFactor  (Hash parameter.)
  530.      * This value specifies the load factor when starting to split 
  531.      * the containers in the local hash tables. 
  532.      * 100 is the maximum which will optimize memory usage.
  533.      * A lower figure will store less information in each container and thus
  534.      * find the key faster but consume more memory.
  535.      */
  536.     void setMaxLoadFactor(int);
  537.     /**
  538.      * Get MaxLoadFactor  (Hash parameter.)
  539.      * This value specifies the load factor when starting to split 
  540.      * the containers in the local hash tables. 
  541.      * 100 is the maximum which will optimize memory usage.
  542.      * A lower figure will store less information in each container and thus
  543.      * find the key faster but consume more memory.
  544.      */
  545.     int getMaxLoadFactor() const;
  546.     /** @} *******************************************************************/
  547.     /** 
  548.      * @name Other
  549.      * @{
  550.      */
  551.     
  552.     /**
  553.      * Get number of columns in the table
  554.      */
  555.     int getNoOfColumns() const;
  556.     
  557.     /**
  558.      * Get number of primary keys in the table
  559.      */
  560.     int getNoOfPrimaryKeys() const;
  561.     /**
  562.      * Get name of primary key 
  563.      */
  564.     const char* getPrimaryKey(int no) const;
  565.     
  566.     /**
  567.      * Check if table is equal to some other table
  568.      */
  569.     bool equal(const Table&) const;
  570.     /**
  571.      * Get frm file stored with this table
  572.      */
  573.     const void* getFrmData() const;
  574.     Uint32 getFrmLength() const;
  575.     /**
  576.      * Set frm file to store with this table
  577.      */ 
  578.     void setFrm(const void* data, Uint32 len);
  579.     /**
  580.      * Set table object type
  581.      */
  582.     void setObjectType(Object::Type type);
  583.     /**
  584.      * Get table object type
  585.      */
  586.     Object::Type getObjectType() const;
  587.     /**
  588.      * Get object status
  589.      */
  590.     virtual Object::Status getObjectStatus() const;
  591.     /**
  592.      * Get object version
  593.      */
  594.     virtual int getObjectVersion() const;
  595.     /** @} *******************************************************************/
  596. #ifndef DOXYGEN_SHOULD_SKIP_DEPRECATED
  597.     void setStoredTable(bool x) { setLogging(x); }
  598.     bool getStoredTable() const { return getLogging(); }
  599.     int getRowSizeInBytes() const ;
  600.     int createTableInDb(Ndb*, bool existingEqualIsOk = true) const ;
  601. #endif
  602.   private:
  603.     friend class NdbTableImpl;
  604.     class NdbTableImpl & m_impl;
  605.     Table(NdbTableImpl&);
  606.   };
  607.   
  608.   /**
  609.    * @class Index
  610.    * @brief Represents an index in an NDB Cluster
  611.    */
  612.   class Index : public Object {
  613.   public:
  614.     /**
  615.      *  Constructor
  616.      *  @param  name  Name of index
  617.      */
  618.     Index(const char * name = "");
  619.     virtual ~Index();
  620.     /**
  621.      * Set the name of an index
  622.      */
  623.     void setName(const char * name);
  624.     
  625.     /**
  626.      * Get the name of an index
  627.      */
  628.     const char * getName() const;
  629.     
  630.     /**
  631.      * Define the name of the table to be indexed
  632.      */
  633.     void setTable(const char * name);
  634.     /**
  635.      * Get the name of the table being indexed
  636.      */
  637.     const char * getTable() const;
  638.     
  639.     /**
  640.      * Get the number of columns in the index
  641.      */
  642.     unsigned getNoOfColumns() const;
  643.     /**
  644.      * Get the number of columns in the index
  645.      * Depricated, use getNoOfColumns instead.
  646.      */
  647.     int getNoOfIndexColumns() const;
  648.     /**
  649.      * Get a specific column in the index
  650.      */
  651.     const Column * getColumn(unsigned no) const ;
  652.     /**
  653.      * Get a specific column name in the index
  654.      * Depricated, use getColumn instead.
  655.      */
  656.     const char * getIndexColumn(int no) const ;
  657.     /**
  658.      * Add a column to the index definition
  659.      * Note that the order of columns will be in
  660.      * the order they are added (only matters for ordered indexes).
  661.      */
  662.     void addColumn(const Column & c);
  663.     /**
  664.      * Add a column name to the index definition
  665.      * Note that the order of indexes will be in
  666.      * the order they are added (only matters for ordered indexes).
  667.      */
  668.     void addColumnName(const char * name);
  669.     /**
  670.      * Add a column name to the index definition
  671.      * Note that the order of indexes will be in
  672.      * the order they are added (only matters for ordered indexes).
  673.      * Depricated, use addColumnName instead.
  674.      */
  675.     void addIndexColumn(const char * name);
  676.     /**
  677.      * Add several column names to the index definition
  678.      * Note that the order of indexes will be in
  679.      * the order they are added (only matters for ordered indexes).
  680.      */
  681.     void addColumnNames(unsigned noOfNames, const char ** names);
  682.     /**
  683.      * Add several column names to the index definition
  684.      * Note that the order of indexes will be in
  685.      * the order they are added (only matters for ordered indexes).
  686.      * Depricated, use addColumnNames instead.
  687.      */
  688.     void addIndexColumns(int noOfNames, const char ** names);
  689.     /**
  690.      * Represents type of index
  691.      */
  692.     enum Type {
  693.       Undefined = 0,          ///< Undefined object type (initial value)
  694.       UniqueHashIndex = 3,    ///< Unique un-ordered hash index 
  695.                               ///< (only one currently supported)
  696.       HashIndex = 4,          ///< Non-unique un-ordered hash index
  697.       UniqueOrderedIndex = 5, ///< Unique ordered index
  698.       OrderedIndex = 6        ///< Non-unique ordered index
  699.     };
  700.     /**
  701.      * Set index type of the index
  702.      */
  703.     void setType(Type type);
  704.     /**
  705.      * Get index type of the index
  706.      */
  707.     Type getType() const;
  708.     
  709.     /**
  710.      * Enable/Disable index storage on disk
  711.      *
  712.      * @param enable  If enable is set to true, then logging becomes enabled
  713.      *
  714.      * @see NdbDictionary::Table::setLogging
  715.      *
  716.      * @note Non-logged indexes are rebuilt at system restart.
  717.      * @note Ordered index does not currently support logging.
  718.      */
  719.     void setLogging(bool enable); 
  720.     /**
  721.      * Check if index is set to be stored on disk
  722.      *
  723.      * @see NdbDictionary::Index::setLogging
  724.      */
  725.     bool getLogging() const;
  726. #ifndef DOXYGEN_SHOULD_SKIP_DEPRECATED
  727.     void setStoredIndex(bool x) { setLogging(x); }
  728.     bool getStoredIndex() const { return getLogging(); }
  729. #endif
  730.     
  731.     /**
  732.      * Get object status
  733.      */
  734.     virtual Object::Status getObjectStatus() const;
  735.     /**
  736.      * Get object version
  737.      */
  738.     virtual int getObjectVersion() const;
  739.   private:
  740.     friend class NdbIndexImpl;
  741.     class NdbIndexImpl & m_impl;
  742.     Index(NdbIndexImpl&);
  743.   };
  744.   /**
  745.    * @brief Represents an Event in NDB Cluster
  746.    *
  747.    */
  748.   class Event : public Object  {
  749.   public:
  750.     enum TableEvent { TE_INSERT=1, TE_DELETE=2, TE_UPDATE=4, TE_ALL=7 };
  751.     enum EventDurability { 
  752.       ED_UNDEFINED = 0,
  753. #if 0 // not supported
  754.       ED_SESSION = 1, 
  755.       // Only this API can use it
  756.       // and it's deleted after api has disconnected or ndb has restarted
  757.       
  758.       ED_TEMPORARY = 2,
  759.       // All API's can use it,
  760.       // But's its removed when ndb is restarted
  761. #endif      
  762.       ED_PERMANENT = 3
  763.       // All API's can use it,
  764.       // It's still defined after a restart
  765.     };
  766.     
  767.     Event(const char *name);
  768.     virtual ~Event();
  769.     void setName(const char *);
  770.     void setTable(const char *);
  771.     void addTableEvent(const TableEvent);
  772.     void setDurability(const EventDurability);
  773.     void addColumn(const Column &c);
  774.     void addEventColumn(unsigned attrId);
  775.     void addEventColumn(const char * columnName);
  776.     void addEventColumns(int n, const char ** columnNames);
  777.     /**
  778.      * Get object status
  779.      */
  780.     virtual Object::Status getObjectStatus() const;
  781.     /**
  782.      * Get object version
  783.      */
  784.     virtual int getObjectVersion() const;
  785.     void print();
  786.   private:
  787.     friend class NdbEventImpl;
  788.     friend class NdbEventOperationImpl;
  789.     class NdbEventImpl & m_impl;
  790.     Event(NdbEventImpl&);
  791.   };
  792.   /**
  793.    * @class Dictionary
  794.    * @brief Dictionary for defining and retreiving meta data
  795.    */
  796.   class Dictionary {
  797.   public:
  798.     /**
  799.      * @class List
  800.      * @brief Structure for retrieving lists of object names
  801.      */
  802.     struct List {
  803.       /**
  804.        * @struct  Element
  805.        * @brief   Object to be stored in an NdbDictionary::Dictionary::List
  806.        */
  807.       struct Element {
  808. unsigned id;            ///< Id of object
  809.         Object::Type type;      ///< Type of object
  810.         Object::State state;    ///< State of object
  811.         Object::Store store;    ///< How object is stored
  812. char * database;        ///< In what database the object resides 
  813. char * schema;          ///< What schema the object is defined in
  814. char * name;            ///< Name of object
  815.         Element() :
  816.           id(0),
  817.           type(Object::TypeUndefined),
  818.           state(Object::StateUndefined),
  819.           store(Object::StoreUndefined),
  820.   database(0),
  821.   schema(0),
  822.           name(0) {
  823.         }
  824.       };
  825.       unsigned count;           ///< Number of elements in list
  826.       Element * elements;       ///< Pointer to array of elements
  827.       List() : count(0), elements(0) {}
  828.       ~List() {
  829.         if (elements != 0) {
  830.           for (unsigned i = 0; i < count; i++) {
  831.             delete[] elements[i].database;
  832.             delete[] elements[i].schema;
  833.             delete[] elements[i].name;
  834.             elements[i].name = 0;
  835.           }
  836.           delete[] elements;
  837.           count = 0;
  838.           elements = 0;
  839.         }
  840.       }
  841.     };
  842.     /** 
  843.      * @name General
  844.      * @{
  845.      */
  846.     /**
  847.      * Fetch list of all objects, optionally restricted to given type.
  848.      */
  849.     int listObjects(List & list, Object::Type type = Object::TypeUndefined);
  850.     /**
  851.      * Get the latest error
  852.      *
  853.      * @return   Error object.
  854.      */      
  855.     const struct NdbError & getNdbError() const;
  856.     /** @} *******************************************************************/
  857.     /** 
  858.      * @name Tables
  859.      * @{
  860.      */
  861.     /**
  862.      * Create defined table given defined Table instance
  863.      * @param Table Table to create
  864.      * @return 0 if successful otherwise -1.
  865.      */
  866.     int createTable(const Table &);
  867.     /**
  868.      * Drop table given retrieved Table instance
  869.      * @param Table Table to drop
  870.      * @return 0 if successful otherwise -1.
  871.      */
  872.     int dropTable(Table &);
  873.     /**
  874.      * Drop table given table name
  875.      * @param name   Name of table to drop 
  876.      * @return 0 if successful otherwise -1.
  877.      */
  878.     int dropTable(const char * name);
  879.     
  880.     /**
  881.      * Alter defined table given defined Table instance
  882.      * @param Table Table to alter
  883.      * @return  -2 (incompatible version) <br>
  884.      *          -1 general error          <br>
  885.      *           0 success                 
  886.      */
  887.     int alterTable(const Table &);
  888.     /**
  889.      * Get table with given name, NULL if undefined
  890.      * @param name   Name of table to get
  891.      * @return table if successful otherwise NULL.
  892.      */
  893.     const Table * getTable(const char * name);
  894. #ifndef DOXYGEN_SHOULD_SKIP_INTERNAL
  895.     /**
  896.      * Invalidate cached table object
  897.      * @param name  Name of table to invalidate
  898.      */
  899.     void invalidateTable(const char * name);
  900. #endif
  901.     /**
  902.      * Remove table/index from local cache
  903.      */
  904.     void removeCachedTable(const char * table);
  905.     void removeCachedIndex(const char * index, const char * table);
  906.     
  907.     /** @} *******************************************************************/
  908.     /** 
  909.      * @name Indexes
  910.      * @{
  911.      */
  912.     
  913.     /**
  914.      * Create index given defined Index instance
  915.      * @param Index to create
  916.      * @return 0 if successful otherwise -1.
  917.      */
  918.     int createIndex(const Index &);
  919.     /**
  920.      * Drop index with given name
  921.      * @param indexName  Name of index to drop.
  922.      * @param tableName  Name of table that index belongs to.
  923.      * @return 0 if successful otherwise -1.
  924.      */
  925.     int dropIndex(const char * indexName,
  926.   const char * tableName);
  927.     
  928.     /**
  929.      * Get index with given name, NULL if undefined
  930.      * @param indexName  Name of index to get.
  931.      * @param tableName  Name of table that index belongs to.
  932.      * @return  index if successful, otherwise 0.
  933.      */
  934.     const Index * getIndex(const char * indexName,
  935.    const char * tableName);
  936. #ifndef DOXYGEN_SHOULD_SKIP_INTERNAL
  937.     /**
  938.      * Invalidate cached index object
  939.      */
  940.     void invalidateIndex(const char * indexName,
  941.                          const char * tableName);
  942. #endif
  943.     /**
  944.      * Fetch list of indexes of given table.
  945.      * @param list  Reference to list where to store the listed indexes
  946.      * @param tableName  Name of table that index belongs to.
  947.      * @return  0 if successful, otherwise -1
  948.      */
  949.     int listIndexes(List & list, const char * tableName);
  950.     /** @} *******************************************************************/
  951.     /** 
  952.      * @name Events
  953.      * @{
  954.      */
  955.     
  956.     /**
  957.      * Create event given defined Event instance
  958.      * @param Event to create
  959.      * @return 0 if successful otherwise -1.
  960.      */
  961.     int createEvent(const Event &);
  962.     /**
  963.      * Drop event with given name
  964.      * @param eventName  Name of event to drop.
  965.      * @return 0 if successful otherwise -1.
  966.      */
  967.     int dropEvent(const char * eventName);
  968.     
  969.     /**
  970.      * Get event with given name.
  971.      * @param eventName  Name of event to get.
  972.      * @return an Event if successful, otherwise NULL.
  973.      */
  974.     const Event * getEvent(const char * eventName);
  975.     /** @} *******************************************************************/
  976.     
  977.   protected:
  978.     Dictionary(Ndb & ndb);
  979.     ~Dictionary();
  980.     
  981.   private:
  982.     friend class NdbDictionaryImpl;
  983.     friend class UtilTransactions;
  984.     friend class NdbBlob;
  985.     class NdbDictionaryImpl & m_impl;
  986.     Dictionary(NdbDictionaryImpl&);
  987.     const Table * getIndexTable(const char * indexName, 
  988. const char * tableName);
  989.   public:
  990.     const Table * getTable(const char * name, void **data);
  991.     void set_local_table_data_size(unsigned sz);
  992.   };
  993. };
  994. class NdbOut& operator <<(class NdbOut& out, const NdbDictionary::Column& col);
  995. #endif