49 #undef SQLSetConnectAttr
50 #define SQLSetConnectAttr(h, n, p, t) _SQLSetConnectAttr(h, n, p, t _wide0)
52 #undef SQLSetConnectAttr
84 #if ENABLE_EXTRA_CHECKS
87 #define IRD_CHECK odbc_ird_check(stmt)
99 #define INIT_HANDLE(t, n) \
100 TDS_##t *n = (TDS_##t*)h##n; \
101 if (SQL_NULL_H##t == h##n || !IS_H##t(h##n)) return SQL_INVALID_HANDLE; \
102 tds_mutex_lock(&n->mtx); \
103 CHECK_##t##_EXTRA(n); \
104 odbc_errs_reset(&n->errs);
106 #define ODBC_ENTER_HSTMT INIT_HANDLE(STMT, stmt)
107 #define ODBC_ENTER_HDBC INIT_HANDLE(DBC, dbc)
108 #define ODBC_ENTER_HENV INIT_HANDLE(ENV, env)
109 #define ODBC_ENTER_HDESC INIT_HANDLE(DESC, desc)
111 #define IS_VALID_LEN(len) ((len) >= 0 || (len) == SQL_NTS || (len) == SQL_NULL_DATA)
113 #define ODBC_SAFE_ERROR(stmt) \
115 if (!stmt->errs.num_errors) \
116 odbc_errs_add(&stmt->errs, "HY000", "Unknown error"); \
119 #define DEFAULT_QUERY_TIMEOUT (~((SQLUINTEGER) 0))
137 #if ODBCVER >= 0x0300
144 snprintf(unknown, unknown_size,
"unknown: %d", (
int)ret);
148 #define ODBC_PRRET_BUF char unknown_prret_buf[24]
149 #define odbc_prret(ret) odbc_prret(ret, unknown_prret_buf, sizeof(unknown_prret_buf))
154 #if ENABLE_EXTRA_CHECKS
160 #if ENABLE_EXTRA_CHECKS
161 if (colpos > 0 &&
stmt->tds !=
NULL && (resinfo =
stmt->tds->current_results) !=
NULL) {
162 if (colpos <= resinfo->num_cols) {
236 strcpy(
query,
"USE ");
271 switch (txn_isolation) {
273 level =
"READ COMMITTED";
276 level =
"READ UNCOMMITTED";
279 level =
"REPEATABLE READ";
282 level =
"SERIALIZABLE";
299 sprintf(
query,
"SET TRANSACTION ISOLATION LEVEL %s", level);
350 dbc->attr.packet_size = atoi(newval);
360 #ifdef ENABLE_ODBC_WIDE
364 if (!
dbc->tds_socket)
367 dbc->tds_socket->conn->use_iconv = 0;
376 if (
dbc->attr.connection_timeout)
381 if (
dbc->attr.bulk_enabled != SQL_BCP_OFF)
384 #ifdef ENABLE_ODBC_WIDE
392 if (
dbc->use_oldpwd) {
405 #ifdef ENABLE_ODBC_WIDE
409 dbc->default_query_timeout =
dbc->tds_socket->query_timeout;
412 dbc->cursor_support = 1;
448 if (!
stmt->need_reprepare ||
stmt->prepared_query_is_rpc
450 stmt->need_reprepare = 0;
498 switch (result_type) {
535 stmt->need_reprepare = 0;
556 switch (fDriverCompletion) {
624 if (!odbc_build_connect_string(&
dbc->errs, params, &
out))
638 odbc_errs_add(&
dbc->errs,
"IM007",
"Could not find Servername or server parameter");
654 hdbc, szConnStrIn, cbConnStrIn, szConnStrOut, cbConnStrOutMax, pcbConnStrOut);
656 odbc_errs_add(&
dbc->errs,
"HYC00",
"SQLBrowseConnect: function not implemented");
671 "O@table_owner", szSchemaName, cbSchemaName,
"O@table_name", szTableName, cbTableName,
672 "P@column_name", szColumnName, cbColumnName);
686 hstmt, ipar, pfSqlType, pcbParamDef, pibScale, pfNullable);
688 odbc_errs_add(&
stmt->errs,
"HYC00",
"SQLDescribeParam: function not implemented");
709 hstmt, fFetchType, (
int)irow, pcrow, rgfRowStatus);
717 tmp_rows =
stmt->ird->header.sql_desc_rows_processed_ptr;
718 stmt->ird->header.sql_desc_rows_processed_ptr = &out_len;
719 tmp_status =
stmt->ird->header.sql_desc_array_status_ptr;
720 stmt->ird->header.sql_desc_array_status_ptr = rgfRowStatus;
721 tmp_size =
stmt->ard->header.sql_desc_array_size;
722 stmt->ard->header.sql_desc_array_size =
stmt->sql_rowset_size;
723 tmp_offset =
stmt->ard->header.sql_desc_bind_offset_ptr;
724 stmt->ard->header.sql_desc_bind_offset_ptr =
NULL;
725 tmp_bookmark =
stmt->attr.fetch_bookmark_ptr;
731 stmt->attr.fetch_bookmark_ptr = &bookmark;
739 stmt->ird->header.sql_desc_rows_processed_ptr = tmp_rows;
742 stmt->ird->header.sql_desc_array_status_ptr = tmp_status;
743 stmt->ard->header.sql_desc_array_size = tmp_size;
744 stmt->ard->header.sql_desc_bind_offset_ptr = tmp_offset;
745 stmt->attr.fetch_bookmark_ptr = tmp_bookmark;
761 szPkSchemaName, cbPkSchemaName,
"O@pktable_name", szPkTableName, cbPkTableName,
762 "O@fktable_qualifier", szFkCatalogName, cbFkCatalogName,
"O@fktable_owner", szFkSchemaName,
763 cbFkSchemaName,
"O@fktable_name", szFkTableName, cbFkTableName);
786 if (
stmt->dbc->current_statement ==
NULL
787 ||
stmt->dbc->current_statement ==
stmt) {
789 stmt->dbc->current_statement =
stmt;
794 stmt->dbc->current_statement->tds =
NULL;
796 stmt->dbc->current_statement =
stmt;
806 stmt->attr.query_timeout :
stmt->dbc->default_query_timeout;
817 if (
stmt->dbc->current_statement !=
NULL
818 &&
stmt->dbc->current_statement !=
stmt) {
824 stmt->dbc->current_statement->tds =
NULL;
826 stmt->dbc->current_statement =
stmt;
829 stmt->attr.query_timeout :
stmt->dbc->default_query_timeout;
845 if (
stmt->dbc->current_statement ==
stmt) {
848 stmt->dbc->current_statement =
NULL;
903 result_type,
stmt->row_count,
stmt->errs.lastrc);
904 switch (result_type) {
927 switch (
stmt->row_status) {
973 switch (
stmt->errs.lastrc) {
981 if (
stmt->curr_param_row <
stmt->num_param_rows) {
982 if (
stmt->ipd->header.sql_desc_array_status_ptr)
983 stmt->ipd->header.sql_desc_array_status_ptr[
stmt->curr_param_row] = param_status;
984 ++
stmt->curr_param_row;
985 if (
stmt->ipd->header.sql_desc_rows_processed_ptr)
986 *
stmt->ipd->header.sql_desc_rows_processed_ptr =
stmt->curr_param_row;
988 if (
stmt->curr_param_row <
stmt->num_param_rows) {
1077 *pcpar =
stmt->param_count;
1104 szSchemaName, cbSchemaName,
"O@table_name", szTableName, cbTableName);
1121 "O@procedure_qualifier", szCatalogName, cbCatalogName,
1122 "P@procedure_owner", szSchemaName, cbSchemaName,
"P@procedure_name", szProcName, cbProcName,
1123 "P@column_name", szColumnName, cbColumnName,
"V@ODBCVer", (
char*)
NULL, 0);
1146 cbSchemaName,
"O@sp_qualifier", szCatalogName, cbCatalogName);
1161 for (
n = 0;
n <
stmt->ird->header.sql_desc_count &&
n <
stmt->ard->header.sql_desc_count; ++
n) {
1165 drec_ird = &
stmt->ird->records[
n];
1173 params = temp_params;
1209 hstmt, (
long) irow, fOption, fLock);
1211 if (!
stmt->dbc->cursor_support) {
1218 if (!
stmt->cursor) {
1285 "P@table_owner", szSchemaName, cbSchemaName,
"P@table_name", szTableName, cbTableName);
1293 #if (ODBCVER >= 0x0300)
1312 env->attr.odbc_version = i_val;
1321 env->attr.output_nts = i_val;
1344 src = &
env->attr.connection_pooling;
1345 size =
sizeof(
env->attr.connection_pooling);
1348 src = &
env->attr.cp_match;
1349 size =
sizeof(
env->attr.cp_match);
1352 src = &
env->attr.odbc_version;
1353 size =
sizeof(
env->attr.odbc_version);
1358 src = &
env->attr.output_nts;
1359 size =
sizeof(
env->attr.output_nts);
1368 *StringLength =
size;
1377 #define IRD_UPDATE(desc, errs, exit) \
1379 if (desc->type == DESC_IRD && ((TDS_STMT*)desc->parent)->need_reprepare && \
1380 odbc_update_ird((TDS_STMT*)desc->parent, errs) != SQL_SUCCESS) \
1395 tdsdump_log(
TDS_DBG_FUNC,
"_SQLBindParameter(%p, %u, %d, %d, %d, %u, %d, %p, %d, %p)\n",
1396 hstmt, (
unsigned short)ipar, (
int)fParamType, (
int)fCType, (
int)fSqlType, (
unsigned int)cbColDef,
1397 (
int)ibScale, rgbValue, (
int)cbValueMax, pcbValue);
1403 switch (fParamType) {
1414 if (cbValueMax < 0) {
1423 if (cbColDef < 1 || cbColDef > 38) {
1427 if (ibScale < 0 || (
SQLULEN)ibScale > cbColDef) {
1434 if (ipar <= 0 || ipar > 4000) {
1446 drec = &apd->
records[ipar - 1];
1454 stmt->need_reprepare = 1;
1471 drec = &ipd->
records[ipar - 1];
1494 tdsdump_log(
TDS_DBG_FUNC,
"SQLBindParameter(%p, %u, %d, %d, %d, %u, %d, %p, %d, %p)\n",
1495 hstmt, (
unsigned)ipar, fParamType, fCType, (
int)fSqlType, (
unsigned)cbColDef, ibScale, rgbValue, (
int)cbValueMax, pcbValue);
1496 return _SQLBindParameter(hstmt, ipar, fParamType, fCType, fSqlType, cbColDef, ibScale, rgbValue, cbValueMax, pcbValue);
1506 hstmt, ipar, fCType, fSqlType, (
unsigned)cbColDef, ibScale, rgbValue, pcbValue);
1510 #if (ODBCVER >= 0x0300)
1516 switch (HandleType) {
1572 dbc->attr.connection_timeout = 0;
1575 dbc->attr.login_timeout = 0;
1578 dbc->attr.packet_size = 0;
1585 #ifdef ENABLE_ODBC_WIDE
1589 dbc->attr.translate_option = 0;
1592 dbc->attr.bulk_enabled = SQL_BCP_OFF;
1615 phenv, (
int) odbc_version);
1622 env->attr.odbc_version = odbc_version;
1637 ctx->locale->date_fmt =
strdup(
"%Y-%m-%d %H:%M:%S.%z");
1662 for (
i = 0; ; ++
i) {
1701 stmt->num_param_rows = 1;
1743 stmt->attr.fetch_bookmark_ptr =
NULL;
1746 stmt->attr.keyset_size = 0;
1747 stmt->attr.max_length = 0;
1748 stmt->attr.max_rows = 0;
1749 stmt->attr.metadata_id =
dbc->attr.metadata_id;
1757 assert(
stmt->apd->header.sql_desc_array_size == 1);
1760 assert(
stmt->ard->header.sql_desc_array_size == 1);
1763 stmt->attr.row_number = 0;
1771 stmt->attr.qn_timeout = 432000;
1773 stmt->sql_rowset_size = 1;
1811 hstmt, icol, fCType, rgbValue, (
int)cbValueMax, pcbValue);
1831 if (icol <= 0 || icol > 4000) {
1843 drec = &ard->
records[icol - 1];
2010 if (cbColNameMax < 0) {
2014 drec = &ird->
records[icol - 1];
2017 if (szColName ==
NULL)
2057 hstmt, icol, fDescType, rgbDesc, cbDescMax, pcbDesc, pfDesc);
2061 #define COUT(src) result = odbc_set_string_oct(stmt->dbc, rgbDesc, cbDescMax, pcbDesc, src ? src : "", -1);
2062 #define SOUT(src) result = odbc_set_string_oct(stmt->dbc, rgbDesc, cbDescMax, pcbDesc, tds_dstr_cstr(&src), -1);
2065 #if ENABLE_EXTRA_CHECKS
2066 #define IOUT(type, src) do { \
2068 type *p_test = &src; p_test = p_test; \
2069 *pfDesc = src; } while(0)
2071 #define IOUT(type, src) *pfDesc = src
2077 switch (fDescType) {
2078 #if SQL_COLUMN_COUNT != SQL_DESC_COUNT
2096 drec = &ird->
records[icol - 1];
2100 switch (fDescType) {
2116 #if SQL_COLUMN_TYPE != SQL_DESC_CONCISE_TYPE
2169 #if SQL_COLUMN_NAME != SQL_DESC_NAME
2175 #if SQL_COLUMN_NULLABLE != SQL_DESC_NULLABLE
2272 hstmt, icol, fDescType, rgbDesc, cbDescMax, pcbDesc, pfDesc);
2277 #if (ODBCVER >= 0x0300)
2281 #ifdef TDS_SQLCOLATTRIBUTE_SQLLEN
2293 #ifdef ENABLE_ODBC_WIDE
2297 #ifdef TDS_SQLCOLATTRIBUTE_SQLLEN
2305 hstmt, icol, fDescType, rgbDesc, cbDescMax, pcbDesc, pfDesc);
2307 return _SQLColAttribute(hstmt, icol, fDescType, rgbDesc, cbDescMax, pcbDesc, pfDesc, 1);
2338 #ifdef ENABLE_ODBC_WIDE
2344 dbc->cursor_support = 0;
2385 }
else if (
ctx->parent) {
2401 state = severity <= 10 ?
"01000" :
"42000";
2408 if (severity <= 10) {
2419 #define DESC_SET_NEED_REPREPARE \
2421 if (desc->type == DESC_IPD) {\
2422 assert(IS_HSTMT(desc->parent));\
2423 ((TDS_STMT *) desc->parent)->need_reprepare = 1;\
2436 tdsdump_log(
TDS_DBG_FUNC,
"SQLSetDescRec(%p, %d, %d, %d, %d, %d, %d, %p, %p, %p)\n",
2437 hdesc, nRecordNumber, nType, nSubType, (
int)nLength, nPrecision, nScale, pData, pnStringLength, pnIndicator);
2444 if (nRecordNumber > desc->header.sql_desc_count || nRecordNumber <= 0) {
2449 drec = &desc->records[nRecordNumber - 1];
2459 if (!concise_type) {
2464 if (concise_type != nType) {
2493 if (RecordNumber <= 0) {
2499 if (RecordNumber > desc->header.sql_desc_count)
2502 if (desc->type ==
DESC_IRD && !desc->header.sql_desc_count) {
2507 drec = &desc->records[RecordNumber - 1];
2536 #define COUT(src) result = odbc_set_string_oct(desc_get_dbc(desc), Value, BufferLength, StringLength, src, -1);
2537 #define SOUT(src) result = odbc_set_string_oct(desc_get_dbc(desc), Value, BufferLength, StringLength, tds_dstr_cstr(&src), -1);
2539 #if ENABLE_EXTRA_CHECKS
2540 #define IOUT(type, src) do { \
2542 type *p_test = &src; p_test = p_test; \
2543 *((type *)Value) = src; } while(0)
2545 #define IOUT(type, src) *((type *)Value) = src
2549 switch (fDescType) {
2563 IOUT(
SQLLEN *, desc->header.sql_desc_bind_offset_ptr);
2576 IOUT(
SQLULEN *, desc->header.sql_desc_rows_processed_ptr);
2582 if (!desc->header.sql_desc_count) {
2591 if (icol > desc->header.sql_desc_count)
2593 drec = &desc->records[icol - 1];
2597 switch (fDescType) {
2676 #ifdef SQL_DESC_ROWVER
2738 #if ENABLE_EXTRA_CHECKS
2739 #define IIN(type, dest) do { \
2741 type *p_test = &dest; p_test = p_test; \
2742 dest = (type)(TDS_INTPTR)Value; } while(0)
2743 #define PIN(type, dest) do { \
2745 type *p_test = &dest; p_test = p_test; \
2746 dest = (type)Value; } while(0)
2748 #define IIN(type, dest) dest = (type)(TDS_INTPTR)Value
2749 #define PIN(type, dest) dest = (type)Value
2759 switch (fDescType) {
2761 odbc_errs_add(&desc->errs,
"HY091",
"Descriptor type read only");
2765 IIN(
SQLULEN, desc->header.sql_desc_array_size);
2773 PIN(
SQLULEN *, desc->header.sql_desc_rows_processed_ptr);
2784 if (n <= 0 || n > 4000) {
2796 if (!desc->header.sql_desc_count) {
2801 if (icol <= 0 || icol > desc->header.sql_desc_count) {
2805 drec = &desc->records[icol - 1];
2809 switch (fDescType) {
2815 odbc_errs_add(&desc->errs,
"HY091",
"Descriptor type read only");
2834 odbc_errs_add(&desc->errs,
"HY091",
"Descriptor type read only");
2841 odbc_errs_add(&desc->errs,
"HY091",
"Descriptor type read only");
2851 odbc_errs_add(&desc->errs,
"HY091",
"Descriptor type read only");
2861 odbc_errs_add(&desc->errs,
"HY091",
"Descriptor type read only");
2886 #ifdef SQL_DESC_ROWVER
2888 odbc_errs_add(&desc->errs,
"HY091",
"Descriptor type read only");
2903 odbc_errs_add(&desc->errs,
"HY091",
"Descriptor type read only");
2913 odbc_errs_add(&desc->errs,
"HY091",
"Descriptor type read only");
2921 odbc_errs_add(&desc->errs,
"HY091",
"Descriptor type read only");
2960 #if ENABLE_EXTRA_CHECKS
2964 #if !ENABLE_ODBC_MARS
2971 if (
stmt->tds->current_results) {
2972 res_info =
stmt->tds->current_results;
3006 if (*start !=
'[' && *start !=
'\"') {
3008 if (end < start + buf_len)
3009 buf_len = end - start;
3010 memcpy(
buf, start, buf_len);
3016 quote = (*start ==
'[') ?
']' : *start;
3018 while (buf_len > 0 && start < end) {
3019 if (*start == quote)
3040 if (!
stmt->tds || !(res_info =
stmt->tds->current_results))
3042 if (res_info ==
stmt->tds->param_info)
3053 for (
i = 0;
i < num_cols;
i++) {
3095 for (
i = 0; ; ++
i) {
3098 if (*p ==
'[' || *p ==
'\"') {
3101 pend = strchr(p,
'.');
3103 pend = strchr(p, 0);
3105 partials[
i].start = p;
3106 partials[
i].end = pend;
3108 if (
i == 3 || *p !=
'.')
3172 stmt->cursor = cursor;
3175 switch (
stmt->attr.cursor_type) {
3192 switch (
stmt->attr.concurrency) {
3243 head->qn_timeout =
stmt->attr.qn_timeout;
3258 int found_info = 0, found_error = 0;
3269 if (
stmt->params &&
stmt->param_num <= (
int)
stmt->param_count) {
3290 stmt->curr_param_row = 0;
3295 if (
stmt->prepared_query_is_rpc) {
3305 stmt->prepared_pos = end;
3312 }
else if (!
stmt->is_prepared_query) {
3316 if (
stmt->num_param_rows <= 1) {
3317 if (!
stmt->params) {
3330 if (++
stmt->curr_param_row >=
stmt->num_param_rows)
3345 stmt->need_reprepare = 0;
3360 stmt->need_reprepare = 0;
3377 if (
stmt->num_param_rows <= 1) {
3397 if (++
stmt->curr_param_row >=
stmt->num_param_rows)
3418 stmt->curr_param_row = 0;
3426 switch (result_type) {
3436 switch (
stmt->errs.lastrc) {
3446 if (
stmt->curr_param_row <
stmt->num_param_rows &&
stmt->ipd->header.sql_desc_array_status_ptr)
3447 stmt->ipd->header.sql_desc_array_status_ptr[
stmt->curr_param_row] = param_status;
3449 ++
stmt->curr_param_row;
3456 total_rows =
stmt->row_count;
3458 total_rows +=
stmt->row_count;
3460 if (
stmt->curr_param_row >=
stmt->num_param_rows) {
3486 if ((found_info || found_error) &&
stmt->errs.lastrc !=
SQL_ERROR)
3492 if (found_error &&
stmt->num_param_rows <= 1)
3494 if (
stmt->curr_param_row <
stmt->num_param_rows) {
3495 if (
stmt->ipd->header.sql_desc_array_status_ptr)
3496 stmt->ipd->header.sql_desc_array_status_ptr[
stmt->curr_param_row] = param_status;
3497 ++
stmt->curr_param_row;
3499 total_rows =
stmt->row_count;
3501 total_rows +=
stmt->row_count;
3504 if (
stmt->ipd->header.sql_desc_rows_processed_ptr)
3505 *
stmt->ipd->header.sql_desc_rows_processed_ptr =
ODBC_MIN(
stmt->curr_param_row,
stmt->num_param_rows);
3508 stmt->row_count = total_rows;
3511 switch (result_type) {
3542 stmt->param_data_called = 0;
3567 if (!
stmt->is_prepared_query) {
3576 stmt->param_data_called = 0;
3577 stmt->curr_param_row = 0;
3617 switch (result_type) {
3650 result_type==
TDS_DONE_RESULT?
"TDS_DONE_RESULT" :
"TDS_DONEPROC_RESULT");
3693 if (!resinfo || resinfo->
num_cols <= idx)
3696 colinfo = resinfo->
columns[idx];
3740 #define AT_ROW(ptr, type) (row_offset ? (type*)(((char*)(ptr)) + row_offset) : &ptr[curr_row])
3746 row_offset = *
stmt->ard->header.sql_desc_bind_offset_ptr;
3766 switch (FetchOrientation) {
3819 if (
stmt->ird->header.sql_desc_count <= 0) {
3826 fetched_ptr = &
dummy;
3827 if (
stmt->ird->header.sql_desc_rows_processed_ptr)
3828 fetched_ptr =
stmt->ird->header.sql_desc_rows_processed_ptr;
3831 status_ptr =
stmt->ird->header.sql_desc_array_status_ptr;
3835 status_ptr =
stmt->ird->header.sql_desc_array_status_ptr;
3843 switch (
stmt->row_status) {
3887 switch (
stmt->special_row) {
3947 if (row_offset || curr_row == 0) {
3948 data_ptr += row_offset;
3974 #if SQL_BIND_BY_COLUMN != 0
3977 row_offset +=
stmt->ard->header.sql_desc_bind_type;
3978 }
while (++curr_row < num_rows);
4010 keep.array_size =
stmt->ard->header.sql_desc_array_size;
4011 keep.rows_processed_ptr =
stmt->ird->header.sql_desc_rows_processed_ptr;
4012 keep.array_status_ptr =
stmt->ird->header.sql_desc_array_status_ptr;
4015 stmt->ard->header.sql_desc_array_size = 1;
4016 stmt->ird->header.sql_desc_rows_processed_ptr =
NULL;
4017 stmt->ird->header.sql_desc_array_status_ptr =
NULL;
4023 stmt->ard->header.sql_desc_array_size = keep.array_size;
4024 stmt->ird->header.sql_desc_rows_processed_ptr = keep.rows_processed_ptr;
4025 stmt->ird->header.sql_desc_array_status_ptr = keep.array_status_ptr;
4031 #if (ODBCVER >= 0x0300)
4049 #if (ODBCVER >= 0x0300)
4055 switch (HandleType) {
4097 #ifdef ENABLE_ODBC_WIDE
4283 if (
stmt->ard == desc)
4285 if (
stmt->apd == desc)
4291 if (
dbc->uad[
i] == desc) {
4321 size =
sizeof(
stmt->attr.async_enable);
4322 src = &
stmt->attr.async_enable;
4325 size =
sizeof(
stmt->attr.concurrency);
4326 src = &
stmt->attr.concurrency;
4329 size =
sizeof(
stmt->attr.cursor_type);
4330 src = &
stmt->attr.cursor_type;
4333 size =
sizeof(
stmt->attr.enable_auto_ipd);
4334 src = &
stmt->attr.enable_auto_ipd;
4337 size =
sizeof(
stmt->attr.fetch_bookmark_ptr);
4338 src = &
stmt->attr.fetch_bookmark_ptr;
4341 size =
sizeof(
stmt->attr.keyset_size);
4342 src = &
stmt->attr.keyset_size;
4345 size =
sizeof(
stmt->attr.max_length);
4346 src = &
stmt->attr.max_length;
4349 size =
sizeof(
stmt->attr.max_rows);
4350 src = &
stmt->attr.max_rows;
4353 size =
sizeof(
stmt->attr.metadata_id);
4354 src = &
stmt->attr.noscan;
4358 src = &
stmt->attr.noscan;
4361 size =
sizeof(
stmt->apd->header.sql_desc_bind_offset_ptr);
4362 src = &
stmt->apd->header.sql_desc_bind_offset_ptr;
4365 size =
sizeof(
stmt->apd->header.sql_desc_bind_type);
4366 src = &
stmt->apd->header.sql_desc_bind_type;
4369 size =
sizeof(
stmt->apd->header.sql_desc_array_status_ptr);
4370 src = &
stmt->apd->header.sql_desc_array_status_ptr;
4373 size =
sizeof(
stmt->ipd->header.sql_desc_array_status_ptr);
4374 src = &
stmt->ipd->header.sql_desc_array_status_ptr;
4377 size =
sizeof(
stmt->ipd->header.sql_desc_rows_processed_ptr);
4378 src = &
stmt->ipd->header.sql_desc_rows_processed_ptr;
4381 size =
sizeof(
stmt->apd->header.sql_desc_array_size);
4382 src = &
stmt->apd->header.sql_desc_array_size;
4385 size =
sizeof(
stmt->attr.query_timeout);
4386 src = &
stmt->attr.query_timeout;
4389 size =
sizeof(
stmt->attr.retrieve_data);
4390 src = &
stmt->attr.retrieve_data;
4393 size =
sizeof(
stmt->ard->header.sql_desc_bind_offset_ptr);
4394 src = &
stmt->ard->header.sql_desc_bind_offset_ptr;
4396 #if SQL_BIND_TYPE != SQL_ATTR_ROW_BIND_TYPE
4400 size =
sizeof(
stmt->ard->header.sql_desc_bind_type);
4401 src = &
stmt->ard->header.sql_desc_bind_type;
4409 stmt->attr.row_number = row_number;
4411 size =
sizeof(
stmt->attr.row_number);
4412 src = &
stmt->attr.row_number;
4415 size =
sizeof(
stmt->ard->header.sql_desc_array_status_ptr);
4416 src = &
stmt->ard->header.sql_desc_array_status_ptr;
4419 size =
sizeof(
stmt->ird->header.sql_desc_array_status_ptr);
4420 src = &
stmt->ird->header.sql_desc_array_status_ptr;
4423 size =
sizeof(
stmt->ird->header.sql_desc_rows_processed_ptr);
4424 src = &
stmt->ird->header.sql_desc_rows_processed_ptr;
4427 size =
sizeof(
stmt->ard->header.sql_desc_array_size);
4428 src = &
stmt->ard->header.sql_desc_array_size;
4431 size =
sizeof(
stmt->attr.simulate_cursor);
4432 src = &
stmt->attr.simulate_cursor;
4435 size =
sizeof(
stmt->attr.use_bookmarks);
4436 src = &
stmt->attr.use_bookmarks;
4439 size =
sizeof(
stmt->attr.cursor_scrollable);
4440 src = &
stmt->attr.cursor_scrollable;
4443 size =
sizeof(
stmt->attr.cursor_sensitivity);
4444 src = &
stmt->attr.cursor_sensitivity;
4455 size =
sizeof(
stmt->sql_rowset_size);
4456 src = &
stmt->sql_rowset_size;
4459 size =
sizeof(
stmt->attr.qn_timeout);
4460 src = &
stmt->attr.qn_timeout;
4480 *StringLength =
size;
4485 #if (ODBCVER >= 0x0300)
4495 #ifdef ENABLE_ODBC_WIDE
4511 hstmt, fOption, pvParam);
4535 *pccol =
stmt->ird->header.sql_desc_count;
4552 stmt->is_prepared_query = 1;
4566 if (!
stmt->prepared_query_is_rpc
4571 stmt->param_num = 0;
4572 stmt->need_reprepare = 0;
4580 stmt->need_reprepare = 1;
4593 #if TDS_NO_COUNT != -1
4594 # error TDS_NO_COUNT != -1
4604 *pcrow =
stmt->row_count;