Fixed transaction command handling to not ignore savepoints and to correctly check...
authorMichael Meskes <meskes@postgresql.org>
Mon, 12 Sep 2005 11:58:33 +0000 (11:58 +0000)
committerMichael Meskes <meskes@postgresql.org>
Mon, 12 Sep 2005 11:58:33 +0000 (11:58 +0000)
src/interfaces/ecpg/ecpglib/misc.c

index 709fd56f8ff67202d8cd0294113f8859cb893e79..a0998c3bda3566dd55897c59984e8dd8b400e0e7 100644 (file)
@@ -1,4 +1,4 @@
-/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/misc.c,v 1.24 2004/10/14 20:23:46 momjian Exp $ */
+/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/misc.c,v 1.24.4.1 2005/09/12 11:58:33 meskes Exp $ */
 
 #define POSTGRES_ECPG_INTERNAL
 #include "postgres_fe.h"
@@ -186,31 +186,35 @@ ECPGtrans(int lineno, const char *connection_name, const char *transaction)
    /* if we have no connection we just simulate the command */
    if (con && con->connection)
    {
-       /*
-        * if we are not in autocommit mode, already have committed the
-        * transaction and get another commit, just ignore it
+       /* If we got a transaction command but have no open transaction,
+        * we have to start one, unless we are in autocommit, where the
+        * developers have to take care themselves.
+        * However, if the command is a begin statement, we just execute it once.
         */
-       if (!con->committed || con->autocommit)
+       if (con->committed && !con->autocommit && strncmp(transaction, "begin", 5) != 0 && strncmp(transaction, "start", 5) != 0)
        {
-           if ((res = PQexec(con->connection, transaction)) == NULL)
+           res = PQexec(con->connection, "begin transaction");
+           if (res == NULL || PQresultStatus(res) != PGRES_COMMAND_OK)
            {
                ECPGraise(lineno, ECPG_TRANS, ECPG_SQLSTATE_TRANSACTION_RESOLUTION_UNKNOWN, NULL);
                return FALSE;
            }
            PQclear(res);
        }
+       
+       res = PQexec(con->connection, transaction);
+       if (res == NULL || PQresultStatus(res) != PGRES_COMMAND_OK)
+       {
+           ECPGraise(lineno, ECPG_TRANS, ECPG_SQLSTATE_TRANSACTION_RESOLUTION_UNKNOWN, NULL);
+           return FALSE;
+       }
+       PQclear(res);
    }
 
    if (strcmp(transaction, "commit") == 0 || strcmp(transaction, "rollback") == 0)
-   {
        con->committed = true;
-
-#if 0
-       /* deallocate all prepared statements */
-       if (!ECPGdeallocate_all(lineno))
-           return false;
-#endif
-   }
+   else
+       con->committed = false;
 
    return true;
 }