14#if __DCL_HAVE_ALLOC_DEBUG
15#undef __DCL_ALLOC_LEVEL
16#define __DCL_ALLOC_LEVEL __DCL_ALLOC_INTERNAL
31#define __DCL_TRACE0_N __DCL_TRACE0
32#define __DCL_TRACE1_N __DCL_TRACE1
33#define __DCL_TRACE2_N __DCL_TRACE2
34#define __DCL_TRACE3_N __DCL_TRACE3
35#define __DCL_TRACE4_N __DCL_TRACE4
36#define __DCL_TRACE5_N __DCL_TRACE5
37#define __DCL_TRACE6_N __DCL_TRACE6
39#define __DCL_TRACE0_N(fmt)
40#define __DCL_TRACE1_N(fmt, arg)
41#define __DCL_TRACE2_N(fmt, arg1, arg2)
42#define __DCL_TRACE3_N(fmt, arg1, arg2, arg3)
43#define __DCL_TRACE4_N(fmt, arg1, arg2, arg3, arg4)
44#define __DCL_TRACE5_N(fmt, arg1, arg2, arg3, arg4, arg5)
45#define __DCL_TRACE6_N(fmt, arg1, arg2, arg3, arg4, arg5, arg6)
53#define __SET_ERROR(_error) \
54 connection()->setErrorStatus(_error, __THIS_FILE__, __LINE__)
55#define __SET_ERROR_MSG(_msg) \
56 conn()->setErrorMessage(_msg, __THIS_FILE__, __LINE__)
57#define __SET_ERROR_HANDLE(_rc, _htype, _handle) \
58 conn()->setErrorHandle(_rc, _htype, _handle, __THIS_FILE__, __LINE__)
59#define __SET_INFO_HANDLE(_rc, _htype, _handle) \
60 if (_rc == SQL_SUCCESS_WITH_INFO) { \
61 conn()->setErrorHandle(_rc, _htype, _handle, __THIS_FILE__, __LINE__); \
83 size_t buflen =
sizeof(buf) - 1;
84 bool b = conn()->__getErrorMessage(buf, &buflen);
85 buf[b ? buflen : 0] =
'\0';
101 Query::__affectedRows = -1;
107 Query::__fieldCount = 0;
114 Query::__paramCount = 0;
129 SQLRETURN rc_ = SQLFreeStmt(
__hstmt, SQL_CLOSE);
130 if (rc_ != SQL_SUCCESS) {
133 rc_ = SQLFreeHandle(SQL_HANDLE_STMT,
__hstmt);
134 if (rc_ != SQL_SUCCESS) {
147 && (Query::__paramCount == 0)
152 SQLSMALLINT paramCount = 0;
153 SQLRETURN rc = SQLNumParams(
__hstmt, ¶mCount);
156 size_t alloc =
sizeof(
BIND) * paramCount;
165 SQLHDESC hdesc =
NULL;
166 SQLINTEGER len =
sizeof(hdesc);
167 rc = SQLGetStmtAttr(
__hstmt, SQL_ATTR_IMP_PARAM_DESC, &hdesc, len, &len);
168 if (rc != SQL_SUCCESS) {
174 for (SQLSMALLINT i = 0; i < paramCount; i++, bind++) {
178 SQLSMALLINT namelen =
sizeof(name);
180 rc = SQLGetDescRecA(hdesc, bind->
number, name, namelen, &namelen,
181 &(bind->
type), &subtype, (SQLLEN*)&(bind->
size),
183 if (rc != SQL_SUCCESS) {
192 if (rc != SQL_SUCCESS) {
197 rc = SQLGetDescFieldA(hdesc, bind->
number, SQL_DESC_PRECISION, &numAttr, 0,
NULL);
198 if (rc != SQL_SUCCESS) {
204 __DCL_TRACE6_N(L
"Param [%2d] size [%10d %4d,%4d] type [%4d %ls]\n",
210#if __USE_SS_PARAM_FIX
211 switch (bind->
type) {
213 bind->
type = SQL_TYPE_TIME;
216 case SQL_SS_TIMESTAMPOFFSET: {
217 bind->
type = SQL_TYPE_TIMESTAMP;
227#define __TYPE_PARAM_SIZE(_type, _size) \
228 __MAX(ODBCData::__TYPE_SIZE(_type, _size), sizeof(PARAM_BUFFER_MINIMAL))
229#define __TYPE_PARAM_ALIGN(_offset) \
230 ((_offset + sizeof(long) - 1) & ~(sizeof(long) - 1))
235 for (SQLSMALLINT i = 0; i < paramCount; i++, bind++) {
240 __DCL_TRACE5_N(L
"Param [%2d] offset [%10zd %5d ] type [%4d %ls]\n",
262 for (SQLSMALLINT i = 0; i < paramCount; i++, bind++) {
272 Query::__paramCount = paramCount;
280 for(
size_t i = 0; i < Query::__paramCount; i++, bind++) {
291 && (_columnCount > 0)
292 && (Query::__fieldCount == 0)
298 size_t alloc =
sizeof(
BIND) * _columnCount;
308 for (SQLSMALLINT i = 0; i < _columnCount; i++, bind++) {
311 SQLCHAR* name = _name;
312 SQLSMALLINT length =
sizeof(_name);
314 name, length, &length,
316 if (rc == SQL_SUCCESS_WITH_INFO) {
317 name = (SQLCHAR*)alloca(++length);
318 rc = SQLDescribeColA(
__hstmt, bind->
number, name, length, &length,
321 if (rc != SQL_SUCCESS) {
327 SQL_DESC_PRECISION,
NULL, 0,
NULL, &numAttr);
328 if (rc != SQL_SUCCESS) {
334 __DCL_TRACE6_N(L
"Field [%2d] size [%10d %4d,%4d] type [%4d %hs]\n",
341 names.add(UTF8Decoder::decode((
const char*)name, length).toUpperCase());
355 for (SQLSMALLINT i = 0; i < _columnCount; i++, bind++) {
360 __DCL_TRACE5_N(L
"Field [%2d] offset [%10zd %5d ] type [%4d %ls]\n",
381 for (SQLSMALLINT i = 0; i < _columnCount; i++, bind++) {
391 if (rc != SQL_SUCCESS) {
398 Query::__fieldCount = _columnCount;
406 for (
size_t i = 0; i < Query::__fieldCount; i++, bind++) {
407 if (!
__fields[i].init(
this, bind, names[i]))
415 const char* _sql,
size_t _sqllen,
426 SQLRETURN rc = SQLAllocHandle(SQL_HANDLE_STMT, conn()->connHandle(), &
__hstmt);
427 if (rc != SQL_SUCCESS) {
432 rc = SQLPrepareA(
__hstmt, (SQLCHAR*) _sql, (SQLINTEGER) _sqllen);
433 if (!SQL_SUCCEEDED(rc)) {
439 if (_paramCount > 0) {
450 for (
size_t i = 0; i < Query::__paramCount; i++) {
455 SQLRETURN rc = SQLExecute(
__hstmt);
459 Query::__affectedRows = 0;
462 case SQL_NEED_DATA: {
465 while ((rc = SQLParamData(
__hstmt, &ptr)) == SQL_NEED_DATA) {
466 if (!(((
ODBCParam*)ptr)->onNeedData())) {
478 case SQL_SUCCESS_WITH_INFO: {
481 SQLSMALLINT RecNumber = 0;
482 SQLINTEGER NativeError;
483 SQLCHAR SQLState[SQL_SQLSTATE_SIZE + 1];
484 SQLCHAR ErrorMsg[1024];
485 SQLSMALLINT ErrorMsgLen;
486 while ((rc = SQLGetDiagRecA(
487 SQL_HANDLE_STMT,
__hstmt, ++RecNumber, SQLState, &NativeError,
488 ErrorMsg,
__countof(ErrorMsg, SQLCHAR), &ErrorMsgLen
491 RecNumber, SQLState, ErrorMsgLen, ErrorMsg);
492 if (memcmp(SQLState,
"22001", 5)) {
511 for (
size_t i = 0; i < Query::__paramCount; i++) {
512 if (!
__params[i].onAfterExecute()) {
517 SQLSMALLINT columnCount = 0;
518 rc = SQLNumResultCols(
__hstmt, &columnCount);
519 if (!SQL_SUCCEEDED(rc)) {
527 Query::__eof = columnCount == 0;
528 Query::__affectedRows = -1;
540 rc = SQLRowCount(
__hstmt, &rowCount);
541 if (!SQL_SUCCEEDED(rc)) {
546 Query::__affectedRows = rowCount;
556 SQLRETURN rc = SQLFetch(
__hstmt);
561 for (
size_t i = 0; i < Query::__fieldCount; i++) {
573 case SQL_SUCCESS_WITH_INFO: {
600 Query::__fieldCount = 0;
608 SQLRETURN rc = SQLMoreResults(
__hstmt);
611 Query::__affectedRows = (size_t)-1;
613 *_moreResults =
false;
617 *_moreResults =
true;
626 SQLSMALLINT columnCount = 0;
627 rc = SQLNumResultCols(
__hstmt, &columnCount);
628 if (!SQL_SUCCEEDED(rc)) {
636 Query::__eof = columnCount == 0;
637 Query::__affectedRows = -1;
649 rc = SQLRowCount(
__hstmt, &rowCount);
650 if (!SQL_SUCCEEDED(rc)) {
655 Query::__affectedRows = rowCount;
665 __DCL_ASSERT((0 <= _index) && (_index < Query::__fieldCount));
666 *_fieldHandleOut = &
__fields[_index];
673 __DCL_ASSERT((0 <= _index) && (_index < Query::__paramCount));
674 *_paramHandleOut = &
__params[_index];
#define __countof(array, type)
#define __DCL_TRACE1_N(fmt, arg)
#define __DCL_TRACE2_N(fmt, arg1, arg2)
#define __DCL_TRACE4_N(fmt, arg1, arg2, arg3, arg4)
#define __SET_ERROR_MSG(_message)
#define __DCL_TRACE0_N(fmt)
#define __SET_ERROR_HANDLE(_SQLCODE)
#define __SET_INFO_HANDLE(_rc, _htype, _handle)
#define __TYPE_PARAM_ALIGN(_offset)
#define __DCL_TRACE6_N(fmt, arg1, arg2, arg3, arg4, arg5, arg6)
#define __TYPE_PARAM_SIZE(_type, _size)
#define __DCL_TRACE5_N(fmt, arg1, arg2, arg3, arg4, arg5)
#define __DCL_TRACE1(fmt, arg1)
#define __DCL_ASSERT(expr)
#define IMPLEMENT_CLASSINFO(class_name, base_class_name)
#define __SET_ERROR(_errorCode)
String toStringAll() const
static const wchar_t * __TYPE_NAME(SQLSMALLINT _type)
static SQLULEN __TYPE_SIZE(SQLSMALLINT _type, SQLULEN _size)
static SQLSMALLINT __VALUE_TYPE(SQLSMALLINT _type)
static size_t __TYPE_ALIGN(size_t _offset, SQLSMALLINT _type)
virtual bool __getParam(size_t _index, SQL::Param **_paramHandleOut)
virtual bool __prepare(const char *_sql, size_t _sqllen, size_t _paramCount)
bool initParams(size_t _paramCount)
virtual bool __getField(size_t _index, SQL::Field **_fieldHandleOut)
ODBCQuery(ODBCConnection *_connection)
bool initFields(SQLSMALLINT _columnCount)
virtual bool __moreResults(bool *_moreResults)