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

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 "HandleDbc.hpp"
  14. static void
  15. callback_SQL_ATTR_ACCESS_MODE_set(Ctx& ctx, HandleBase* self, const OdbcData& data)
  16. {
  17.     HandleDbc* pDbc = static_cast<HandleDbc*>(self);
  18.     ctx_assert(pDbc != 0 && data.type() == OdbcData::Uinteger);
  19.     SQLUINTEGER value = data.uinteger();
  20.     switch (value) {
  21.     case SQL_MODE_READ_ONLY:
  22. break;
  23.     case SQL_MODE_READ_WRITE:
  24. break;
  25.     default:
  26. ctx.pushStatus(Sqlstate::_HY024, Error::Gen, "invalid access mode value %u", (unsigned)value);
  27. break;
  28.     }
  29. }
  30. static void
  31. callback_SQL_ATTR_ACCESS_MODE_default(Ctx& ctx, HandleBase* self, OdbcData& data)
  32. {
  33.     HandleDbc* pDbc = static_cast<HandleDbc*>(self);
  34.     ctx_assert(pDbc != 0);
  35.     SQLUINTEGER value = SQL_MODE_READ_WRITE;
  36.     data.setValue(value);
  37. }
  38. static void
  39. callback_SQL_ATTR_ASYNC_ENABLE_set(Ctx& ctx, HandleBase* self, const OdbcData& data)
  40. {
  41.     HandleDbc* pDbc = static_cast<HandleDbc*>(self);
  42.     ctx_assert(pDbc != 0 && data.type() == OdbcData::Uinteger);
  43.     SQLUINTEGER value = data.uinteger();
  44.     switch (value) {
  45.     case SQL_ASYNC_ENABLE_OFF:
  46. break;
  47.     case SQL_ASYNC_ENABLE_ON:
  48. ctx.pushStatus(Sqlstate::_HYC00, Error::Gen, "async enable on not supported");
  49. break;
  50.     default:
  51. ctx.pushStatus(Sqlstate::_HY024, Error::Gen, "invalid async enable value %u", (unsigned)value);
  52. break;
  53.     }
  54. }
  55. static void
  56. callback_SQL_ATTR_ASYNC_ENABLE_default(Ctx& ctx, HandleBase* self, OdbcData& data)
  57. {
  58.     HandleDbc* pDbc = static_cast<HandleDbc*>(self);
  59.     ctx_assert(pDbc != 0);
  60.     SQLUINTEGER value = SQL_ASYNC_ENABLE_OFF;
  61.     data.setValue(value);
  62. }
  63. static void
  64. callback_SQL_ATTR_AUTO_IPD_set(Ctx& ctx, HandleBase* self, const OdbcData& data)
  65. {
  66.     HandleDbc* pDbc = static_cast<HandleDbc*>(self);
  67.     ctx_assert(pDbc != 0 && data.type() == OdbcData::Uinteger);
  68.     ctx_assert(false); // read-only
  69. }
  70. static void
  71. callback_SQL_ATTR_AUTO_IPD_default(Ctx& ctx, HandleBase* self, OdbcData& data)
  72. {
  73.     HandleDbc* pDbc = static_cast<HandleDbc*>(self);
  74.     ctx_assert(pDbc != 0);
  75.     SQLUINTEGER value = SQL_FALSE;
  76.     data.setValue(value);
  77. }
  78. static void
  79. callback_SQL_ATTR_AUTOCOMMIT_set(Ctx& ctx, HandleBase* self, const OdbcData& data)
  80. {
  81.     HandleDbc* pDbc = static_cast<HandleDbc*>(self);
  82.     ctx_assert(pDbc != 0 && data.type() == OdbcData::Uinteger);
  83.     SQLUINTEGER value = data.uinteger();
  84.     switch (value) {
  85.     case SQL_AUTOCOMMIT_OFF:
  86. if (pDbc->autocommit()) {
  87.     pDbc->autocommit(false);
  88.     pDbc->useConnection(ctx, true);
  89. }
  90. break;
  91.     case SQL_AUTOCOMMIT_ON:
  92. if (! pDbc->autocommit()) {
  93.     pDbc->autocommit(true);
  94.     pDbc->sqlEndTran(ctx, SQL_COMMIT);
  95.     pDbc->useConnection(ctx, false);
  96. }
  97. break;
  98.     default:
  99. ctx.pushStatus(Sqlstate::_HY024, Error::Gen, "invalid autocommit value %u", (unsigned)value);
  100. break;
  101.     }
  102. }
  103. static void
  104. callback_SQL_ATTR_AUTOCOMMIT_default(Ctx& ctx, HandleBase* self, OdbcData& data)
  105. {
  106.     HandleDbc* pDbc = static_cast<HandleDbc*>(self);
  107.     ctx_assert(pDbc != 0);
  108.     SQLUINTEGER value = pDbc->autocommit() ? SQL_AUTOCOMMIT_ON : SQL_AUTOCOMMIT_OFF;
  109.     data.setValue(value);
  110. }
  111. static void
  112. callback_SQL_ATTR_CONNECTION_DEAD_set(Ctx& ctx, HandleBase* self, const OdbcData& data)
  113. {
  114.     HandleDbc* pDbc = static_cast<HandleDbc*>(self);
  115.     ctx_assert(pDbc != 0 && data.type() == OdbcData::Uinteger);
  116.     ctx_assert(false); // read-only
  117. }
  118. static void
  119. callback_SQL_ATTR_CONNECTION_DEAD_default(Ctx& ctx, HandleBase* self, OdbcData& data)
  120. {
  121.     HandleDbc* pDbc = static_cast<HandleDbc*>(self);
  122.     ctx_assert(pDbc != 0);
  123.     SQLUINTEGER value = pDbc->getState() == HandleDbc::Free ? SQL_CD_TRUE : SQL_CD_FALSE;
  124.     data.setValue(value);
  125. }
  126. static void
  127. callback_SQL_ATTR_CONNECTION_TIMEOUT_set(Ctx& ctx, HandleBase* self, const OdbcData& data)
  128. {
  129.     HandleDbc* pDbc = static_cast<HandleDbc*>(self);
  130.     ctx_assert(pDbc != 0 && data.type() == OdbcData::Uinteger);
  131. }
  132. static void
  133. callback_SQL_ATTR_CONNECTION_TIMEOUT_default(Ctx& ctx, HandleBase* self, OdbcData& data)
  134. {
  135.     HandleDbc* pDbc = static_cast<HandleDbc*>(self);
  136.     ctx_assert(pDbc != 0);
  137.     SQLUINTEGER value = 0;
  138.     data.setValue(value);
  139. }
  140. static void
  141. callback_SQL_ATTR_CURRENT_CATALOG_set(Ctx& ctx, HandleBase* self, const OdbcData& data)
  142. {
  143.     HandleDbc* pDbc = static_cast<HandleDbc*>(self);
  144.     ctx_assert(pDbc != 0 && data.type() == OdbcData::Sqlchar);
  145. }
  146. static void
  147. callback_SQL_ATTR_CURRENT_CATALOG_default(Ctx& ctx, HandleBase* self, OdbcData& data)
  148. {
  149.     HandleDbc* pDbc = static_cast<HandleDbc*>(self);
  150.     ctx_assert(pDbc != 0);
  151.     const char* value = "DEFAULT";
  152.     data.setValue(value);
  153. }
  154. static void
  155. callback_SQL_ATTR_LOGIN_TIMEOUT_set(Ctx& ctx, HandleBase* self, const OdbcData& data)
  156. {
  157.     callback_SQL_ATTR_CONNECTION_TIMEOUT_set(ctx, self, data);
  158. }
  159. static void
  160. callback_SQL_ATTR_LOGIN_TIMEOUT_default(Ctx& ctx, HandleBase* self, OdbcData& data)
  161. {
  162.     callback_SQL_ATTR_CONNECTION_TIMEOUT_default(ctx, self, data);
  163. }
  164. static void
  165. callback_SQL_ATTR_METADATA_ID_set(Ctx& ctx, HandleBase* self, const OdbcData& data)
  166. {
  167.     HandleDbc* pDbc = static_cast<HandleDbc*>(self);
  168.     ctx_assert(pDbc != 0 && data.type() == OdbcData::Uinteger);
  169.     SQLUINTEGER value = data.uinteger();
  170.     switch (value) {
  171.     case SQL_FALSE:
  172. break;
  173.     case SQL_TRUE:
  174. break;
  175.     default:
  176. ctx.pushStatus(Sqlstate::_HY024, Error::Gen, "invalid metadata id value %u", (unsigned)value);
  177. break;
  178.     }
  179. }
  180. static void
  181. callback_SQL_ATTR_METADATA_ID_default(Ctx& ctx, HandleBase* self, OdbcData& data)
  182. {
  183.     HandleDbc* pDbc = static_cast<HandleDbc*>(self);
  184.     ctx_assert(pDbc != 0);
  185.     SQLUINTEGER value = SQL_FALSE;
  186.     data.setValue(value);
  187. }
  188. static void
  189. callback_SQL_ATTR_ODBC_CURSORS_set(Ctx& ctx, HandleBase* self, const OdbcData& data)
  190. {
  191.     HandleDbc* pDbc = static_cast<HandleDbc*>(self);
  192.     ctx_assert(pDbc != 0 && data.type() == OdbcData::Uinteger);
  193.     SQLUINTEGER value = data.uinteger();
  194.     switch (value) {
  195.     case SQL_CUR_USE_DRIVER:
  196. ctx.pushStatus(Sqlstate::_HYC00, Error::Gen, "cur use driver not supported");
  197. break;
  198.     case SQL_CUR_USE_IF_NEEDED:
  199. ctx.pushStatus(Sqlstate::_HYC00, Error::Gen, "cur use if needed not supported");
  200. break;
  201.     case SQL_CUR_USE_ODBC:
  202. break;
  203.     default:
  204. ctx.pushStatus(Sqlstate::_HY024, Error::Gen, "invalid odbc cursors value %u", (unsigned)value);
  205. break;
  206.     }
  207. }
  208. static void
  209. callback_SQL_ATTR_ODBC_CURSORS_default(Ctx& ctx, HandleBase* self, OdbcData& data)
  210. {
  211.     HandleDbc* pDbc = static_cast<HandleDbc*>(self);
  212.     ctx_assert(pDbc != 0);
  213.     SQLUINTEGER value = SQL_CUR_USE_ODBC;
  214.     data.setValue(value);
  215. }
  216. static void
  217. callback_SQL_ATTR_PACKET_SIZE_set(Ctx& ctx, HandleBase* self, const OdbcData& data)
  218. {
  219.     HandleDbc* pDbc = static_cast<HandleDbc*>(self);
  220.     ctx_assert(pDbc != 0 && data.type() == OdbcData::Uinteger);
  221.     SQLUINTEGER value = data.uinteger();
  222.     ctx.pushStatus(Sqlstate::_HYC00, Error::Gen, "packet size (%u) not supported", (unsigned)value);
  223. }
  224. static void
  225. callback_SQL_ATTR_PACKET_SIZE_default(Ctx& ctx, HandleBase* self, OdbcData& data)
  226. {
  227.     HandleDbc* pDbc = static_cast<HandleDbc*>(self);
  228.     ctx_assert(pDbc != 0);
  229.     SQLUINTEGER value = 0;
  230.     data.setValue(value);
  231. }
  232. static void
  233. callback_SQL_ATTR_QUIET_MODE_set(Ctx& ctx, HandleBase* self, const OdbcData& data)
  234. {
  235.     HandleDbc* pDbc = static_cast<HandleDbc*>(self);
  236.     ctx_assert(pDbc != 0 && data.type() == OdbcData::Pointer);
  237. }
  238. static void
  239. callback_SQL_ATTR_QUIET_MODE_default(Ctx& ctx, HandleBase* self, OdbcData& data)
  240. {
  241.     HandleDbc* pDbc = static_cast<HandleDbc*>(self);
  242.     ctx_assert(pDbc != 0);
  243.     data.setValue();
  244. }
  245. static void
  246. callback_SQL_ATTR_TRACE_set(Ctx& ctx, HandleBase* self, const OdbcData& data)
  247. {
  248.     HandleDbc* pDbc = static_cast<HandleDbc*>(self);
  249.     ctx_assert(pDbc != 0 && data.type() == OdbcData::Uinteger);
  250. }
  251. static void
  252. callback_SQL_ATTR_TRACE_default(Ctx& ctx, HandleBase* self, OdbcData& data)
  253. {
  254.     HandleDbc* pDbc = static_cast<HandleDbc*>(self);
  255.     ctx_assert(pDbc != 0);
  256.     data.setValue();
  257. }
  258. static void
  259. callback_SQL_ATTR_TRACEFILE_set(Ctx& ctx, HandleBase* self, const OdbcData& data)
  260. {
  261.     HandleDbc* pDbc = static_cast<HandleDbc*>(self);
  262.     ctx_assert(pDbc != 0 && data.type() == OdbcData::Sqlchar);
  263. }
  264. static void
  265. callback_SQL_ATTR_TRACEFILE_default(Ctx& ctx, HandleBase* self, OdbcData& data)
  266. {
  267.     HandleDbc* pDbc = static_cast<HandleDbc*>(self);
  268.     ctx_assert(pDbc != 0);
  269.     data.setValue();
  270. }
  271. static void
  272. callback_SQL_ATTR_TRANSLATE_LIB_set(Ctx& ctx, HandleBase* self, const OdbcData& data)
  273. {
  274.     HandleDbc* pDbc = static_cast<HandleDbc*>(self);
  275.     ctx_assert(pDbc != 0 && data.type() == OdbcData::Sqlchar);
  276. }
  277. static void
  278. callback_SQL_ATTR_TRANSLATE_LIB_default(Ctx& ctx, HandleBase* self, OdbcData& data)
  279. {
  280.     HandleDbc* pDbc = static_cast<HandleDbc*>(self);
  281.     ctx_assert(pDbc != 0);
  282.     data.setValue();
  283. }
  284. static void
  285. callback_SQL_ATTR_TRANSLATE_OPTION_set(Ctx& ctx, HandleBase* self, const OdbcData& data)
  286. {
  287.     HandleDbc* pDbc = static_cast<HandleDbc*>(self);
  288.     ctx_assert(pDbc != 0 && data.type() == OdbcData::Uinteger);
  289. }
  290. static void
  291. callback_SQL_ATTR_TRANSLATE_OPTION_default(Ctx& ctx, HandleBase* self, OdbcData& data)
  292. {
  293.     HandleDbc* pDbc = static_cast<HandleDbc*>(self);
  294.     ctx_assert(pDbc != 0);
  295.     data.setValue();
  296. }
  297. static void
  298. callback_SQL_ATTR_TXN_ISOLATION_set(Ctx& ctx, HandleBase* self, const OdbcData& data)
  299. {
  300.     HandleDbc* pDbc = static_cast<HandleDbc*>(self);
  301.     ctx_assert(pDbc != 0 && data.type() == OdbcData::Uinteger);
  302.     if (pDbc->getState() == HandleDbc::Free) {
  303. ctx.pushStatus(Sqlstate::_08003, Error::Gen, "not connected");
  304. return;
  305.     }
  306.     if (pDbc->getState() == HandleDbc::Transacting) {
  307. ctx.pushStatus(Sqlstate::_HY011, Error::Gen, "transaction is open");
  308. return;
  309.     }
  310.     SQLUINTEGER value = data.uinteger();
  311.     SQLUINTEGER mask = SQL_TXN_READ_COMMITTED;
  312.     if (! (value & mask)) {
  313. ctx.pushStatus(Sqlstate::_HYC00, Error::Gen, "txn isolation level %u not supported", (unsigned)value);
  314. return;
  315.     }
  316. }
  317. static void
  318. callback_SQL_ATTR_TXN_ISOLATION_default(Ctx& ctx, HandleBase* self, OdbcData& data)
  319. {
  320.     HandleDbc* pDbc = static_cast<HandleDbc*>(self);
  321.     ctx_assert(pDbc != 0);
  322.     SQLUINTEGER value = SQL_TXN_READ_COMMITTED;
  323.     data.setValue(value);
  324. }
  325. AttrSpec HandleDbc::m_attrSpec[] = {
  326.     {   SQL_ATTR_ACCESS_MODE,
  327.         OdbcData::Uinteger,
  328.         Attr_mode_readwrite,
  329.         callback_SQL_ATTR_ACCESS_MODE_set,
  330.         callback_SQL_ATTR_ACCESS_MODE_default,
  331.     },
  332.     {   SQL_ATTR_ASYNC_ENABLE,
  333.         OdbcData::Uinteger,
  334.         Attr_mode_readwrite,
  335.         callback_SQL_ATTR_ASYNC_ENABLE_set,
  336.         callback_SQL_ATTR_ASYNC_ENABLE_default,
  337.     },
  338.     {   SQL_ATTR_AUTO_IPD,
  339.         OdbcData::Uinteger,
  340.         Attr_mode_readonly,
  341.         callback_SQL_ATTR_AUTO_IPD_set,
  342.         callback_SQL_ATTR_AUTO_IPD_default,
  343.     },
  344.     {   SQL_ATTR_AUTOCOMMIT,
  345.         OdbcData::Uinteger,
  346.         Attr_mode_readwrite,
  347.         callback_SQL_ATTR_AUTOCOMMIT_set,
  348.         callback_SQL_ATTR_AUTOCOMMIT_default,
  349.     },
  350.     {   SQL_ATTR_CONNECTION_DEAD,
  351.         OdbcData::Uinteger,
  352.         Attr_mode_readonly,
  353.         callback_SQL_ATTR_CONNECTION_DEAD_set,
  354.         callback_SQL_ATTR_CONNECTION_DEAD_default,
  355.     },
  356.     {   SQL_ATTR_CONNECTION_TIMEOUT,
  357.         OdbcData::Uinteger,
  358.         Attr_mode_readwrite,
  359.         callback_SQL_ATTR_CONNECTION_TIMEOUT_set,
  360.         callback_SQL_ATTR_CONNECTION_TIMEOUT_default,
  361.     },
  362.     {   SQL_ATTR_CURRENT_CATALOG,
  363.         OdbcData::Sqlchar,
  364.         Attr_mode_readwrite,
  365.         callback_SQL_ATTR_CURRENT_CATALOG_set,
  366.         callback_SQL_ATTR_CURRENT_CATALOG_default,
  367.     },
  368.     {   SQL_ATTR_LOGIN_TIMEOUT,
  369.         OdbcData::Uinteger,
  370.         Attr_mode_readwrite,
  371.         callback_SQL_ATTR_LOGIN_TIMEOUT_set,
  372.         callback_SQL_ATTR_LOGIN_TIMEOUT_default,
  373.     },
  374.     {   SQL_ATTR_METADATA_ID,
  375.         OdbcData::Uinteger,
  376.         Attr_mode_readwrite,
  377.         callback_SQL_ATTR_METADATA_ID_set,
  378.         callback_SQL_ATTR_METADATA_ID_default,
  379.     },
  380.     {   SQL_ATTR_ODBC_CURSORS,
  381.         OdbcData::Uinteger,
  382.         Attr_mode_readwrite,
  383.         callback_SQL_ATTR_ODBC_CURSORS_set,
  384.         callback_SQL_ATTR_ODBC_CURSORS_default,
  385.     },
  386.     {   SQL_ATTR_PACKET_SIZE,
  387.         OdbcData::Uinteger,
  388.         Attr_mode_readwrite,
  389.         callback_SQL_ATTR_PACKET_SIZE_set,
  390.         callback_SQL_ATTR_PACKET_SIZE_default,
  391.     },
  392.     {   SQL_ATTR_QUIET_MODE,
  393.         OdbcData::Pointer,
  394.         Attr_mode_readwrite,
  395.         callback_SQL_ATTR_QUIET_MODE_set,
  396.         callback_SQL_ATTR_QUIET_MODE_default,
  397.     },
  398.     {   SQL_ATTR_TRACE,
  399.         OdbcData::Uinteger,
  400.         Attr_mode_readwrite,
  401.         callback_SQL_ATTR_TRACE_set,
  402.         callback_SQL_ATTR_TRACE_default,
  403.     },
  404.     {   SQL_ATTR_TRACEFILE,
  405.         OdbcData::Sqlchar,
  406.         Attr_mode_readwrite,
  407.         callback_SQL_ATTR_TRACEFILE_set,
  408.         callback_SQL_ATTR_TRACEFILE_default,
  409.     },
  410.     {   SQL_ATTR_TRANSLATE_LIB,
  411.         OdbcData::Sqlchar,
  412.         Attr_mode_readwrite,
  413.         callback_SQL_ATTR_TRANSLATE_LIB_set,
  414.         callback_SQL_ATTR_TRANSLATE_LIB_default,
  415.     },
  416.     {   SQL_ATTR_TRANSLATE_OPTION,
  417.         OdbcData::Uinteger,
  418.         Attr_mode_readwrite,
  419.         callback_SQL_ATTR_TRANSLATE_OPTION_set,
  420.         callback_SQL_ATTR_TRANSLATE_OPTION_default,
  421.     },
  422.     {   SQL_ATTR_TXN_ISOLATION,
  423.         OdbcData::Uinteger,
  424.         Attr_mode_readwrite,
  425.         callback_SQL_ATTR_TXN_ISOLATION_set,
  426.         callback_SQL_ATTR_TXN_ISOLATION_default,
  427.     },
  428.     {   0,
  429.         OdbcData::Undef,
  430.         Attr_mode_undef,
  431.         0,
  432.         0,
  433.     },
  434. };