From: Nick Kew Date: Sun, 9 Oct 2005 14:19:22 +0000 (+0000) Subject: Support dbd connections tied to the conn_rec. X-Git-Tag: 2.3.0~2891 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7d8187cc83dccd37d1958bef206cc5a3a67a8d59;p=thirdparty%2Fapache%2Fhttpd.git Support dbd connections tied to the conn_rec. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@307439 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/modules/database/mod_dbd.c b/modules/database/mod_dbd.c index bdf78176b2e..fff0e4b2cb5 100644 --- a/modules/database/mod_dbd.c +++ b/modules/database/mod_dbd.c @@ -420,6 +420,29 @@ ap_dbd_t *ap_dbd_acquire(request_rec *r) } return req->conn; } +ap_dbd_t *ap_dbd_cacquire(conn_rec *c) +{ + svr_cfg *svr; + dbd_pool_rec *req = ap_get_module_config(c->conn_config, &dbd_module); + if (!req) { + req = apr_palloc(c->pool, sizeof(dbd_pool_rec)); + req->conn = ap_dbd_open(c->pool, c->base_server); + if (req->conn) { + svr = ap_get_module_config(c->base_server->module_config, &dbd_module); + ap_set_module_config(c->conn_config, &dbd_module, req); + if (svr->persist) { + req->dbpool = svr->dbpool; + apr_pool_cleanup_register(c->pool, req, dbd_release, + apr_pool_cleanup_null); + } + else { + apr_pool_cleanup_register(c->pool, req->conn, dbd_close, + apr_pool_cleanup_null); + } + } + } + return req->conn; +} #else ap_dbd_t *ap_dbd_acquire(request_rec *r) { @@ -428,7 +451,7 @@ ap_dbd_t *ap_dbd_acquire(request_rec *r) if (!ret) { svr = ap_get_module_config(r->server->module_config, &dbd_module); ret = ap_dbd_open(r->pool, r->server); - if ( ret ) { + if (ret) { ap_set_module_config(r->request_config, &dbd_module, ret); if (!svr->persist) { apr_pool_cleanup_register(r->pool, svr->conn, dbd_close, @@ -439,6 +462,24 @@ ap_dbd_t *ap_dbd_acquire(request_rec *r) } return ret; } +ap_dbd_t *ap_dbd_cacquire(conn_rec *c) +{ + svr_cfg *svr; + ap_dbd_t *ret = ap_get_module_config(c->conn_config, &dbd_module); + if (!ret) { + svr = ap_get_module_config(c->base_server->module_config, &dbd_module); + ret = ap_dbd_open(c->pool, c->base_server); + if (ret) { + ap_set_module_config(c->conn_config, &dbd_module, ret); + if (!svr->persist) { + apr_pool_cleanup_register(c->pool, svr->conn, dbd_close, + apr_pool_cleanup_null); + } + /* if persist then dbd_open registered cleanup on proc pool */ + } + } + return ret; +} #endif static void dbd_hooks(apr_pool_t *pool) @@ -449,6 +490,7 @@ static void dbd_hooks(apr_pool_t *pool) APR_REGISTER_OPTIONAL_FN(ap_dbd_open); APR_REGISTER_OPTIONAL_FN(ap_dbd_close); APR_REGISTER_OPTIONAL_FN(ap_dbd_acquire); + APR_REGISTER_OPTIONAL_FN(ap_dbd_cacquire); APR_REGISTER_OPTIONAL_FN(ap_dbd_prepare); apr_dbd_init(pool); } diff --git a/modules/database/mod_dbd.h b/modules/database/mod_dbd.h index 252981367c7..f98df9948e1 100644 --- a/modules/database/mod_dbd.h +++ b/modules/database/mod_dbd.h @@ -58,6 +58,12 @@ AP_DECLARE(void) ap_dbd_close(server_rec*, ap_dbd_t*); */ AP_DECLARE(ap_dbd_t*) ap_dbd_acquire(request_rec*); +/* acquire a connection that will have the lifetime of a connection + * and MUST NOT be explicitly closed. Return NULL on error. + * This is the preferred function for most applications. + */ +AP_DECLARE(ap_dbd_t*) ap_dbd_cacquire(conn_rec*); + /* Prepare a statement for use by a client module */ AP_DECLARE(void) ap_dbd_prepare(server_rec*, const char*, const char*); @@ -65,6 +71,7 @@ AP_DECLARE(void) ap_dbd_prepare(server_rec*, const char*, const char*); APR_DECLARE_OPTIONAL_FN(ap_dbd_t*, ap_dbd_open, (apr_pool_t*, server_rec*)); APR_DECLARE_OPTIONAL_FN(void, ap_dbd_close, (server_rec*, ap_dbd_t*)); APR_DECLARE_OPTIONAL_FN(ap_dbd_t*, ap_dbd_acquire, (request_rec*)); +APR_DECLARE_OPTIONAL_FN(ap_dbd_t*, ap_dbd_cacquire, (conn_rec*)); APR_DECLARE_OPTIONAL_FN(void, ap_dbd_prepare, (server_rec*, const char*, const char*)); #endif