diff --git a/src/interfaces/odbc/bind.c b/src/interfaces/odbc/bind.c index 6ce32c7982b8848d0c783b7786383b9e95506a05..b7303c478593a53ed4893993c961964f5b9083db 100644 --- a/src/interfaces/odbc/bind.c +++ b/src/interfaces/odbc/bind.c @@ -199,12 +199,20 @@ PGAPI_BindCol( else { /* Make sure it is the bookmark data type */ - if (fCType != SQL_C_BOOKMARK) + if (fCType == SQL_C_BOOKMARK) + switch (fCType) { - stmt->errormsg = "Column 0 is not of type SQL_C_BOOKMARK"; - stmt->errornumber = STMT_PROGRAM_TYPE_OUT_OF_RANGE; - SC_log_error(func, "", stmt); - return SQL_ERROR; + case SQL_C_BOOKMARK: +#if (ODBCVER >= 0x0300) + case SQL_C_VARBOOKMARK: +#endif /* ODBCVER */ + break; + default: + stmt->errormsg = "Column 0 is not of type SQL_C_BOOKMARK"; +inolog("Column 0 is type %d not of type SQL_C_BOOKMARK", fCType); + stmt->errornumber = STMT_PROGRAM_TYPE_OUT_OF_RANGE; + SC_log_error(func, "", stmt); + return SQL_ERROR; } stmt->bookmark.buffer = rgbValue; diff --git a/src/interfaces/odbc/connection.c b/src/interfaces/odbc/connection.c index 44d7589496a478da99e2adc33eef5207437562de..d176d925d4ada5669e0b2c65ef81de7b073eeda1 100644 --- a/src/interfaces/odbc/connection.c +++ b/src/interfaces/odbc/connection.c @@ -1322,7 +1322,7 @@ CC_send_query(ConnectionClass *self, char *query, QueryInfo *qi, BOOL clear_resu if ((swallow != '\0') || SOCK_get_errcode(sock) != 0) { self->errornumber = CONNECTION_BACKEND_CRAZY; - self->errormsg = "Unexpected protocol character from backend (send_query - I)"; + QR_set_message(res, "Unexpected protocol character from backend (send_query - I)"); QR_set_status(res, PGRES_FATAL_ERROR); ReadyToReturn = TRUE; retres = cmdres; @@ -1346,14 +1346,13 @@ CC_send_query(ConnectionClass *self, char *query, QueryInfo *qi, BOOL clear_resu if (msgbuffer[0] != '\0' && msgbuffer[strlen(msgbuffer) - 1] == '\n') msgbuffer[strlen(msgbuffer) - 1] = '\0'; - self->errormsg = msgbuffer; - mylog("send_query: 'E' - %s\n", self->errormsg); - qlog("ERROR from backend during send_query: '%s'\n", self->errormsg); + mylog("send_query: 'E' - %s\n", msgbuffer); + qlog("ERROR from backend during send_query: '%s'\n", msgbuffer); /* We should report that an error occured. Zoltan */ - if (!strncmp(self->errormsg, "FATAL", 5)) + if (!strncmp(msgbuffer, "FATAL", 5)) { self->errornumber = CONNECTION_SERVER_REPORTED_ERROR; CC_set_no_trans(self); @@ -1361,6 +1360,7 @@ CC_send_query(ConnectionClass *self, char *query, QueryInfo *qi, BOOL clear_resu else self->errornumber = CONNECTION_SERVER_REPORTED_WARNING; QR_set_status(res, PGRES_FATAL_ERROR); + QR_set_message(res, msgbuffer); QR_set_aborted(res, TRUE); aborted = TRUE; while (msg_truncated) @@ -1487,7 +1487,7 @@ CC_send_query(ConnectionClass *self, char *query, QueryInfo *qi, BOOL clear_resu retres = NULL; } } - else + if (retres) { /* * discard results other than errors. @@ -1501,6 +1501,11 @@ CC_send_query(ConnectionClass *self, char *query, QueryInfo *qi, BOOL clear_resu qres->next = NULL; QR_Destructor(qres); } + /* + * If error message isn't set + */ + if (retres && (!self->errormsg || !self->errormsg[0])) + self->errormsg = QR_get_message(retres); } } } diff --git a/src/interfaces/odbc/convert.c b/src/interfaces/odbc/convert.c index a38ffd1de8313605238d294136112c2c5ac3cb3f..6ba6587f6406e0896a4dc15843d1c748464fb667 100644 --- a/src/interfaces/odbc/convert.c +++ b/src/interfaces/odbc/convert.c @@ -349,8 +349,8 @@ copy_and_convert_field(StatementClass *stmt, Int4 field_type, void *value, Int2 { pbic = &stmt->bindings[stmt->current_col]; if (pbic->data_left == -2) - pbic->data_left = (cbValueMax > 0) ? 0 : -1; /* This seems to be * - * needed for ADO ? */ + pbic->data_left = (cbValueMax > 0) ? 0 : -1; /* This seems to be * + * needed for ADO ? */ if (pbic->data_left == 0) { if (pbic->ttlbuf != NULL) diff --git a/src/interfaces/odbc/dlg_specific.c b/src/interfaces/odbc/dlg_specific.c index 4fbf037cec204d01bedf905d08aea74b9eff3d90..d165f1300f1cb9230eec0a8004bc89f4077759e0 100644 --- a/src/interfaces/odbc/dlg_specific.c +++ b/src/interfaces/odbc/dlg_specific.c @@ -175,9 +175,9 @@ driver_options_update(HWND hdlg, ConnInfo *ci, BOOL updateProfile) comval->commlog = IsDlgButtonChecked(hdlg, DRV_COMMLOG); comval->disable_optimizer = IsDlgButtonChecked(hdlg, DRV_OPTIMIZER); comval->ksqo = IsDlgButtonChecked(hdlg, DRV_KSQO); + comval->unique_index = IsDlgButtonChecked(hdlg, DRV_UNIQUEINDEX); if (!ci) { - comval->unique_index = IsDlgButtonChecked(hdlg, DRV_UNIQUEINDEX); comval->onlyread = IsDlgButtonChecked(hdlg, DRV_READONLY); } comval->use_declarefetch = IsDlgButtonChecked(hdlg, DRV_USEDECLAREFETCH); @@ -442,15 +442,13 @@ updateCommons(const ConnInfo *ci) SQLWritePrivateProfileString(sectionName, INI_KSQO, tmp, fileName); + sprintf(tmp, "%d", comval->unique_index); + SQLWritePrivateProfileString(sectionName, INI_UNIQUEINDEX, tmp, fileName); /* - * Never update the onlyread, unique_index from this module. + * Never update the onlyread from this module. */ if (!ci) { - sprintf(tmp, "%d", comval->unique_index); - SQLWritePrivateProfileString(sectionName, INI_UNIQUEINDEX, tmp, - fileName); - sprintf(tmp, "%d", comval->onlyread); SQLWritePrivateProfileString(sectionName, INI_READONLY, tmp, fileName); diff --git a/src/interfaces/odbc/info.c b/src/interfaces/odbc/info.c index fc5dcef34152a309d7b1eaddb45953c3fb3df315..10a900207c61e4e2409386abbaccd0f45d93c321 100644 --- a/src/interfaces/odbc/info.c +++ b/src/interfaces/odbc/info.c @@ -1734,7 +1734,11 @@ PGAPI_Columns( * a statement is actually executed, so we'll have to do this * ourselves. */ +#if (ODBCVER >= 0x0300) + result_cols = 18; +#else result_cols = 14; +#endif /* ODBCVER */ extend_bindings(stmt, result_cols); /* set the field names */ @@ -1803,7 +1807,12 @@ PGAPI_Columns( set_tuplefield_string(&row->tuple[11], ""); #if (ODBCVER >= 0x0300) + set_tuplefield_null(&row->tuple[12]); set_tuplefield_int2(&row->tuple[13], sqltype); + set_tuplefield_null(&row->tuple[14]); + set_tuplefield_int4(&row->tuple[15], pgtype_length(stmt, the_type, PG_STATIC, PG_STATIC)); + set_tuplefield_int4(&row->tuple[16], 0); + set_tuplefield_string(&row->tuple[17], "No"); #else set_tuplefield_int4(&row->tuple[12], pgtype_display_size(stmt, the_type, PG_STATIC, PG_STATIC)); set_tuplefield_int4(&row->tuple[13], the_type); @@ -1918,9 +1927,12 @@ PGAPI_Columns( break; default: set_tuplefield_int2(&row->tuple[13], sqltype); + set_tuplefield_null(&row->tuple[14]); break; } + set_tuplefield_int4(&row->tuple[15], pgtype_length(stmt, field_type, PG_STATIC, PG_STATIC)); set_tuplefield_int4(&row->tuple[16], field_number); + set_tuplefield_null(&row->tuple[17]); #else set_tuplefield_int4(&row->tuple[13], field_type); #endif /* ODBCVER */ @@ -1956,7 +1968,8 @@ PGAPI_Columns( set_tuplefield_string(&row->tuple[1], ""); set_tuplefield_string(&row->tuple[2], table_name); set_tuplefield_string(&row->tuple[3], "xmin"); - set_tuplefield_int2(&row->tuple[4], pgtype_to_sqltype(stmt, the_type)); + sqltype = pgtype_to_sqltype(stmt, the_type); + set_tuplefield_int2(&row->tuple[4], sqltype); set_tuplefield_string(&row->tuple[5], pgtype_to_name(stmt, the_type)); set_tuplefield_int4(&row->tuple[6], pgtype_precision(stmt, the_type, PG_STATIC, PG_STATIC)); set_tuplefield_int4(&row->tuple[7], pgtype_length(stmt, the_type, PG_STATIC, PG_STATIC)); @@ -1964,8 +1977,17 @@ PGAPI_Columns( set_nullfield_int2(&row->tuple[9], pgtype_radix(stmt, the_type)); set_tuplefield_int2(&row->tuple[10], SQL_NO_NULLS); set_tuplefield_string(&row->tuple[11], ""); +#if (ODBCVER >= 0x0300) + set_tuplefield_null(&row->tuple[12]); + set_tuplefield_int2(&row->tuple[13], sqltype); + set_tuplefield_null(&row->tuple[14]); + set_tuplefield_int4(&row->tuple[15], pgtype_length(stmt, the_type, PG_STATIC, PG_STATIC)); + set_tuplefield_int4(&row->tuple[16], 0); + set_tuplefield_string(&row->tuple[17], "No"); +#else set_tuplefield_int4(&row->tuple[12], pgtype_display_size(stmt, the_type, PG_STATIC, PG_STATIC)); set_tuplefield_int4(&row->tuple[13], the_type); +#endif /* ODBCVER */ QR_add_tuple(res, row); } diff --git a/src/interfaces/odbc/options.c b/src/interfaces/odbc/options.c index d58f84916fc0b8086675882415be48b62a45bde5..c8e07700c836a79652a13e51748b7f549a57c907 100644 --- a/src/interfaces/odbc/options.c +++ b/src/interfaces/odbc/options.c @@ -342,9 +342,9 @@ PGAPI_SetConnectOption( break; case SQL_AUTOCOMMIT: - if (vParam == SQL_AUTOCOMMIT_ON && CC_is_in_trans(conn)) + if (vParam == SQL_AUTOCOMMIT_ON && CC_is_in_autocommit(conn)) break; - else if (vParam == SQL_AUTOCOMMIT_OFF && !CC_is_in_trans(conn)) + else if (vParam == SQL_AUTOCOMMIT_OFF && !CC_is_in_autocommit(conn)) break; if (CC_is_in_trans(conn)) CC_commit(conn); diff --git a/src/interfaces/odbc/psqlodbc.h b/src/interfaces/odbc/psqlodbc.h index 534678e2802e28060924a5e1e084a6074f9e6256..8fba1abd30d77d064f505779c6e4334bc3f9d92b 100644 --- a/src/interfaces/odbc/psqlodbc.h +++ b/src/interfaces/odbc/psqlodbc.h @@ -5,7 +5,7 @@ * * Comments: See "notice.txt" for copyright and license information. * - * $Id: psqlodbc.h,v 1.58 2002/03/08 08:52:53 inoue Exp $ + * $Id: psqlodbc.h,v 1.59 2002/03/11 10:25:57 inoue Exp $ * */ diff --git a/src/interfaces/odbc/results.c b/src/interfaces/odbc/results.c index e43c0e3db45df71f06d6c9ca89f458d7894821a1..13f223b7205fbd1d315639bbe544728242ea7774 100644 --- a/src/interfaces/odbc/results.c +++ b/src/interfaces/odbc/results.c @@ -189,6 +189,7 @@ PGAPI_DescribeCol( /* gets all the information about a specific column */ StatementClass *stmt = (StatementClass *) hstmt; + ConnectionClass *conn; QResultClass *res; char *col_name = NULL; Int4 fieldtype = 0; @@ -200,7 +201,7 @@ PGAPI_DescribeCol( int len = 0; RETCODE result; - mylog("%s: entering...\n", func); + mylog("%s: entering.%d..\n", func, icol); if (!stmt) { @@ -208,14 +209,16 @@ PGAPI_DescribeCol( return SQL_INVALID_HANDLE; } - ci = &(SC_get_conn(stmt)->connInfo); + conn = SC_get_conn(stmt); + ci = &(conn->connInfo); SC_clear_error(stmt); #if (ODBCVER >= 0x0300) if (0 == icol) /* bookmark column */ { - SQLSMALLINT fType = SQL_INTEGER; + SQLSMALLINT fType = stmt->options.use_bookmarks == SQL_UB_VARIABLE ? SQL_BINARY : SQL_INTEGER; + if (szColName && cbColNameMax > 0) *szColName = '\0'; if (pcbColName) @@ -440,7 +443,7 @@ PGAPI_ColAttributes( break; case SQL_DESC_TYPE: if (pfDesc) - *pfDesc = SQL_INTEGER; + *pfDesc = stmt->options.use_bookmarks == SQL_UB_VARIABLE ? SQL_BINARY : SQL_INTEGER; break; } return SQL_SUCCESS; @@ -813,12 +816,19 @@ PGAPI_GetData( } /* Make sure it is the bookmark data type */ - if (fCType != SQL_C_BOOKMARK) + switch (fCType) { - stmt->errormsg = "Column 0 is not of type SQL_C_BOOKMARK"; - stmt->errornumber = STMT_PROGRAM_TYPE_OUT_OF_RANGE; - SC_log_error(func, "", stmt); - return SQL_ERROR; + case SQL_C_BOOKMARK: +#if (ODBCVER >= 0x0300) + case SQL_C_VARBOOKMARK: +#endif /* ODBCVER */ + break; + default: + stmt->errormsg = "Column 0 is not of type SQL_C_BOOKMARK"; +inolog("Column 0 is type %d not of type SQL_C_BOOKMARK", fCType); + stmt->errornumber = STMT_PROGRAM_TYPE_OUT_OF_RANGE; + SC_log_error(func, "", stmt); + return SQL_ERROR; } get_bookmark = TRUE; diff --git a/src/interfaces/odbc/statement.c b/src/interfaces/odbc/statement.c index 513c916019a51bb95cdf2bd3a5d17e788fa9bb6e..4bb884dbf8fff890540c0234692c080234be189d 100644 --- a/src/interfaces/odbc/statement.c +++ b/src/interfaces/odbc/statement.c @@ -959,8 +959,7 @@ SC_execute(StatementClass *self) mylog(" Sending SELECT statement on stmt=%u, cursor_name='%s'\n", self, self->cursor_name); /* send the declare/select */ - res = CC_send_query(conn, self->stmt_with_params, NULL, TRUE); - + res = CC_send_query(conn, self->stmt_with_params, NULL, FALSE); if (SC_is_fetchcursor(self) && res != NULL && QR_command_successful(res)) { @@ -1068,7 +1067,7 @@ SC_execute(StatementClass *self) else { self->errornumber = STMT_EXEC_ERROR; - self->errormsg = "Error while executing the query"; + self->errormsg = conn->errormsg; } if (!self->internal)