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

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 ODBC_COMMON_DataField_hpp
  14. #define ODBC_COMMON_DataField_hpp
  15. #include <NdbApi.hpp>
  16. #include <common/common.hpp>
  17. #include "DataType.hpp"
  18. /**
  19.  * @class SqlSpec
  20.  * @brief Specification of data in SQL format
  21.  */
  22. class SqlSpec {
  23. public:
  24.     enum Store {
  25. Undef = 0,
  26. Reference = 1, // reference to read-only SqlField of same type
  27. Physical = 2 // stored within or in allocated storage
  28.     };
  29.     SqlSpec();
  30.     SqlSpec(const SqlType& sqlType, Store store);
  31.     SqlSpec(const SqlSpec& sqlSpec);
  32.     SqlSpec(const SqlSpec& sqlSpec, Store store);
  33.     const SqlType& sqlType() const;
  34.     const Store store() const;
  35.     unsigned size() const;
  36. private:
  37.     //SqlSpec& operator=(const SqlSpec& sqlSpec); // disallowed
  38.     SqlType m_sqlType;
  39.     Store m_store;
  40. };
  41. /**
  42.  * @class ExtSpec
  43.  * @brief Specification of data in external format
  44.  */
  45. class ExtSpec {
  46. public:
  47.     ExtSpec();
  48.     ExtSpec(const ExtType& extType);
  49.     ExtSpec(const ExtSpec& extSpec);
  50.     const ExtType& extType() const;
  51.     unsigned size() const;
  52.     void setValue(const ExtType& extType);
  53. private:
  54.     ExtType m_extType;
  55. };
  56. /**
  57.  * @class LexSpec
  58.  * @brief Specification of lexical data
  59.  *
  60.  * Used only for converting lexical data to SQL data.
  61.  */
  62. class LexSpec {
  63. public:
  64.     LexSpec();
  65.     LexSpec(const LexType& lexType);
  66.     /**
  67.      * Lexical data is represented as string.  Following
  68.      * converts it to SQL data.
  69.      */
  70.     void convert(Ctx& ctx, const BaseString& value, class SqlField& out);
  71. private:
  72.     LexType m_lexType;
  73. };
  74. // SqlSpec
  75. inline
  76. SqlSpec::SqlSpec() :
  77.     m_store(Undef)
  78. {
  79. }
  80. inline
  81. SqlSpec::SqlSpec(const SqlType& sqlType, Store store) :
  82.     m_sqlType(sqlType),
  83.     m_store(store)
  84. {
  85. }
  86. inline
  87. SqlSpec::SqlSpec(const SqlSpec& sqlSpec) :
  88.     m_sqlType(sqlSpec.m_sqlType),
  89.     m_store(sqlSpec.m_store)
  90. {
  91. }
  92. inline
  93. SqlSpec::SqlSpec(const SqlSpec& sqlSpec, Store store) :
  94.     m_sqlType(sqlSpec.m_sqlType),
  95.     m_store(store)
  96. {
  97. }
  98. inline const SqlType&
  99. SqlSpec::sqlType() const
  100. {
  101.     return m_sqlType;
  102. }
  103. inline const SqlSpec::Store
  104. SqlSpec::store() const
  105. {
  106.     return m_store;
  107. }
  108. inline unsigned
  109. SqlSpec::size() const
  110. {
  111.     return sqlType().size();
  112. }
  113. // ExtSpec
  114. inline
  115. ExtSpec::ExtSpec()
  116. {
  117. }
  118. inline
  119. ExtSpec::ExtSpec(const ExtType& extType) :
  120.     m_extType(extType)
  121. {
  122. }
  123. inline
  124. ExtSpec::ExtSpec(const ExtSpec& extSpec) :
  125.     m_extType(extSpec.m_extType)
  126. {
  127. }
  128. inline const ExtType&
  129. ExtSpec::extType() const
  130. {
  131.     return m_extType;
  132. }
  133. inline unsigned
  134. ExtSpec::size() const
  135. {
  136.     return m_extType.size();
  137. }
  138. inline void
  139. ExtSpec::setValue(const ExtType& extType)
  140. {
  141.     m_extType = extType;
  142. }
  143. // LexSpec
  144. inline
  145. LexSpec::LexSpec(const LexType& lexType) :
  146.     m_lexType(lexType)
  147. {
  148. }
  149. /**
  150.  * @class SqlField
  151.  * @brief Sql data field accessor
  152.  */
  153. class SqlField {
  154. public:
  155.     SqlField();
  156.     SqlField(const SqlSpec& sqlSpec);
  157.     SqlField(const SqlSpec& sqlSpec, const SqlField* sqlField);
  158.     SqlField(const SqlField& sqlField);
  159.     ~SqlField();
  160.     const SqlSpec& sqlSpec() const;
  161.     const void* addr() const; // address of data
  162.     void* addr();
  163.     unsigned allocSize() const;
  164.     const SqlChar* sqlChar() const; // get
  165.     const SqlChar* sqlVarchar(unsigned* length) const;
  166.     const SqlChar* sqlBinary() const;
  167.     const SqlChar* sqlVarbinary(unsigned* length) const;
  168.     SqlSmallint sqlSmallint() const;
  169.     SqlInteger sqlInteger() const;
  170.     SqlBigint sqlBigint() const;
  171.     SqlReal sqlReal() const;
  172.     SqlDouble sqlDouble() const;
  173.     SqlDatetime sqlDatetime() const;
  174.     void sqlChar(const char* value, int length); // set
  175.     void sqlChar(const SqlChar* value, int length);
  176.     void sqlVarchar(const char* value, int length);
  177.     void sqlVarchar(const SqlChar* value, int length);
  178.     void sqlBinary(const char* value, int length);
  179.     void sqlBinary(const SqlChar* value, int length);
  180.     void sqlVarbinary(const char* value, int length);
  181.     void sqlVarbinary(const SqlChar* value, int length);
  182.     void sqlSmallint(SqlSmallint value);
  183.     void sqlInteger(SqlInteger value);
  184.     void sqlBigint(SqlBigint value);
  185.     void sqlReal(SqlReal value);
  186.     void sqlDouble(SqlDouble value);
  187.     void sqlDatetime(SqlDatetime value);
  188.     bool sqlNull() const; // get and set null
  189.     void sqlNull(bool value);
  190.     unsigned trim() const; // right trimmed length
  191.     void copy(Ctx& ctx, SqlField& out) const;
  192.     bool cast(Ctx& ctx, SqlField& out) const;
  193.     bool less(const SqlField& sqlField) const;
  194.     // application input and output
  195.     void copyin(Ctx& ctx, class ExtField& extField);
  196.     void copyout(Ctx& ctx, class ExtField& extField) const;
  197.     // print for debugging
  198.     void print(char* buf, unsigned size) const;
  199.     // public for forte6
  200.     //enum { CharSmall = 20 };
  201. #define SqlField_CharSmall 20 // redhat-6.2 (egcs-2.91.66)
  202. private:
  203.     friend class LexSpec;
  204.     friend class SqlRow;
  205.     void alloc(); // allocate Physical
  206.     void alloc(const SqlField& sqlField);
  207.     void free(); // free Physical
  208.     SqlSpec m_sqlSpec;
  209.     union Data {
  210. Data();
  211. Data(const SqlField* sqlField);
  212. const SqlField* m_sqlField;
  213. // Physical
  214. SqlChar* m_sqlChar; // all char types
  215. SqlChar m_sqlCharSmall[SqlField_CharSmall];
  216. SqlSmallint m_sqlSmallint;
  217. SqlInteger m_sqlInteger;
  218. SqlBigint m_sqlBigint;
  219. SqlReal m_sqlReal;
  220. SqlDouble m_sqlDouble;
  221. SqlDatetime m_sqlDatetime;
  222.     } u_data;
  223.     union Null {
  224. Null();
  225. bool m_nullFlag;
  226.     } u_null;
  227. };
  228. /**
  229.  * @class ExtField
  230.  * @brief External data field accessor
  231.  */
  232. class ExtField {
  233. public:
  234.     ExtField();
  235.     ExtField(const ExtSpec& extSpec, int fieldId = 0);
  236.     ExtField(const ExtSpec& extSpec, SQLPOINTER dataPtr, SQLINTEGER dataLen, SQLINTEGER* indPtr, int fieldId = 0);
  237.     ~ExtField();
  238.     const ExtSpec& extSpec() const;
  239.     void setValue(SQLPOINTER dataPtr, SQLINTEGER dataLen);
  240.     void setValue(const ExtSpec& extSpec, SQLPOINTER dataPtr, SQLINTEGER dataLen, SQLINTEGER* indPtr);
  241.     int fieldId() const;
  242.     void setPos(int pos);
  243.     int getPos() const;
  244. private:
  245.     friend class SqlField;
  246.     friend class Exec_root;
  247.     ExtSpec m_extSpec;
  248.     SQLPOINTER m_dataPtr; // data buffer
  249.     SQLINTEGER m_dataLen; // data buffer length
  250.     SQLINTEGER* m_indPtr; // null indicator or length
  251.     int m_fieldId; // field id > 0 for error messages
  252.     int m_pos; // output position for SQLGetData (if != -1)
  253. };
  254. inline int
  255. ExtField::fieldId() const
  256. {
  257.     return m_fieldId;
  258. }
  259. inline void
  260. ExtField::setPos(int pos)
  261. {
  262.     m_pos = pos;
  263. }
  264. inline int
  265. ExtField::getPos() const
  266. {
  267.     return m_pos;
  268. }
  269. // SqlField
  270. inline
  271. SqlField::SqlField()
  272. {
  273. }
  274. inline
  275. SqlField::SqlField(const SqlSpec& sqlSpec) :
  276.     m_sqlSpec(sqlSpec)
  277. {
  278.     if (m_sqlSpec.store() == SqlSpec::Physical)
  279. alloc();
  280. }
  281. inline
  282. SqlField::SqlField(const SqlSpec& sqlSpec, const SqlField* sqlField) :
  283.     m_sqlSpec(sqlSpec),
  284.     u_data(sqlField)
  285. {
  286.     ctx_assert(m_sqlSpec.store() == SqlSpec::Reference);
  287. }
  288. inline
  289. SqlField::SqlField(const SqlField& sqlField) :
  290.     m_sqlSpec(sqlField.m_sqlSpec),
  291.     u_data(sqlField.u_data),
  292.     u_null(sqlField.u_null)
  293. {
  294.     if (m_sqlSpec.store() == SqlSpec::Physical)
  295. alloc(sqlField);
  296. }
  297. inline
  298. SqlField::Data::Data()
  299. {
  300. }
  301. inline
  302. SqlField::Data::Data(const SqlField* sqlField)
  303. {
  304.     m_sqlField = sqlField;
  305. }
  306. inline
  307. SqlField::Null::Null()
  308. {
  309. }
  310. inline
  311. SqlField::~SqlField()
  312. {
  313.     if (m_sqlSpec.store() == SqlSpec::Physical)
  314. free();
  315. }
  316. inline const SqlSpec&
  317. SqlField::sqlSpec() const
  318. {
  319.     return m_sqlSpec;
  320. }
  321. inline void
  322. SqlField::sqlChar(const char* value, int length)
  323. {
  324.     sqlChar(reinterpret_cast<const SqlChar*>(value), length);
  325. }
  326. inline void
  327. SqlField::sqlVarchar(const char* value, int length)
  328. {
  329.     sqlVarchar(reinterpret_cast<const SqlChar*>(value), length);
  330. }
  331. inline void
  332. SqlField::sqlBinary(const char* value, int length)
  333. {
  334.     sqlBinary(reinterpret_cast<const SqlChar*>(value), length);
  335. }
  336. inline void
  337. SqlField::sqlVarbinary(const char* value, int length)
  338. {
  339.     sqlVarbinary(reinterpret_cast<const SqlChar*>(value), length);
  340. }
  341. // ExtField
  342. inline
  343. ExtField::ExtField() :
  344.     m_dataPtr(0),
  345.     m_dataLen(0),
  346.     m_indPtr(0),
  347.     m_pos(-1)
  348. {
  349. }
  350. inline
  351. ExtField::ExtField(const ExtSpec& extSpec, int fieldId) :
  352.     m_extSpec(extSpec),
  353.     m_dataPtr(0),
  354.     m_dataLen(0),
  355.     m_indPtr(0),
  356.     m_fieldId(fieldId),
  357.     m_pos(-1)
  358. {
  359. }
  360. inline
  361. ExtField::ExtField(const ExtSpec& extSpec, SQLPOINTER dataPtr, SQLINTEGER dataLen, SQLINTEGER* indPtr, int fieldId) :
  362.     m_extSpec(extSpec),
  363.     m_dataPtr(dataPtr),
  364.     m_dataLen(dataLen),
  365.     m_indPtr(indPtr),
  366.     m_fieldId(fieldId),
  367.     m_pos(-1)
  368. {
  369. }
  370. inline
  371. ExtField::~ExtField()
  372. {
  373. }
  374. inline const ExtSpec&
  375. ExtField::extSpec() const
  376. {
  377.     return m_extSpec;
  378. }
  379. inline void
  380. ExtField::setValue(SQLPOINTER dataPtr, SQLINTEGER dataLen)
  381. {
  382.     m_dataPtr = dataPtr;
  383.     m_dataLen = dataLen;
  384. }
  385. inline void
  386. ExtField::setValue(const ExtSpec& extSpec, SQLPOINTER dataPtr, SQLINTEGER dataLen, SQLINTEGER* indPtr)
  387. {
  388.     m_extSpec.setValue(extSpec.extType());
  389.     m_dataPtr = dataPtr;
  390.     m_dataLen = dataLen;
  391.     m_indPtr = indPtr;
  392. }
  393. #endif