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
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}";
|
|
|