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

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_DataRow_hpp
  14. #define ODBC_COMMON_DataRow_hpp
  15. #include <new>
  16. #include <common/common.hpp>
  17. #include "DataField.hpp"
  18. class Ctx;
  19. /**
  20.  * @class SqlSpecs
  21.  * @brief Specification of row of SQL data
  22.  */
  23. class SqlSpecs {
  24. public:
  25.     SqlSpecs(unsigned count);
  26.     SqlSpecs(const SqlSpecs& sqlSpecs);
  27.     ~SqlSpecs();
  28.     unsigned count() const;
  29.     void setEntry(unsigned i, const SqlSpec& sqlSpec);
  30.     const SqlSpec& getEntry(unsigned i) const;
  31. private:
  32.     SqlSpecs& operator=(const SqlSpecs& sqlSpecs); // disallowed
  33.     const unsigned m_count;
  34.     SqlSpec* m_sqlSpec;
  35. };
  36. inline unsigned
  37. SqlSpecs::count() const
  38. {
  39.     return m_count;
  40. }
  41. inline void
  42. SqlSpecs::setEntry(unsigned i, const SqlSpec& sqlSpec)
  43. {
  44.     ctx_assert(m_sqlSpec != 0 && 1 <= i && i <= m_count);
  45.     void* place = static_cast<void*>(&m_sqlSpec[i]);
  46.     new (place) SqlSpec(sqlSpec);
  47. }
  48. inline const SqlSpec&
  49. SqlSpecs::getEntry(unsigned i) const
  50. {
  51.     ctx_assert(m_sqlSpec != 0 && 1 <= i && i <= m_count);
  52.     return m_sqlSpec[i];
  53. }
  54. /**
  55.  * @class ExtSpecs
  56.  * @brief Specification of row of external data
  57.  */
  58. class ExtSpecs {
  59. public:
  60.     ExtSpecs(unsigned count);
  61.     ExtSpecs(const ExtSpecs& extSpecs);
  62.     ~ExtSpecs();
  63.     unsigned count() const;
  64.     void setEntry(unsigned i, const ExtSpec& extSpec);
  65.     const ExtSpec& getEntry(unsigned i) const;
  66. private:
  67.     ExtSpecs& operator=(const ExtSpecs& extSpecs); // disallowed
  68.     const unsigned m_count;
  69.     ExtSpec* m_extSpec;
  70. };
  71. inline unsigned
  72. ExtSpecs::count() const
  73. {
  74.     return m_count;
  75. }
  76. inline void
  77. ExtSpecs::setEntry(unsigned i, const ExtSpec& extSpec)
  78. {
  79.     ctx_assert(m_extSpec != 0 && 1 <= i && i <= m_count);
  80.     void* place = static_cast<void*>(&m_extSpec[i]);
  81.     new (place) ExtSpec(extSpec);
  82. }
  83. inline const ExtSpec&
  84. ExtSpecs::getEntry(unsigned i) const
  85. {
  86.     ctx_assert(m_extSpec != 0 && 1 <= i && i <= m_count);
  87.     return m_extSpec[i];
  88. }
  89. /**
  90.  * @class SqlRow
  91.  * @brief Sql data row
  92.  */
  93. class SqlRow {
  94. public:
  95.     SqlRow(const SqlSpecs& sqlSpecs);
  96.     SqlRow(const SqlRow& sqlRow);
  97.     ~SqlRow();
  98.     unsigned count() const;
  99.     void setEntry(unsigned i, const SqlField& sqlField);
  100.     SqlField& getEntry(unsigned i) const;
  101.     SqlRow* copy() const;
  102.     void copyout(Ctx& ctx, class ExtRow& extRow) const;
  103. private:
  104.     SqlRow& operator=(const SqlRow& sqlRow); // disallowed
  105.     SqlSpecs m_sqlSpecs;
  106.     SqlField* m_sqlField;
  107. };
  108. inline unsigned
  109. SqlRow::count() const
  110. {
  111.     return m_sqlSpecs.count();
  112. }
  113. inline void
  114. SqlRow::setEntry(unsigned i, const SqlField& sqlField)
  115. {
  116.     ctx_assert(1 <= i && i <= count() && m_sqlField != 0);
  117.     m_sqlField[i].~SqlField();
  118.     void* place = static_cast<void*>(&m_sqlField[i]);
  119.     new (place) SqlField(sqlField);
  120. }
  121. inline SqlField&
  122. SqlRow::getEntry(unsigned i) const
  123. {
  124.     ctx_assert(1 <= i && i <= count() && m_sqlField != 0);
  125.     return m_sqlField[i];
  126. }
  127. /**
  128.  * @class ExtRow
  129.  * @brief External data row
  130.  */
  131. class ExtRow {
  132. public:
  133.     ExtRow(const ExtSpecs& extSpecs);
  134.     ExtRow(const ExtRow& extRow);
  135.     ~ExtRow();
  136.     unsigned count() const;
  137.     void setEntry(unsigned i, const ExtField& extField);
  138.     ExtField& getEntry(unsigned i) const;
  139. private:
  140.     ExtRow& operator=(const ExtRow& extRow); // disallowed
  141.     ExtSpecs m_extSpecs;
  142.     ExtField* m_extField;
  143. };
  144. inline unsigned
  145. ExtRow::count() const
  146. {
  147.     return m_extSpecs.count();
  148. }
  149. inline void
  150. ExtRow::setEntry(unsigned i, const ExtField& extField)
  151. {
  152.     ctx_assert(1 <= i && i <= count() && m_extField != 0);
  153.     void* place = static_cast<void*>(&m_extField[i]);
  154.     new (place) ExtField(extField);
  155. }
  156. inline ExtField&
  157. ExtRow::getEntry(unsigned i) const
  158. {
  159.     ctx_assert(1 <= i && i <= count() && m_extField != 0);
  160.     return m_extField[i];
  161. }
  162. #endif