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

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_HANDLES_AttrArea_hpp
  14. #define ODBC_HANDLES_AttrArea_hpp
  15. #include <map>
  16. #include <common/common.hpp>
  17. #include "OdbcData.hpp"
  18. class HandleBase;
  19. enum AttrMode {
  20.     Attr_mode_undef,
  21.     Attr_mode_readonly,
  22.     Attr_mode_writeonly,
  23.     Attr_mode_readwrite
  24. };
  25. /**
  26.  * @struct AttrSpec
  27.  * @brief Attribute specifier
  28.  *
  29.  * Each handle class has a list of attribute specifiers.
  30.  */
  31. struct AttrSpec {
  32.     int m_id; // SQL_ATTR_ identifier
  33.     OdbcData::Type m_type; // data type
  34.     AttrMode m_mode; // access mode, undef indicates end of list
  35.     /**
  36.      * Callback for checks and side effects.  Called before the
  37.      * attribute is stored.  May set error status.
  38.      */
  39.     typedef void CallbackSet(Ctx& ctx, HandleBase* self, const OdbcData& data);
  40.     CallbackSet* m_set;
  41.     /**
  42.      * Callback to set default value.  May set error status.
  43.      */
  44.     typedef void CallbackDefault(Ctx& ctx, HandleBase* self, OdbcData& data);
  45.     CallbackDefault* m_default;
  46. };
  47. /**
  48.  * @class AttrField
  49.  * @brief Attribute value (stored as OdbcData)
  50.  */
  51. class AttrField {
  52. public:
  53.     AttrField(const AttrSpec& attrSpec, const OdbcData& data);
  54.     AttrField(const AttrField& field);
  55.     ~AttrField();
  56.     void setData(const OdbcData& data);
  57.     const OdbcData& getData();
  58. private:
  59.     const AttrSpec& m_spec;
  60.     OdbcData m_data;
  61. };
  62. inline
  63. AttrField::AttrField(const AttrSpec& spec, const OdbcData& data) :
  64.     m_spec(spec),
  65.     m_data(data)
  66. {
  67. }
  68. inline
  69. AttrField::AttrField(const AttrField& field) :
  70.     m_spec(field.m_spec),
  71.     m_data(field.m_data)
  72. {
  73. }
  74. inline
  75. AttrField::~AttrField()
  76. {
  77. }
  78. inline void
  79. AttrField::setData(const OdbcData& data)
  80. {
  81.     ctx_assert(m_spec.m_type == data.type());
  82.     m_data.setValue(data);
  83. }
  84. inline const OdbcData&
  85. AttrField::getData()
  86. {
  87.     ctx_assert(m_data.type() != OdbcData::Undef);
  88.     return m_data;
  89. }
  90. /**
  91.  * @class AttrArea
  92.  * @brief Handle attributes
  93.  * 
  94.  * Each handle instance has a list of attribute values stored
  95.  * under an AttrArea.  Callbacks to handle code provide for
  96.  * default values, extra checks, and side-effects.
  97.  */
  98. class AttrArea {
  99. public:
  100.     AttrArea(const AttrSpec* specList);
  101.     ~AttrArea();
  102.     void setHandle(HandleBase* handle);
  103.     const AttrSpec& findSpec(int id) const;
  104.     void setAttr(Ctx& ctx, int id, const OdbcData& data);
  105.     void getAttr(Ctx& ctx, int id, OdbcData& data);
  106. private:
  107.     HandleBase* m_handle;
  108.     const AttrSpec* const m_specList;
  109.     typedef std::map<int, AttrField> Fields;
  110.     Fields m_fields;
  111. };
  112. inline void
  113. AttrArea::setHandle(HandleBase* handle)
  114. {
  115.     ctx_assert(handle != 0);
  116.     m_handle = handle;
  117. }
  118. #endif