aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorThomas G. Lockhart <lockhart@fourpalms.org>2000-10-25 14:15:49 +0000
committerThomas G. Lockhart <lockhart@fourpalms.org>2000-10-25 14:15:49 +0000
commitc404d91c0bf15442a3dc38644263a05e258c3c52 (patch)
treeedb5bbc8dc43e2a1f92704003f617633f7c7c866 /src
parent48f0490809794011b449339d3844459177bb353f (diff)
downloadpostgresql-c404d91c0bf15442a3dc38644263a05e258c3c52.tar.gz
postgresql-c404d91c0bf15442a3dc38644263a05e258c3c52.zip
From Zoltan Kovacs back in April (sorry for the delay Zoltan!):
I modified the current ODBC driver for * referential integrity error reporting, * SELECT in transactions and * disabling autocommit. I tested these changes with Borland C++ Builder -> ODBCExpress -> WinODBC driver (DLL) -> Postgres 7.0beta1 and Borland C++ Builder -> BDE -> WinODBC driver (DLL) -> Postgres 7.0beta1. The patch is based on snapshot of 22th April (I don't think that someone has modified it since that: Byron hasn't gave any sign of living for about a month and I didn't find any comments about the ODBC driver on the list).
Diffstat (limited to 'src')
-rw-r--r--src/interfaces/odbc/connection.c23
-rw-r--r--src/interfaces/odbc/options.c9
-rw-r--r--src/interfaces/odbc/statement.c23
3 files changed, 47 insertions, 8 deletions
diff --git a/src/interfaces/odbc/connection.c b/src/interfaces/odbc/connection.c
index e3d444997ec..d5b0d12dffe 100644
--- a/src/interfaces/odbc/connection.c
+++ b/src/interfaces/odbc/connection.c
@@ -947,6 +947,19 @@ char cmdbuffer[MAX_MESSAGE_LEN+1]; /* QR_set_command() dups this string so dont
case 'E':
SOCK_get_string(sock, cmdbuffer, ERROR_MSG_LENGTH);
qlog("ERROR from backend during clear: '%s'\n", cmdbuffer);
+ /* We must report this type of error as well
+ (practically for reference integrity violation
+ error reporting, from PostgreSQL 7.0).
+ (Zoltan Kovacs, 04/26/2000)
+ */
+ self->errormsg = cmdbuffer;
+ if ( ! strncmp(self->errormsg, "FATAL", 5)) {
+ self->errornumber = CONNECTION_SERVER_REPORTED_ERROR;
+ CC_set_no_trans(self);
+ }
+ else
+ self->errornumber = CONNECTION_SERVER_REPORTED_WARNING;
+ QR_set_status(res, PGRES_NONFATAL_ERROR);
break;
}
}
@@ -1001,14 +1014,20 @@ char cmdbuffer[MAX_MESSAGE_LEN+1]; /* QR_set_command() dups this string so dont
mylog("send_query: 'E' - %s\n", self->errormsg);
qlog("ERROR from backend during send_query: '%s'\n", self->errormsg);
+ /* We should report that an error occured. Zoltan */
+ res = QR_Constructor();
+
if ( ! strncmp(self->errormsg, "FATAL", 5)) {
self->errornumber = CONNECTION_SERVER_REPORTED_ERROR;
CC_set_no_trans(self);
+ QR_set_status(res, PGRES_FATAL_ERROR);
}
- else
+ else {
self->errornumber = CONNECTION_SERVER_REPORTED_WARNING;
+ QR_set_status(res, PGRES_NONFATAL_ERROR);
+ }
- return NULL;
+ return res; /* instead of NULL. Zoltan */
case 'P' : /* get the Portal name */
SOCK_get_string(sock, msgbuffer, MAX_MESSAGE_LEN);
diff --git a/src/interfaces/odbc/options.c b/src/interfaces/odbc/options.c
index eb67dd590fa..217f063338e 100644
--- a/src/interfaces/odbc/options.c
+++ b/src/interfaces/odbc/options.c
@@ -330,6 +330,15 @@ int i;
switch(vParam) {
case SQL_AUTOCOMMIT_OFF:
CC_set_autocommit_off(conn);
+ /* The following two lines are new.
+ With this modification the SELECT statements
+ are also included in the transactions.
+ Error handling should be written,
+ this is missing yet, see
+ SC_execute in statement.c for details. Zoltan
+ */
+ CC_send_query(conn,"BEGIN",NULL);
+ CC_set_in_trans(conn);
break;
case SQL_AUTOCOMMIT_ON:
diff --git a/src/interfaces/odbc/statement.c b/src/interfaces/odbc/statement.c
index 95c9e8986e7..0fac4d6bc08 100644
--- a/src/interfaces/odbc/statement.c
+++ b/src/interfaces/odbc/statement.c
@@ -748,8 +748,14 @@ QueryInfo qi;
/* Begin a transaction if one is not already in progress */
/* The reason is because we can't use declare/fetch cursors without
starting a transaction first.
+
+ A transaction should be begun if and only if
+ we use declare/fetch and the statement is SELECT.
+ We assume that the Postgres backend has an autocommit
+ feature as default. (Zoltan Kovacs, 04/26/2000)
*/
- if ( ! self->internal && ! CC_is_in_trans(conn) && (globals.use_declarefetch || STMT_UPDATE(self))) {
+ // if ( ! self->internal && ! CC_is_in_trans(conn) && (globals.use_declarefetch || STMT_UPDATE(self))) {
+ if ( ! self->internal && ! CC_is_in_trans(conn) && globals.use_declarefetch && self->statement_type == STMT_TYPE_SELECT) {
mylog(" about to begin a transaction on statement = %u\n", self);
res = CC_send_query(conn, "BEGIN", NULL);
@@ -826,11 +832,14 @@ QueryInfo qi;
self->result = CC_send_query(conn, self->stmt_with_params, NULL);
/* If we are in autocommit, we must send the commit. */
- if ( ! self->internal && CC_is_in_autocommit(conn) && STMT_UPDATE(self)) {
+ /* No, we shouldn't. Postgres backend does the
+ autocommit if neccessary. (Zoltan, 04/26/2000)
+ */
+/* if ( ! self->internal && CC_is_in_autocommit(conn) && STMT_UPDATE(self)) {
res = CC_send_query(conn, "COMMIT", NULL);
QR_Destructor(res);
CC_set_no_trans(conn);
- }
+ }*/
}
@@ -889,10 +898,12 @@ QueryInfo qi;
if (self->errornumber == STMT_OK)
return SQL_SUCCESS;
- else if (self->errornumber == STMT_INFO_ONLY)
- return SQL_SUCCESS_WITH_INFO;
-
else {
+ // Modified, 04/29/2000, Zoltan
+ if (self->errornumber == STMT_INFO_ONLY)
+ self->errormsg = "Error while executing the query (non-fatal)";
+ else
+ self->errormsg = "Unknown error";
SC_log_error(func, "", self);
return SQL_ERROR;
}