diff options
| author | 2008-09-21 15:54:12 +0000 | |
|---|---|---|
| committer | 2008-09-21 15:54:12 +0000 | |
| commit | ba30ceeb705e9b4d40ce0d98f6a4e047d47ce919 (patch) | |
| tree | 5768679317a303031c80be6cba683b6addeb07ac /src/mod_log_sql_dbd.c | |
| parent | d33662354f64354c601ae257bd5b1b043c484d97 (diff) | |
moved all modules source to src subdirectory.. Moved header files into include subdirectory
cleaned up makefiles.
Diffstat (limited to 'src/mod_log_sql_dbd.c')
| -rw-r--r-- | src/mod_log_sql_dbd.c | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/src/mod_log_sql_dbd.c b/src/mod_log_sql_dbd.c new file mode 100644 index 0000000..c78a128 --- /dev/null +++ b/src/mod_log_sql_dbd.c | |||
| @@ -0,0 +1,132 @@ | |||
| 1 | /* $Id: mod_log_sql_dbi.c 120 2004-04-17 15:14:12Z urkle@drip.ws $ */ | ||
| 2 | |||
| 3 | #if defined(WITH_APACHE20) | ||
| 4 | # include "apache20.h" | ||
| 5 | #else | ||
| 6 | # error Unsupported Apache version | ||
| 7 | #endif | ||
| 8 | |||
| 9 | |||
| 10 | #ifdef HAVE_CONFIG_H | ||
| 11 | /* Undefine these to prevent conflicts between Apache ap_config_auto.h and | ||
| 12 | * my config.h. Only really needed for Apache < 2.0.48, but it can't hurt. | ||
| 13 | */ | ||
| 14 | #undef PACKAGE_BUGREPORT | ||
| 15 | #undef PACKAGE_NAME | ||
| 16 | #undef PACKAGE_STRING | ||
| 17 | #undef PACKAGE_TARNAME | ||
| 18 | #undef PACKAGE_VERSION | ||
| 19 | |||
| 20 | #include "config.h" | ||
| 21 | #endif | ||
| 22 | |||
| 23 | #include "mod_log_sql.h" | ||
| 24 | |||
| 25 | #include "apr_dbd.h" | ||
| 26 | #include "mod_dbd.h" | ||
| 27 | |||
| 28 | typedef struct { | ||
| 29 | ap_dbd_t *dbd; | ||
| 30 | } request_config_t; | ||
| 31 | |||
| 32 | LOGSQL_MODULE_FORWARD(dbd); | ||
| 33 | |||
| 34 | static ap_dbd_t *(*dbd_acquire_fn)(request_rec*) = NULL; | ||
| 35 | |||
| 36 | static ap_dbd_t *log_sql_dbd_getconnection(request_rec *r) | ||
| 37 | { | ||
| 38 | request_config_t *rconf = ap_get_module_config(r->request_config, &LOGSQL_MODULE(dbd)); | ||
| 39 | if (!rconf) { | ||
| 40 | rconf = apr_pcalloc(r->pool, sizeof(request_config_t)); | ||
| 41 | ap_set_module_config(r->request_config, &LOGSQL_MODULE(dbd), (void *)rconf); | ||
| 42 | rconf->dbd = dbd_acquire_fn(r); | ||
| 43 | } | ||
| 44 | return rconf->dbd; | ||
| 45 | } | ||
| 46 | |||
| 47 | /* Connect to the database */ | ||
| 48 | static logsql_opendb_ret log_sql_dbd_connect(server_rec *s, logsql_dbconnection *db) | ||
| 49 | { | ||
| 50 | // We are using mod_dbd so we don't do anything here | ||
| 51 | if (!dbd_acquire_fn) { | ||
| 52 | // no mod_dbd return failure | ||
| 53 | log_error(APLOG_MARK,APLOG_ERR,0, s,"mod_log_sql_dbd: mod_dbd is not loaded or available"); | ||
| 54 | return LOGSQL_OPENDB_FAIL; | ||
| 55 | } else { | ||
| 56 | return LOGSQL_OPENDB_SUCCESS; | ||
| 57 | } | ||
| 58 | } | ||
| 59 | |||
| 60 | /* Close the DB link */ | ||
| 61 | static void log_sql_dbd_close(logsql_dbconnection *db) | ||
| 62 | { | ||
| 63 | // mod_dbd handles this, so do nothing | ||
| 64 | } | ||
| 65 | |||
| 66 | /* Routine to escape the 'dangerous' characters that would otherwise | ||
| 67 | * corrupt the INSERT string: ', \, and " | ||
| 68 | */ | ||
| 69 | static const char *log_sql_dbd_escape(request_rec *r, const char *from_str, apr_pool_t *p, | ||
| 70 | logsql_dbconnection *db) | ||
| 71 | { | ||
| 72 | // Acquire a DBD connection from mod_dbd | ||
| 73 | ap_dbd_t *dbd = log_sql_dbd_getconnection(r); | ||
| 74 | if (!dbd) return NULL; | ||
| 75 | |||
| 76 | if (!from_str) | ||
| 77 | return NULL; | ||
| 78 | |||
| 79 | return apr_pstrcat(p, "'",apr_dbd_escape(dbd->driver, p, from_str, dbd->handle),"'",NULL); | ||
| 80 | } | ||
| 81 | |||
| 82 | /* Run an insert query and return a categorized error or success */ | ||
| 83 | static logsql_query_ret log_sql_dbd_query(request_rec *r,logsql_dbconnection *db, | ||
| 84 | const char *query) | ||
| 85 | { | ||
| 86 | int ret; | ||
| 87 | const char *err; | ||
| 88 | int affected; | ||
| 89 | // Acquire a DBD connection from mod_dbd | ||
| 90 | ap_dbd_t *dbd = log_sql_dbd_getconnection(r); | ||
| 91 | if (!dbd) return LOGSQL_QUERY_NOLINK; | ||
| 92 | |||
| 93 | // Run the query | ||
| 94 | ret = apr_dbd_query(dbd->driver, dbd->handle, &affected, query); | ||
| 95 | if (ret == 0) { | ||
| 96 | return LOGSQL_QUERY_SUCCESS; | ||
| 97 | } else { | ||
| 98 | // attempt to detect error message | ||
| 99 | err = apr_dbd_error(dbd->driver, dbd->handle, ret); | ||
| 100 | log_error(APLOG_MARK, APLOG_ERR, 0, r->server, "DB Returned error: (%d) %s", ret, err); | ||
| 101 | // Unable to check if "NO SUCH TABLE" due to apr_dbd not mapping error codes to a standard set. | ||
| 102 | return LOGSQL_QUERY_FAIL; | ||
| 103 | } | ||
| 104 | } | ||
| 105 | |||
| 106 | /* Create table table_name of type table_type. */ | ||
| 107 | static logsql_table_ret log_sql_dbd_create(request_rec *r, logsql_dbconnection *db, | ||
| 108 | logsql_tabletype table_type, const char *table_name) | ||
| 109 | { | ||
| 110 | return LOGSQL_TABLE_FAIL; | ||
| 111 | } | ||
| 112 | |||
| 113 | static const char *supported_drivers[] = {"dbd",NULL}; | ||
| 114 | static logsql_dbdriver log_sql_dbd_driver = { | ||
| 115 | "dbd", | ||
| 116 | supported_drivers, | ||
| 117 | log_sql_dbd_connect,/* open DB connection */ | ||
| 118 | log_sql_dbd_close, /* close DB connection */ | ||
| 119 | log_sql_dbd_escape, /* escape query */ | ||
| 120 | log_sql_dbd_query, /* insert query */ | ||
| 121 | log_sql_dbd_create /* create table */ | ||
| 122 | }; | ||
| 123 | |||
| 124 | LOGSQL_REGISTER(dbd) { | ||
| 125 | dbd_acquire_fn = APR_RETRIEVE_OPTIONAL_FN(ap_dbd_acquire); | ||
| 126 | if (dbd_acquire_fn == NULL) { | ||
| 127 | log_error(APLOG_MARK,APLOG_ERR,0,s,"You must load mod_dbd to enable AuthDBD functions"); | ||
| 128 | } | ||
| 129 | |||
| 130 | log_sql_register_driver(p,&log_sql_dbd_driver); | ||
| 131 | LOGSQL_REGISTER_RETURN; | ||
| 132 | } | ||
