Return-Path: Delivered-To: apmail-apr-dev-archive@www.apache.org Received: (qmail 9232 invoked from network); 28 Apr 2006 04:58:15 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur.apache.org with SMTP; 28 Apr 2006 04:58:14 -0000 Received: (qmail 83226 invoked by uid 500); 28 Apr 2006 04:58:12 -0000 Delivered-To: apmail-apr-dev-archive@apr.apache.org Received: (qmail 83181 invoked by uid 500); 28 Apr 2006 04:58:12 -0000 Mailing-List: contact dev-help@apr.apache.org; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Id: Delivered-To: mailing list dev@apr.apache.org Received: (qmail 83169 invoked by uid 99); 28 Apr 2006 04:58:12 -0000 Received: from asf.osuosl.org (HELO asf.osuosl.org) (140.211.166.49) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 27 Apr 2006 21:58:11 -0700 X-ASF-Spam-Status: No, hits=-0.0 required=10.0 tests=SPF_HELO_PASS,SPF_PASS X-Spam-Check-By: apache.org Received-SPF: pass (asf.osuosl.org: domain of bojan@rexursive.com designates 203.171.74.242 as permitted sender) Received: from [203.171.74.242] (HELO beauty.rexursive.com) (203.171.74.242) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 27 Apr 2006 21:58:11 -0700 Received: by beauty.rexursive.com (Postfix, from userid 48) id 4C4E12566C7; Fri, 28 Apr 2006 14:57:49 +1000 (EST) Received: from cache4.syd.ops.aspac.uu.net (cache4.syd.ops.aspac.uu.net [203.166.96.238]) by www.rexursive.com (Horde MIME library) with HTTP; Fri, 28 Apr 2006 14:57:49 +1000 Message-ID: <20060428145749.jh5cf8eqsw8osoc0@www.rexursive.com> Date: Fri, 28 Apr 2006 14:57:49 +1000 From: Bojan Smojver To: APR Development List Subject: [PATCH]: Introduce apr_dbd_transaction_rollback MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=_eulm7skvob4" Content-Transfer-Encoding: 7bit User-Agent: Internet Messaging Program (IMP) H3 (4.1.1) X-Virus-Checked: Checked by ClamAV on apache.org X-Spam-Rating: minotaur.apache.org 1.6.2 0/1000/N This message is in MIME format. --=_eulm7skvob4 Content-Type: text/plain; charset=ISO-8859-1; DelSp="Yes"; format="flowed" Content-Disposition: inline Content-Transfer-Encoding: 7bit This was never compiled, let alone tested. It is here as a prototype for Ronen's suggestion. -- Bojan --=_eulm7skvob4 Content-Type: text/x-patch; charset=ISO-8859-1; name="apr_dbd-rollback.patch" Content-Disposition: attachment; filename="apr_dbd-rollback.patch" Content-Transfer-Encoding: quoted-printable Index: include/apr_dbd.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- include/apr_dbd.h=09(revision 397754) +++ include/apr_dbd.h=09(working copy) @@ -153,6 +153,18 @@ apr_pool_t *pool, apr_dbd_transaction_t *trans); =20 +/** apr_dbd_transaction_rollback: rollback a transaction + * May be a no-op. + * + * @param driver - the driver + * @param handle - the db connection + * @param transaction - the transaction. + * @return 0 for success or error code + */ +APU_DECLARE(int) apr_dbd_transaction_rollback(const apr_dbd_driver_t *drive= r, + apr_pool_t *pool, + apr_dbd_transaction_t *trans)= ; + /** apr_dbd_query: execute an SQL query that doesn't return a result set * * @param driver - the driver Index: include/private/apr_dbd_internal.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- include/private/apr_dbd_internal.h=09(revision 397754) +++ include/private/apr_dbd_internal.h=09(working copy) @@ -254,6 +254,14 @@ * @return param name, or NULL if col is out of bounds. */ const char* (*get_name)(const apr_dbd_results_t *res, int col); + + /** rollback_transaction: rollback a transaction + * May be a no-op. + * + * @param transaction - the transaction. + * @return 0 for success or error code + */ + int (*rollback_transaction)(apr_dbd_transaction_t *trans); }; =20 /* Export mutex lock/unlock for drivers that need it */ Index: dbd/apr_dbd_sqlite2.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- dbd/apr_dbd_sqlite2.c=09(revision 397754) +++ dbd/apr_dbd_sqlite2.c=09(working copy) @@ -308,6 +308,19 @@ return ret; } =20 +static int dbd_sqlite_rollback_transaction(apr_dbd_transaction_t * trans) +{ + int rows; + int ret =3D -1; /* no transaction is an error cond */ + + if (trans) { + ret =3D dbd_sqlite_query(trans->handle, &rows, "ROLLBACK TRANSACTIO= N"); + trans->handle->trans =3D NULL; + } + + return ret; +} + static apr_dbd_t *dbd_sqlite_open(apr_pool_t * pool, const char *params_) { apr_dbd_t *sql; @@ -396,6 +409,7 @@ dbd_sqlite_pvselect, dbd_sqlite_pquery, dbd_sqlite_pselect, - dbd_sqlite_get_name + dbd_sqlite_get_name, + dbd_sqlite_rollback_transaction }; #endif Index: dbd/apr_dbd_sqlite3.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- dbd/apr_dbd_sqlite3.c=09(revision 397754) +++ dbd/apr_dbd_sqlite3.c=09(working copy) @@ -368,6 +368,19 @@ return ret; } =20 +static int dbd_sqlite3_rollback_transaction(apr_dbd_transaction_t *trans) +{ + int ret =3D -1; + int nrows =3D 0; + + if (trans) { + ret =3D dbd_sqlite3_query(trans->handle, &nrows, "ROLLBACK;"); + trans->handle->trans =3D NULL; + } + + return ret; +} + static apr_dbd_t *dbd_sqlite3_open(apr_pool_t *pool, const char *params) { apr_dbd_t *sql =3D NULL; @@ -445,6 +458,7 @@ dbd_sqlite3_pvselect, dbd_sqlite3_pquery, dbd_sqlite3_pselect, - dbd_sqlite3_get_name + dbd_sqlite3_get_name, + dbd_sqlite3_rollback_transaction }; #endif Index: dbd/apr_dbd_oracle.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- dbd/apr_dbd_oracle.c=09(revision 397754) +++ dbd/apr_dbd_oracle.c=09(working copy) @@ -1682,6 +1682,28 @@ return ret; } =20 +static int dbd_oracle_rollback_transaction(apr_dbd_transaction_t *trans) +{ + int ret =3D 1; /* no transaction is an error cond */ + sword status; + apr_dbd_t *handle =3D trans->handle; + if (trans) { + status =3D OCITransRollback(handle->svc, handle->err, OCI_DEFAULT); + + handle->trans =3D NULL; + + switch (status) { + case OCI_SUCCESS: + ret =3D 0; + break; + default: + ret =3D 3; + break; + } + } + return ret; +} + /* This doesn't work for BLOB because of NULLs, but it can fake it * if the BLOB is really a string */ @@ -1910,6 +1932,7 @@ dbd_oracle_pvselect, dbd_oracle_pquery, dbd_oracle_pselect, - dbd_oracle_get_name + dbd_oracle_get_name, + dbd_oracle_end_transaction }; #endif Index: dbd/apr_dbd_pgsql.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- dbd/apr_dbd_pgsql.c=09(revision 397754) +++ dbd/apr_dbd_pgsql.c=09(working copy) @@ -567,6 +567,27 @@ return ret; } =20 +static int dbd_pgsql_rollback_transaction(apr_dbd_transaction_t *trans) +{ + PGresult *res; + int ret =3D -1; /* no transaction is an error cond */ + if (trans) { + res =3D PQexec(trans->handle->conn, "ROLLBACK"); + if (res) { + ret =3D PQresultStatus(res); + if (dbd_pgsql_is_success(ret)) { + ret =3D 0; + } + PQclear(res); + } + else { + ret =3D PGRES_FATAL_ERROR; + } + trans->handle->trans =3D NULL; + } + return ret; +} + static apr_dbd_t *dbd_pgsql_open(apr_pool_t *pool, const char *params) { apr_dbd_t *sql; @@ -656,6 +677,7 @@ dbd_pgsql_pvselect, dbd_pgsql_pquery, dbd_pgsql_pselect, - dbd_pgsql_get_name + dbd_pgsql_get_name, + dbd_pgsql_rollback_transaction }; #endif Index: dbd/apr_dbd.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- dbd/apr_dbd.c=09(revision 397754) +++ dbd/apr_dbd.c=09(working copy) @@ -200,6 +200,7 @@ } return ret; } + APU_DECLARE(int) apr_dbd_transaction_end(const apr_dbd_driver_t *driver, apr_pool_t *pool, apr_dbd_transaction_t *trans) @@ -208,6 +209,14 @@ return driver->end_transaction(trans); } =20 +APU_DECLARE(int) apr_dbd_transaction_rollback(const apr_dbd_driver_t *drive= r, + apr_pool_t *pool, + apr_dbd_transaction_t *trans) +{ + apr_pool_cleanup_kill(pool, trans, CLEANUP_CAST driver->end_transaction= ); + return driver->rollback_transaction(trans); +} + APU_DECLARE(apr_status_t) apr_dbd_close(const apr_dbd_driver_t *driver, apr_dbd_t *handle) { --=_eulm7skvob4--