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

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 NdbRecAttr_H
  14. #define NdbRecAttr_H
  15. #include "NdbDictionary.hpp"
  16. #include "Ndb.hpp"
  17. class NdbOperation;
  18. /**
  19.  * @class NdbRecAttr
  20.  * @brief Contains value of an attribute.
  21.  *
  22.  * NdbRecAttr objects are used to store the attribute value 
  23.  * after retrieving the value from the NDB Cluster using the method 
  24.  * NdbOperation::getValue.  The objects are allocated by the NDB API.
  25.  * An example application program follows:
  26.  *
  27.  * @code
  28.  *   MyRecAttr = MyOperation->getValue("ATTR2", NULL);
  29.  *   if (MyRecAttr == NULL) goto error;
  30.  *
  31.  *   if (MyConnection->execute(Commit) == -1) goto error;
  32.  *
  33.  *   ndbout << MyRecAttr->u_32_value();
  34.  * @endcode
  35.  * For more examples, see 
  36.  * @ref ndbapi_example1.cpp and 
  37.  * @ref ndbapi_example2.cpp.
  38.  *
  39.  * @note The NdbRecAttr object is instantiated with its value when 
  40.  *       NdbConnection::execute is called.  Before this, the value is 
  41.  *       undefined.  (NdbRecAttr::isNULL can be used to check 
  42.  *       if the value is defined or not.)
  43.  *       This means that an NdbRecAttr object only has valid information
  44.  *       between the time of calling NdbConnection::execute and
  45.  *       the time of Ndb::closeTransaction.
  46.  *       The value of the null indicator is -1 until the
  47.  *       NdbConnection::execute method have been called.
  48.  *
  49.  * For simple types, there are methods which directly getting the value
  50.  * from the NdbRecAttr object.
  51.  *
  52.  * To get a reference to the value, there are two methods:
  53.  * NdbRecAttr::aRef (memory is released by NDB API) and 
  54.  * NdbRecAttr::getAttributeObject (memory must be released 
  55.  * by application program).
  56.  * The two methods may return different pointers.
  57.  *
  58.  * There are also methods to check attribute type, attribute size and
  59.  * array size.  
  60.  * The method NdbRecAttr::arraySize returns the number of elements in the
  61.  * array (where each element is of size given by NdbRecAttr::attrSize). 
  62.  * The NdbRecAttr::arraySize method is needed when reading variable-sized
  63.  * attributes.
  64.  *
  65.  * @note Variable-sized attributes are not yet supported.
  66.  */
  67. class NdbRecAttr
  68. {
  69.   friend class NdbOperation;
  70.   friend class NdbIndexScanOperation;
  71.   friend class NdbEventOperationImpl;
  72.   friend class NdbReceiver;
  73.   friend class Ndb;
  74.   friend class NdbOut& operator<<(class NdbOut&, const class AttributeS&);
  75. public:
  76.   /** 
  77.    * @name Getting meta information
  78.    * @{
  79.    */
  80.   const NdbDictionary::Column * getColumn() const;
  81.   /**
  82.    * Get type of column
  83.    * @return Data type of the column
  84.    */
  85.   NdbDictionary::Column::Type getType() const;
  86.   
  87.   /**
  88.    * Get attribute (element) size in bytes. 
  89.    * 
  90.    * @note For arrays, the method only gives the size of an element.
  91.    *       The total attribute size is calculated by 
  92.    *       multiplying this value with the value 
  93.    *       returned by NdbRecAttr::arraySize.
  94.    *
  95.    * @return Attribute size in 32 bit unsigned int. 
  96.    */
  97.   Uint32 attrSize() const ;             
  98.   /**
  99.    * Get array size of attribute. 
  100.    * For variable-sized arrays this method returns the 
  101.    * size of the attribute read.
  102.    *
  103.    * @return array size in 32 unsigned int.
  104.    */
  105.   Uint32 arraySize() const ;            
  106.   Uint32 getLength() const ;
  107.   
  108.   /** @} *********************************************************************/
  109.   /** 
  110.    * @name Getting stored value
  111.    * @{
  112.    */
  113.   /** 
  114.    * Check if attribute value is NULL.
  115.    *
  116.    * @return -1 = Not defined (Failure or 
  117.    *              NdbConnection::execute not yet called).<br>
  118.    *          0 = Attribute value is defined, but not equal to NULL.<br>
  119.    *          1 = Attribute value is defined and equal to NULL.
  120.    */
  121.   int isNULL() const; 
  122.   /**
  123.    * Get value stored in NdbRecAttr object.
  124.    *
  125.    * @return  64 bit long value.
  126.    */
  127.   Int64 int64_value() const;  
  128.   /**
  129.    * Get value stored in NdbRecAttr object.
  130.    *
  131.    * @return  32 bit int value.
  132.    */   
  133.   Int32 int32_value() const;  
  134.   /**
  135.    * Get value stored in NdbRecAttr object.
  136.    *
  137.    * @return  Short value.
  138.    */
  139.   short short_value() const;
  140.   /**
  141.    * Get value stored in NdbRecAttr object.
  142.    *
  143.    * @return  Char value.
  144.    */           
  145.   char  char_value() const;           
  146.   /**
  147.    * Get value stored in NdbRecAttr object.
  148.    *
  149.    * @return  64 bit unsigned value.
  150.    */
  151.   Uint64 u_64_value() const;          
  152.   /**
  153.    * Get value stored in NdbRecAttr object.
  154.    *
  155.    * @return  32 bit unsigned value.
  156.    */
  157.   Uint32 u_32_value() const;          
  158.   /**
  159.    * Get value stored in NdbRecAttr object.
  160.    * 
  161.    * @return  Unsigned short value.
  162.    */
  163.   Uint16 u_short_value() const;
  164.   /**
  165.    * Get value stored in NdbRecAttr object.
  166.    *
  167.    * @return  Unsigned char value.
  168.    */   
  169.   Uint8 u_char_value() const;        
  170.   /**
  171.    * Get value stored in NdbRecAttr object.
  172.    *
  173.    * @return  Float value.
  174.    */
  175.   float float_value() const;         
  176.   /**
  177.    * Get value stored in NdbRecAttr object.
  178.    *
  179.    * @return  Double value.
  180.    */
  181.   double double_value() const;        
  182.   
  183.   /** @} *********************************************************************/
  184.   /** 
  185.    * @name Getting reference to stored value
  186.    * @{
  187.    */
  188.   /**
  189.    * Get reference to attribute value. 
  190.    * 
  191.    * Returns a char*-pointer to the value.
  192.    * The pointer is aligned appropriately for the data type.  
  193.    * The memory is released when Ndb::closeTransaction is executed 
  194.    * for the transaction which read the value.
  195.    *
  196.    * @note The memory is released by NDB API.
  197.    * 
  198.    * @note The pointer to the attribute value stored in an NdbRecAttr
  199.    *       object (i.e. the pointer returned by aRef) is constant.  
  200.    *       This means that this method can be called anytime after 
  201.    *       NdbOperation::getValue has been called.
  202.    * 
  203.    * @return Pointer to attribute value.         
  204.    */
  205.   char* aRef() const;                 
  206.                                 
  207.   /** @} *********************************************************************/
  208.                              
  209.   /**
  210.    * Make a copy of RecAttr object including all data.
  211.    *
  212.    * @note  Copy needs to be deleted by application program.
  213.    */
  214.   NdbRecAttr * clone() const;
  215.   
  216.   /**
  217.    * Destructor
  218.    *
  219.    * @note  You should only delete RecAttr-copies, 
  220.    *        i.e. objects that has been cloned.
  221.    */
  222.   ~NdbRecAttr();    
  223. private:
  224.   Uint32 attrId() const;        /* Get attribute id                     */
  225.   bool setNULL();               /* Set NULL indicator                   */
  226.   bool receive_data(const Uint32*, Uint32);
  227.   void release();               /* Release memory if allocated          */
  228.   void init();                  /* Initialise object when allocated     */
  229.   NdbRecAttr(Ndb*);
  230.   void next(NdbRecAttr* aRecAttr);
  231.   NdbRecAttr* next() const;
  232.   int setup(const class NdbDictionary::Column* col, char* aValue);
  233.   int setup(const class NdbColumnImpl* anAttrInfo, char* aValue);
  234.                                 /* Set up attributes and buffers        */
  235.   bool copyoutRequired() const; /* Need to copy data to application     */
  236.   void copyout();               /* Copy from storage to application     */
  237.   Uint64        theStorage[4];  /* The data storage here if <= 32 bytes */
  238.   Uint64*       theStorageX;    /* The data storage here if >  32 bytes */
  239.   char*         theValue;       /* The data storage in the application  */
  240.   void*         theRef;         /* Pointer to one of above              */
  241.   NdbRecAttr*   theNext;        /* Next pointer                         */
  242.   Uint32        theAttrId;      /* The attribute id                     */
  243.   int theNULLind;
  244.   bool m_nullable;
  245.   Uint32 theAttrSize;
  246.   Uint32 theArraySize;
  247.   const NdbDictionary::Column* m_column;
  248.   friend struct Ndb_free_list_t<NdbRecAttr>;
  249. };
  250. inline
  251. NdbDictionary::Column::Type
  252. NdbRecAttr::getType() const {
  253.   return m_column->getType();
  254. }
  255. inline
  256. const NdbDictionary::Column *
  257. NdbRecAttr::getColumn() const {
  258.   return m_column;
  259. }
  260. inline
  261. Uint32
  262. NdbRecAttr::attrSize() const {
  263.   return theAttrSize;
  264. }
  265. inline
  266. Uint32
  267. NdbRecAttr::arraySize() const 
  268. {
  269.   return theArraySize;
  270. }
  271. inline
  272. Int32
  273. NdbRecAttr::int32_value() const 
  274. {
  275.   return *(Int32*)theRef;
  276. }
  277. inline
  278. short
  279. NdbRecAttr::short_value() const
  280. {
  281.   return *(short*)theRef;
  282. }
  283. inline
  284. char
  285. NdbRecAttr::char_value() const
  286. {
  287.   return *(char*)theRef;
  288. }
  289. inline
  290. Uint32
  291. NdbRecAttr::u_32_value() const
  292. {
  293.   return *(Uint32*)theRef;
  294. }
  295. inline
  296. Uint16
  297. NdbRecAttr::u_short_value() const
  298. {
  299.   return *(Uint16*)theRef;
  300. }
  301. inline
  302. Uint8
  303. NdbRecAttr::u_char_value() const
  304. {
  305.   return *(Uint8*)theRef;
  306. }
  307. inline
  308. void
  309. NdbRecAttr::release()
  310. {
  311.   if (theStorageX != 0) {
  312.     delete [] theStorageX;
  313.     theStorageX = 0;
  314.   }
  315. }
  316. inline
  317. void
  318. NdbRecAttr::init()
  319. {
  320.   theStorageX = 0;
  321.   theValue = 0;
  322.   theRef = 0;
  323.   theNext = 0;
  324.   theAttrId = 0xFFFF;
  325.   theNULLind = -1;
  326. }
  327. inline
  328. void
  329. NdbRecAttr::next(NdbRecAttr* aRecAttr)
  330. {
  331.   theNext = aRecAttr;
  332. }
  333. inline
  334. NdbRecAttr*
  335. NdbRecAttr::next() const
  336. {
  337.   return theNext;
  338. }
  339. inline
  340. char*
  341. NdbRecAttr::aRef() const
  342. {
  343.   return (char*)theRef; 
  344. }
  345. inline
  346. bool
  347. NdbRecAttr::copyoutRequired() const
  348. {
  349.   return theRef != theValue && theValue != 0;
  350. }
  351. inline
  352. Uint32
  353. NdbRecAttr::attrId() const
  354. {
  355.   return theAttrId;
  356. }
  357. inline
  358. bool
  359. NdbRecAttr::setNULL()
  360. {
  361.   theNULLind = 1;
  362.   return m_nullable;
  363. }
  364. inline
  365. int
  366. NdbRecAttr::isNULL() const
  367. {
  368.   return theNULLind;
  369. }
  370. class NdbOut& operator <<(class NdbOut&, const NdbRecAttr &);
  371. #endif