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

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 "HandleBase.hpp"
  14. HandleBase::~HandleBase()
  15. {
  16.     delete m_ctx;
  17.     m_ctx = 0;
  18. }
  19. void
  20. HandleBase::saveCtx(Ctx& ctx)
  21. {
  22.     delete m_ctx;
  23.     m_ctx = &ctx;
  24. }
  25. // get diagnostics
  26. void
  27. HandleBase::sqlGetDiagField(Ctx& ctx, SQLSMALLINT recNumber, SQLSMALLINT diagIdentifier, SQLPOINTER diagInfo, SQLSMALLINT bufferLength, SQLSMALLINT* stringLength)
  28. {
  29.     const DiagSpec& spec = DiagSpec::find(diagIdentifier);
  30.     if (spec.m_pos == Diag_pos_end) {
  31. ctx.setCode(SQL_ERROR);
  32. return;
  33.     }
  34.     const bool header = (spec.m_pos == Diag_pos_header);
  35.     const bool status = (spec.m_pos == Diag_pos_status);
  36.     ctx_assert(header || status);
  37.     if (! (spec.m_handles & odbcHandle())) {
  38. ctx.setCode(SQL_ERROR);
  39. return;
  40.     }
  41.     if (header) {
  42. recNumber = 0; // ignored for header fields, so fix it
  43. if (m_ctx == 0) {
  44.     if (diagIdentifier == SQL_DIAG_NUMBER) {
  45. SQLINTEGER n = 0;
  46. OdbcData data(n);
  47. data.copyout(ctx, diagInfo, bufferLength, 0, stringLength);
  48. return;
  49.     }
  50.     if (diagIdentifier == SQL_DIAG_RETURNCODE) {
  51. SQLSMALLINT n = 0;
  52. OdbcData data(n);
  53. data.copyout(ctx, diagInfo, bufferLength, 0, stringLength);
  54. return;
  55.     }
  56.     return;
  57. }
  58.     }
  59.     if (status) {
  60. if (recNumber <= 0) {
  61.     ctx.setCode(SQL_ERROR);
  62.     return;
  63. }
  64. if (m_ctx == 0) {
  65.     if ((unsigned)recNumber > 0) {
  66. ctx.setCode(SQL_NO_DATA);
  67. return;
  68.     }
  69.     return;
  70. }
  71. if ((unsigned)recNumber > m_ctx->diagArea().numStatus()) {
  72.     ctx.setCode(SQL_NO_DATA);
  73.     return;
  74. }
  75.     }
  76.     OdbcData data;
  77.     ctx_assert(m_ctx != 0);
  78.     m_ctx->diagArea().getRecord(ctx, recNumber, diagIdentifier, data);
  79.     if (data.type() != OdbcData::Undef)
  80. data.copyout(ctx, diagInfo, bufferLength, 0, stringLength);
  81. }
  82. void
  83. HandleBase::sqlGetDiagRec(Ctx& ctx, SQLSMALLINT recNumber, SQLCHAR* sqlstate, SQLINTEGER* nativeError, SQLCHAR* messageText, SQLSMALLINT bufferLength, SQLSMALLINT* textLength)
  84. {
  85.     sqlGetDiagField(ctx, recNumber, SQL_DIAG_SQLSTATE, static_cast<SQLPOINTER>(sqlstate), 5 + 1, 0);
  86.     sqlGetDiagField(ctx, recNumber, SQL_DIAG_NATIVE, static_cast<SQLPOINTER>(nativeError), -1, 0);
  87.     sqlGetDiagField(ctx, recNumber, SQL_DIAG_MESSAGE_TEXT, static_cast<SQLPOINTER>(messageText), bufferLength, textLength);
  88. }
  89. void
  90. HandleBase::sqlError(Ctx& ctx, SQLCHAR* sqlstate, SQLINTEGER* nativeError, SQLCHAR* messageText, SQLSMALLINT bufferLength, SQLSMALLINT* textLength)
  91. {
  92.     if (m_ctx == 0) {
  93. ctx.setCode(SQL_NO_DATA);
  94. return;
  95.     }
  96.     const SQLSMALLINT recNumber = m_ctx->diagArea().nextRecNumber();
  97.     if (recNumber == 0) {
  98. ctx.setCode(SQL_NO_DATA);
  99. return;
  100.     }
  101.     sqlGetDiagField(ctx, recNumber, SQL_DIAG_SQLSTATE, static_cast<SQLPOINTER>(sqlstate), 5 + 1, 0);
  102.     sqlGetDiagField(ctx, recNumber, SQL_DIAG_NATIVE, static_cast<SQLPOINTER>(nativeError), -1, 0);
  103.     sqlGetDiagField(ctx, recNumber, SQL_DIAG_MESSAGE_TEXT, static_cast<SQLPOINTER>(messageText), bufferLength, textLength);
  104. }
  105. // common code for attributes
  106. void
  107. HandleBase::baseSetHandleAttr(Ctx& ctx, AttrArea& attrArea, SQLINTEGER attribute, SQLPOINTER value, SQLINTEGER stringLength)
  108. {
  109.     const AttrSpec& spec = attrArea.findSpec(attribute);
  110.     if (spec.m_mode == Attr_mode_undef) { // not found
  111. ctx.pushStatus(Sqlstate::_HY092, Error::Gen, "undefined attribute id %d", (int)attribute);
  112. return;
  113.     }
  114.     if (spec.m_mode == Attr_mode_readonly) { // read only
  115. ctx.pushStatus(Sqlstate::_HY092, Error::Gen, "read-only attribute id %d", (int)attribute);
  116. return;
  117.     }
  118.     OdbcData data;
  119.     data.copyin(ctx, spec.m_type, value, stringLength);
  120.     if (! ctx.ok())
  121. return;
  122.     attrArea.setAttr(ctx, attribute, data);
  123. }
  124. void
  125. HandleBase::baseGetHandleAttr(Ctx& ctx, AttrArea& attrArea, SQLINTEGER attribute, SQLPOINTER value, SQLINTEGER bufferLength, SQLINTEGER* stringLength)
  126. {
  127.     const AttrSpec& spec = attrArea.findSpec(attribute);
  128.     if (spec.m_mode == Attr_mode_undef) { // not found
  129. ctx.pushStatus(Sqlstate::_HY092, Error::Gen, "undefined attribute id %d", (int)attribute);
  130. return;
  131.     }
  132.     OdbcData data;
  133.     attrArea.getAttr(ctx, attribute, data);
  134.     if (! ctx.ok())
  135. return;
  136.     data.copyout(ctx, value, bufferLength, stringLength);
  137. }
  138. void
  139. HandleBase::baseSetHandleOption(Ctx& ctx, AttrArea& attrArea, SQLUSMALLINT option, SQLUINTEGER value)
  140. {
  141.     baseSetHandleAttr(ctx, attrArea, static_cast<SQLINTEGER>(option), reinterpret_cast<SQLPOINTER>(value), 0);
  142. }
  143. void
  144. HandleBase::baseGetHandleOption(Ctx& ctx, AttrArea& attrArea, SQLUSMALLINT option, SQLPOINTER value)
  145. {
  146.     baseGetHandleAttr(ctx, attrArea, static_cast<SQLINTEGER>(option), value, SQL_NTS, 0);
  147. }