Bug fixes for the 2002-03-08 change.

1) Put back the error message for SQLError().
2) Change Disallow premature to handle the SELECTed
   result.
3) Put back the behavior of AUTUCOMMIT mode change.
4) Fix SQLColumns for ODBC3.0.

5) Improve the handling of variable bookmark in ODBC3.0.
6) Enable Recognize Unique Index Button.
This commit is contained in:
Hiroshi Inoue 2002-03-11 10:25:57 +00:00
parent d0d3ab5325
commit dadb718b10
9 changed files with 77 additions and 35 deletions

View File

@ -199,9 +199,17 @@ PGAPI_BindCol(
else else
{ {
/* Make sure it is the bookmark data type */ /* Make sure it is the bookmark data type */
if (fCType != SQL_C_BOOKMARK) if (fCType == SQL_C_BOOKMARK)
switch (fCType)
{ {
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"; 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; stmt->errornumber = STMT_PROGRAM_TYPE_OUT_OF_RANGE;
SC_log_error(func, "", stmt); SC_log_error(func, "", stmt);
return SQL_ERROR; return SQL_ERROR;

View File

@ -1322,7 +1322,7 @@ CC_send_query(ConnectionClass *self, char *query, QueryInfo *qi, BOOL clear_resu
if ((swallow != '\0') || SOCK_get_errcode(sock) != 0) if ((swallow != '\0') || SOCK_get_errcode(sock) != 0)
{ {
self->errornumber = CONNECTION_BACKEND_CRAZY; 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); QR_set_status(res, PGRES_FATAL_ERROR);
ReadyToReturn = TRUE; ReadyToReturn = TRUE;
retres = cmdres; 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') if (msgbuffer[0] != '\0' && msgbuffer[strlen(msgbuffer) - 1] == '\n')
msgbuffer[strlen(msgbuffer) - 1] = '\0'; msgbuffer[strlen(msgbuffer) - 1] = '\0';
self->errormsg = msgbuffer;
mylog("send_query: 'E' - %s\n", self->errormsg); mylog("send_query: 'E' - %s\n", msgbuffer);
qlog("ERROR from backend during send_query: '%s'\n", self->errormsg); qlog("ERROR from backend during send_query: '%s'\n", msgbuffer);
/* We should report that an error occured. Zoltan */ /* 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; self->errornumber = CONNECTION_SERVER_REPORTED_ERROR;
CC_set_no_trans(self); CC_set_no_trans(self);
@ -1361,6 +1360,7 @@ CC_send_query(ConnectionClass *self, char *query, QueryInfo *qi, BOOL clear_resu
else else
self->errornumber = CONNECTION_SERVER_REPORTED_WARNING; self->errornumber = CONNECTION_SERVER_REPORTED_WARNING;
QR_set_status(res, PGRES_FATAL_ERROR); QR_set_status(res, PGRES_FATAL_ERROR);
QR_set_message(res, msgbuffer);
QR_set_aborted(res, TRUE); QR_set_aborted(res, TRUE);
aborted = TRUE; aborted = TRUE;
while (msg_truncated) while (msg_truncated)
@ -1487,7 +1487,7 @@ CC_send_query(ConnectionClass *self, char *query, QueryInfo *qi, BOOL clear_resu
retres = NULL; retres = NULL;
} }
} }
else if (retres)
{ {
/* /*
* discard results other than errors. * discard results other than errors.
@ -1501,6 +1501,11 @@ CC_send_query(ConnectionClass *self, char *query, QueryInfo *qi, BOOL clear_resu
qres->next = NULL; qres->next = NULL;
QR_Destructor(qres); QR_Destructor(qres);
} }
/*
* If error message isn't set
*/
if (retres && (!self->errormsg || !self->errormsg[0]))
self->errormsg = QR_get_message(retres);
} }
} }
} }

View File

@ -175,9 +175,9 @@ driver_options_update(HWND hdlg, ConnInfo *ci, BOOL updateProfile)
comval->commlog = IsDlgButtonChecked(hdlg, DRV_COMMLOG); comval->commlog = IsDlgButtonChecked(hdlg, DRV_COMMLOG);
comval->disable_optimizer = IsDlgButtonChecked(hdlg, DRV_OPTIMIZER); comval->disable_optimizer = IsDlgButtonChecked(hdlg, DRV_OPTIMIZER);
comval->ksqo = IsDlgButtonChecked(hdlg, DRV_KSQO); comval->ksqo = IsDlgButtonChecked(hdlg, DRV_KSQO);
comval->unique_index = IsDlgButtonChecked(hdlg, DRV_UNIQUEINDEX);
if (!ci) if (!ci)
{ {
comval->unique_index = IsDlgButtonChecked(hdlg, DRV_UNIQUEINDEX);
comval->onlyread = IsDlgButtonChecked(hdlg, DRV_READONLY); comval->onlyread = IsDlgButtonChecked(hdlg, DRV_READONLY);
} }
comval->use_declarefetch = IsDlgButtonChecked(hdlg, DRV_USEDECLAREFETCH); comval->use_declarefetch = IsDlgButtonChecked(hdlg, DRV_USEDECLAREFETCH);
@ -442,15 +442,13 @@ updateCommons(const ConnInfo *ci)
SQLWritePrivateProfileString(sectionName, SQLWritePrivateProfileString(sectionName,
INI_KSQO, tmp, fileName); 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) if (!ci)
{ {
sprintf(tmp, "%d", comval->unique_index);
SQLWritePrivateProfileString(sectionName, INI_UNIQUEINDEX, tmp,
fileName);
sprintf(tmp, "%d", comval->onlyread); sprintf(tmp, "%d", comval->onlyread);
SQLWritePrivateProfileString(sectionName, INI_READONLY, tmp, SQLWritePrivateProfileString(sectionName, INI_READONLY, tmp,
fileName); fileName);

View File

@ -1734,7 +1734,11 @@ PGAPI_Columns(
* a statement is actually executed, so we'll have to do this * a statement is actually executed, so we'll have to do this
* ourselves. * ourselves.
*/ */
#if (ODBCVER >= 0x0300)
result_cols = 18;
#else
result_cols = 14; result_cols = 14;
#endif /* ODBCVER */
extend_bindings(stmt, result_cols); extend_bindings(stmt, result_cols);
/* set the field names */ /* set the field names */
@ -1803,7 +1807,12 @@ PGAPI_Columns(
set_tuplefield_string(&row->tuple[11], ""); set_tuplefield_string(&row->tuple[11], "");
#if (ODBCVER >= 0x0300) #if (ODBCVER >= 0x0300)
set_tuplefield_null(&row->tuple[12]);
set_tuplefield_int2(&row->tuple[13], sqltype); 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 #else
set_tuplefield_int4(&row->tuple[12], pgtype_display_size(stmt, the_type, PG_STATIC, PG_STATIC)); set_tuplefield_int4(&row->tuple[12], pgtype_display_size(stmt, the_type, PG_STATIC, PG_STATIC));
set_tuplefield_int4(&row->tuple[13], the_type); set_tuplefield_int4(&row->tuple[13], the_type);
@ -1918,9 +1927,12 @@ PGAPI_Columns(
break; break;
default: default:
set_tuplefield_int2(&row->tuple[13], sqltype); set_tuplefield_int2(&row->tuple[13], sqltype);
set_tuplefield_null(&row->tuple[14]);
break; 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_int4(&row->tuple[16], field_number);
set_tuplefield_null(&row->tuple[17]);
#else #else
set_tuplefield_int4(&row->tuple[13], field_type); set_tuplefield_int4(&row->tuple[13], field_type);
#endif /* ODBCVER */ #endif /* ODBCVER */
@ -1956,7 +1968,8 @@ PGAPI_Columns(
set_tuplefield_string(&row->tuple[1], ""); set_tuplefield_string(&row->tuple[1], "");
set_tuplefield_string(&row->tuple[2], table_name); set_tuplefield_string(&row->tuple[2], table_name);
set_tuplefield_string(&row->tuple[3], "xmin"); 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_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[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)); 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_nullfield_int2(&row->tuple[9], pgtype_radix(stmt, the_type));
set_tuplefield_int2(&row->tuple[10], SQL_NO_NULLS); set_tuplefield_int2(&row->tuple[10], SQL_NO_NULLS);
set_tuplefield_string(&row->tuple[11], ""); 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[12], pgtype_display_size(stmt, the_type, PG_STATIC, PG_STATIC));
set_tuplefield_int4(&row->tuple[13], the_type); set_tuplefield_int4(&row->tuple[13], the_type);
#endif /* ODBCVER */
QR_add_tuple(res, row); QR_add_tuple(res, row);
} }

View File

@ -342,9 +342,9 @@ PGAPI_SetConnectOption(
break; break;
case SQL_AUTOCOMMIT: case SQL_AUTOCOMMIT:
if (vParam == SQL_AUTOCOMMIT_ON && CC_is_in_trans(conn)) if (vParam == SQL_AUTOCOMMIT_ON && CC_is_in_autocommit(conn))
break; break;
else if (vParam == SQL_AUTOCOMMIT_OFF && !CC_is_in_trans(conn)) else if (vParam == SQL_AUTOCOMMIT_OFF && !CC_is_in_autocommit(conn))
break; break;
if (CC_is_in_trans(conn)) if (CC_is_in_trans(conn))
CC_commit(conn); CC_commit(conn);

View File

@ -5,7 +5,7 @@
* *
* Comments: See "notice.txt" for copyright and license information. * 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 $
* *
*/ */

View File

@ -189,6 +189,7 @@ PGAPI_DescribeCol(
/* gets all the information about a specific column */ /* gets all the information about a specific column */
StatementClass *stmt = (StatementClass *) hstmt; StatementClass *stmt = (StatementClass *) hstmt;
ConnectionClass *conn;
QResultClass *res; QResultClass *res;
char *col_name = NULL; char *col_name = NULL;
Int4 fieldtype = 0; Int4 fieldtype = 0;
@ -200,7 +201,7 @@ PGAPI_DescribeCol(
int len = 0; int len = 0;
RETCODE result; RETCODE result;
mylog("%s: entering...\n", func); mylog("%s: entering.%d..\n", func, icol);
if (!stmt) if (!stmt)
{ {
@ -208,14 +209,16 @@ PGAPI_DescribeCol(
return SQL_INVALID_HANDLE; return SQL_INVALID_HANDLE;
} }
ci = &(SC_get_conn(stmt)->connInfo); conn = SC_get_conn(stmt);
ci = &(conn->connInfo);
SC_clear_error(stmt); SC_clear_error(stmt);
#if (ODBCVER >= 0x0300) #if (ODBCVER >= 0x0300)
if (0 == icol) /* bookmark column */ 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) if (szColName && cbColNameMax > 0)
*szColName = '\0'; *szColName = '\0';
if (pcbColName) if (pcbColName)
@ -440,7 +443,7 @@ PGAPI_ColAttributes(
break; break;
case SQL_DESC_TYPE: case SQL_DESC_TYPE:
if (pfDesc) if (pfDesc)
*pfDesc = SQL_INTEGER; *pfDesc = stmt->options.use_bookmarks == SQL_UB_VARIABLE ? SQL_BINARY : SQL_INTEGER;
break; break;
} }
return SQL_SUCCESS; return SQL_SUCCESS;
@ -813,9 +816,16 @@ PGAPI_GetData(
} }
/* Make sure it is the bookmark data type */ /* Make sure it is the bookmark data type */
if (fCType != SQL_C_BOOKMARK) switch (fCType)
{ {
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"; 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; stmt->errornumber = STMT_PROGRAM_TYPE_OUT_OF_RANGE;
SC_log_error(func, "", stmt); SC_log_error(func, "", stmt);
return SQL_ERROR; return SQL_ERROR;

View File

@ -959,8 +959,7 @@ SC_execute(StatementClass *self)
mylog(" Sending SELECT statement on stmt=%u, cursor_name='%s'\n", self, self->cursor_name); mylog(" Sending SELECT statement on stmt=%u, cursor_name='%s'\n", self, self->cursor_name);
/* send the declare/select */ /* 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 && if (SC_is_fetchcursor(self) && res != NULL &&
QR_command_successful(res)) QR_command_successful(res))
{ {
@ -1068,7 +1067,7 @@ SC_execute(StatementClass *self)
else else
{ {
self->errornumber = STMT_EXEC_ERROR; self->errornumber = STMT_EXEC_ERROR;
self->errormsg = "Error while executing the query"; self->errormsg = conn->errormsg;
} }
if (!self->internal) if (!self->internal)