From 19bbdd68a491721dd4aeff7cacea51148ce3a9b9 Mon Sep 17 00:00:00 2001 From: Edward Rudd Date: Fri, 24 Oct 2008 13:55:48 +0000 Subject: add logging function added @todo tags for what needs to be finished --- (limited to 'utility/database.c') diff --git a/utility/database.c b/utility/database.c index a979268..45022da 100644 --- a/utility/database.c +++ b/utility/database.c @@ -3,6 +3,8 @@ #include "apr_dbd.h" #include "apr_strings.h" +#include "util.h" + struct config_dbd_t { const apr_dbd_driver_t *driver; apr_dbd_t *dbd; @@ -18,17 +20,26 @@ void database_init(apr_pool_t *p) apr_status_t database_connect(config_t *cfg) { 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)); } rv = apr_dbd_get_driver(cfg->pool, cfg->dbdriver, &(cfg->dbconn->driver)); - if (rv) + if (rv) { + logging_log(cfg, LOGLEVEL_ERROR, + "Could not load database driver %s. Error %d", cfg->dbdriver, + rv); return rv; + } rv = apr_dbd_open(cfg->dbconn->driver, cfg->pool, cfg->dbparams, &(cfg->dbconn->dbd)); - if (rv) + if (rv) { + logging_log(cfg, LOGLEVEL_ERROR, + "Could not connect to database. Error %d", rv); return rv; + } return APR_SUCCESS; } @@ -38,6 +49,56 @@ apr_status_t database_disconnect(config_t *cfg) return apr_dbd_close(cfg->dbconn->driver, cfg->dbconn->dbd); } +static apr_dbd_prepared_t *database_prepare_insert(config_t *cfg, apr_pool_t *p) +{ + apr_status_t rv; + char *sql; + int i, f; + struct iovec *vec; + apr_dbd_prepared_t *stmt; + int nfs = cfg->output_fields->nelts; + config_output_field_t *ofields; + + ofields = (config_output_field_t *)cfg->output_fields->elts; + + vec = apr_palloc(p, (nfs*2 + 5) * sizeof(struct iovec)); + sql = apr_palloc(p, (nfs*3)); + + vec[0].iov_base = "INSERT INTO "; + vec[0].iov_len = 12; + vec[1].iov_base = (void *)cfg->table; + vec[1].iov_len = strlen(cfg->table); + vec[2].iov_base = " ("; + vec[2].iov_len = 2; + for (i=3, f=0; fdbconn->driver, cfg->pool, cfg->dbconn->dbd, sql, + "INSERT", &stmt); + + if (rv) { + printf("DB Error: %s\n", apr_dbd_error(cfg->dbconn->driver, + cfg->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 rv; @@ -47,41 +108,8 @@ apr_status_t database_insert(config_t *cfg, apr_pool_t *p, apr_table_t *data) nfs = cfg->output_fields->nelts; // Prepare statement if (!cfg->dbconn->stmt) { - char *sql; - int i; - struct iovec *vec; - vec = apr_palloc(p, (nfs*2 + 5) * sizeof(struct iovec)); - sql = apr_palloc(p, (nfs*3)); - vec[0].iov_base = "INSERT INTO "; - vec[0].iov_len = 12; - vec[1].iov_base = (void *)cfg->table; - vec[1].iov_len = strlen(cfg->table); - vec[2].iov_base = " ("; - vec[2].iov_len = 2; - for (i=3, f=0; fdbconn->stmt = database_prepare_insert(cfg, p); cfg->dbconn->args = apr_palloc(cfg->pool, nfs * sizeof(char *)); - rv = apr_dbd_prepare(cfg->dbconn->driver, cfg->pool, cfg->dbconn->dbd, - sql, "INSERT", &(cfg->dbconn->stmt)); - if (rv) { - printf("DB Error: %s\n", apr_dbd_error(cfg->dbconn->driver, - cfg->dbconn->dbd, rv)); - return rv; - } } for (f=0; fdbconn->args[f] = apr_table_get(data, ofields[f].field); @@ -95,3 +123,5 @@ apr_status_t database_insert(config_t *cfg, apr_pool_t *p, apr_table_t *data) } return APR_SUCCESS; } + +/** @todo implement transactions */ -- cgit v0.9.2