OSDN Git Service

there is one problem with Zoltan patches commited into the tree:
authorBruce Momjian <bruce@momjian.us>
Fri, 15 Dec 2000 19:11:28 +0000 (19:11 +0000)
committerBruce Momjian <bruce@momjian.us>
Fri, 15 Dec 2000 19:11:28 +0000 (19:11 +0000)
if we set autocommit off and issued COMMIT (or ROLLBACK) on a connection
new transaction is not started

Max Khon

src/interfaces/odbc/options.c
src/interfaces/odbc/statement.c

index c9d6d10..ccc4192 100644 (file)
@@ -314,32 +314,18 @@ int i;
 
        case SQL_AUTOCOMMIT:
 
-               /*  Since we are almost always in a transaction, this is now ok.
-                       Even if we were, the logic will handle it by sending a commit
-                       after the statement.
-               
                if (CC_is_in_trans(conn)) {
-                       conn->errormsg = "Cannot switch commit mode while a transaction is in progres";
+                       conn->errormsg = "Cannot switch commit mode while a transaction is in progress";
                        conn->errornumber = CONN_TRANSACT_IN_PROGRES;
                        CC_log_error(func, "", conn);
                        return SQL_ERROR;
                }
-               */
 
                mylog("SQLSetConnectOption: AUTOCOMMIT: transact_status=%d, vparam=%d\n", conn->transact_status, vParam);
 
                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:
index 0fac4d6..e3b8a0f 100644 (file)
@@ -750,12 +750,12 @@ QueryInfo qi;
                starting a transaction first.
 
                A transaction should be begun if and only if
-               we use declare/fetch and the statement is SELECT.
+               we use declare/fetch and the statement is SELECT
+               or we are not in autocommit state
                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 && self->statement_type == STMT_TYPE_SELECT) {
+       if ( ! self->internal && ! CC_is_in_trans(conn) && ((globals.use_declarefetch && self->statement_type == STMT_TYPE_SELECT) || ! CC_is_in_autocommit(conn))) {
 
                mylog("   about to begin a transaction on statement = %u\n", self);
                res = CC_send_query(conn, "BEGIN", NULL);
@@ -831,16 +831,9 @@ QueryInfo qi;
                mylog("      it's NOT a select statement: stmt=%u\n", self);
                self->result = CC_send_query(conn, self->stmt_with_params, NULL);
 
-               /*      If we are in autocommit, we must send the commit. */
-               /*      No, we shouldn't. Postgres backend does the
+               /*      We shouldn't send COMMIT. 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);
-               }*/             
-
        }
 
        conn->status = oldstatus;