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.
 
 
 
 
 
 

172 lines
5.9 KiB

--- DBD-Pg-1.22/dbdimp.c.orig Thu Mar 27 04:14:19 2003
+++ DBD-Pg-1.22/dbdimp.c Sat May 17 13:26:56 2003
@@ -97,6 +97,36 @@
free(err);
}
+
+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, ref. ~8 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;
+ }
+
+ return 1;
+}
+
+
static int
pgtype_bind_ok (dbtype)
int dbtype;
@@ -193,6 +223,7 @@
imp_dbh->init_commit = 1; /* initialize AutoCommit */
imp_dbh->pg_auto_escape = 1; /* initialize pg_auto_escape */
imp_dbh->pg_bool_tf = 0; /* initialize pg_bool_tf */
+ 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 */
@@ -284,7 +315,7 @@
if (NULL != imp_dbh->conn) {
PGresult* result = 0;
- ExecStatusType commitstatus, beginstatus;
+ ExecStatusType commitstatus;
/* execute commit */
result = PQexec(imp_dbh->conn, "commit");
@@ -297,15 +328,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) {
@@ -335,6 +359,10 @@
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");
status = result ? PQresultStatus(result) : -1;
@@ -346,14 +374,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;
}
@@ -377,7 +399,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");
@@ -453,16 +476,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"); }
}
@@ -1182,6 +1196,9 @@
SV **svp;
if (dbis->debug >= 1) { PerlIO_printf(DBILOGFP, "dbd_st_execute\n"); }
+
+ if (_dbd_begin(sth, imp_dbh) == 0)
+ return 0;
/*
here we get the statement from the statement handle where
--- DBD-Pg-1.22/dbdimp.h.orig Tue Mar 25 23:17:00 2003
+++ DBD-Pg-1.22/dbdimp.h Sat May 17 13:29:12 2003
@@ -28,6 +28,7 @@
#ifdef SvUTF8_off
int pg_enable_utf8; /* should we attempt to make utf8 strings? */
#endif
+ int pg_need_begin; /* does a begin need to be sent */
};
/* Define sth implementor data structure */
--- DBD-ODBC-1.06/Makefile.PL.dist 2003-06-23 15:42:09.000000000 +0200
+++ DBD-ODBC-1.06/Makefile.PL 2003-06-23 15:42:23.000000000 +0200
@@ -424,7 +424,7 @@
changes_pm = ' . File::Spec->catfile($self->{INST_LIB}, 'DBD/ODBC', 'Changes.pm') . '
config :: $(changes_pm)
- @$(NOOP)
+ @$(NOOP)
$(changes_pm): Changes
$(NOECHO) $(MKPATH) $(inst_libdbdodbc)
--- DBD-Pg-1.22/Makefile.PL.dist 2003-07-01 08:31:41.000000000 +0200
+++ DBD-Pg-1.22/Makefile.PL 2003-07-01 08:31:57.000000000 +0200
@@ -36,7 +36,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}";