Return-Path: Delivered-To: apmail-apr-dev-archive@www.apache.org Received: (qmail 93213 invoked from network); 2 May 2006 03:12:41 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur.apache.org with SMTP; 2 May 2006 03:12:41 -0000 Received: (qmail 14684 invoked by uid 500); 2 May 2006 03:12:40 -0000 Delivered-To: apmail-apr-dev-archive@apr.apache.org Received: (qmail 14629 invoked by uid 500); 2 May 2006 03:12:39 -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 14614 invoked by uid 99); 2 May 2006 03:12:39 -0000 Received: from asf.osuosl.org (HELO asf.osuosl.org) (140.211.166.49) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 01 May 2006 20:12:39 -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; Mon, 01 May 2006 20:12:38 -0700 Received: by beauty.rexursive.com (Postfix, from userid 48) id 87453256BE2; Tue, 2 May 2006 13:12:15 +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; Tue, 02 May 2006 13:12:15 +1000 Message-ID: <20060502131215.h0gdo30zcww8o4co@www.rexursive.com> Date: Tue, 02 May 2006 13:12:15 +1000 From: Bojan Smojver To: dev@apr.apache.org Subject: Re: [PATCH]: Introduce APR DBD transaction mode References: <20060501112825.2zqayzuou8wc8ocw@www.rexursive.com> <200605012319.11509.nick@webthing.com> <20060502095335.9jw95n4m4g8w4ww8@www.rexursive.com> <200605020121.52366.nick@webthing.com> <20060502104107.ridans75wg8okwgg@www.rexursive.com> In-Reply-To: <20060502104107.ridans75wg8okwgg@www.rexursive.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=_1r1k0h4c9bfo" 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. --=_1r1k0h4c9bfo Content-Type: text/plain; charset=ISO-8859-1; DelSp="Yes"; format="flowed" Content-Disposition: inline Content-Transfer-Encoding: 7bit Quoting Bojan Smojver : > Something like this: Attached example patches. -- Bojan --=_1r1k0h4c9bfo Content-Type: text/x-patch; charset=ISO-8859-1; name="apr_dbd-trans-mode-recover.patch" Content-Disposition: attachment; filename="apr_dbd-trans-mode-recover.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 398759) +++ include/apr_dbd.h=09(working copy) @@ -153,6 +153,38 @@ apr_pool_t *pool, apr_dbd_transaction_t *trans); =20 +#define APR_DBD_TRANSACTION_COMMIT 0 /**< commit the transaction */ +#define APR_DBD_TRANSACTION_ROLLBACK 1 /**< rollback the transaction */ + +/** apr_dbd_transaction_mode_get: get the mode of transaction + * + * @param driver - the driver + * @param trans - the transaction + * @return mode of transaction + */ +APU_DECLARE(int) apr_dbd_transaction_mode_get(const apr_dbd_driver_t *drive= r, + apr_dbd_transaction_t *trans)= ; + +/** apr_dbd_transaction_mode_set: set the mode of transaction + * + * @param driver - the driver + * @param trans - the transaction + * @param mode - new mode of the transaction + * @return new mode of transaction + */ +APU_DECLARE(int) apr_dbd_transaction_mode_set(const apr_dbd_driver_t *drive= r, + apr_dbd_transaction_t *trans, + int mode); + +/** apr_dbd_transaction_recover: recover transaction from an error conditio= n + * + * @param driver - the driver + * @param trans - the transaction + * @return 0 for success or error code + */ +APU_DECLARE(int) apr_dbd_transaction_recover(const apr_dbd_driver_t *driver= , + 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 398759) +++ include/private/apr_dbd_internal.h=09(working copy) @@ -82,9 +82,9 @@ =20 /** transaction: start a transaction. May be a no-op. * - * @param pool - a pool to use for error messages (if any). + * @param pool - a pool to use for error messages (if any). * @param handle - the connection - * @param transaction - ptr to a transaction. May be null on entry + * @param trans - ptr to a transaction. May be null on entry * @return 0 for success or error code */ int (*start_transaction)(apr_pool_t *pool, apr_dbd_t *handle, @@ -94,7 +94,7 @@ * (commit on success, rollback on error). * May be a no-op. * - * @param transaction - the transaction. + * @param trans - the transaction. * @return 0 for success or error code */ int (*end_transaction)(apr_dbd_transaction_t *trans); @@ -254,6 +254,28 @@ * @return param name, or NULL if col is out of bounds. */ const char* (*get_name)(const apr_dbd_results_t *res, int col); + + /** transaction_mode_get: get the mode of transaction + * + * @param trans - the transaction. + * @return mode of transaction + */ + int (*transaction_mode_get)(apr_dbd_transaction_t *trans); + + /** transaction_mode_set: get the mode of transaction + * + * @param trans - the transaction. + * @param mode - new mode of the transaction + * @return new mode of transaction + */ + int (*transaction_mode_set)(apr_dbd_transaction_t *trans, int mode); + + /** transaction_recover: recover transaction from an error condition + * + * @param trans - the transaction. + * @return 0 for success or error code + */ + int (*transaction_recover)(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 398759) +++ dbd/apr_dbd_sqlite2.c=09(working copy) @@ -29,6 +29,7 @@ #include "apr_dbd_internal.h" =20 struct apr_dbd_transaction_t { + int mode; int errnum; apr_dbd_t *handle; }; @@ -292,7 +293,8 @@ int ret =3D -1; /* no transaction is an error cond */ =20 if (trans) { - if (trans->errnum) { + /* rollback on error or explicit rollback request */ + if (trans->errnum || trans->mode) { trans->errnum =3D 0; ret =3D dbd_sqlite_query(trans->handle, &rows, @@ -308,6 +310,36 @@ return ret; } =20 +static int dbd_sqlite_transaction_mode_get(apr_dbd_transaction_t *trans) +{ + if (!trans) + return APR_DBD_TRANSACTION_COMMIT; + + return trans->mode; +} + +static int dbd_sqlite_transaction_mode_set(apr_dbd_transaction_t *trans, + int mode) +{ + if (!trans) + return APR_DBD_TRANSACTION_COMMIT; + + return trans->mode =3D (mode ? APR_DBD_TRANSACTION_ROLLBACK + : APR_DBD_TRANSACTION_COMMIT); +} + +static int dbd_sqlite_transaction_recover(apr_dbd_transaction_t *trans) +{ + int ret =3D -1; + + if (trans) { + trans->errnum =3D 0; + ret =3D 0; + } + + return ret; +} + static apr_dbd_t *dbd_sqlite_open(apr_pool_t * pool, const char *params_) { apr_dbd_t *sql; @@ -396,6 +428,9 @@ dbd_sqlite_pvselect, dbd_sqlite_pquery, dbd_sqlite_pselect, - dbd_sqlite_get_name + dbd_sqlite_get_name, + dbd_sqlite_transaction_mode_get, + dbd_sqlite_transaction_mode_set, + dbd_sqlite_transaction_recover }; #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 398759) +++ dbd/apr_dbd_sqlite3.c=09(working copy) @@ -32,6 +32,7 @@ #define MAX_RETRY_SLEEP 100000 =20 struct apr_dbd_transaction_t { + int mode; int errnum; apr_dbd_t *handle; }; @@ -355,7 +356,8 @@ int nrows =3D 0; =20 if (trans) { - if (trans->errnum) { + /* rollback on error or explicit rollback request */ + if (trans->errnum || trans->mode) { trans->errnum =3D 0; ret =3D dbd_sqlite3_query(trans->handle, &nrows, "ROLLBACK"); } else { @@ -367,6 +369,36 @@ return ret; } =20 +static int dbd_sqlite3_transaction_mode_get(apr_dbd_transaction_t *trans) +{ + if (!trans) + return APR_DBD_TRANSACTION_COMMIT; + + return trans->mode; +} + +static int dbd_sqlite3_transaction_mode_set(apr_dbd_transaction_t *trans, + int mode) +{ + if (!trans) + return APR_DBD_TRANSACTION_COMMIT; + + return trans->mode =3D (mode ? APR_DBD_TRANSACTION_ROLLBACK + : APR_DBD_TRANSACTION_COMMIT); +} + +static int dbd_sqlite3_transaction_recover(apr_dbd_transaction_t *trans) +{ + int ret =3D -1; + + if (trans) { + trans->errnum =3D 0; + ret =3D 0; + } + + return ret; +} + static apr_dbd_t *dbd_sqlite3_open(apr_pool_t *pool, const char *params) { apr_dbd_t *sql =3D NULL; @@ -444,6 +476,9 @@ dbd_sqlite3_pvselect, dbd_sqlite3_pquery, dbd_sqlite3_pselect, - dbd_sqlite3_get_name + dbd_sqlite3_get_name, + dbd_sqlite3_transaction_mode_get, + dbd_sqlite3_transaction_mode_set, + dbd_sqlite3_transaction_recover }; #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 398759) +++ dbd/apr_dbd_oracle.c=09(working copy) @@ -123,6 +123,7 @@ static int dbd_oracle_end_transaction(apr_dbd_transaction_t *trans); =20 struct apr_dbd_transaction_t { + int mode; enum { TRANS_NONE, TRANS_ERROR, TRANS_1, TRANS_2 } status; apr_dbd_t *handle; OCITrans *trans; @@ -1664,7 +1665,12 @@ status =3D OCITransRollback(handle->svc, handle->err, OCI_DEFAU= LT); break; default: - status =3D OCITransCommit(handle->svc, handle->err, OCI_DEFAULT= ); + /* rollback on explicit rollback request */ + if (trans->mode) { + status =3D OCITransRollback(handle->svc, handle->err, OCI_D= EFAULT); + } else { + status =3D OCITransCommit(handle->svc, handle->err, OCI_DEF= AULT); + } break; } =20 @@ -1682,6 +1688,36 @@ return ret; } =20 +static int dbd_oracle_transaction_mode_get(apr_dbd_transaction_t *trans) +{ + if (!trans) + return APR_DBD_TRANSACTION_COMMIT; + + return trans->mode; +} + +static int dbd_oracle_transaction_mode_set(apr_dbd_transaction_t *trans, + int mode) +{ + if (!trans) + return APR_DBD_TRANSACTION_COMMIT; + + return trans->mode =3D (mode ? APR_DBD_TRANSACTION_ROLLBACK + : APR_DBD_TRANSACTION_COMMIT); +} + +static int dbd_oracle_transaction_recover(apr_dbd_transaction_t *trans) +{ + int ret =3D -1; + + if (trans) { + trans->errnum =3D 0; + ret =3D 0; + } + + 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 +1946,9 @@ dbd_oracle_pvselect, dbd_oracle_pquery, dbd_oracle_pselect, - dbd_oracle_get_name + dbd_oracle_get_name, + dbd_oracle_transaction_mode_get, + dbd_oracle_transaction_mode_set, + dbd_oracle_transaction_recover }; #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 398759) +++ dbd/apr_dbd_pgsql.c=09(working copy) @@ -31,6 +31,7 @@ #define QUERY_MAX_ARGS 40 =20 struct apr_dbd_transaction_t { + int mode; int errnum; apr_dbd_t *handle; }; @@ -545,7 +546,8 @@ PGresult *res; int ret =3D -1; /* no transaction is an error cond */ if (trans) { - if (trans->errnum) { + /* rollback on error or explicit rollback request */ + if (trans->errnum || trans->mode) { trans->errnum =3D 0; res =3D PQexec(trans->handle->conn, "ROLLBACK"); } @@ -567,6 +569,36 @@ return ret; } =20 +static int dbd_pgsql_transaction_mode_get(apr_dbd_transaction_t *trans) +{ + if (!trans) + return APR_DBD_TRANSACTION_COMMIT; + + return trans->mode; +} + +static int dbd_pgsql_transaction_mode_set(apr_dbd_transaction_t *trans, + int mode) +{ + if (!trans) + return APR_DBD_TRANSACTION_COMMIT; + + return trans->mode =3D (mode ? APR_DBD_TRANSACTION_ROLLBACK + : APR_DBD_TRANSACTION_COMMIT); +} + +static int dbd_pgsql_transaction_recover(apr_dbd_transaction_t *trans) +{ + int ret =3D -1; + + if (trans) { + trans->errnum =3D 0; + ret =3D 0; + } + + return ret; +} + static apr_dbd_t *dbd_pgsql_open(apr_pool_t *pool, const char *params) { apr_dbd_t *sql; @@ -656,6 +688,9 @@ dbd_pgsql_pvselect, dbd_pgsql_pquery, dbd_pgsql_pselect, - dbd_pgsql_get_name + dbd_pgsql_get_name, + dbd_pgsql_transaction_mode_get, + dbd_pgsql_transaction_mode_set, + dbd_pgsql_transaction_recover }; #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 398759) +++ dbd/apr_dbd.c=09(working copy) @@ -208,6 +208,25 @@ return driver->end_transaction(trans); } =20 +APU_DECLARE(int) apr_dbd_transaction_mode_get(const apr_dbd_driver_t *drive= r, + apr_dbd_transaction_t *trans) +{ + return driver->transaction_mode_get(trans); +} + +APU_DECLARE(int) apr_dbd_transaction_mode_set(const apr_dbd_driver_t *drive= r, + apr_dbd_transaction_t *trans, + int mode) +{ + return driver->transaction_mode_set(trans, mode); +} + +APU_DECLARE(int) apr_dbd_transaction_recover(const apr_dbd_driver_t *driver= , + apr_dbd_transaction_t *trans) +{ + return driver->transaction_recover(trans); +} + APU_DECLARE(apr_status_t) apr_dbd_close(const apr_dbd_driver_t *driver, apr_dbd_t *handle) { --=_1r1k0h4c9bfo Content-Type: text/x-patch; charset=ISO-8859-1; name="apr_dbd-trans-mode-recover-mysql.patch" Content-Disposition: attachment; filename="apr_dbd-trans-mode-recover-mysql.patch" Content-Transfer-Encoding: quoted-printable --- apr_dbd_mysql.c.orig=092006-05-02 11:35:04.000000000 +1000 +++ apr_dbd_mysql.c=092006-05-02 11:37:09.000000000 +1000 @@ -62,6 +62,7 @@ }; =20 struct apr_dbd_transaction_t { + int mode; int errnum; apr_dbd_t *handle; }; @@ -506,7 +507,8 @@ { int ret =3D -1; if (trans) { - if (trans->errnum) { + /* rollback on error or explicit rollback request */ + if (trans->errnum || trans->mode) { trans->errnum =3D 0; ret =3D mysql_rollback(trans->handle->conn); } @@ -536,6 +538,37 @@ handle->trans =3D *trans; return (*trans)->errnum; } + +static int dbd_pgsql_transaction_mode_get(apr_dbd_transaction_t *trans) +{ + if (!trans) + return APR_DBD_TRANSACTION_COMMIT; + + return trans->mode; +} + +static int dbd_pgsql_transaction_mode_set(apr_dbd_transaction_t *trans, + int mode) +{ + if (!trans) + return APR_DBD_TRANSACTION_COMMIT; + + return trans->mode =3D (mode ? APR_DBD_TRANSACTION_ROLLBACK + : APR_DBD_TRANSACTION_COMMIT); +} + +static int dbd_pgsql_transaction_recover(apr_dbd_transaction_t *trans) +{ + int ret =3D -1; + + if (trans) { + trans->errnum =3D 0; + ret =3D 0; + } + + return ret; +} + static apr_dbd_t *dbd_mysql_open(apr_pool_t *pool, const char *params) { static const char *const delims =3D " \r\n\t;|,"; @@ -674,7 +707,10 @@ dbd_mysql_pvselect, dbd_mysql_pquery, dbd_mysql_pselect, - dbd_mysql_get_name + dbd_mysql_get_name, + dbd_mysql_transaction_mode_get, + dbd_mysql_transaction_mode_set, + dbd_mysql_transaction_recover }; =20 #endif --=_1r1k0h4c9bfo--