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

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. #include "AttrArea.hpp"
  14. // AttrSpec
  15. // AttrField
  16. // AttrArea
  17. AttrArea::AttrArea(const AttrSpec* specList) :
  18.     m_specList(specList)
  19. {
  20. }
  21. AttrArea::~AttrArea()
  22. {
  23. }
  24. const AttrSpec&
  25. AttrArea::findSpec(int id) const
  26. {
  27.     const AttrSpec* p;
  28.     for (p = m_specList; p->m_mode != Attr_mode_undef; p++) {
  29. if (p->m_id == id)
  30.     break;
  31.     }
  32.     return *p;
  33. }
  34. void
  35. AttrArea::setAttr(Ctx& ctx, int id, const OdbcData& data)
  36. {
  37.     const AttrSpec& spec = findSpec(id);
  38.     if (spec.m_mode == Attr_mode_undef) {
  39. ctx.pushStatus(Sqlstate::_HY092, Error::Gen, "undefined attribute id %d", id);
  40. return;
  41.     }
  42.     ctx_assert(spec.m_type == data.type());
  43.     ctx_assert(spec.m_set != 0);
  44.     spec.m_set(ctx, m_handle, data);
  45.     if (! ctx.ok())
  46. return;
  47.     Fields::iterator iter;
  48.     if (ctx.logLevel() >= 3) {
  49. char buf[100];
  50. data.print(buf, sizeof(buf));
  51. ctx_log3(("attr handle 0x%x set id %d = %s", (unsigned)m_handle, id, buf));
  52.     }
  53.     iter = m_fields.find(id);
  54.     if (iter != m_fields.end()) {
  55. AttrField& field = (*iter).second;
  56. field.setData(data);
  57. return;
  58.     }
  59.     AttrField field(spec, data);
  60.     m_fields.insert(Fields::value_type(id, field));
  61. }
  62. void
  63. AttrArea::getAttr(Ctx& ctx, int id, OdbcData& data)
  64. {
  65.     const AttrSpec& spec = findSpec(id);
  66.     if (spec.m_mode == Attr_mode_undef) {
  67. ctx.pushStatus(Sqlstate::_HY092, Error::Gen, "undefined attribute id %d", id);
  68. return;
  69.     }
  70.     Fields::iterator iter;
  71.     iter = m_fields.find(id);
  72.     if (iter != m_fields.end()) {
  73. AttrField& field = (*iter).second;
  74. data.setValue(field.getData());
  75. return;
  76.     }
  77.     ctx_assert(spec.m_default != 0);
  78.     spec.m_default(ctx, m_handle, data);
  79. }