pkgsrc/databases/p5-DBD-postgresql/patches/patch-aa
mjl 637c77c045 Update p5-DBD-postgresql to 1.21
- System tables no longer returned by tables().
      - Fix table_attributes to handle removal of pg_relcheck in 7.3,
      - Properly reset transaction status after failed transaction when
        autocommit is off.  Properly report transaction failure message.
      - New pg_bool_tf database handle that when set to true booleans are
        returned as 't'/'f' rather than 1/0.
      - Maintenance transferred to GBorg.
      - Added implementations of column_info() and table_info(), and
        primary_key_info().
      - The POD formatting was cleaned up.
      - The preparser was updated to better handle escaped characters.
      - Added eg/lotest.pl as a demonstration of using large objects in buffers
        rather than files.
      - Added LISTEN/NOTIFY functionality.
      - Added constants for common PostgreSQL data types.
      - Fixed compile-time warnings.
2003-01-17 16:41:37 +00:00

145 lines
4.3 KiB
Text

$NetBSD: patch-aa,v 1.3 2003/01/17 16:41:39 mjl Exp $
--- dbdimp.c.orig Wed Jan 8 23:08:17 2003
+++ dbdimp.c Fri Jan 17 17:23:37 2003
@@ -40,6 +40,30 @@
int
+_dbd_begin(imp_dbh_t *imp_dbh)
+{
+ PGresult *result = NULL;
+ ExecStatusType status;
+
+ if (DBIc_has(imp_dbh, DBIcf_AutoCommit) != FALSE)
+ return 1;
+
+ if (imp_dbh->need_begin == 0)
+ return 1;
+
+ imp_dbh->need_begin = 0;
+
+ result = PQexec(imp_dbh->conn, "begin");
+ status = result ? PQresultStatus(result) : -1;
+ PQclear(result);
+ if (status != PGRES_COMMAND_OK) {
+ return 0;
+ }
+
+ return 1;
+}
+
+int
dbd_discon_all (drh, imp_drh)
SV *drh;
imp_drh_t *imp_drh;
@@ -192,6 +216,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->need_begin = 1;
DBIc_IMPSET_on(imp_dbh); /* imp_dbh set up now */
DBIc_ACTIVE_on(imp_dbh); /* call disconnect before freeing */
@@ -283,6 +308,9 @@
PGresult* result = 0;
ExecStatusType commitstatus, beginstatus;
+ if (imp_dbh->need_begin)
+ return 1;
+
/* execute commit */
result = PQexec(imp_dbh->conn, "commit");
commitstatus = result ? PQresultStatus(result) : -1;
@@ -294,21 +322,12 @@
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;
- }
-
/* if the initial COMMIT failed, return 0 now */
if (commitstatus != PGRES_COMMAND_OK) {
return 0;
}
-
+
+ imp_dbh->need_begin = 1;
return 1;
}
@@ -332,6 +351,9 @@
PGresult* result = 0;
ExecStatusType status;
+ if (imp_dbh->need_begin)
+ return 1;
+
/* execute rollback */
result = PQexec(imp_dbh->conn, "rollback");
status = result ? PQresultStatus(result) : -1;
@@ -343,15 +365,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;
- }
-
+ imp_dbh->need_begin = 1;
+
return 1;
}
@@ -374,7 +389,8 @@
if (NULL != imp_dbh->conn) {
/* rollback if AutoCommit = off */
- if (DBIc_has(imp_dbh, DBIcf_AutoCommit) == FALSE) {
+ if ((imp_dbh->need_begin == 0)
+ && (DBIc_has(imp_dbh, DBIcf_AutoCommit) == FALSE)) {
PGresult* result = 0;
ExecStatusType status;
result = PQexec(imp_dbh->conn, "rollback");
@@ -450,16 +466,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->need_begin = 1;
}
if (dbis->debug >= 2) { PerlIO_printf(DBILOGFP, "dbd_db_STORE: switch AutoCommit to off: begin\n"); }
}
@@ -1142,6 +1149,11 @@
return -2;
}
+ if (_dbd_begin(imp_dbh) == 0) {
+ pg_error(sth, -1, "executing begin failed\n");
+ return -2;
+ }
+
statement = imp_sth->statement;
if (! statement) {
/* are we prepared ? */