From b8790b1b48c238f2ba266e34625b8e8f5db0ad6e Mon Sep 17 00:00:00 2001 From: Edward Rudd Date: Sat, 14 Mar 2009 22:07:56 +0000 Subject: refactoroed to allo wdb connections to be per-thread added initial threading implementation using apr_queues and apr_thread_pools --- (limited to 'utility/database.c') diff --git a/utility/database.c b/utility/database.c index 98c203b..ff81caa 100644 --- a/utility/database.c +++ b/utility/database.c @@ -19,15 +19,16 @@ void database_init(apr_pool_t *p) apr_dbd_init(p); } -apr_status_t database_connect(config_t *cfg) +/** @todo split this into load and connect */ +apr_status_t database_connect(config_t *cfg, config_dbd_t **dbconn) { apr_status_t rv; if (!cfg->dbdriver || !cfg->dbparams) return APR_EINVAL; - if (!cfg->dbconn) { - cfg->dbconn = apr_pcalloc(cfg->pool, sizeof(config_dbd_t)); + if (!*dbconn) { + *dbconn = apr_pcalloc(cfg->pool, sizeof(config_dbd_t)); } - rv = apr_dbd_get_driver(cfg->pool, cfg->dbdriver, &(cfg->dbconn->driver)); + rv = apr_dbd_get_driver(cfg->pool, cfg->dbdriver, &((*dbconn)->driver)); if (rv) { logging_log(cfg, LOGLEVEL_ERROR, @@ -36,8 +37,8 @@ apr_status_t database_connect(config_t *cfg) return rv; } - rv = apr_dbd_open(cfg->dbconn->driver, cfg->pool, cfg->dbparams, - &(cfg->dbconn->dbd)); + rv = apr_dbd_open((*dbconn)->driver, cfg->pool, cfg->dbparams, + &((*dbconn)->dbd)); if (rv) { logging_log(cfg, LOGLEVEL_ERROR, "DB: Could not connect to database. Error (%d)%s", rv, @@ -48,12 +49,13 @@ apr_status_t database_connect(config_t *cfg) return APR_SUCCESS; } -apr_status_t database_disconnect(config_t *cfg) +apr_status_t database_disconnect(config_dbd_t *dbconn) { - return apr_dbd_close(cfg->dbconn->driver, cfg->dbconn->dbd); + return apr_dbd_close(dbconn->driver, dbconn->dbd); } -static apr_dbd_prepared_t *database_prepare_insert(config_t *cfg, apr_pool_t *p) +static apr_dbd_prepared_t *database_prepare_insert(config_t *cfg, + config_dbd_t *dbconn, apr_pool_t *p) { apr_status_t rv; char *sql; @@ -93,19 +95,20 @@ static apr_dbd_prepared_t *database_prepare_insert(config_t *cfg, apr_pool_t *p) logging_log(cfg, LOGLEVEL_DEBUG, "DB: Generated SQL: %s", sql); - rv = apr_dbd_prepare(cfg->dbconn->driver, cfg->pool, cfg->dbconn->dbd, sql, + rv = apr_dbd_prepare(dbconn->driver, cfg->pool, dbconn->dbd, sql, "INSERT", &stmt); if (rv) { logging_log(cfg, LOGLEVEL_NOISE, "DB: Unable to Prepare SQL insert: %s", apr_dbd_error( - cfg->dbconn->driver, cfg->dbconn->dbd, rv)); + dbconn->driver, dbconn->dbd, rv)); return NULL; } return stmt; } -apr_status_t database_insert(config_t *cfg, apr_pool_t *p, apr_table_t *data) +apr_status_t database_insert(config_t *cfg, config_dbd_t *dbconn, + apr_pool_t *p, apr_table_t *data) { apr_status_t rv; int f, nfs; @@ -113,93 +116,95 @@ apr_status_t database_insert(config_t *cfg, apr_pool_t *p, apr_table_t *data) ofields = (config_output_field_t *)cfg->output_fields->elts; nfs = cfg->output_fields->nelts; // Prepare statement - if (!cfg->dbconn->stmt) { - cfg->dbconn->stmt = database_prepare_insert(cfg, p); - if (!cfg->dbconn->stmt) { + if (!dbconn->stmt) { + dbconn->stmt = database_prepare_insert(cfg, dbconn, p); + if (!dbconn->stmt) { return APR_EINVAL; } - cfg->dbconn->args = apr_palloc(cfg->pool, nfs * sizeof(char *)); + dbconn->args = apr_palloc(cfg->pool, nfs * sizeof(char *)); } for (f=0; fdbconn->args[f] = apr_table_get(data, ofields[f].field); + dbconn->args[f] = apr_table_get(data, ofields[f].field); } - rv = apr_dbd_pquery(cfg->dbconn->driver, p, cfg->dbconn->dbd, &f, - cfg->dbconn->stmt, nfs, cfg->dbconn->args); + rv = apr_dbd_pquery(dbconn->driver, p, dbconn->dbd, &f, + dbconn->stmt, nfs, dbconn->args); if (rv) { logging_log(cfg, LOGLEVEL_ERROR, "DB: Unable to Insert SQL: %s", - apr_dbd_error(cfg->dbconn->driver, cfg->dbconn->dbd, rv)); + apr_dbd_error(dbconn->driver, dbconn->dbd, rv)); return rv; } return APR_SUCCESS; } -apr_status_t database_trans_start(config_t *cfg, apr_pool_t *p) +apr_status_t database_trans_start(config_t *cfg, config_dbd_t *dbconn, + apr_pool_t *p) { #if HAVE_APR_DBD_TRANSACTION_MODE_GET apr_status_t rv; if (!cfg->transactions) return APR_SUCCESS; - if (cfg->dbconn->txn) { + if (dbconn->txn) { logging_log(cfg, LOGLEVEL_NOISE, "Transaction Already Started. Something is BROKE"); return APR_EINVAL; } logging_log(cfg, LOGLEVEL_DEBUG, "DB: Starting Transaction"); - rv = apr_dbd_transaction_start(cfg->dbconn->driver, p, cfg->dbconn->dbd, - &cfg->dbconn->txn); + rv = apr_dbd_transaction_start(dbconn->driver, p, dbconn->dbd, + &dbconn->txn); if (rv) logging_log(cfg, LOGLEVEL_NOISE, "DB: Error Starting Transaction: (%d)%s", rv, apr_dbd_error( - cfg->dbconn->driver, cfg->dbconn->dbd, rv)); + dbconn->driver, dbconn->dbd, rv)); return rv; #else return APR_SUCCESS; #endif } -apr_status_t database_trans_stop(config_t *cfg, apr_pool_t *p) +apr_status_t database_trans_stop(config_t *cfg, config_dbd_t *dbconn, + apr_pool_t *p) { #if HAVE_APR_DBD_TRANSACTION_MODE_GET apr_status_t rv; if (!cfg->transactions) return APR_SUCCESS; - if (!cfg->dbconn->txn) { + if (!dbconn->txn) { logging_log(cfg, LOGLEVEL_NOISE, "No Transaction Started. Something is BROKE"); return APR_EINVAL; } logging_log(cfg, LOGLEVEL_DEBUG, "DB: Stopping Transaction"); - rv = apr_dbd_transaction_end(cfg->dbconn->driver, p, cfg->dbconn->txn); + rv = apr_dbd_transaction_end(dbconn->driver, p, dbconn->txn); if (rv) logging_log(cfg, LOGLEVEL_NOISE, "DB: Error Stopping Transaction: (%d)%s", rv, apr_dbd_error( - cfg->dbconn->driver, cfg->dbconn->dbd, rv)); + dbconn->driver, dbconn->dbd, rv)); - cfg->dbconn->txn = NULL; + dbconn->txn = NULL; return rv; #else return APR_SUCCESS; #endif } -apr_status_t database_trans_abort(config_t *cfg) +apr_status_t database_trans_abort(config_t *cfg, config_dbd_t *dbconn) { #if HAVE_APR_DBD_TRANSACTION_MODE_GET apr_status_t rv; if (!cfg->transactions) return APR_SUCCESS; - if (!cfg->dbconn->txn) { + if (!dbconn->txn) { logging_log(cfg, LOGLEVEL_NOISE, "No Transaction Started. Something is BROKE"); return APR_EINVAL; } logging_log(cfg, LOGLEVEL_NOTICE, "DB: Aborting Transaction"); - rv = apr_dbd_transaction_mode_set(cfg->dbconn->driver, cfg->dbconn->txn, + rv = apr_dbd_transaction_mode_set(dbconn->driver, dbconn->txn, APR_DBD_TRANSACTION_ROLLBACK); if (rv) logging_log(cfg, LOGLEVEL_NOISE, "DB: Error Aborting Transaction: (%d)%s", rv, apr_dbd_error( - cfg->dbconn->driver, cfg->dbconn->dbd, rv)); + dbconn->driver, dbconn->dbd, rv)); return rv; #else return APR_SUCCESS; -- cgit v0.9.2