DescArea.cpp
上传用户: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. #include <vector>
  14. #include "DescArea.hpp"
  15. // DescField
  16. // DescRec
  17. void
  18. DescRec::setField(int id, const OdbcData& data)
  19. {
  20.     Ctx ctx;
  21.     setField(ctx, id, data);
  22.     ctx_assert(ctx.ok());
  23. }
  24. void
  25. DescRec::getField(int id, OdbcData& data)
  26. {
  27.     Ctx ctx;
  28.     getField(ctx, id, data);
  29.     ctx_assert(ctx.ok());
  30. }
  31. void
  32. DescRec::setField(Ctx& ctx, int id, const OdbcData& data)
  33. {
  34.     Fields::iterator iter;
  35.     iter = m_fields.find(id);
  36.     if (ctx.logLevel() >= 3) {
  37. char buf[100];
  38. data.print(buf, sizeof(buf));
  39. ctx_log3(("set %s rec %d id %d = %s", DescArea::nameUsage(m_area->getUsage()), m_num, id, buf));
  40.     }
  41.     if (iter != m_fields.end()) {
  42. DescField& field = (*iter).second;
  43. field.setData(data);
  44. m_area->setBound(false); // XXX could compare data values
  45. return;
  46.     }
  47.     const DescSpec& spec = m_area->findSpec(id);
  48.     if (spec.m_pos != Desc_pos_end) {
  49. DescField field(spec, data);
  50. m_fields.insert(Fields::value_type(id, field));
  51. m_area->setBound(false);
  52. return;
  53.     }
  54.     ctx_assert(false);
  55. }
  56. void
  57. DescRec::getField(Ctx& ctx, int id, OdbcData& data)
  58. {
  59.     Fields::iterator iter;
  60.     iter = m_fields.find(id);
  61.     if (iter != m_fields.end()) {
  62. DescField& field = (*iter).second;
  63. data.setValue(field.getData());
  64. return;
  65.     }
  66.     const DescSpec& spec = m_area->findSpec(id);
  67.     if (spec.m_pos != Desc_pos_end) {
  68. data.setValue();
  69. return; // XXX default value
  70.     }
  71.     ctx_assert(false);
  72. }
  73. // DescArea
  74. DescArea::DescArea(HandleBase* handle, const DescSpec* specList) :
  75.     m_handle(handle),
  76.     m_specList(specList),
  77.     m_alloc(Desc_alloc_undef),
  78.     m_usage(Desc_usage_undef),
  79.     m_bound(true) // no bind necessary since empty
  80. {
  81.     m_header.m_area = this;
  82.     m_header.m_num = -1;
  83.     DescRec rec;
  84.     rec.m_area = this;
  85.     rec.m_num = m_recs.size();
  86.     m_recs.push_back(rec); // add bookmark record
  87.     SQLSMALLINT count = 0;
  88.     getHeader().setField(SQL_DESC_COUNT, count);
  89.     m_bound = true;
  90. }
  91. DescArea::~DescArea()
  92. {
  93. }
  94. const DescSpec&
  95. DescArea::findSpec(int id)
  96. {
  97.     const DescSpec* p;
  98.     for (p = m_specList; p->m_pos != Desc_pos_end; p++) {
  99. if (p->m_id == id)
  100.     break;
  101.     }
  102.     return *p;
  103. }
  104. unsigned
  105. DescArea::getCount() const
  106. {
  107.     ctx_assert(m_recs.size() > 0);
  108.     return m_recs.size() - 1;
  109. }
  110. void
  111. DescArea::setCount(Ctx& ctx, unsigned count)
  112. {
  113.     if (m_recs.size() - 1 == count)
  114. return;
  115.     ctx_log3(("set %s count %d to %d",
  116.              DescArea::nameUsage(m_usage),
  117.              (unsigned)(m_recs.size() - 1),
  118.              count));
  119.     m_recs.resize(1 + count);
  120.     for (unsigned i = 0; i <= count; i++) {
  121. m_recs[i].m_area = this;
  122. m_recs[i].m_num = i;
  123.     }
  124.     getHeader().setField(SQL_DESC_COUNT, static_cast<SQLSMALLINT>(count));
  125. }
  126. DescRec&
  127. DescArea::pushRecord()
  128. {
  129.     ctx_assert(m_recs.size() > 0);
  130.     DescRec rec;
  131.     rec.m_area = this;
  132.     rec.m_num = m_recs.size();
  133.     m_recs.push_back(rec);
  134.     SQLSMALLINT count = m_recs.size() - 1;
  135.     getHeader().setField(SQL_DESC_COUNT, count);
  136.     return m_recs.back();
  137. }
  138. DescRec&
  139. DescArea::getHeader()
  140. {
  141.     return m_header;
  142. }
  143. DescRec&
  144. DescArea::getRecord(unsigned num)
  145. {
  146.     ctx_assert(num < m_recs.size());
  147.     return m_recs[num];
  148. }