mariadb/ndb/include/ndbapi/NdbRecAttr.hpp
magnus@neptunus.(none) 80837e0c7d Removed AttrType.hpp and moved the "internal" datatypes to their corresponding class.
Moved NdbSchemaCon and NdbSchemaOp out of the public NdbApi, it can however still be used by old test programs.
Added print oof indexes to desc.
2004-05-25 11:53:07 +02:00

479 lines
11 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 NdbRecAttr_H
#define NdbRecAttr_H
#include <NdbDictionary.hpp>
class NdbOperation;
class AttrInfo;
/**
* @class NdbRecAttr
* @brief Contains value of an attribute.
*
* NdbRecAttr objects are used to store the attribute value
* after retrieving the value from the NDB Cluster using the method
* NdbOperation::getValue. The objects are allocated by the NDB API.
* An example application program follows:
*
* @code
* MyRecAttr = MyOperation->getValue("ATTR2", NULL);
* if (MyRecAttr == NULL) goto error;
*
* if (MyConnection->execute(Commit) == -1) goto error;
*
* ndbout << MyRecAttr->u_32_value();
* @endcode
* For more examples, see
* @ref ndbapi_example1.cpp and
* @ref ndbapi_example2.cpp.
*
* @note The NdbRecAttr object is instantiated with its value when
* NdbConnection::execute is called. Before this, the value is
* undefined. (NdbRecAttr::isNULL can be used to check
* if the value is defined or not.)
* This means that an NdbRecAttr object only has valid information
* between the time of calling NdbConnection::execute and
* the time of Ndb::closeTransaction.
* The value of the null indicator is -1 until the
* NdbConnection::execute method have been called.
*
* For simple types, there are methods which directly getting the value
* from the NdbRecAttr object.
*
* To get a reference to the value, there are two methods:
* NdbRecAttr::aRef (memory is released by NDB API) and
* NdbRecAttr::getAttributeObject (memory must be released
* by application program).
* The two methods may return different pointers.
*
* There are also methods to check attribute type, attribute size and
* array size.
* The method NdbRecAttr::arraySize returns the number of elements in the
* array (where each element is of size given by NdbRecAttr::attrSize).
* The NdbRecAttr::arraySize method is needed when reading variable-sized
* attributes.
*
* @note Variable-sized attributes are not yet supported.
*/
class NdbRecAttr
{
friend class NdbOperation;
friend class NdbEventOperationImpl;
friend class NdbScanReceiver;
friend class Ndb;
public:
/**
* @name Getting meta information
* @{
*/
const NdbDictionary::Column * getColumn() const;
/**
* Get type of column
* @return Data type of the column
*/
NdbDictionary::Column::Type getType() const;
/**
* Get attribute (element) size in bytes.
*
* @note For arrays, the method only gives the size of an element.
* The total attribute size is calculated by
* multiplying this value with the value
* returned by NdbRecAttr::arraySize.
*
* @return Attribute size in 32 bit unsigned int.
*/
Uint32 attrSize() const ;
/**
* Get array size of attribute.
* For variable-sized arrays this method returns the
* size of the attribute read.
*
* @return array size in 32 unsigned int.
*/
Uint32 arraySize() const ;
Uint32 getLength() const ;
/** @} *********************************************************************/
/**
* @name Getting stored value
* @{
*/
/**
* Check if attribute value is NULL.
*
* @return -1 = Not defined (Failure or
* NdbConnection::execute not yet called).<br>
* 0 = Attribute value is defined, but not equal to NULL.<br>
* 1 = Attribute value is defined and equal to NULL.
*/
int isNULL() const;
/**
* Get value stored in NdbRecAttr object.
*
* @return 64 bit long value.
*/
Int64 int64_value() const;
/**
* Get value stored in NdbRecAttr object.
*
* @return 32 bit int value.
*/
Int32 int32_value() const;
/**
* Get value stored in NdbRecAttr object.
*
* @return Short value.
*/
short short_value() const;
/**
* Get value stored in NdbRecAttr object.
*
* @return Char value.
*/
char char_value() const;
/**
* Get value stored in NdbRecAttr object.
*
* @return 64 bit unsigned value.
*/
Uint64 u_64_value() const;
/**
* Get value stored in NdbRecAttr object.
*
* @return 32 bit unsigned value.
*/
Uint32 u_32_value() const;
/**
* Get value stored in NdbRecAttr object.
*
* @return Unsigned short value.
*/
Uint16 u_short_value() const;
/**
* Get value stored in NdbRecAttr object.
*
* @return Unsigned char value.
*/
Uint8 u_char_value() const;
/**
* Get value stored in NdbRecAttr object.
*
* @return Float value.
*/
float float_value() const;
/**
* Get value stored in NdbRecAttr object.
*
* @return Double value.
*/
double double_value() const;
/** @} *********************************************************************/
/**
* @name Getting reference to stored value
* @{
*/
/**
* Get reference to attribute value.
*
* Returns a char*-pointer to the value.
* The pointer is aligned appropriately for the data type.
* The memory is released when Ndb::closeTransaction is executed
* for the transaction which read the value.
*
* @note The memory is released by NDB API.
*
* @note The pointer to the attribute value stored in an NdbRecAttr
* object (i.e. the pointer returned by aRef) is constant.
* This means that this method can be called anytime after
* NdbOperation::getValue has been called.
*
* @return Pointer to attribute value.
*/
char* aRef() const;
/** @} *********************************************************************/
/**
* Make a copy of RecAttr object including all data.
*
* @note Copy needs to be deleted by application program.
*/
NdbRecAttr * clone() const;
/**
* Destructor
*
* @note You should only delete RecAttr-copies,
* i.e. objects that has been cloned.
*/
~NdbRecAttr();
private:
NdbRecAttr();
Uint32 attrId() const; /* Get attribute id */
void setNULL(); /* Set NULL indicator */
void setNotNULL(); /* Set Not NULL indicator */
void setUNDEFINED(); /* Set UNDEFINED indicator */
void release(); /* Release memory if allocated */
void init(); /* Initialise object when allocated */
void next(NdbRecAttr* aRecAttr);
NdbRecAttr* next() const;
int setup(const class NdbColumnImpl* anAttrInfo, char* aValue);
/* Set up attributes and buffers */
bool copyoutRequired() const; /* Need to copy data to application */
void copyout(); /* Copy from storage to application */
Uint64 theStorage[4]; /* The data storage here if <= 32 bytes */
Uint64* theStorageX; /* The data storage here if > 32 bytes */
char* theValue; /* The data storage in the application */
void* theRef; /* Pointer to one of above */
NdbRecAttr* theNext; /* Next pointer */
Uint32 theAttrId; /* The attribute id */
int theNULLind;
Uint32 theAttrSize;
Uint32 theArraySize;
const NdbDictionary::Column* m_column;
};
inline
NdbDictionary::Column::Type
NdbRecAttr::getType() const {
return m_column->getType();
}
inline
const NdbDictionary::Column *
NdbRecAttr::getColumn() const {
return m_column;
}
inline
Uint32
NdbRecAttr::attrSize() const {
switch(getType()){
case NdbDictionary::Column::Int:
case NdbDictionary::Column::Unsigned:
case NdbDictionary::Column::Float:
return 4;
case NdbDictionary::Column::Decimal:
case NdbDictionary::Column::Char:
case NdbDictionary::Column::Varchar:
case NdbDictionary::Column::Binary:
case NdbDictionary::Column::Varbinary:
return 1;
case NdbDictionary::Column::Bigint:
case NdbDictionary::Column::Bigunsigned:
case NdbDictionary::Column::Double:
case NdbDictionary::Column::Datetime:
return 8;
case NdbDictionary::Column::Timespec:
return 12;
case NdbDictionary::Column::Undefined:
default:
return 0;
}
}
inline
Uint32
NdbRecAttr::arraySize() const
{
return theArraySize;
}
inline
Int64
NdbRecAttr::int64_value() const
{
return *(Int64*)theRef;
}
inline
Int32
NdbRecAttr::int32_value() const
{
return *(Int32*)theRef;
}
inline
short
NdbRecAttr::short_value() const
{
return *(short*)theRef;
}
inline
char
NdbRecAttr::char_value() const
{
return *(char*)theRef;
}
inline
Uint64
NdbRecAttr::u_64_value() const
{
return *(Uint64*)theRef;
}
inline
Uint32
NdbRecAttr::u_32_value() const
{
return *(Uint32*)theRef;
}
inline
Uint16
NdbRecAttr::u_short_value() const
{
return *(Uint16*)theRef;
}
inline
Uint8
NdbRecAttr::u_char_value() const
{
return *(Uint8*)theRef;
}
inline
float
NdbRecAttr::float_value() const
{
return *(float*)theRef;
}
inline
double
NdbRecAttr::double_value() const
{
return *(double*)theRef;
}
inline
void
NdbRecAttr::release()
{
if (theStorageX != 0) {
delete [] theStorageX;
theStorageX = 0;
}
}
inline
void
NdbRecAttr::init()
{
theStorageX = 0;
theValue = 0;
theRef = 0;
theNext = 0;
theAttrId = 0xFFFF;
theNULLind = -1;
}
inline
void
NdbRecAttr::next(NdbRecAttr* aRecAttr)
{
theNext = aRecAttr;
}
inline
NdbRecAttr*
NdbRecAttr::next() const
{
return theNext;
}
inline
char*
NdbRecAttr::aRef() const
{
return (char*)theRef;
}
inline
bool
NdbRecAttr::copyoutRequired() const
{
return theRef != theValue && theValue != 0;
}
inline
Uint32
NdbRecAttr::attrId() const
{
return theAttrId;
}
inline
void
NdbRecAttr::setNULL()
{
theNULLind = 1;
}
inline
void
NdbRecAttr::setNotNULL()
{
theNULLind = 0;
}
inline
void
NdbRecAttr::setUNDEFINED()
{
theNULLind = -1;
}
inline
int
NdbRecAttr::isNULL() const
{
return theNULLind;
}
#endif