From: Nick Kew Date: Wed, 16 Nov 2005 22:08:41 +0000 (+0000) Subject: Backport today's simple fixes X-Git-Tag: 2.1.10~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=313307a2f6a2c056eec7843bff217a98fe132dc4;p=thirdparty%2Fapache%2Fhttpd.git Backport today's simple fixes git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.2.x@345135 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/modules/database/mod_dbd.c b/modules/database/mod_dbd.c index 932ca4a931b..7a7aa2ffdb1 100644 --- a/modules/database/mod_dbd.c +++ b/modules/database/mod_dbd.c @@ -76,7 +76,7 @@ static const char *dbd_param(cmd_parms *cmd, void *cfg, const char *val) svr->name = val; /* loading the driver involves once-only dlloading that is * best done at server startup. This also guarantees that - * load_driver won't return an error later. + * we won't return an error later. */ switch (apr_dbd_get_driver(cmd->pool, svr->name, &driver)) { case APR_ENOTIMPL: @@ -185,6 +185,7 @@ static void *dbd_cfg(apr_pool_t *p, server_rec *x) { svr_cfg *svr = (svr_cfg*) apr_pcalloc(p, sizeof(svr_cfg)); svr->persist = -1; + svr->name = svr->params = ""; /* don't risk segfault on misconfiguration */ #if APR_HAS_THREADS svr->nmin = DEFAULT_NMIN; svr->nkeep = DEFAULT_NKEEP; @@ -298,6 +299,23 @@ static apr_status_t dbd_setup(apr_pool_t *pool, server_rec *s) - open acquires a connection from the pool (opens one if necessary) - close releases it back in to the pool */ +void ap_dbd_close(server_rec *s, ap_dbd_t *sql) +{ + svr_cfg *svr = ap_get_module_config(s->module_config, &dbd_module); + if (!svr->persist) { + apr_dbd_close(sql->driver, sql->handle); + } +#if APR_HAS_THREADS + else { + apr_reslist_release(svr->dbpool, sql); + } +#endif +} +static apr_status_t dbd_close(void *CONN) +{ + ap_dbd_t *conn = CONN; + return apr_dbd_close(conn->driver, conn->handle); +} #define arec ((ap_dbd_t*)rec) #if APR_HAS_THREADS ap_dbd_t* ap_dbd_open(apr_pool_t *pool, server_rec *s) @@ -366,29 +384,15 @@ ap_dbd_t* ap_dbd_open(apr_pool_t *pool, server_rec *s) } /* We don't have a connection right now, so we'll open one */ if (!svr->conn) { - rv = dbd_construct(&rec, svr, s->process->pool); - svr->conn = (rv == APR_SUCCESS) ? arec : NULL; + if (dbd_construct(&rec, svr, s->process->pool) == APR_SUCCESS) { + svr->conn = arec ; + apr_pool_cleanup_register(s->process->pool, svr->conn, + dbd_close, apr_pool_cleanup_null); + } } return svr->conn; } #endif -void ap_dbd_close(server_rec *s, ap_dbd_t *sql) -{ - svr_cfg *svr = ap_get_module_config(s->module_config, &dbd_module); - if (!svr->persist) { - apr_dbd_close(sql->driver, sql->handle); - } -#if APR_HAS_THREADS - else { - apr_reslist_release(svr->dbpool, sql); - } -#endif -} -static apr_status_t dbd_close(void *CONN) -{ - ap_dbd_t *conn = CONN; - return apr_dbd_close(conn->driver, conn->handle); -} #if APR_HAS_THREADS typedef struct { ap_dbd_t *conn; diff --git a/modules/database/mod_dbd.h b/modules/database/mod_dbd.h index f98df9948e1..83f2535d1c8 100644 --- a/modules/database/mod_dbd.h +++ b/modules/database/mod_dbd.h @@ -64,7 +64,10 @@ AP_DECLARE(ap_dbd_t*) ap_dbd_acquire(request_rec*); */ AP_DECLARE(ap_dbd_t*) ap_dbd_cacquire(conn_rec*); -/* Prepare a statement for use by a client module */ +/* Prepare a statement for use by a client module during + * the server startup/configuration phase. Can't be called + * after the server has created its children (use apr_dbd_*). + */ AP_DECLARE(void) ap_dbd_prepare(server_rec*, const char*, const char*); /* Also export them as optional functions for modules that prefer it */