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:
parent
d0d3ab5325
commit
dadb718b10
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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 $
|
||||
*
|
||||
*/
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user