HandleEnv.cpp
上传用户: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. #include <common/DiagArea.hpp>
  14. #include "HandleRoot.hpp"
  15. #include "HandleEnv.hpp"
  16. #include "HandleDbc.hpp"
  17. HandleEnv::HandleEnv(HandleRoot* pRoot) :
  18.     m_root(pRoot),
  19.     m_attrArea(m_attrSpec)
  20. {
  21.     m_attrArea.setHandle(this);
  22. }
  23. HandleEnv::~HandleEnv() {
  24. }
  25. void
  26. HandleEnv::ctor(Ctx& ctx)
  27. {
  28. }
  29. void
  30. HandleEnv::dtor(Ctx& ctx)
  31. {
  32.     if (! m_listDbc.empty()) {
  33. ctx.pushStatus(Sqlstate::_HY010, Error::Gen, "cannot delete environment handle - has %u associated connection handles", (unsigned)m_listDbc.size());
  34. return;
  35.     }
  36. }
  37. // allocate and free handles
  38. void
  39. HandleEnv::sqlAllocConnect(Ctx& ctx, HandleDbc** ppDbc)
  40. {
  41.     if (getOdbcVersion(ctx) == -1)
  42. return;
  43.     if (ppDbc == 0) {
  44. ctx.pushStatus(Sqlstate::_HY009, Error::Gen, "cannot allocate connection handle - null return address");
  45. return;
  46.     }
  47.     HandleDbc* pDbc = new HandleDbc(this);
  48.     pDbc->ctor(ctx);
  49.     if (! ctx.ok()) {
  50. pDbc->dtor(ctx);
  51. delete pDbc;
  52. return;
  53.     }
  54.     m_listDbc.push_back(pDbc);
  55.     getRoot()->record(SQL_HANDLE_DBC, pDbc, true);
  56.     *ppDbc = pDbc;
  57. }
  58. void
  59. HandleEnv::sqlAllocHandle(Ctx& ctx, SQLSMALLINT childType, HandleBase** ppChild)
  60. {
  61.     if (getOdbcVersion(ctx) == -1)
  62. return;
  63.     switch (childType) {
  64.     case SQL_HANDLE_DBC:
  65. sqlAllocConnect(ctx, (HandleDbc**)ppChild);
  66. return;
  67.     }
  68.     ctx.pushStatus(Sqlstate::_HY092, Error::Gen, "invalid child handle type %d", (int)childType);
  69. }
  70. void
  71. HandleEnv::sqlFreeConnect(Ctx& ctx, HandleDbc* pDbc)
  72. {
  73.     if (getOdbcVersion(ctx) == -1)
  74. return;
  75.     pDbc->dtor(ctx);
  76.     if (! ctx.ok())
  77. return;
  78.     m_listDbc.remove(pDbc);
  79.     getRoot()->record(SQL_HANDLE_DBC, pDbc, false);
  80.     delete pDbc;
  81. }
  82. void
  83. HandleEnv::sqlFreeHandle(Ctx& ctx, SQLSMALLINT childType, HandleBase* pChild)
  84. {
  85.     if (getOdbcVersion(ctx) == -1)
  86. return;
  87.     switch (childType) {
  88.     case SQL_HANDLE_DBC:
  89. sqlFreeConnect(ctx, (HandleDbc*)pChild);
  90. return;
  91.     }
  92.     ctx.pushStatus(Sqlstate::_HY092, Error::Gen, "invalid child handle type %d", (int)childType);
  93. }
  94. // attributes
  95. void
  96. HandleEnv::sqlSetEnvAttr(Ctx& ctx, SQLINTEGER attribute, SQLPOINTER value, SQLINTEGER stringLength)
  97. {
  98.     baseSetHandleAttr(ctx, m_attrArea, attribute, value, stringLength);
  99. }
  100. void
  101. HandleEnv::sqlGetEnvAttr(Ctx& ctx, SQLINTEGER attribute, SQLPOINTER value, SQLINTEGER bufferLength, SQLINTEGER* stringLength)
  102. {
  103.     baseGetHandleAttr(ctx, m_attrArea, attribute, value, bufferLength, stringLength);
  104. }
  105. int
  106. HandleEnv::getOdbcVersion(Ctx& ctx)
  107. {
  108.     OdbcData data;
  109.     m_attrArea.getAttr(ctx, SQL_ATTR_ODBC_VERSION, data);
  110.     if (! ctx.ok())
  111. return -1;
  112.     return data.integer();
  113. }
  114. // transactions
  115. void
  116. HandleEnv::sqlEndTran(Ctx& ctx, SQLSMALLINT completionType)
  117. {
  118.     ctx_assert(false); // XXX
  119. }
  120. void
  121. HandleEnv::sqlTransact(Ctx& ctx, SQLUSMALLINT completionType)
  122. {
  123.     ctx_assert(false); // XXX
  124. }