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

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_DescArea_hpp
  14. #define ODBC_COMMON_DescArea_hpp
  15. #include <map>
  16. #include <vector>
  17. #include <common/common.hpp>
  18. #include "OdbcData.hpp"
  19. /**
  20.  * Descriptor records.  Contains:
  21.  * -# header, not called a "record" in this context
  22.  * -# bookmark record at index position 0
  23.  * -# descriptor records at index positions starting from 1
  24.  *
  25.  * These classes are in common/ since the code is general.
  26.  * However each area is associated with a HandleDesc.
  27.  *
  28.  * DescField - field identified by an SQL_DESC_* constant
  29.  * DescRec   - header or record, a list of fields
  30.  * DescArea  - header and all records
  31.  */
  32. class HandleBase;
  33. class DescField;
  34. class DescRec;
  35. class DescArea;
  36. enum DescPos {
  37.     Desc_pos_undef = 0,
  38.     Desc_pos_header,
  39.     Desc_pos_record,
  40.     Desc_pos_end
  41. };
  42. enum DescMode {
  43.     Desc_mode_undef = 0,
  44.     Desc_mode_readonly,
  45.     Desc_mode_writeonly,
  46.     Desc_mode_readwrite,
  47.     Desc_mode_unused
  48. };
  49. struct DescSpec {
  50.     DescPos m_pos; // header or record
  51.     int m_id; // SQL_DESC_ identifier
  52.     OdbcData::Type m_type; // data type
  53.     DescMode m_mode[1+4]; // access mode IPD APD IRD ARD
  54.     // called before setting value
  55.     typedef void CallbackSet(Ctx& ctx, HandleBase* self, const OdbcData& data);
  56.     CallbackSet* m_set;
  57.     // called to get default value
  58.     typedef void CallbackDefault(Ctx& ctx, HandleBase* self, OdbcData& data);
  59.     CallbackDefault* m_default;
  60. };
  61. enum DescAlloc {
  62.     Desc_alloc_undef = 0,
  63.     Desc_alloc_auto,
  64.     Desc_alloc_user
  65. };
  66. enum DescUsage {
  67.     Desc_usage_undef = 0,
  68.     Desc_usage_IPD = 1, // these must be 1-4
  69.     Desc_usage_IRD = 2,
  70.     Desc_usage_APD = 3,
  71.     Desc_usage_ARD = 4
  72. };
  73. /**
  74.  * @class DescField
  75.  * @brief Field identified by an SQL_DESC_* constant
  76.  */
  77. class DescField {
  78. public:
  79.     DescField(const DescSpec& spec, const OdbcData& data);
  80.     DescField(const DescField& field);
  81.     ~DescField();
  82. private:
  83.     friend class DescRec;
  84.     void setData(const OdbcData& data);
  85.     const OdbcData& getData();
  86.     const DescSpec& m_spec;
  87.     OdbcData m_data;
  88. };
  89. inline
  90. DescField::DescField(const DescSpec& spec, const OdbcData& data) :
  91.     m_spec(spec),
  92.     m_data(data)
  93. {
  94. }
  95. inline
  96. DescField::DescField(const DescField& field) :
  97.     m_spec(field.m_spec),
  98.     m_data(field.m_data)
  99. {
  100. }
  101. inline
  102. DescField::~DescField()
  103. {
  104. }
  105. inline void
  106. DescField::setData(const OdbcData& data)
  107. {
  108.     ctx_assert(m_spec.m_type == data.type());
  109.     m_data.setValue(data);
  110. }
  111. inline const OdbcData&
  112. DescField::getData()
  113. {
  114.     ctx_assert(m_data.type() != OdbcData::Undef);
  115.     return m_data;
  116. }
  117. /**
  118.  * @class DescRec
  119.  * @brief Descriptor record, a list of fields
  120.  */
  121. class DescRec {
  122.     friend class DescArea;
  123. public:
  124.     DescRec();
  125.     ~DescRec();
  126.     void setField(int id, const OdbcData& data);
  127.     void getField(int id, OdbcData& data);
  128.     void setField(Ctx& ctx, int id, const OdbcData& data);
  129.     void getField(Ctx& ctx, int id, OdbcData& data);
  130. private:
  131.     DescArea* m_area;
  132.     int m_num; // for logging only -1 = header 0 = bookmark
  133.     typedef std::map<int, DescField> Fields;
  134.     Fields m_fields;
  135. };
  136. inline
  137. DescRec::DescRec() :
  138.     m_area(0)
  139. {
  140. }
  141. inline
  142. DescRec::~DescRec()
  143. {
  144. }
  145. /**
  146.  * @class DescArea
  147.  * @brief All records, including header (record 0)
  148.  *
  149.  * Descriptor area includes a header (record 0)
  150.  * and zero or more records at position >= 1.  
  151.  * Each of these describes one parameter or one column.
  152.  *
  153.  * - DescArea : Collection of records
  154.  *   - DescRec : Collection of fields
  155.  *     - DescField : Contains data of type OdbcData
  156.  */
  157. class DescArea {
  158. public:
  159.     DescArea(HandleBase* handle, const DescSpec* specList);
  160.     ~DescArea();
  161.     void setAlloc(DescAlloc alloc);
  162.     DescAlloc getAlloc() const;
  163.     void setUsage(DescUsage usage);
  164.     DescUsage getUsage() const;
  165.     static const char* nameUsage(DescUsage u);
  166.     // find specifier
  167.     const DescSpec& findSpec(int id);
  168.     // get or set number of records (record 0 not counted)
  169.     unsigned getCount() const;
  170.     void setCount(Ctx& ctx, unsigned count);
  171.     // paush new record (record 0 exists always)
  172.     DescRec& pushRecord();
  173.     // get ref to header or to any record
  174.     DescRec& getHeader();
  175.     DescRec& getRecord(unsigned num);
  176.     // modified since last bind
  177.     void setBound(bool bound);
  178.     bool isBound() const;
  179. private:
  180.     HandleBase* m_handle;
  181.     const DescSpec* const m_specList;
  182.     DescRec m_header;
  183.     typedef std::vector<DescRec> Recs;
  184.     Recs m_recs;
  185.     DescAlloc m_alloc;
  186.     DescUsage m_usage;
  187.     bool m_bound;
  188. };
  189. inline void
  190. DescArea::setAlloc(DescAlloc alloc)
  191. {
  192.     m_alloc = alloc;
  193. }
  194. inline DescAlloc
  195. DescArea::getAlloc() const
  196. {
  197.     return m_alloc;
  198. }
  199. inline void
  200. DescArea::setUsage(DescUsage usage)
  201. {
  202.     m_usage = usage;
  203. }
  204. inline DescUsage
  205. DescArea::getUsage() const
  206. {
  207.     return m_usage;
  208. }
  209. inline const char*
  210. DescArea::nameUsage(DescUsage u)
  211. {
  212.     switch (u) {
  213.     case Desc_usage_undef:
  214. break;
  215.     case Desc_usage_IPD:
  216. return "IPD";
  217.     case Desc_usage_IRD:
  218. return "IRD";
  219.     case Desc_usage_APD:
  220. return "APD";
  221.     case Desc_usage_ARD:
  222. return "ARD";
  223.     }
  224.     return "?";
  225. }
  226. inline void
  227. DescArea::setBound(bool bound)
  228. {
  229.     m_bound = bound;
  230. }
  231. inline bool
  232. DescArea::isBound() const
  233. {
  234.     return m_bound;
  235. }
  236. #endif