You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
175 lines
5.8 KiB
175 lines
5.8 KiB
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);
|
|
|