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

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. #include "HandleStmt.hpp"
  15. #include "HandleDesc.hpp"
  16. static void
  17. callback_SQL_ATTR_APP_PARAM_DESC_set(Ctx& ctx, HandleBase* self, const OdbcData& data)
  18. {
  19.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  20.     ctx_assert(pStmt != 0 && data.type() == OdbcData::Pointer);
  21.     pStmt->setHandleDesc(ctx, Desc_usage_APD, data.pointer());
  22. }
  23. static void
  24. callback_SQL_ATTR_APP_PARAM_DESC_default(Ctx& ctx, HandleBase* self, OdbcData& data)
  25. {
  26.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  27.     ctx_assert(pStmt != 0);
  28.     HandleDesc* apd = pStmt->getHandleDesc(ctx, Desc_usage_APD);
  29.     OdbcData value(reinterpret_cast<SQLPOINTER>(apd));
  30.     data.setValue(value);
  31. }
  32. static void
  33. callback_SQL_ATTR_APP_ROW_DESC_set(Ctx& ctx, HandleBase* self, const OdbcData& data)
  34. {
  35.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  36.     ctx_assert(pStmt != 0 && data.type() == OdbcData::Pointer);
  37.     pStmt->setHandleDesc(ctx, Desc_usage_ARD, data.pointer());
  38. }
  39. static void
  40. callback_SQL_ATTR_APP_ROW_DESC_default(Ctx& ctx, HandleBase* self, OdbcData& data)
  41. {
  42.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  43.     ctx_assert(pStmt != 0);
  44.     HandleDesc* ard = pStmt->getHandleDesc(ctx, Desc_usage_ARD);
  45.     OdbcData value(reinterpret_cast<SQLPOINTER>(ard));
  46.     data.setValue(value);
  47. }
  48. static void
  49. callback_SQL_ATTR_ASYNC_ENABLE_set(Ctx& ctx, HandleBase* self, const OdbcData& data)
  50. {
  51.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  52.     ctx_assert(pStmt != 0 && data.type() == OdbcData::Uinteger);
  53.     SQLUINTEGER value = data.uinteger();
  54.     switch (value) {
  55.     case SQL_ASYNC_ENABLE_OFF:
  56. break;
  57.     case SQL_ASYNC_ENABLE_ON:
  58. // ctx.pushStatus(Sqlstate::_HYC00, Error::Gen, "async enable ON not supported");
  59. break;
  60.     default:
  61. ctx.pushStatus(Sqlstate::_HY024, Error::Gen, "invalid async enable value %u", (unsigned)value);
  62. break;
  63.     }
  64. }
  65. static void
  66. callback_SQL_ATTR_ASYNC_ENABLE_default(Ctx& ctx, HandleBase* self, OdbcData& data)
  67. {
  68.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  69.     ctx_assert(pStmt != 0);
  70.     SQLUINTEGER value = SQL_ASYNC_ENABLE_OFF;
  71.     data.setValue(value);
  72. }
  73. static void
  74. callback_SQL_ATTR_CONCURRENCY_set(Ctx& ctx, HandleBase* self, const OdbcData& data)
  75. {
  76.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  77.     ctx_assert(pStmt != 0 && data.type() == OdbcData::Uinteger);
  78.     SQLUINTEGER value = data.uinteger();
  79.     switch (value) {
  80.     case SQL_CONCUR_READ_ONLY:
  81. break;
  82.     case SQL_CONCUR_LOCK:
  83. ctx.pushStatus(Sqlstate::_HYC00, Error::Gen, "concur lock not supported");
  84. break;
  85.     case SQL_CONCUR_ROWVER:
  86. ctx.pushStatus(Sqlstate::_HYC00, Error::Gen, "concur rowver not supported");
  87. break;
  88.     case SQL_CONCUR_VALUES:
  89. ctx.pushStatus(Sqlstate::_HYC00, Error::Gen, "concur values not supported");
  90. break;
  91.     default:
  92. ctx.pushStatus(Sqlstate::_HY024, Error::Gen, "invalid concurrency value %u", (unsigned)value);
  93. break;
  94.     }
  95. }
  96. static void
  97. callback_SQL_ATTR_CONCURRENCY_default(Ctx& ctx, HandleBase* self, OdbcData& data)
  98. {
  99.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  100.     ctx_assert(pStmt != 0);
  101.     SQLUINTEGER value = SQL_CONCUR_READ_ONLY;
  102.     data.setValue(value);
  103. }
  104. static void
  105. callback_SQL_ATTR_CURSOR_SCROLLABLE_set(Ctx& ctx, HandleBase* self, const OdbcData& data)
  106. {
  107.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  108.     ctx_assert(pStmt != 0 && data.type() == OdbcData::Uinteger);
  109.     SQLUINTEGER value = data.uinteger();
  110.     switch (value) {
  111.     case SQL_NONSCROLLABLE:
  112. break;
  113.     case SQL_SCROLLABLE:
  114. ctx.pushStatus(Sqlstate::_HYC00, Error::Gen, "cursor scrollable not supported");
  115. break;
  116.     default:
  117. ctx.pushStatus(Sqlstate::_HY024, Error::Gen, "invalid concurrency value %u", (unsigned)value);
  118. break;
  119.     }
  120. }
  121. static void
  122. callback_SQL_ATTR_CURSOR_SCROLLABLE_default(Ctx& ctx, HandleBase* self, OdbcData& data)
  123. {
  124.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  125.     ctx_assert(pStmt != 0);
  126.     SQLUINTEGER value = SQL_NONSCROLLABLE;
  127.     data.setValue(value);
  128. }
  129. static void
  130. callback_SQL_ATTR_CURSOR_SENSITIVITY_set(Ctx& ctx, HandleBase* self, const OdbcData& data)
  131. {
  132.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  133.     ctx_assert(pStmt != 0 && data.type() == OdbcData::Uinteger);
  134.     SQLUINTEGER value = data.uinteger();
  135.     switch (value) {
  136.     case SQL_UNSPECIFIED:
  137.     case SQL_INSENSITIVE:
  138. break;
  139.     case SQL_SENSITIVE:
  140. ctx.pushStatus(Sqlstate::_HYC00, Error::Gen, "cursor sensitive not supported");
  141. break;
  142.     default:
  143. ctx.pushStatus(Sqlstate::_HY024, Error::Gen, "invalid cursor sensitivity value %u", (unsigned)value);
  144. break;
  145.     }
  146. }
  147. static void
  148. callback_SQL_ATTR_CURSOR_SENSITIVITY_default(Ctx& ctx, HandleBase* self, OdbcData& data)
  149. {
  150.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  151.     ctx_assert(pStmt != 0);
  152.     SQLUINTEGER value = SQL_INSENSITIVE;
  153.     data.setValue(value);
  154. }
  155. static void
  156. callback_SQL_ATTR_CURSOR_TYPE_set(Ctx& ctx, HandleBase* self, const OdbcData& data)
  157. {
  158.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  159.     ctx_assert(pStmt != 0 && data.type() == OdbcData::Uinteger);
  160.     SQLUINTEGER value = data.uinteger();
  161.     switch (value) {
  162.     case SQL_CURSOR_FORWARD_ONLY:
  163. break;
  164.     case SQL_CURSOR_STATIC:
  165. ctx.pushStatus(Sqlstate::_HYC00, Error::Gen, "cursor static not supported");
  166. break;
  167.     case SQL_CURSOR_KEYSET_DRIVEN:
  168. ctx.pushStatus(Sqlstate::_HYC00, Error::Gen, "cursor keyset driven not supported");
  169. break;
  170.     case SQL_CURSOR_DYNAMIC:
  171. ctx.pushStatus(Sqlstate::_HYC00, Error::Gen, "cursor dynamic not supported");
  172. break;
  173.     default:
  174. ctx.pushStatus(Sqlstate::_HY024, Error::Gen, "invalid cursor type value %u", (unsigned)value);
  175. break;
  176.     }
  177. }
  178. static void
  179. callback_SQL_ATTR_CURSOR_TYPE_default(Ctx& ctx, HandleBase* self, OdbcData& data)
  180. {
  181.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  182.     ctx_assert(pStmt != 0);
  183.     SQLUINTEGER value = SQL_CURSOR_FORWARD_ONLY;
  184.     data.setValue(value);
  185. }
  186. static void
  187. callback_SQL_ATTR_ENABLE_AUTO_IPD_set(Ctx& ctx, HandleBase* self, const OdbcData& data)
  188. {
  189.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  190.     ctx_assert(pStmt != 0 && data.type() == OdbcData::Uinteger);
  191.     SQLUINTEGER value = data.uinteger();
  192.     switch (value) {
  193.     case SQL_FALSE:
  194. break;
  195.     case SQL_TRUE:
  196. ctx.pushStatus(Sqlstate::_HYC00, Error::Gen, "enable auto IPD not supported");
  197. break;
  198.     default:
  199. ctx.pushStatus(Sqlstate::_HY024, Error::Gen, "invalid enable auto IPD value %u", (unsigned)value);
  200. break;
  201.     }
  202. }
  203. static void
  204. callback_SQL_ATTR_ENABLE_AUTO_IPD_default(Ctx& ctx, HandleBase* self, OdbcData& data)
  205. {
  206.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  207.     ctx_assert(pStmt != 0);
  208.     SQLUINTEGER value = SQL_FALSE;
  209.     data.setValue(value);
  210. }
  211. static void
  212. callback_SQL_ATTR_FETCH_BOOKMARK_PTR_set(Ctx& ctx, HandleBase* self, const OdbcData& data)
  213. {
  214.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  215.     ctx_assert(pStmt != 0 && data.type() == OdbcData::Pointer);
  216.     SQLPOINTER value = data.pointer();
  217.     if (value != 0) {
  218. ctx.pushStatus(Sqlstate::_HYC00, Error::Gen, "fetch bookmark ptr not supported");
  219. return;
  220.     }
  221. }
  222. static void
  223. callback_SQL_ATTR_FETCH_BOOKMARK_PTR_default(Ctx& ctx, HandleBase* self, OdbcData& data)
  224. {
  225.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  226.     ctx_assert(pStmt != 0);
  227.     SQLPOINTER value = 0;
  228.     data.setValue(value);
  229. }
  230. static void
  231. callback_SQL_ATTR_IMP_PARAM_DESC_set(Ctx& ctx, HandleBase* self, const OdbcData& data)
  232. {
  233.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  234.     ctx_assert(pStmt != 0 && data.type() == OdbcData::Pointer);
  235.     ctx_assert(false); // read-only
  236. }
  237. static void
  238. callback_SQL_ATTR_IMP_PARAM_DESC_default(Ctx& ctx, HandleBase* self, OdbcData& data)
  239. {
  240.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  241.     ctx_assert(pStmt != 0);
  242.     HandleDesc* ipd = pStmt->getHandleDesc(ctx, Desc_usage_IPD);
  243.     OdbcData value(reinterpret_cast<SQLPOINTER>(ipd));
  244.     data.setValue(value);
  245. }
  246. static void
  247. callback_SQL_ATTR_IMP_ROW_DESC_set(Ctx& ctx, HandleBase* self, const OdbcData& data)
  248. {
  249.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  250.     ctx_assert(pStmt != 0 && data.type() == OdbcData::Pointer);
  251.     ctx_assert(false); // read-only
  252. }
  253. static void
  254. callback_SQL_ATTR_IMP_ROW_DESC_default(Ctx& ctx, HandleBase* self, OdbcData& data)
  255. {
  256.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  257.     ctx_assert(pStmt != 0);
  258.     HandleDesc* ird = pStmt->getHandleDesc(ctx, Desc_usage_IRD);
  259.     OdbcData value(reinterpret_cast<SQLPOINTER>(ird));
  260.     data.setValue(value);
  261. }
  262. static void
  263. callback_SQL_ATTR_KEYSET_SIZE_set(Ctx& ctx, HandleBase* self, const OdbcData& data)
  264. {
  265.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  266.     ctx_assert(pStmt != 0 && data.type() == OdbcData::Uinteger);
  267.     SQLUINTEGER value = data.uinteger();
  268.     if (value != 0) {
  269. ctx.pushStatus(Sqlstate::_HYC00, Error::Gen, "keyset size not supported");
  270. return;
  271.     }
  272. }
  273. static void
  274. callback_SQL_ATTR_KEYSET_SIZE_default(Ctx& ctx, HandleBase* self, OdbcData& data)
  275. {
  276.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  277.     ctx_assert(pStmt != 0);
  278.     SQLUINTEGER value = 0;
  279.     data.setValue(value);
  280. }
  281. static void
  282. callback_SQL_ATTR_MAX_LENGTH_set(Ctx& ctx, HandleBase* self, const OdbcData& data)
  283. {
  284.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  285.     ctx_assert(pStmt != 0 && data.type() == OdbcData::Uinteger);
  286.     SQLUINTEGER value = data.uinteger();
  287.     if (value != 0) {
  288. ctx.pushStatus(Sqlstate::_HYC00, Error::Gen, "max length not supported");
  289. return;
  290.     }
  291. }
  292. static void
  293. callback_SQL_ATTR_MAX_LENGTH_default(Ctx& ctx, HandleBase* self, OdbcData& data)
  294. {
  295.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  296.     ctx_assert(pStmt != 0);
  297.     SQLUINTEGER value = 0;
  298.     data.setValue(value);
  299. }
  300. static void
  301. callback_SQL_ATTR_MAX_ROWS_set(Ctx& ctx, HandleBase* self, const OdbcData& data)
  302. {
  303.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  304.     ctx_assert(pStmt != 0 && data.type() == OdbcData::Uinteger);
  305.     SQLUINTEGER value = data.uinteger();
  306.     if (value != 0) {
  307. ctx.pushStatus(Sqlstate::_HYC00, Error::Gen, "max rows not supported");
  308. return;
  309.     }
  310. }
  311. static void
  312. callback_SQL_ATTR_MAX_ROWS_default(Ctx& ctx, HandleBase* self, OdbcData& data)
  313. {
  314.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  315.     ctx_assert(pStmt != 0);
  316.     SQLUINTEGER value = 0;
  317.     data.setValue(value);
  318. }
  319. static void
  320. callback_SQL_ATTR_METADATA_ID_set(Ctx& ctx, HandleBase* self, const OdbcData& data)
  321. {
  322.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  323.     ctx_assert(pStmt != 0 && data.type() == OdbcData::Uinteger);
  324.     SQLUINTEGER value = data.uinteger();
  325.     switch (value) {
  326.     case SQL_FALSE:
  327. break;
  328.     case SQL_TRUE:
  329. break;
  330.     default:
  331. ctx.pushStatus(Sqlstate::_HY024, Error::Gen, "invalid metadata id value %u", (unsigned)value);
  332. break;
  333.     }
  334. }
  335. static void
  336. callback_SQL_ATTR_METADATA_ID_default(Ctx& ctx, HandleBase* self, OdbcData& data)
  337. {
  338.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  339.     ctx_assert(pStmt != 0);
  340.     SQLUINTEGER value = SQL_FALSE;
  341.     data.setValue(value);
  342. }
  343. static void
  344. callback_SQL_ATTR_NOSCAN_set(Ctx& ctx, HandleBase* self, const OdbcData& data)
  345. {
  346.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  347.     ctx_assert(pStmt != 0 && data.type() == OdbcData::Uinteger);
  348.     SQLUINTEGER value = data.uinteger();
  349.     switch (value) {
  350.     case SQL_NOSCAN_OFF:
  351. ctx.pushStatus(Sqlstate::_HYC00, Error::Gen, "noscan OFF not supported");
  352. break;
  353.     case SQL_NOSCAN_ON:
  354. break;
  355.     default:
  356. ctx.pushStatus(Sqlstate::_HY024, Error::Gen, "invalid no scan value %u", (unsigned)value);
  357. break;
  358.     }
  359. }
  360. static void
  361. callback_SQL_ATTR_NOSCAN_default(Ctx& ctx, HandleBase* self, OdbcData& data)
  362. {
  363.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  364.     ctx_assert(pStmt != 0);
  365.     SQLUINTEGER value = SQL_NOSCAN_ON;
  366.     data.setValue(value);
  367. }
  368. static void
  369. callback_SQL_ATTR_PARAM_BIND_OFFSET_PTR_set(Ctx& ctx, HandleBase* self, const OdbcData& data)
  370. {
  371.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  372.     ctx_assert(pStmt != 0 && data.type() == OdbcData::UintegerPtr);
  373.     SQLUINTEGER* value = data.uintegerPtr();
  374.     if (value != 0) {
  375. ctx.pushStatus(Sqlstate::_HYC00, Error::Gen, "param bind offset ptr not supported");
  376. return;
  377.     }
  378. }
  379. static void
  380. callback_SQL_ATTR_PARAM_BIND_OFFSET_PTR_default(Ctx& ctx, HandleBase* self, OdbcData& data)
  381. {
  382.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  383.     ctx_assert(pStmt != 0);
  384.     SQLUINTEGER* value = 0;
  385.     data.setValue(value);
  386. }
  387. static void
  388. callback_SQL_ATTR_PARAM_BIND_TYPE_set(Ctx& ctx, HandleBase* self, const OdbcData& data)
  389. {
  390.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  391.     ctx_assert(pStmt != 0 && data.type() == OdbcData::Uinteger);
  392.     SQLUINTEGER value = data.uinteger();
  393.     if (value != SQL_PARAM_BIND_BY_COLUMN) {
  394. ctx.pushStatus(Sqlstate::_HYC00, Error::Gen, "row-wise param binding not supported");
  395. return;
  396.     }
  397. }
  398. static void
  399. callback_SQL_ATTR_PARAM_BIND_TYPE_default(Ctx& ctx, HandleBase* self, OdbcData& data)
  400. {
  401.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  402.     ctx_assert(pStmt != 0);
  403.     SQLUINTEGER value = SQL_PARAM_BIND_BY_COLUMN;
  404.     data.setValue(value);
  405. }
  406. static void
  407. callback_SQL_ATTR_PARAM_OPERATION_PTR_set(Ctx& ctx, HandleBase* self, const OdbcData& data)
  408. {
  409.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  410.     ctx_assert(pStmt != 0 && data.type() == OdbcData::UsmallintPtr);
  411.     SQLUSMALLINT* value = data.usmallintPtr();
  412.     if (value != 0) {
  413. ctx.pushStatus(Sqlstate::_HYC00, Error::Gen, "param operation ptr not supported");
  414. return;
  415.     }
  416. }
  417. static void
  418. callback_SQL_ATTR_PARAM_OPERATION_PTR_default(Ctx& ctx, HandleBase* self, OdbcData& data)
  419. {
  420.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  421.     ctx_assert(pStmt != 0);
  422.     SQLUSMALLINT* value = 0;
  423.     data.setValue(value);
  424. }
  425. static void
  426. callback_SQL_ATTR_PARAM_STATUS_PTR_set(Ctx& ctx, HandleBase* self, const OdbcData& data)
  427. {
  428.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  429.     ctx_assert(pStmt != 0 && data.type() == OdbcData::UsmallintPtr);
  430.     SQLUSMALLINT* value = data.usmallintPtr();
  431.     if (value != 0) {
  432. ctx.pushStatus(Sqlstate::_HYC00, Error::Gen, "param status ptr not supported");
  433. return;
  434.     }
  435. }
  436. static void
  437. callback_SQL_ATTR_PARAM_STATUS_PTR_default(Ctx& ctx, HandleBase* self, OdbcData& data)
  438. {
  439.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  440.     ctx_assert(pStmt != 0);
  441.     SQLUSMALLINT* value = 0;
  442.     data.setValue(value);
  443. }
  444. static void
  445. callback_SQL_ATTR_PARAMS_PROCESSED_PTR_set(Ctx& ctx, HandleBase* self, const OdbcData& data)
  446. {
  447.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  448.     ctx_assert(pStmt != 0 && data.type() == OdbcData::UintegerPtr);
  449.     SQLUINTEGER* value = data.uintegerPtr();
  450.     if (value != 0) {
  451. ctx.pushStatus(Sqlstate::_HYC00, Error::Gen, "params processed ptr not supported");
  452. return;
  453.     }
  454. }
  455. static void
  456. callback_SQL_ATTR_PARAMS_PROCESSED_PTR_default(Ctx& ctx, HandleBase* self, OdbcData& data)
  457. {
  458.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  459.     ctx_assert(pStmt != 0);
  460.     SQLUINTEGER* value = 0;
  461.     data.setValue(value);
  462. }
  463. static void
  464. callback_SQL_ATTR_PARAMSET_SIZE_set(Ctx& ctx, HandleBase* self, const OdbcData& data)
  465. {
  466.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  467.     ctx_assert(pStmt != 0 && data.type() == OdbcData::Uinteger);
  468.     SQLUINTEGER value = data.uinteger();
  469.     if (value != 1) {
  470. ctx.pushStatus(Sqlstate::_HYC00, Error::Gen, "paramset size %u not supported", (unsigned)value);
  471. return;
  472.     }
  473. }
  474. static void
  475. callback_SQL_ATTR_PARAMSET_SIZE_default(Ctx& ctx, HandleBase* self, OdbcData& data)
  476. {
  477.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  478.     ctx_assert(pStmt != 0);
  479.     SQLUINTEGER value = 1;
  480.     data.setValue(value);
  481. }
  482. static void
  483. callback_SQL_ATTR_QUERY_TIMEOUT_set(Ctx& ctx, HandleBase* self, const OdbcData& data)
  484. {
  485.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  486.     ctx_assert(pStmt != 0 && data.type() == OdbcData::Uinteger);
  487.     SQLUINTEGER value = data.uinteger();
  488.     if (value != 0) {
  489. ctx.pushStatus(Sqlstate::_01S02, Error::Gen, "query timeout %u replaced by 0", (unsigned)value);
  490. return;
  491.     }
  492. }
  493. static void
  494. callback_SQL_ATTR_QUERY_TIMEOUT_default(Ctx& ctx, HandleBase* self, OdbcData& data)
  495. {
  496.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  497.     ctx_assert(pStmt != 0);
  498.     SQLUINTEGER value = 0;
  499.     data.setValue(value);
  500. }
  501. static void
  502. callback_SQL_ATTR_RETRIEVE_DATA_set(Ctx& ctx, HandleBase* self, const OdbcData& data)
  503. {
  504.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  505.     ctx_assert(pStmt != 0 && data.type() == OdbcData::Uinteger);
  506.     SQLUINTEGER value = data.uinteger();
  507.     switch (value) {
  508.     case SQL_RD_ON:
  509. break;
  510.     case SQL_RD_OFF:
  511. ctx.pushStatus(Sqlstate::_HYC00, Error::Gen, "retrieve data OFF not supported");
  512. break;
  513.     default:
  514. ctx.pushStatus(Sqlstate::_HY024, Error::Gen, "invalid retrieve data value %u", (unsigned)value);
  515. break;
  516.     }
  517. }
  518. static void
  519. callback_SQL_ATTR_RETRIEVE_DATA_default(Ctx& ctx, HandleBase* self, OdbcData& data)
  520. {
  521.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  522.     ctx_assert(pStmt != 0);
  523.     SQLUINTEGER value = SQL_RD_ON;
  524.     data.setValue(value);
  525. }
  526. static void
  527. callback_SQL_ATTR_ROW_ARRAY_SIZE_set(Ctx& ctx, HandleBase* self, const OdbcData& data)
  528. {
  529.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  530.     ctx_assert(pStmt != 0 && data.type() == OdbcData::Uinteger);
  531.     SQLUINTEGER value = data.uinteger();
  532.     if (value != 1) {
  533. ctx.pushStatus(Sqlstate::_HYC00, Error::Gen, "row array size %u != 1 not supported", (unsigned)value);
  534. return;
  535.     }
  536. }
  537. static void
  538. callback_SQL_ATTR_ROW_ARRAY_SIZE_default(Ctx& ctx, HandleBase* self, OdbcData& data)
  539. {
  540.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  541.     ctx_assert(pStmt != 0);
  542.     SQLUINTEGER value = 1;
  543.     data.setValue(value);
  544. }
  545. static void
  546. callback_SQL_ATTR_ROW_BIND_OFFSET_PTR_set(Ctx& ctx, HandleBase* self, const OdbcData& data)
  547. {
  548.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  549.     ctx_assert(pStmt != 0 && data.type() == OdbcData::UintegerPtr);
  550.     SQLUINTEGER* value = data.uintegerPtr();
  551.     if (value != 0) {
  552. ctx.pushStatus(Sqlstate::_HYC00, Error::Gen, "row bind offset ptr != 0 not supported");
  553. return;
  554.     }
  555. }
  556. static void
  557. callback_SQL_ATTR_ROW_BIND_OFFSET_PTR_default(Ctx& ctx, HandleBase* self, OdbcData& data)
  558. {
  559.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  560.     ctx_assert(pStmt != 0);
  561.     SQLUINTEGER* value = 0;
  562.     data.setValue(value);
  563. }
  564. static void
  565. callback_SQL_ATTR_ROW_BIND_TYPE_set(Ctx& ctx, HandleBase* self, const OdbcData& data)
  566. {
  567.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  568.     ctx_assert(pStmt != 0 && data.type() == OdbcData::Uinteger);
  569.     SQLUINTEGER value = data.uinteger();
  570.     if (value != SQL_BIND_BY_COLUMN) {
  571. ctx.pushStatus(Sqlstate::_HYC00, Error::Gen, "row-wise binding not supported");
  572. return;
  573.     }
  574. }
  575. static void
  576. callback_SQL_ATTR_ROW_BIND_TYPE_default(Ctx& ctx, HandleBase* self, OdbcData& data)
  577. {
  578.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  579.     ctx_assert(pStmt != 0);
  580.     SQLUINTEGER value = SQL_BIND_BY_COLUMN;
  581.     data.setValue(value);
  582. }
  583. static void
  584. callback_SQL_ATTR_ROW_NUMBER_set(Ctx& ctx, HandleBase* self, const OdbcData& data)
  585. {
  586.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  587.     ctx_assert(pStmt != 0 && data.type() == OdbcData::Uinteger);
  588.     ctx_assert(false); // read-only
  589. }
  590. static void
  591. callback_SQL_ATTR_ROW_NUMBER_default(Ctx& ctx, HandleBase* self, OdbcData& data)
  592. {
  593.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  594.     ctx_assert(pStmt != 0);
  595.     SQLUINTEGER value = pStmt->getRowCount();
  596.     data.setValue(value);
  597. }
  598. static void
  599. callback_SQL_ATTR_ROW_OPERATION_PTR_set(Ctx& ctx, HandleBase* self, const OdbcData& data)
  600. {
  601.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  602.     ctx_assert(pStmt != 0 && data.type() == OdbcData::UsmallintPtr);
  603.     SQLUSMALLINT* value = data.usmallintPtr();
  604.     if (value != 0) {
  605. ctx.pushStatus(Sqlstate::_HYC00, Error::Gen, "row operation ptr not supported");
  606. return;
  607.     }
  608. }
  609. static void
  610. callback_SQL_ATTR_ROW_OPERATION_PTR_default(Ctx& ctx, HandleBase* self, OdbcData& data)
  611. {
  612.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  613.     ctx_assert(pStmt != 0);
  614.     SQLUSMALLINT* value = 0;
  615.     data.setValue(value);
  616. }
  617. static void
  618. callback_SQL_ATTR_ROW_STATUS_PTR_set(Ctx& ctx, HandleBase* self, const OdbcData& data)
  619. {
  620.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  621.     ctx_assert(pStmt != 0 && data.type() == OdbcData::UsmallintPtr);
  622.     SQLUSMALLINT* value = data.usmallintPtr();
  623.     if (value != 0) {
  624. ctx.pushStatus(Sqlstate::_HYC00, Error::Gen, "row status ptr not supported");
  625. return;
  626.     }
  627. }
  628. static void
  629. callback_SQL_ATTR_ROW_STATUS_PTR_default(Ctx& ctx, HandleBase* self, OdbcData& data)
  630. {
  631.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  632.     ctx_assert(pStmt != 0);
  633.     SQLUSMALLINT* value = 0;
  634.     data.setValue(value);
  635. }
  636. static void
  637. callback_SQL_ATTR_ROWS_FETCHED_PTR_set(Ctx& ctx, HandleBase* self, const OdbcData& data)
  638. {
  639.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  640.     ctx_assert(pStmt != 0 && data.type() == OdbcData::UintegerPtr);
  641.     SQLUINTEGER* value = data.uintegerPtr();
  642.     HandleDesc* ird = pStmt->getHandleDesc(ctx, Desc_usage_IRD);
  643.     ird->sqlSetDescField(ctx, 0, SQL_DESC_ROWS_PROCESSED_PTR, static_cast<SQLPOINTER>(value), SQL_IS_POINTER);
  644. }
  645. static void
  646. callback_SQL_ATTR_ROWS_FETCHED_PTR_default(Ctx& ctx, HandleBase* self, OdbcData& data)
  647. {
  648.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  649.     ctx_assert(pStmt != 0);
  650.     SQLUINTEGER* value = 0;
  651.     HandleDesc* ird = pStmt->getHandleDesc(ctx, Desc_usage_IRD);
  652.     ird->sqlGetDescField(ctx, 0, SQL_DESC_ROWS_PROCESSED_PTR, &value, SQL_IS_POINTER, 0);
  653.     data.setValue(value);
  654. }
  655. static void
  656. callback_SQL_ATTR_SIMULATE_CURSOR_set(Ctx& ctx, HandleBase* self, const OdbcData& data)
  657. {
  658.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  659.     ctx_assert(pStmt != 0 && data.type() == OdbcData::Uinteger);
  660.     SQLUINTEGER value = data.uinteger();
  661.     switch (value) {
  662.     case SQL_SC_NON_UNIQUE:
  663. break;
  664.     case SQL_SC_TRY_UNIQUE:
  665. break;
  666.     case SQL_SC_UNIQUE:
  667. break;
  668.     default:
  669. ctx.pushStatus(Sqlstate::_HY024, Error::Gen, "invalid simulate cursor value %u", (unsigned)value);
  670. break;
  671.     }
  672. }
  673. static void
  674. callback_SQL_ATTR_SIMULATE_CURSOR_default(Ctx& ctx, HandleBase* self, OdbcData& data)
  675. {
  676.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  677.     ctx_assert(pStmt != 0);
  678.     SQLUINTEGER value = SQL_SC_UNIQUE; // XXX if we did
  679.     data.setValue(value);
  680. }
  681. static void
  682. callback_SQL_ATTR_USE_BOOKMARKS_set(Ctx& ctx, HandleBase* self, const OdbcData& data)
  683. {
  684.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  685.     SQLUINTEGER value = data.uinteger();
  686.     switch (value) {
  687.     case SQL_UB_OFF:
  688. break;
  689.     case SQL_UB_VARIABLE:
  690.     case SQL_UB_FIXED:
  691.  ctx.pushStatus(Sqlstate::_HYC00, Error::Gen, "bookmarks not supported");
  692.  return;
  693.     }
  694. }
  695. static void
  696. callback_SQL_ATTR_USE_BOOKMARKS_default(Ctx& ctx, HandleBase* self, OdbcData& data)
  697. {
  698.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  699.     ctx_assert(pStmt != 0);
  700.     SQLUINTEGER value = SQL_UB_OFF;
  701.     data.setValue(value);
  702. }
  703. // driver specific
  704. static void
  705. callback_SQL_ATTR_NDB_TUPLES_FETCHED_set(Ctx& ctx, HandleBase* self, const OdbcData& data)
  706. {
  707.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  708.     ctx_assert(pStmt != 0 && data.type() == OdbcData::Uinteger);
  709.     ctx_assert(false); // read-only
  710. }
  711. static void
  712. callback_SQL_ATTR_NDB_TUPLES_FETCHED_default(Ctx& ctx, HandleBase* self, OdbcData& data)
  713. {
  714.     HandleStmt* pStmt = static_cast<HandleStmt*>(self);
  715.     ctx_assert(pStmt != 0);
  716.     SQLUINTEGER value = pStmt->getTuplesFetched();
  717.     data.setValue(value);
  718. }
  719. AttrSpec HandleStmt::m_attrSpec[] = {
  720.     {   SQL_ATTR_APP_PARAM_DESC,
  721.         OdbcData::Pointer,
  722.         Attr_mode_readwrite,
  723.         callback_SQL_ATTR_APP_PARAM_DESC_set,
  724.         callback_SQL_ATTR_APP_PARAM_DESC_default,
  725.     },
  726.     {   SQL_ATTR_APP_ROW_DESC,
  727.         OdbcData::Pointer,
  728.         Attr_mode_readwrite,
  729.         callback_SQL_ATTR_APP_ROW_DESC_set,
  730.         callback_SQL_ATTR_APP_ROW_DESC_default,
  731.     },
  732.     {   SQL_ATTR_ASYNC_ENABLE,
  733.         OdbcData::Uinteger,
  734.         Attr_mode_readwrite,
  735.         callback_SQL_ATTR_ASYNC_ENABLE_set,
  736.         callback_SQL_ATTR_ASYNC_ENABLE_default,
  737.     },
  738.     {   SQL_ATTR_CONCURRENCY,
  739.         OdbcData::Uinteger,
  740.         Attr_mode_readwrite,
  741.         callback_SQL_ATTR_CONCURRENCY_set,
  742.         callback_SQL_ATTR_CONCURRENCY_default,
  743.     },
  744.     {   SQL_ATTR_CURSOR_SCROLLABLE,
  745.         OdbcData::Uinteger,
  746.         Attr_mode_readwrite,
  747.         callback_SQL_ATTR_CURSOR_SCROLLABLE_set,
  748.         callback_SQL_ATTR_CURSOR_SCROLLABLE_default,
  749.     },
  750.     {   SQL_ATTR_CURSOR_SENSITIVITY,
  751.         OdbcData::Uinteger,
  752.         Attr_mode_readwrite,
  753.         callback_SQL_ATTR_CURSOR_SENSITIVITY_set,
  754.         callback_SQL_ATTR_CURSOR_SENSITIVITY_default,
  755.     },
  756.     {   SQL_ATTR_CURSOR_TYPE,
  757.         OdbcData::Uinteger,
  758.         Attr_mode_readwrite,
  759.         callback_SQL_ATTR_CURSOR_TYPE_set,
  760.         callback_SQL_ATTR_CURSOR_TYPE_default,
  761.     },
  762.     {   SQL_ATTR_ENABLE_AUTO_IPD,
  763.         OdbcData::Uinteger,
  764.         Attr_mode_readwrite,
  765.         callback_SQL_ATTR_ENABLE_AUTO_IPD_set,
  766.         callback_SQL_ATTR_ENABLE_AUTO_IPD_default,
  767.     },
  768.     {   SQL_ATTR_FETCH_BOOKMARK_PTR,
  769.         OdbcData::Pointer,
  770.         Attr_mode_readwrite,
  771.         callback_SQL_ATTR_FETCH_BOOKMARK_PTR_set,
  772.         callback_SQL_ATTR_FETCH_BOOKMARK_PTR_default,
  773.     },
  774.     {   SQL_ATTR_IMP_PARAM_DESC,
  775.         OdbcData::Pointer,
  776.         Attr_mode_readonly,
  777.         callback_SQL_ATTR_IMP_PARAM_DESC_set,
  778.         callback_SQL_ATTR_IMP_PARAM_DESC_default,
  779.     },
  780.     {   SQL_ATTR_IMP_ROW_DESC,
  781.         OdbcData::Pointer,
  782.         Attr_mode_readonly,
  783.         callback_SQL_ATTR_IMP_ROW_DESC_set,
  784.         callback_SQL_ATTR_IMP_ROW_DESC_default,
  785.     },
  786.     {   SQL_ATTR_KEYSET_SIZE,
  787.         OdbcData::Uinteger,
  788.         Attr_mode_readwrite,
  789.         callback_SQL_ATTR_KEYSET_SIZE_set,
  790.         callback_SQL_ATTR_KEYSET_SIZE_default,
  791.     },
  792.     {   SQL_ATTR_MAX_LENGTH,
  793.         OdbcData::Uinteger,
  794.         Attr_mode_readwrite,
  795.         callback_SQL_ATTR_MAX_LENGTH_set,
  796.         callback_SQL_ATTR_MAX_LENGTH_default,
  797.     },
  798.     {   SQL_ATTR_MAX_ROWS,
  799.         OdbcData::Uinteger,
  800.         Attr_mode_readwrite,
  801.         callback_SQL_ATTR_MAX_ROWS_set,
  802.         callback_SQL_ATTR_MAX_ROWS_default,
  803.     },
  804.     {   SQL_ATTR_METADATA_ID,
  805.         OdbcData::Uinteger,
  806.         Attr_mode_readwrite,
  807.         callback_SQL_ATTR_METADATA_ID_set,
  808.         callback_SQL_ATTR_METADATA_ID_default,
  809.     },
  810.     {   SQL_ATTR_NOSCAN,
  811.         OdbcData::Uinteger,
  812.         Attr_mode_readwrite,
  813.         callback_SQL_ATTR_NOSCAN_set,
  814.         callback_SQL_ATTR_NOSCAN_default,
  815.     },
  816.     {   SQL_ATTR_PARAM_BIND_OFFSET_PTR,
  817.         OdbcData::UintegerPtr,
  818.         Attr_mode_readwrite,
  819.         callback_SQL_ATTR_PARAM_BIND_OFFSET_PTR_set,
  820.         callback_SQL_ATTR_PARAM_BIND_OFFSET_PTR_default,
  821.     },
  822.     {   SQL_ATTR_PARAM_BIND_TYPE,
  823.         OdbcData::Uinteger,
  824.         Attr_mode_readwrite,
  825.         callback_SQL_ATTR_PARAM_BIND_TYPE_set,
  826.         callback_SQL_ATTR_PARAM_BIND_TYPE_default,
  827.     },
  828.     {   SQL_ATTR_PARAM_OPERATION_PTR,
  829.         OdbcData::UsmallintPtr,
  830.         Attr_mode_readwrite,
  831.         callback_SQL_ATTR_PARAM_OPERATION_PTR_set,
  832.         callback_SQL_ATTR_PARAM_OPERATION_PTR_default,
  833.     },
  834.     {   SQL_ATTR_PARAM_STATUS_PTR,
  835.         OdbcData::UsmallintPtr,
  836.         Attr_mode_readwrite,
  837.         callback_SQL_ATTR_PARAM_STATUS_PTR_set,
  838.         callback_SQL_ATTR_PARAM_STATUS_PTR_default,
  839.     },
  840.     {   SQL_ATTR_PARAMS_PROCESSED_PTR,
  841.         OdbcData::UintegerPtr,
  842.         Attr_mode_readwrite,
  843.         callback_SQL_ATTR_PARAMS_PROCESSED_PTR_set,
  844.         callback_SQL_ATTR_PARAMS_PROCESSED_PTR_default,
  845.     },
  846.     {   SQL_ATTR_PARAMSET_SIZE,
  847.         OdbcData::Uinteger,
  848.         Attr_mode_readwrite,
  849.         callback_SQL_ATTR_PARAMSET_SIZE_set,
  850.         callback_SQL_ATTR_PARAMSET_SIZE_default,
  851.     },
  852.     {   SQL_ATTR_QUERY_TIMEOUT,
  853.         OdbcData::Uinteger,
  854.         Attr_mode_readwrite,
  855.         callback_SQL_ATTR_QUERY_TIMEOUT_set,
  856.         callback_SQL_ATTR_QUERY_TIMEOUT_default,
  857.     },
  858.     {   SQL_ATTR_RETRIEVE_DATA,
  859.         OdbcData::Uinteger,
  860.         Attr_mode_readwrite,
  861.         callback_SQL_ATTR_RETRIEVE_DATA_set,
  862.         callback_SQL_ATTR_RETRIEVE_DATA_default,
  863.     },
  864.     {   SQL_ATTR_ROW_ARRAY_SIZE,
  865.         OdbcData::Uinteger,
  866.         Attr_mode_readwrite,
  867.         callback_SQL_ATTR_ROW_ARRAY_SIZE_set,
  868.         callback_SQL_ATTR_ROW_ARRAY_SIZE_default,
  869.     },
  870.     {   SQL_ATTR_ROW_BIND_OFFSET_PTR,
  871.         OdbcData::UintegerPtr,
  872.         Attr_mode_readwrite,
  873.         callback_SQL_ATTR_ROW_BIND_OFFSET_PTR_set,
  874.         callback_SQL_ATTR_ROW_BIND_OFFSET_PTR_default,
  875.     },
  876.     {   SQL_ATTR_ROW_BIND_TYPE,
  877.         OdbcData::Uinteger,
  878.         Attr_mode_readwrite,
  879.         callback_SQL_ATTR_ROW_BIND_TYPE_set,
  880.         callback_SQL_ATTR_ROW_BIND_TYPE_default,
  881.     },
  882.     {   SQL_ATTR_ROW_NUMBER,
  883.         OdbcData::Uinteger,
  884.         Attr_mode_readonly,
  885.         callback_SQL_ATTR_ROW_NUMBER_set,
  886.         callback_SQL_ATTR_ROW_NUMBER_default,
  887.     },
  888.     {   SQL_ATTR_ROW_OPERATION_PTR,
  889.         OdbcData::UsmallintPtr,
  890.         Attr_mode_readwrite,
  891.         callback_SQL_ATTR_ROW_OPERATION_PTR_set,
  892.         callback_SQL_ATTR_ROW_OPERATION_PTR_default,
  893.     },
  894.     {   SQL_ATTR_ROW_STATUS_PTR,
  895.         OdbcData::UsmallintPtr,
  896.         Attr_mode_readwrite,
  897.         callback_SQL_ATTR_ROW_STATUS_PTR_set,
  898.         callback_SQL_ATTR_ROW_STATUS_PTR_default,
  899.     },
  900.     {   SQL_ATTR_ROWS_FETCHED_PTR,
  901.         OdbcData::UintegerPtr,
  902.         Attr_mode_readwrite,
  903.         callback_SQL_ATTR_ROWS_FETCHED_PTR_set,
  904.         callback_SQL_ATTR_ROWS_FETCHED_PTR_default,
  905.     },
  906.     {   SQL_ATTR_SIMULATE_CURSOR,
  907.         OdbcData::Uinteger,
  908.         Attr_mode_readwrite,
  909.         callback_SQL_ATTR_SIMULATE_CURSOR_set,
  910.         callback_SQL_ATTR_SIMULATE_CURSOR_default,
  911.     },
  912.     {   SQL_ATTR_USE_BOOKMARKS,
  913.         OdbcData::Uinteger,
  914.         Attr_mode_readwrite,
  915.         callback_SQL_ATTR_USE_BOOKMARKS_set,
  916.         callback_SQL_ATTR_USE_BOOKMARKS_default,
  917.     },
  918.     // driver specific
  919.     {   SQL_ATTR_NDB_TUPLES_FETCHED,
  920.         OdbcData::Uinteger,
  921.         Attr_mode_readonly,
  922.         callback_SQL_ATTR_NDB_TUPLES_FETCHED_set,
  923.         callback_SQL_ATTR_NDB_TUPLES_FETCHED_default,
  924.     },
  925.     {   0,
  926.         OdbcData::Undef,
  927.         Attr_mode_undef,
  928.         0,
  929.         0,
  930.     },
  931. };