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

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);