Index: DBD-Pg-1.31/dbdimp.c --- DBD-Pg-1.31/dbdimp.c.orig 2003-10-27 20:57:02.000000000 +0100 +++ DBD-Pg-1.31/dbdimp.c 2003-11-21 21:10:50.000000000 +0100 @@ -36,6 +36,34 @@ #include "large_object.c" #include "prescan_stmt.c" +static int +_dbd_begin(dbh, imp_dbh) + SV *dbh; + imp_dbh_t *imp_dbh; +{ + PGresult *result = NULL; + ExecStatusType status; + + if (DBIc_has(imp_dbh, DBIcf_AutoCommit)) + return 1; + + if (imp_dbh->pg_need_begin == 0) + return 1; + + imp_dbh->pg_need_begin = 0; + + /* start new transaction. AutoCommit must be FALSE (see above) */ + result = PQexec(imp_dbh->conn, "begin"); + status = result ? PQresultStatus(result) : -1; + PQclear(result); + if (status != PGRES_COMMAND_OK) { + pg_error(dbh, status, "begin failed\n"); + return 0; + } + + return 1; +} + void dbd_init (dbistate) dbistate_t *dbistate; @@ -219,6 +247,7 @@ #ifdef is_utf8_string imp_dbh->pg_enable_utf8 = 0; /* initialize pg_enable_utf8 */ #endif + imp_dbh->pg_need_begin = 1; /* initialize begin state */ DBIc_IMPSET_on(imp_dbh); /* imp_dbh set up now */ DBIc_ACTIVE_on(imp_dbh); /* call disconnect before freeing */ @@ -310,7 +339,7 @@ if (NULL != imp_dbh->conn) { PGresult* result = 0; - ExecStatusType commitstatus, beginstatus; + ExecStatusType commitstatus; /* execute commit */ result = PQexec(imp_dbh->conn, "commit"); @@ -323,15 +352,8 @@ pg_error(dbh, commitstatus, PQerrorMessage(imp_dbh->conn)); } - /* start new transaction. AutoCommit must be FALSE, ref. 20 lines up */ - result = PQexec(imp_dbh->conn, "begin"); - beginstatus = result ? PQresultStatus(result) : -1; - PQclear(result); - if (beginstatus != PGRES_COMMAND_OK) { - /* Maybe add some loud barf here? Raising some very high error? */ - pg_error(dbh, beginstatus, "begin failed\n"); - return 0; - } + /* mark need for a begin at the start of the next command */ + imp_dbh->pg_need_begin = 1; /* if the initial COMMIT failed, return 0 now */ if (commitstatus != PGRES_COMMAND_OK) { @@ -361,6 +383,10 @@ if (NULL != imp_dbh->conn) { PGresult* result = 0; ExecStatusType status; + + /* no rollback is needed if we are not already in a transaction */ + if (imp_dbh->pg_need_begin) + return 1; /* execute rollback */ result = PQexec(imp_dbh->conn, "rollback"); @@ -375,14 +401,8 @@ return 0; } - /* start new transaction. AutoCommit must be FALSE, ref. 20 lines up */ - result = PQexec(imp_dbh->conn, "begin"); - status = result ? PQresultStatus(result) : -1; - PQclear(result); - if (status != PGRES_COMMAND_OK) { - pg_error(dbh, status, "begin failed\n"); - return 0; - } + /* mark need for a begin at the start of the next command */ + imp_dbh->pg_need_begin = 1; return 1; } @@ -409,7 +429,8 @@ if (NULL != imp_dbh->conn) { /* rollback if AutoCommit = off */ - if (DBIc_has(imp_dbh, DBIcf_AutoCommit) == FALSE) { + if ((imp_dbh->pg_need_begin == 0) + && (DBIc_has(imp_dbh, DBIcf_AutoCommit) == FALSE)) { PGresult* result = 0; ExecStatusType status; result = PQexec(imp_dbh->conn, "rollback"); @@ -485,16 +506,7 @@ if (dbis->debug >= 2) { PerlIO_printf(DBILOGFP, "dbd_db_STORE: switch AutoCommit to on: commit\n"); } } else if ((oldval != FALSE && newval == FALSE) || (oldval == FALSE && newval == FALSE && imp_dbh->init_commit)) { if (NULL != imp_dbh->conn) { - /* start new transaction */ - PGresult* result = 0; - ExecStatusType status; - result = PQexec(imp_dbh->conn, "begin"); - status = result ? PQresultStatus(result) : -1; - PQclear(result); - if (status != PGRES_COMMAND_OK) { - pg_error(dbh, status, "begin failed\n"); - return 0; - } + imp_dbh->pg_need_begin = 1; } if (dbis->debug >= 2) { PerlIO_printf(DBILOGFP, "dbd_db_STORE: switch AutoCommit to off: begin\n"); } } @@ -899,6 +911,9 @@ pg_error(sth, -1, "statement not prepared\n"); return -2; } + + if (_dbd_begin(sth, imp_dbh) == 0) + return -2; max_len = strlen(imp_sth->statement)+1; /* do we have input parameters ? */ Index: DBD-Pg-1.31/dbdimp.h --- DBD-Pg-1.31/dbdimp.h.orig 2003-03-31 19:52:39.000000000 +0200 +++ DBD-Pg-1.31/dbdimp.h 2003-11-21 20:53:09.000000000 +0100 @@ -28,6 +28,7 @@ #ifdef is_utf8_string int pg_enable_utf8; /* should we attempt to make utf8 strings? */ #endif + int pg_need_begin; /* does a begin need to be sent */ struct { int major; int minor; Index: DBD-Pg-1.31/Makefile.PL --- DBD-Pg-1.31/Makefile.PL.orig 2003-11-21 20:51:13.000000000 +0100 +++ DBD-Pg-1.31/Makefile.PL 2003-11-21 20:51:13.000000000 +0100 @@ -39,7 +39,7 @@ $POSTGRES_INCLUDE = $pg->inc_dir; $POSTGRES_LIB = $pg->lib_dir; } elsif ((!$ENV{POSTGRES_INCLUDE} or !$ENV{POSTGRES_LIB}) and $ENV{POSTGRES_HOME}) { - $POSTGRES_INCLUDE = "$ENV{POSTGRES_HOME}/include"; + $POSTGRES_INCLUDE = "$ENV{POSTGRES_HOME}/include/postgresql"; $POSTGRES_LIB = "$ENV{POSTGRES_HOME}/lib"; } else { $POSTGRES_INCLUDE = "$ENV{POSTGRES_INCLUDE}"; Index: DBD-Pg-1.31/t/lib/App/Info/RDBMS/PostgreSQL.pm --- DBD-Pg-1.31/t/lib/App/Info/RDBMS/PostgreSQL.pm.orig 2003-08-15 02:08:05.000000000 +0200 +++ DBD-Pg-1.31/t/lib/App/Info/RDBMS/PostgreSQL.pm 2003-11-29 14:19:42.000000000 +0100 @@ -251,6 +251,9 @@ @{$self}{qw(version major minor patch)} = ($version, $x, $y, $z); ## Beta/devel/release candidate versions are treated as patch level "0" + } elsif ($version =~ /^(\d+)\.(\d+)$/) { + @{$self}{qw(version major minor patch)} = + ($version, $1, $2, 0); } elsif ($version =~ /(\d+)\.(\d+)\w+\d+/) { @{$self}{qw(version major minor patch)} = ($version, $1, $2, 0);