mariadb/ndb/test/include/NdbSchemaOp.hpp
2004-11-11 21:25:55 +01:00

589 lines
25 KiB
C++

/* Copyright (C) 2003 MySQL AB
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
#ifndef NdbSchemaOp_H
#define NdbSchemaOp_H
#include <NdbDictionary.hpp>
#ifndef DOXYGEN_SHOULD_SKIP_DEPRECATED
/**
* Type of attribute
*
* NOTE! AttrType is deprecated, use NdbDictionary::Column::Type instead!
*/
enum AttrType {
Signed, ///< Attributes of this type can be read with:
///< NdbRecAttr::int64_value,
///< NdbRecAttr::int32_value,
///< NdbRecAttr::short_value,
///< NdbRecAttr::char_value
UnSigned, ///< Attributes of this type can be read with:
///< NdbRecAttr::u_64_value,
///< NdbRecAttr::u_32_value,
///< NdbRecAttr::u_short_value,
///< NdbRecAttr::u_char_value
Float, ///< Attributes of this type can be read with:
///< NdbRecAttr::float_value and
///< NdbRecAttr::double_value
String, ///< Attributes of this type can be read with:
///< NdbRecAttr::aRef,
///< NdbRecAttr::getAttributeObject
NoAttrTypeDef ///< Used for debugging only
};
/**
* @deprecated
*/
enum NullAttributeType {
NoNullTypeDefined = -1,
NotNullAttribute,
NullAttribute,
AttributeDefined
};
/**
* Indicates whether the attribute is part of a primary key or not
*/
enum KeyType {
Undefined = -1, ///< Used for debugging only
NoKey, ///< Attribute is not part of primary key
///< or tuple identity
TupleKey, ///< Attribute is part of primary key
TupleId ///< Attribute is part of tuple identity
///< (This type of attribute is created
///< internally, and should not be
///< manually created.)
};
/**
* Indicate whether the attribute should be stored on disk or not
*/
enum StorageMode {
MMBased = 0, ///< Main memory
DiskBased = 1, ///< Disk (Not yet supported.)
NoStorageTypeDef ///< Used for debugging only
};
/**
* Where attribute is stored.
*
* This is used to indicate whether a primary key
* should only be stored in the index storage and not in the data storage
* or if it should be stored in both places.
* The first alternative makes the attribute take less space,
* but makes it impossible to scan using attribute.
*
* @note Use NormalStorageAttribute for most cases.
* (IndexStorageAttribute should only be used on primary key
* attributes and only if you do not want to scan using the attribute.)
*/
enum StorageAttributeType {
NoStorageAttributeTypeDefined = -1, ///< <i>Missing explanation</i>
IndexStorageAttribute, ///< Attribute is only stored in
///< index storage (ACC)
NormalStorageAttribute ///< Attribute values are stored
///< both in the index (ACC) and
///< in the data storage (TUP)
};
/**
* Type of fragmentation used for a table
*/
enum FragmentType {
Default = 0, ///< (All is default!)
Single = 1, ///< Only one fragment
All = 2, ///< Default value. One fragment per node group
DistributionGroup = 3, ///< Distribution Group used for fragmentation.
///< One fragment per node group
DistributionKey = 4, ///< Distribution Key used for fragmentation.
///< One fragment per node group.
AllLarge = 5, ///< Sixten fragments per node group.
DGroupLarge = 6, ///< Distribution Group used for fragmentation.
///< Sixten fragments per node group
DKeyLarge = 7 ///< Distribution Key used for fragmentation.
///< Sixten fragments per node group
};
/**
* Type of table or index.
*/
enum TableType {
UndefTableType = 0,
SystemTable = 1, ///< Internal.Table cannot be updated by user
UserTable = 2, ///< Normal application table
UniqueHashIndex = 3, ///< Unique un-ordered hash index
HashIndex = 4, ///< Non-unique un-ordered hash index
UniqueOrderedIndex = 5, ///< Unique ordered index
OrderedIndex = 6 ///< Non-unique ordered index
};
class NdbSchemaCon;
class Ndb;
/**
* @class NdbSchemaOp
* @brief Represents various operations for use in schema transactions
*
* This class is used for schema operations, e.g. creating tables and
* attributes.
*
* The NdbSchemaOp object is created using NdbSchemaCon::getNdbSchemaOp.
*
* @note This class is depricated and is now replaced with the class
* NdbDictionary.
*/
class NdbSchemaOp
{
friend class Ndb;
friend class NdbSchemaCon;
public:
/**
* Create a new table in the database.
*
* @note The NdbSchemaCon should be closed with
* Ndb::closeSchemaTransaction, even if this method fails.
*
* @param aTableName Table name. Should not be NULL.
* @param aTableSize (Performance parameter.)
* Initial size of the data part of the table
* expressed in kByte.
* The database handles
* bad parameter setting but at a certain
* loss in performance.
* The size given here is
* the initial size allocated for the table
* storage (the data part).
* When calculating the data storage one should
* add the size of all attributes (each attribute
* consumes at least 4 bytes) and also an overhead
* of 12 byte.
* Variable size attributes (not supported yet)
* will have a size of 12 bytes plus the actual
* data storage parts where there is an
* additional overhead based on the size of the
* variable part.
* <br>
* An example table with 5 attributes:
* one 64 bit attribute, one 32 bit attribute,
* two 16 bit attributes and one array of 64 8 bits.
* This table will consume
* 12 (overhead) + 8 + 4 + 2*4 (4 is minimum) + 64 =
* 96 bytes per record.
* Additionally an overhead of about 2 % as page
* headers and waste should be allocated.
* Thus, 1 million records should consume 96 MBytes
* plus the overhead 2 MByte and rounded up to
* 100 000 kBytes.
* <br><em>
* This parameter is currently not used.
* </em>
* @param aTupleKey Indicates if the table has a primary key or not.
* <br>
* <b>TupleKey</b> means that a <em>primary key</em>
* consisting of one to four attributes
* (at most one of variable size)
* uniquely identifies each record in the created
* table.
* <br>
* <b>TupleId</b> means that a <em>tuple identity</em>
* is used. The tuple identity is
* a unique key indentifying each record of the
* created table.
* The tuple identity is a (non-stored)
* 64 bit attribute named <b>NDB$TID</b>.
* <br>
* When inserting a record (tuple), the method
* NdbOperation::setTupleId
* will generate a unique tuple identity
* and return it to the user.
* <br>
* When reading, updating or deleting a record
* in a table with <b>TupleId</b>,
* NdbOperation::equal("NDB$TID", value_Uint64)
* can be used to identify the record.
* <br>
* Legal values: TupleKey or TupleId.
* @param aNrOfPages (Performance parameter.)
* Specifies the initial size of the index storage.
* When calculating the index storage,
* each key has approximately 14 byte of
* overhead plus the size of the key.
* Each key attribute takes up at least 4 bytes
* of storage.
* Thus a mixed key consisting of a
* 64 bit attribute, a 32 bit attribute
* and a 16 bit attribute will
* consume approx. 30 bytes per key.
* Thus, the if initial size is to be 1 million rows,
* then aNrOfPages should be set to
* 30 M / 8k = 2670 pages.
* <br><em>
* This parameter is currently not used.
* </em>
* @param aFragmentType Type of fragmentation.<br>
* <b>All</b> (default) means that the
* table fragments are automatically
* distributed on all nodes in the system.<br>
* <b>DistributionGroup</b> and
* <b>DistributionKey</b> are
* also supported. For further details about
* these types see the documentation of
* Ndb::startTransaction.
* @param aKValue (Hash parameter.)
* Only allowed value is 6.
* Later implementations might add flexibility
* in this parameter.
* @param aMinLoadFactor (Hash parameter.)
* This value specifies the load factor when
* starting to shrink the hash table.
* It must be smaller than aMaxLoadFactor.
* Both these factors are given in percentage.
* @param aMaxLoadFactor (Hash parameter.)
* This value specifies the load factor when
* starting to split the containers in the local
* hash tables. 100 is the maximum which will
* optimize memory usage (this is the figure
* used for the above calculations).
* A lower figure will store less information in
* each container and thus
* find the key faster but consume more memory.
* @param aMemoryType Currently only 1 is allowed which specifies
* storage of table in main memory.
* Later 2 will be added where the table is stored
* completely on disk
* and 3 where the index is in main memory but
* data is on disk.
* If 1 is chosen an individual attribute can
* still be specified as a disk attribute.
* @param aStoredTable If set to false it indicates that the table is
* a temporary table and should not be logged
* to disk.
* In case of a system restart the table will still
* be defined and exist but will be empty.
* Thus no checkpointing and
* no logging is performed on the table.
* The default value is true and indicates a
* normal table with full checkpointing and
* logging activated.
* @return Returns 0 when successful and returns -1 otherwise.
*/
int createTable( const char* aTableName,
Uint32 aTableSize = 8,
KeyType aTupleKey = TupleKey,
int aNrOfPages = 2,
FragmentType aFragmentType = All,
int aKValue = 6,
int aMinLoadFactor = 78,
int aMaxLoadFactor = 80,
int aMemoryType = 1,
bool aStoredTable = true);
/**
* This is the old function declaration, don't use.
*
* @deprecated do not use!
*/
#ifndef NDB_WIN32
inline int createTable( const char* aTableName,
Uint32 aTableSize,
KeyType aTupleKey,
int aNrOfPages,
FragmentType aFragmentType,
int aKValue,
int aMinLoadFactor,
int aMaxLoadFactor,
int aMemoryType,
int aStoredTable){
return createTable(aTableName,
aTableSize,
aTupleKey,
aNrOfPages,
aFragmentType,
aKValue,
aMinLoadFactor,
aMaxLoadFactor,
aMemoryType,
(aStoredTable == 1 ? true : false));
}
#endif
/**
* Add a new attribute to a database table.
*
* Attributes can only be added to a table in the same transaction
* as the transaction creating the table.
*
* @note The NdbSchemaCon transaction should be closed with
* Ndb::closeSchemaTransaction, even if this method fails.
*
* Example creating an unsigned int attribute belonging to the primary key
* of the table it is created in:
* @code
* MySchemaOp->createAttribute("Attr1", // Attribute name
* TupleKey, // Belongs to primary key
* 32, // 32 bits
* 1, // Not an array attribute
* UnSigned, // Unsigned type
* );
* @endcode
*
* Example creating a string attribute belonging to the primary key
* of the table it is created in:
* @code
* MySchemaOp->createAttribute("Attr1", // Attribute name
* TupleKey, // Belongs to primary key
* 8, // Each character is 8 bits
* 12, // Max 12 chars in string
* String, // Attribute if of type string
* );
* @endcode
*
* A <em>distribution key</em> is a set of attributes which are used
* to distribute the tuples onto the NDB nodes.
* A <em>distribution group</em> is a part (currently 16 bits)
* of an attribute used to distribute the tuples onto the NDB nodes.
* The distribution key uses the NDB Cluster hashing function,
* while the distribution group uses a simpler function.
*
* @param aAttrName Attribute name. Should not be NULL.
* @param aTupleKey This parameter specifies whether the
* attribute is part of the primary key or not.
* Floats are not allowed in the primary key.
* <br>
* Legal values: NoKey, TupleKey
* @param aAttrSize Specifies the size of the elements of the
* attribute. (An attribute can consist
* of an array of elements.)
* <br>
* Legal values: 8, 16, 32, 64 and 128 bits.
* @param aArraySize Size of array.
* <br>
* Legal values:
* 0 = variable-sized array,
* 1 = no array, and
* 2- = fixed size array.
* <br>
* <em>
* Variable-sized array attributes are
* not yet supported.
* </em>
* <br>
* There is no upper limit of the array size
* for a single attribute.
* @param aAttrType The attribute type.
* This is only of interest if calculations are
* made within NDB.
* <br>
* Legal values: UnSigned, Signed, Float, String
* @param aStorageMode Main memory based or disk based attribute.<br>
* Legal values: MMBased, DiskBased
* <br>
* <em>
* Disk-based attributes are not yet supported.
* </em>
* @param nullable Set to true if NULL is a correct value for
* the attribute.
* <br>
* Legal values: true, false
* @param aStType Stored in both index and data storage or
* only store in index data storage.
* <br>
* This parameter is only of interest for tuple
* key attributes.
* All tuple key attributes values are always stored
* in the index storage part.
* If this parameter is set to
* IndexStorageAttribute, then the attribute values
* will <em>only</em> be stored in the index
* storage part and <em>not</em> in the data
* storage part.
* <br>
* If there will be no scans using the primary
* key attribute and if the size of the attribute
* is large, then this might be of interest.
* A typical example is a table where
* http-addresses are used as primary key.
* <br>
* Legal values: NormalStorageAttribute,
* IndexStorageAttribute
* @param aDistributionKey Sometimes it is preferable to use a subset
* of the primary key as the distribution key.
* An example is TPC-C where it might be
* good to use the warehouse id and district id
* as the distribution key.
* <br>
* Locally in the fragments the full primary key
* will still be used with the hashing algorithm.
* Set to 1 if this attribute is part of the
* distribution key.
* All distribution key attributes must be
* defined before
* any other attributes are defined.
* @param aDistributionGroup In other applications it is desirable to use
* only a part of an attribute to create the
* distribution key.
* This is applicable for some telecom
* applications.
* <br>
* In these situations one must provide how many
* bits of the attribute that is to
* be used as the distribution hash value.
* <br>
* This provides some control to the
* application of the distribution.
* It still needs to be part of a primary key
* the attribute and must be defined as the
* first attribute.
* @param aDistributionGroupNoOfBits
* Number of bits to use of the
* distribution group attribute in the
* distribution hash value.
* <br>
* Currently, only 16 bits is supported. It will
* always be the last 16 bits in the attribute
* which is used for the distribution group.
* @param aAutoIncrement Set to autoincrement attribute.
* @param aDefaultValue Set a default value of attribute.
*
* @return Returns 0 when successful and returns -1 otherwise.
****************************************************************************/
int createAttribute(const char* aAttrName,
KeyType aTupleKey = NoKey,
int aAttrSize = 32,
int aArraySize = 1,
AttrType aAttrType = UnSigned,
StorageMode aStorageMode = MMBased,
bool nullable = false,
StorageAttributeType aStType= NormalStorageAttribute,
int aDistributionKey = 0,
int aDistributionGroup = 0,
int aDistributionGroupNoOfBits = 16,
bool aAutoIncrement = false,
const char* aDefaultValue = 0);
/**
* @deprecated do not use!
*/
int createAttribute(const char* aAttrName,
KeyType aTupleKey,
int aAttrSize,
int aArraySize,
AttrType aAttrType,
StorageMode aStorageMode,
NullAttributeType aNullAttr,
StorageAttributeType aStType = NormalStorageAttribute,
int aDistributionKey = 0,
int aDistributionGroup = 0,
int aDistributionGroupNoOfBits = 16){
return createAttribute(aAttrName,
aTupleKey,
aAttrSize,
aArraySize,
aAttrType,
aStorageMode,
aNullAttr == NullAttribute,
aStType,
aDistributionKey,
aDistributionGroup,
aDistributionGroupNoOfBits);
}
const NdbError & getNdbError() const;
protected:
/*****************************************************************************
* These are the methods used to create and delete the NdbOperation objects.
****************************************************************************/
NdbSchemaOp(Ndb* aNdb);
~NdbSchemaOp();
/******************************************************************************
* These methods are service routines used by the other NDBAPI classes.
*****************************************************************************/
void release(); // Release all memory connected
// to the operations object.
/****************************************************************************
* The methods below is the execution part of the NdbSchemaOp class.
*****************************************************************************/
int sendRec();
int sendSignals(Uint32 aNodeId, bool HaveMutex);
int init(NdbSchemaCon* aSchemaCon);
/**************************************************************************
* These are the private variables that are defined in the operation
* objects.
**************************************************************************/
Ndb* theNdb; // Point back to the Ndb object.
NdbSchemaCon* theSchemaCon; // Point back to the connection object.
class NdbDictionary::Table * m_currentTable;
};
/**
* Get old attribute type from new type
*
* NOTE! attrType is deprecated, use getType instead!
*
* @return Type of attribute: { Signed, UnSigned, Float,a String }
*/
inline
AttrType
convertColumnTypeToAttrType(NdbDictionary::Column::Type _type)
{
switch(_type){
case NdbDictionary::Column::Bigint:
case NdbDictionary::Column::Int:
return Signed;
case NdbDictionary::Column::Bigunsigned:
case NdbDictionary::Column::Unsigned:
return UnSigned;
case NdbDictionary::Column::Float:
case NdbDictionary::Column::Decimal:
case NdbDictionary::Column::Double:
return Float;
case NdbDictionary::Column::Char:
case NdbDictionary::Column::Varchar:
case NdbDictionary::Column::Binary:
case NdbDictionary::Column::Varbinary:
return String;
case NdbDictionary::Column::Datetime:
case NdbDictionary::Column::Timespec:
case NdbDictionary::Column::Undefined:
default:
return NoAttrTypeDef;
}
}
#endif
#endif