DiagArea.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_DiagArea_hpp
  14. #define ODBC_COMMON_DiagArea_hpp
  15. #include <map>
  16. #include <vector>
  17. #include <common/common.hpp>
  18. #include "OdbcData.hpp"
  19. enum DiagPos {
  20.     Diag_pos_undef = 0,
  21.     Diag_pos_header,
  22.     Diag_pos_status,
  23.     Diag_pos_end
  24. };
  25. /**
  26.  * @class DiagSpec
  27.  * @brief Field specification
  28.  */
  29. struct DiagSpec {
  30.     DiagPos m_pos; // header or status
  31.     int m_id; // SQL_DIAG_ identifier
  32.     OdbcData::Type m_type; // data type
  33.     unsigned m_handles; // defined for these handle types
  34.     // find the spec
  35.     static const DiagSpec& find(int id);
  36. };
  37. /**
  38.  * @class DiagField
  39.  * @brief Field identified by an SQL_DIAG_* constant
  40.  */
  41. class DiagField {
  42. public:
  43.     DiagField(const DiagSpec& spec, const OdbcData& data);
  44.     DiagField(const DiagField& field);
  45.     ~DiagField();
  46.     void setData(const OdbcData& data);
  47.     const OdbcData& getData();
  48. private:
  49.     const DiagSpec& m_spec;
  50.     OdbcData m_data;
  51. };
  52. inline
  53. DiagField::DiagField(const DiagSpec& spec, const OdbcData& data) :
  54.     m_spec(spec),
  55.     m_data(data)
  56. {
  57. }
  58. inline
  59. DiagField::DiagField(const DiagField& field) :
  60.     m_spec(field.m_spec),
  61.     m_data(field.m_data)
  62. {
  63. }
  64. inline
  65. DiagField::~DiagField()
  66. {
  67. }
  68. inline void
  69. DiagField::setData(const OdbcData& data)
  70. {
  71.     ctx_assert(m_spec.m_type == data.type());
  72.     m_data.setValue(data);
  73. }
  74. inline const OdbcData&
  75. DiagField::getData()
  76. {
  77.     ctx_assert(m_data.type() != OdbcData::Undef);
  78.     return m_data;
  79. }
  80. /**
  81.  * @class DiagRec
  82.  * @brief One diagnostic record, a list of fields
  83.  */
  84. class DiagRec {
  85. public:
  86.     DiagRec();
  87.     ~DiagRec();
  88.     void setField(int id, const OdbcData& data);
  89.     void getField(Ctx& ctx, int id, OdbcData& data);
  90. private:
  91.     typedef std::map<int, DiagField> Fields;
  92.     Fields m_fields;
  93. };
  94. inline
  95. DiagRec::DiagRec()
  96. {
  97. }
  98. inline
  99. DiagRec::~DiagRec()
  100. {
  101. }
  102. /**
  103.  * @class DiagArea
  104.  * @brief All records, including header (record 0)
  105.  *
  106.  * Diagnostic area includes a header (record 0) and zero or more
  107.  * status records at positions >= 1.
  108.  */
  109. class DiagArea {
  110. public:
  111.     DiagArea();
  112.     ~DiagArea();
  113.     /**
  114.      * Get number of status records.
  115.      */
  116.     unsigned numStatus();
  117.     /**
  118.      * Push new status record.
  119.      */
  120.     void pushStatus();
  121.     /**
  122.      * Set field in header.
  123.      */
  124.     void setHeader(int id, const OdbcData& data);
  125.     /**
  126.      * Set field in latest status record.  The arguments can
  127.      * also be plain int, char*, Sqlstate.  The NDB and other
  128.      * native errors set Sqlstate _IM000 automatically.
  129.      */
  130.     void setStatus(int id, const OdbcData& data);
  131.     void setStatus(const Sqlstate& state);
  132.     void setStatus(const Error& error);
  133.     /**
  134.      * Convenience methods to push new status record and set
  135.      * some common fields in it.  Sqlstate is set always.
  136.      */
  137.     void pushStatus(const Error& error);
  138.     /**
  139.      * Get refs to various records.
  140.      */
  141.     DiagRec& getHeader();
  142.     DiagRec& getStatus();
  143.     DiagRec& getRecord(unsigned num);
  144.     /**
  145.      * Get diag values.
  146.      */
  147.     void getRecord(Ctx& ctx, unsigned num, int id, OdbcData& data);
  148.     /**
  149.      * Get or set return code.
  150.      */
  151.     SQLRETURN getCode() const;
  152.     void setCode(SQLRETURN ret);
  153.     /**
  154.      * Get "next" record number (0 when no more).
  155.      * Used only by the deprecated SQLError function.
  156.      */
  157.     unsigned nextRecNumber();
  158. private:
  159.     typedef std::vector<DiagRec> Recs;
  160.     Recs m_recs;
  161.     SQLRETURN m_code;
  162.     unsigned m_recNumber; // for SQLError
  163. };
  164. inline SQLRETURN
  165. DiagArea::getCode() const
  166. {
  167.     return m_code;
  168. }
  169. inline unsigned
  170. DiagArea::nextRecNumber()
  171. {
  172.     if (m_recNumber >= numStatus())
  173. return 0;
  174.     return ++m_recNumber;
  175. }
  176. #endif