You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@apr.apache.org by bo...@apache.org on 2007/10/30 23:54:40 UTC

svn commit: r590501 - in /apr/apr-util/trunk: CHANGES dbd/apr_dbd.c dbd/apr_dbd_freetds.c dbd/apr_dbd_mysql.c dbd/apr_dbd_oracle.c dbd/apr_dbd_pgsql.c dbd/apr_dbd_sqlite2.c dbd/apr_dbd_sqlite3.c include/apr_dbd.h include/private/apr_dbd_internal.h

Author: bojan
Date: Tue Oct 30 15:54:37 2007
New Revision: 590501

URL: http://svn.apache.org/viewvc?rev=590501&view=rev
Log:
Introduce apr_dbd_open_ex()
NOTE: FreeTDS driver needs to be fixed to use the new error argument

Modified:
    apr/apr-util/trunk/CHANGES
    apr/apr-util/trunk/dbd/apr_dbd.c
    apr/apr-util/trunk/dbd/apr_dbd_freetds.c
    apr/apr-util/trunk/dbd/apr_dbd_mysql.c
    apr/apr-util/trunk/dbd/apr_dbd_oracle.c
    apr/apr-util/trunk/dbd/apr_dbd_pgsql.c
    apr/apr-util/trunk/dbd/apr_dbd_sqlite2.c
    apr/apr-util/trunk/dbd/apr_dbd_sqlite3.c
    apr/apr-util/trunk/include/apr_dbd.h
    apr/apr-util/trunk/include/private/apr_dbd_internal.h

Modified: apr/apr-util/trunk/CHANGES
URL: http://svn.apache.org/viewvc/apr/apr-util/trunk/CHANGES?rev=590501&r1=590500&r2=590501&view=diff
==============================================================================
--- apr/apr-util/trunk/CHANGES [utf-8] (original)
+++ apr/apr-util/trunk/CHANGES [utf-8] Tue Oct 30 15:54:37 2007
@@ -1,6 +1,8 @@
                                                      -*- coding: utf-8 -*-
 Changes with APR-util 1.3.0
   
+  *) Introduce apr_dbd_open_ex() [Bojan Smojver]
+
   *) Make md5 hash files portable between EBCDIC and ASCII platforms  
      [David Jones]
 

Modified: apr/apr-util/trunk/dbd/apr_dbd.c
URL: http://svn.apache.org/viewvc/apr/apr-util/trunk/dbd/apr_dbd.c?rev=590501&r1=590500&r2=590501&view=diff
==============================================================================
--- apr/apr-util/trunk/dbd/apr_dbd.c (original)
+++ apr/apr-util/trunk/dbd/apr_dbd.c Tue Oct 30 15:54:37 2007
@@ -183,21 +183,32 @@
 
     return rv;
 }
-APU_DECLARE(apr_status_t) apr_dbd_open(const apr_dbd_driver_t *driver,
-                                       apr_pool_t *pool, const char *params,
-                                       apr_dbd_t **handle)
+APU_DECLARE(apr_status_t) apr_dbd_open_ex(const apr_dbd_driver_t *driver,
+                                          apr_pool_t *pool, const char *params,
+                                          apr_dbd_t **handle,
+                                          const char **error)
 {
     apr_status_t rv;
-    *handle = (driver->open)(pool, params);
+    *handle = (driver->open)(pool, params, error);
     if (*handle == NULL) {
         return APR_EGENERAL;
     }
     rv = apr_dbd_check_conn(driver, pool, *handle);
     if ((rv != APR_SUCCESS) && (rv != APR_ENOTIMPL)) {
+        /* XXX: rv is APR error code, but apr_dbd_error() takes int! */
+        if (error) {
+            *error = apr_dbd_error(driver, *handle, rv);
+        }
         apr_dbd_close(driver, *handle);
         return APR_EGENERAL;
     }
     return APR_SUCCESS;
+}
+APU_DECLARE(apr_status_t) apr_dbd_open(const apr_dbd_driver_t *driver,
+                                       apr_pool_t *pool, const char *params,
+                                       apr_dbd_t **handle)
+{
+    return apr_dbd_open_ex(driver,pool,params,handle,NULL);
 }
 APU_DECLARE(int) apr_dbd_transaction_start(const apr_dbd_driver_t *driver,
                                            apr_pool_t *pool, apr_dbd_t *handle,

Modified: apr/apr-util/trunk/dbd/apr_dbd_freetds.c
URL: http://svn.apache.org/viewvc/apr/apr-util/trunk/dbd/apr_dbd_freetds.c?rev=590501&r1=590500&r2=590501&view=diff
==============================================================================
--- apr/apr-util/trunk/dbd/apr_dbd_freetds.c (original)
+++ apr/apr-util/trunk/dbd/apr_dbd_freetds.c Tue Oct 30 15:54:37 2007
@@ -528,7 +528,8 @@
     return (trans->handle->err == SUCCEED) ? 0 : 1;
 }
 
-static DBPROCESS *freetds_open(apr_pool_t *pool, const char *params)
+static DBPROCESS *freetds_open(apr_pool_t *pool, const char *params,
+                               const char **error)
 {
     char *server = NULL;
     DBPROCESS *process;
@@ -543,6 +544,7 @@
     char *databaseName = NULL;
 
     /* FIXME - this uses malloc */
+    /* FIXME - pass error message back to the caller in case of failure */
     login = dblogin();
     if (login == NULL) {
         return NULL;
@@ -612,10 +614,12 @@
 
     return process;
 }
-static apr_dbd_t *dbd_freetds_open(apr_pool_t *pool, const char *params)
+static apr_dbd_t *dbd_freetds_open(apr_pool_t *pool, const char *params,
+                                   const char **error)
 {
     apr_dbd_t *sql;
-    DBPROCESS *process = freetds_open(pool, params);
+    /* FIXME - pass error message back to the caller in case of failure */
+    DBPROCESS *process = freetds_open(pool, params, error);
     if (process == NULL) {
         return NULL;
     }

Modified: apr/apr-util/trunk/dbd/apr_dbd_mysql.c
URL: http://svn.apache.org/viewvc/apr/apr-util/trunk/dbd/apr_dbd_mysql.c?rev=590501&r1=590500&r2=590501&view=diff
==============================================================================
--- apr/apr-util/trunk/dbd/apr_dbd_mysql.c (original)
+++ apr/apr-util/trunk/dbd/apr_dbd_mysql.c Tue Oct 30 15:54:37 2007
@@ -1064,7 +1064,8 @@
     return trans->mode = (mode & TXN_MODE_BITS);
 }
 
-static apr_dbd_t *dbd_mysql_open(apr_pool_t *pool, const char *params)
+static apr_dbd_t *dbd_mysql_open(apr_pool_t *pool, const char *params,
+                                 const char **error)
 {
     static const char *const delims = " \r\n\t;|,";
     const char *ptr;
@@ -1155,6 +1156,9 @@
                                    fields[5].value, flags);
 
     if(real_conn == NULL) {
+        if (error) {
+            *error = apr_pstrdup(pool, mysql_error(sql->conn));
+        }
         mysql_close(sql->conn);
         return NULL;
     }

Modified: apr/apr-util/trunk/dbd/apr_dbd_oracle.c
URL: http://svn.apache.org/viewvc/apr/apr-util/trunk/dbd/apr_dbd_oracle.c?rev=590501&r1=590500&r2=590501&view=diff
==============================================================================
--- apr/apr-util/trunk/dbd/apr_dbd_oracle.c (original)
+++ apr/apr-util/trunk/dbd/apr_dbd_oracle.c Tue Oct 30 15:54:37 2007
@@ -91,6 +91,8 @@
 
 #define CHECK_CONN_QUERY "SELECT 1 FROM dual"
 
+#define ERR_BUF_SIZE 200
+
 #ifdef DEBUG
 #include <stdio.h>
 #endif
@@ -141,7 +143,7 @@
     OCISession *auth;
     apr_dbd_transaction_t* trans;
     apr_pool_t *pool;
-    char buf[200];        /* for error messages */
+    char buf[ERR_BUF_SIZE]; /* for error messages */
     apr_size_t long_size;
     apr_dbd_prepared_t *check_conn_stmt;
 };
@@ -437,10 +439,11 @@
 #endif
 }
 
-static apr_dbd_t *dbd_oracle_open(apr_pool_t *pool, const char *params)
+static apr_dbd_t *dbd_oracle_open(apr_pool_t *pool, const char *params,
+                                  const char **error)
 {
     apr_dbd_t *ret = apr_pcalloc(pool, sizeof(apr_dbd_t));
-    int_errorcode;
+    int errorcode;
 
     char *BLANK = "";
     struct {
@@ -519,6 +522,9 @@
         printf("OPEN ERROR %d (alloc svr): %s\n", ret->status, ret->buf);
         break;
 #else
+        *error = apr_pcalloc(pool, ERR_BUF_SIZE);
+        OCIErrorGet(ret->err, 1, NULL, &errorcode, (unsigned char*)(*error),
+                    ERR_BUF_SIZE, OCI_HTYPE_ERROR);
         return NULL;
 #endif
     case OCI_SUCCESS:
@@ -535,6 +541,9 @@
         printf("OPEN ERROR %d (alloc svc): %s\n", ret->status, ret->buf);
         break;
 #else
+        *error = apr_pcalloc(pool, ERR_BUF_SIZE);
+        OCIErrorGet(ret->err, 1, NULL, &errorcode, (unsigned char*)(*error),
+                    ERR_BUF_SIZE, OCI_HTYPE_ERROR);
         return NULL;
 #endif
     case OCI_SUCCESS:
@@ -555,6 +564,9 @@
         printf("OPEN ERROR: %s\n", ret->buf);
         break;
 #else
+        *error = apr_pcalloc(pool, ERR_BUF_SIZE);
+        OCIErrorGet(ret->err, 1, NULL, &errorcode, (unsigned char*)(*error),
+                    ERR_BUF_SIZE, OCI_HTYPE_ERROR);
         return NULL;
 #endif
     case OCI_SUCCESS:
@@ -571,6 +583,9 @@
         printf("OPEN ERROR %d (server attach): %s\n", ret->status, ret->buf);
         break;
 #else
+        *error = apr_pcalloc(pool, ERR_BUF_SIZE);
+        OCIErrorGet(ret->err, 1, NULL, &errorcode, (unsigned char*)(*error),
+                    ERR_BUF_SIZE, OCI_HTYPE_ERROR);
         return NULL;
 #endif
     case OCI_SUCCESS:
@@ -586,6 +601,9 @@
         printf("OPEN ERROR %d (attr set): %s\n", ret->status, ret->buf);
         break;
 #else
+        *error = apr_pcalloc(pool, ERR_BUF_SIZE);
+        OCIErrorGet(ret->err, 1, NULL, &errorcode, (unsigned char*)(*error),
+                    ERR_BUF_SIZE, OCI_HTYPE_ERROR);
         return NULL;
 #endif
     case OCI_SUCCESS:
@@ -601,6 +619,9 @@
         printf("OPEN ERROR %d (alloc auth): %s\n", ret->status, ret->buf);
         break;
 #else
+        *error = apr_pcalloc(pool, ERR_BUF_SIZE);
+        OCIErrorGet(ret->err, 1, NULL, &errorcode, (unsigned char*)(*error),
+                    ERR_BUF_SIZE, OCI_HTYPE_ERROR);
         return NULL;
 #endif
     case OCI_SUCCESS:
@@ -616,6 +637,9 @@
         printf("OPEN ERROR %d (attr username): %s\n", ret->status, ret->buf);
         break;
 #else
+        *error = apr_pcalloc(pool, ERR_BUF_SIZE);
+        OCIErrorGet(ret->err, 1, NULL, &errorcode, (unsigned char*)(*error),
+                    ERR_BUF_SIZE, OCI_HTYPE_ERROR);
         return NULL;
 #endif
     case OCI_SUCCESS:
@@ -631,6 +655,9 @@
         printf("OPEN ERROR %d (attr password): %s\n", ret->status, ret->buf);
         break;
 #else
+        *error = apr_pcalloc(pool, ERR_BUF_SIZE);
+        OCIErrorGet(ret->err, 1, NULL, &errorcode, (unsigned char*)(*error),
+                    ERR_BUF_SIZE, OCI_HTYPE_ERROR);
         return NULL;
 #endif
     case OCI_SUCCESS:
@@ -646,6 +673,9 @@
         printf("OPEN ERROR %d (session begin): %s\n", ret->status, ret->buf);
         break;
 #else
+        *error = apr_pcalloc(pool, ERR_BUF_SIZE);
+        OCIErrorGet(ret->err, 1, NULL, &errorcode, (unsigned char*)(*error),
+                    ERR_BUF_SIZE, OCI_HTYPE_ERROR);
         return NULL;
 #endif
     case OCI_SUCCESS:
@@ -660,6 +690,9 @@
                     sizeof(ret->buf), OCI_HTYPE_ERROR);
         printf("OPEN ERROR %d (attr session): %s\n", ret->status, ret->buf);
 #else
+        *error = apr_pcalloc(pool, ERR_BUF_SIZE);
+        OCIErrorGet(ret->err, 1, NULL, &errorcode, (unsigned char*)(*error),
+                    ERR_BUF_SIZE, OCI_HTYPE_ERROR);
         return NULL;
 #endif
         break;

Modified: apr/apr-util/trunk/dbd/apr_dbd_pgsql.c
URL: http://svn.apache.org/viewvc/apr/apr-util/trunk/dbd/apr_dbd_pgsql.c?rev=590501&r1=590500&r2=590501&view=diff
==============================================================================
--- apr/apr-util/trunk/dbd/apr_dbd_pgsql.c (original)
+++ apr/apr-util/trunk/dbd/apr_dbd_pgsql.c Tue Oct 30 15:54:37 2007
@@ -1176,7 +1176,8 @@
     return trans->mode = (mode & TXN_MODE_BITS);
 }
 
-static apr_dbd_t *dbd_pgsql_open(apr_pool_t *pool, const char *params)
+static apr_dbd_t *dbd_pgsql_open(apr_pool_t *pool, const char *params,
+                                 const char **error)
 {
     apr_dbd_t *sql;
     
@@ -1187,6 +1188,9 @@
      * liable to segfault, so just close it out now.  it would be nice
      * if we could give an indication of why we failed to connect... */
     if (PQstatus(conn) != CONNECTION_OK) {
+        if (error) {
+            *error = apr_pstrdup(pool, PQerrorMessage(conn));
+        }
         PQfinish(conn);
         return NULL;
     }

Modified: apr/apr-util/trunk/dbd/apr_dbd_sqlite2.c
URL: http://svn.apache.org/viewvc/apr/apr-util/trunk/dbd/apr_dbd_sqlite2.c?rev=590501&r1=590500&r2=590501&view=diff
==============================================================================
--- apr/apr-util/trunk/dbd/apr_dbd_sqlite2.c (original)
+++ apr/apr-util/trunk/dbd/apr_dbd_sqlite2.c Tue Oct 30 15:54:37 2007
@@ -446,7 +446,14 @@
     return trans->mode = (mode & TXN_MODE_BITS);
 }
 
-static apr_dbd_t *dbd_sqlite_open(apr_pool_t * pool, const char *params_)
+static apr_status_t error_free(void *data)
+{
+    free(data);
+    return APR_SUCCESS;
+}
+
+static apr_dbd_t *dbd_sqlite_open(apr_pool_t * pool, const char *params_,
+                                  const char **error)
 {
     apr_dbd_t *sql;
     sqlite *conn = NULL;
@@ -465,7 +472,19 @@
             iperms = atoi(perm);
     }
 
-    conn = sqlite_open(params, iperms, NULL);
+    if (error) {
+        *error = NULL;
+
+        conn = sqlite_open(params, iperms, (char **)error);
+
+        if (*error) {
+            apr_pool_cleanup_register(pool, *error, error_free,
+                                      apr_pool_cleanup_null);
+        }
+    }
+    else {
+        conn = sqlite_open(params, iperms, NULL);
+    }
 
     sql = apr_pcalloc(pool, sizeof(*sql));
     sql->conn = conn;

Modified: apr/apr-util/trunk/dbd/apr_dbd_sqlite3.c
URL: http://svn.apache.org/viewvc/apr/apr-util/trunk/dbd/apr_dbd_sqlite3.c?rev=590501&r1=590500&r2=590501&view=diff
==============================================================================
--- apr/apr-util/trunk/dbd/apr_dbd_sqlite3.c (original)
+++ apr/apr-util/trunk/dbd/apr_dbd_sqlite3.c Tue Oct 30 15:54:37 2007
@@ -814,7 +814,8 @@
     return trans->mode = (mode & TXN_MODE_BITS);
 }
 
-static apr_dbd_t *dbd_sqlite3_open(apr_pool_t *pool, const char *params)
+static apr_dbd_t *dbd_sqlite3_open(apr_pool_t *pool, const char *params,
+                                   const char **error)
 {
     apr_dbd_t *sql = NULL;
     sqlite3 *conn = NULL;
@@ -823,6 +824,9 @@
         return NULL;
     sqlres = sqlite3_open(params, &conn);
     if (sqlres != SQLITE_OK) {
+        if (error) {
+            *error = apr_pstrdup(pool, sqlite3_errmsg(conn));
+        }
         sqlite3_close(conn);
         return NULL;
     }

Modified: apr/apr-util/trunk/include/apr_dbd.h
URL: http://svn.apache.org/viewvc/apr/apr-util/trunk/include/apr_dbd.h?rev=590501&r1=590500&r2=590501&view=diff
==============================================================================
--- apr/apr-util/trunk/include/apr_dbd.h (original)
+++ apr/apr-util/trunk/include/apr_dbd.h Tue Oct 30 15:54:37 2007
@@ -105,12 +105,13 @@
 APU_DECLARE(apr_status_t) apr_dbd_get_driver(apr_pool_t *pool, const char *name,
                                              const apr_dbd_driver_t **driver);
 
-/** apr_dbd_open: open a connection to a backend
+/** apr_dbd_open_ex: open a connection to a backend
  *
  *  @param pool - working pool
  *  @param params - arguments to driver (implementation-dependent)
  *  @param handle - pointer to handle to return
  *  @param driver - driver struct.
+ *  @param error - descriptive error.
  *  @return APR_SUCCESS for success
  *  @return APR_EGENERAL if driver exists but connection failed
  *  @remarks PostgreSQL: the params is passed directly to the PQconnectdb()
@@ -134,6 +135,21 @@
  *  this value is 1 MB. The value associated with "group" determines which
  *  group from configuration file to use (see MYSQL_READ_DEFAULT_GROUP option
  *  of mysql_options() in MySQL manual).
+ */
+APU_DECLARE(apr_status_t) apr_dbd_open_ex(const apr_dbd_driver_t *driver,
+                                          apr_pool_t *pool, const char *params,
+                                          apr_dbd_t **handle,
+                                          const char **error);
+
+/** apr_dbd_open: open a connection to a backend
+ *
+ *  @param pool - working pool
+ *  @param params - arguments to driver (implementation-dependent)
+ *  @param handle - pointer to handle to return
+ *  @param driver - driver struct.
+ *  @return APR_SUCCESS for success
+ *  @return APR_EGENERAL if driver exists but connection failed
+ *  @see apr_dbd_open_ex
  */
 APU_DECLARE(apr_status_t) apr_dbd_open(const apr_dbd_driver_t *driver,
                                        apr_pool_t *pool, const char *params,

Modified: apr/apr-util/trunk/include/private/apr_dbd_internal.h
URL: http://svn.apache.org/viewvc/apr/apr-util/trunk/include/private/apr_dbd_internal.h?rev=590501&r1=590500&r2=590501&view=diff
==============================================================================
--- apr/apr-util/trunk/include/private/apr_dbd_internal.h (original)
+++ apr/apr-util/trunk/include/private/apr_dbd_internal.h Tue Oct 30 15:54:37 2007
@@ -62,10 +62,12 @@
      *  a lifetime other than a request
      *
      *  @param pool - a pool to use for error messages (if any).
-     *  @param s - server rec managing the underlying connection/pool.
+     *  @param params - connection parameters.
+     *  @param error - descriptive error.
      *  @return database handle, or NULL on error.
      */
-    apr_dbd_t *(*open)(apr_pool_t *pool, const char *params);
+    apr_dbd_t *(*open)(apr_pool_t *pool, const char *params,
+                       const char **error);
 
     /** check_conn: check status of a database connection
      *



Re: svn commit: r590501 - in /apr/apr-util/trunk: CHANGES dbd/apr_dbd.c dbd/apr_dbd_freetds.c dbd/apr_dbd_mysql.c dbd/apr_dbd_oracle.c dbd/apr_dbd_pgsql.c dbd/apr_dbd_sqlite2.c dbd/apr_dbd_sqlite3.c include/apr_dbd.h include/private/apr_dbd_internal.h

Posted by Bojan Smojver <bo...@rexursive.com>.
On Tue, 2007-10-30 at 22:54 +0000, bojan@apache.org wrote:

> Introduce apr_dbd_open_ex()

Given that nobody complained to the patch I sent to the list a while
ago, I decided to rely on CTR. Please let me know if any breakage was
introduced with this commit.

> NOTE: FreeTDS driver needs to be fixed to use the new error argument

Could someone with knowledge of FreeTDS have a look and implement this
new functionality (i.e. return human readable error on failure). At
present, this new argument is passed to the driver, but it is unused.

-- 
Bojan