diff options
Diffstat (limited to 'mod_log_sql.c')
-rw-r--r-- | mod_log_sql.c | 1153 |
1 files changed, 581 insertions, 572 deletions
diff --git a/mod_log_sql.c b/mod_log_sql.c index 60d2b33..8a48b17 100644 --- a/mod_log_sql.c +++ b/mod_log_sql.c | |||
@@ -1,70 +1,92 @@ | |||
1 | /* $Header: /home/cvs/mod_log_sql/mod_log_sql.c,v 1.2 2003/12/21 17:45:51 urkle Exp $ */ | 1 | /* $Header: /home/cvs/mod_log_sql/mod_log_sql.c,v 1.3 2003/12/22 04:45:38 urkle Exp $ */ |
2 | /* --------* | 2 | /* --------* |
3 | * DEFINES * | 3 | * DEFINES * |
4 | * --------*/ | 4 | * --------*/ |
5 | 5 | ||
6 | /* The enduser may wish to modify this */ | 6 | /* The enduser may wish to modify this */ |
7 | #undef DEBUG | 7 | #define DEBUG |
8 | 8 | ||
9 | /* The enduser won't modify these */ | 9 | /* The enduser won't modify these */ |
10 | #define MYSQL_ERROR(mysql) ((mysql)?(mysql_error(mysql)):"MySQL server has gone away") | 10 | #define MYSQL_ERROR(mysql) ((mysql)?(mysql_error(mysql)):"MySQL server has gone away") |
11 | #define ERRLEVEL APLOG_ERR|APLOG_NOERRNO | ||
12 | #define WARNINGLEVEL APLOG_WARNING|APLOG_NOERRNO | ||
13 | #define NOTICELEVEL APLOG_NOTICE|APLOG_NOERRNO | ||
14 | #define DEBUGLEVEL APLOG_DEBUG|APLOG_NOERRNO | ||
15 | 11 | ||
16 | /* ---------* | 12 | /* ---------* |
17 | * INCLUDES * | 13 | * INCLUDES * |
18 | * ---------*/ | 14 | * ---------*/ |
19 | #include <time.h> | 15 | |
20 | #include <stdio.h> | 16 | #include "apr_strings.h" |
21 | #include <stdlib.h> | 17 | #include "apr_lib.h" |
22 | #include <string.h> | 18 | #include "apr_hash.h" |
19 | #include "apr_optional.h" | ||
20 | #define APR_WANT_STRFUNC | ||
21 | #include "apr_want.h" | ||
22 | #include "apr_tables.h" | ||
23 | |||
24 | #include "ap_config.h" | ||
25 | |||
23 | #include "httpd.h" | 26 | #include "httpd.h" |
24 | #include "http_config.h" | 27 | #include "http_config.h" |
25 | #include "http_log.h" | ||
26 | #include "http_core.h" | 28 | #include "http_core.h" |
29 | #include "http_log.h" | ||
30 | #include "http_protocol.h" | ||
31 | |||
32 | #include "util_time.h" | ||
33 | |||
34 | #if APR_HAVE_UNISTD_H | ||
35 | #include <unistd.h> | ||
36 | #endif | ||
37 | #ifdef HAVE_LIMITS_H | ||
38 | #include <limits.h> | ||
39 | #endif | ||
40 | |||
27 | #include "mysql.h" | 41 | #include "mysql.h" |
28 | #include "mysqld_error.h" | 42 | #include "mysqld_error.h" |
29 | 43 | ||
30 | #if MODULE_MAGIC_NUMBER >= 19980324 /* M_M_N is defined in /usr/local/Apache/include/ap_mmn.h, 19990320 as of this writing. */ | 44 | #ifdef HAVE_CONFIG_H |
31 | #include "ap_compat.h" | 45 | /* Undefine these to prevent conflicts between Apache ap_config_auto.h and |
46 | * my config.h. Only really needed for Apache < 2.0.48, but it can't hurt. | ||
47 | */ | ||
48 | #undef PACKAGE_BUGREPORT | ||
49 | #undef PACKAGE_NAME | ||
50 | #undef PACKAGE_STRING | ||
51 | #undef PACKAGE_TARNAME | ||
52 | #undef PACKAGE_VERSION | ||
53 | |||
54 | #include "config.h" | ||
32 | #endif | 55 | #endif |
33 | 56 | ||
34 | #ifdef WANT_SSL_LOGGING | 57 | #ifdef WANT_SSL_LOGGING |
35 | #include "mod_ssl.h" | 58 | #include "mod_ssl.h" |
36 | #endif | 59 | #endif |
37 | 60 | ||
38 | |||
39 | /* -------------* | 61 | /* -------------* |
40 | * DECLARATIONS * | 62 | * DECLARATIONS * |
41 | * -------------*/ | 63 | * -------------*/ |
42 | 64 | ||
43 | /* Declare ourselves so the configuration routines can find and know us. */ | 65 | /* Declare ourselves so the configuration routines can find and know us. */ |
44 | module sql_log_module; | 66 | module AP_MODULE_DECLARE_DATA log_sql_module; |
45 | 67 | ||
46 | /* The contents of these are known 'Apache wide' and are not variable | 68 | /* The contents of these are known 'Apache wide' and are not variable |
47 | * on a per-virtual-server basis. Every virtual server 'knows' the | 69 | * on a per-virtual-server basis. Every virtual server 'knows' the |
48 | * same versions of these variables. | 70 | * same versions of these variables. |
49 | */ | 71 | */ |
50 | MYSQL logsql_server, *logsql_server_p = NULL; | 72 | |
51 | 73 | typedef struct { | |
52 | int logsql_massvirtual = 0; | 74 | int massvirtual; |
53 | int logsql_createtables = 0; | 75 | int createtables; |
54 | int logsql_forcepreserve = 0; | 76 | int forcepreserve; |
55 | char *logsql_dbname = NULL; | 77 | char *dbname; |
56 | char *logsql_dbhost = NULL; | 78 | char *dbhost; |
57 | char *logsql_dbuser = NULL; | 79 | char *dbuser; |
58 | char *logsql_dbpwd = NULL; | 80 | char *dbpwd; |
59 | char *logsql_machid = NULL; | 81 | char *machid; |
60 | char *logsql_socketfile = "/tmp/mysql.sock"; | 82 | char *socketfile; |
61 | unsigned int logsql_tcpport = 3306; | 83 | unsigned int tcpport; |
62 | 84 | int insertdelayed; | |
63 | #ifdef WANT_DELAYED_MYSQL_INSERT | 85 | MYSQL server; |
64 | char *logsql_insertclause = "insert delayed into "; | 86 | MYSQL *server_p; |
65 | #else | 87 | } global_config_t; |
66 | char *logsql_insertclause = "insert into "; | 88 | |
67 | #endif | 89 | static global_config_t global_config; |
68 | 90 | ||
69 | typedef const char *(*item_key_func) (request_rec *, char *); | 91 | typedef const char *(*item_key_func) (request_rec *, char *); |
70 | 92 | ||
@@ -75,13 +97,13 @@ typedef const char *(*item_key_func) (request_rec *, char *); | |||
75 | * Each child process has its own segregated copy of this structure. | 97 | * Each child process has its own segregated copy of this structure. |
76 | */ | 98 | */ |
77 | typedef struct { | 99 | typedef struct { |
78 | apr_array_t *transfer_ignore_list; | 100 | apr_array_header_t *transfer_ignore_list; |
79 | array_header *transfer_accept_list; | 101 | apr_array_header_t *transfer_accept_list; |
80 | array_header *remhost_ignore_list; | 102 | apr_array_header_t *remhost_ignore_list; |
81 | array_header *notes_list; | 103 | apr_array_header_t *notes_list; |
82 | array_header *hout_list; | 104 | apr_array_header_t *hout_list; |
83 | array_header *hin_list; | 105 | apr_array_header_t *hin_list; |
84 | array_header *cookie_list; | 106 | apr_array_header_t *cookie_list; |
85 | char *notes_table_name; | 107 | char *notes_table_name; |
86 | char *hout_table_name; | 108 | char *hout_table_name; |
87 | char *hin_table_name; | 109 | char *hin_table_name; |
@@ -97,16 +119,16 @@ typedef struct { | |||
97 | * HELPER FUNCTIONS * | 119 | * HELPER FUNCTIONS * |
98 | * -----------------*/ | 120 | * -----------------*/ |
99 | 121 | ||
100 | int safe_create_tables(logsql_state *cls, request_rec *r); | 122 | static int safe_create_tables(logsql_state *cls, request_rec *r); |
101 | 123 | ||
102 | static char *format_integer(pool *p, int i) | 124 | static char *format_integer(apr_pool_t *p, int i) |
103 | { | 125 | { |
104 | char dummy[40]; | 126 | char dummy[40]; |
105 | ap_snprintf(dummy, sizeof(dummy), "%d", i); | 127 | apr_snprintf(dummy, sizeof(dummy), "%d", i); |
106 | return pstrdup(p, dummy); | 128 | return apr_pstrdup(p, dummy); |
107 | } | 129 | } |
108 | 130 | ||
109 | static char *pfmt(pool *p, int i) | 131 | static char *pfmt(apr_pool_t *p, int i) |
110 | { | 132 | { |
111 | if (i <= 0) { | 133 | if (i <= 0) { |
112 | return "-"; | 134 | return "-"; |
@@ -122,17 +144,17 @@ static char *pfmt(pool *p, int i) | |||
122 | 144 | ||
123 | static const char *extract_remote_host(request_rec *r, char *a) | 145 | static const char *extract_remote_host(request_rec *r, char *a) |
124 | { | 146 | { |
125 | return (char *) get_remote_host(r->connection, r->per_dir_config, REMOTE_NAME); | 147 | return (char *) ap_get_remote_host(r->connection, r->per_dir_config, REMOTE_NAME, NULL); |
126 | } | 148 | } |
127 | 149 | ||
128 | static const char *extract_remote_logname(request_rec *r, char *a) | 150 | static const char *extract_remote_logname(request_rec *r, char *a) |
129 | { | 151 | { |
130 | return (char *) get_remote_logname(r); | 152 | return (char *) ap_get_remote_logname(r); |
131 | } | 153 | } |
132 | 154 | ||
133 | static const char *extract_remote_user(request_rec *r, char *a) | 155 | static const char *extract_remote_user(request_rec *r, char *a) |
134 | { | 156 | { |
135 | char *rvalue = r->connection->user; | 157 | char *rvalue = r->user; |
136 | 158 | ||
137 | if (rvalue == NULL) { | 159 | if (rvalue == NULL) { |
138 | rvalue = "-"; | 160 | rvalue = "-"; |
@@ -150,7 +172,7 @@ static const char *extract_ssl_keysize(request_rec *r, char *a) | |||
150 | if (ap_ctx_get(r->connection->client->ctx, "ssl") != NULL) { | 172 | if (ap_ctx_get(r->connection->client->ctx, "ssl") != NULL) { |
151 | result = ssl_var_lookup(r->pool, r->server, r->connection, r, "SSL_CIPHER_USEKEYSIZE"); | 173 | result = ssl_var_lookup(r->pool, r->server, r->connection, r, "SSL_CIPHER_USEKEYSIZE"); |
152 | #ifdef DEBUG | 174 | #ifdef DEBUG |
153 | ap_log_error(APLOG_MARK,DEBUGLEVEL,r->server,"SSL_KEYSIZE: %s", result); | 175 | ap_log_error(APLOG_MARK,APLOG_DEBUG,r->server,"SSL_KEYSIZE: %s", result); |
154 | #endif | 176 | #endif |
155 | if (result != NULL && result[0] == '\0') | 177 | if (result != NULL && result[0] == '\0') |
156 | result = NULL; | 178 | result = NULL; |
@@ -167,7 +189,7 @@ static const char *extract_ssl_maxkeysize(request_rec *r, char *a) | |||
167 | if (ap_ctx_get(r->connection->client->ctx, "ssl") != NULL) { | 189 | if (ap_ctx_get(r->connection->client->ctx, "ssl") != NULL) { |
168 | result = ssl_var_lookup(r->pool, r->server, r->connection, r, "SSL_CIPHER_ALGKEYSIZE"); | 190 | result = ssl_var_lookup(r->pool, r->server, r->connection, r, "SSL_CIPHER_ALGKEYSIZE"); |
169 | #ifdef DEBUG | 191 | #ifdef DEBUG |
170 | ap_log_error(APLOG_MARK,DEBUGLEVEL,r->server,"SSL_ALGKEYSIZE: %s", result); | 192 | ap_log_error(APLOG_MARK,APLOG_DEBUG,r->server,"SSL_ALGKEYSIZE: %s", result); |
171 | #endif | 193 | #endif |
172 | if (result != NULL && result[0] == '\0') | 194 | if (result != NULL && result[0] == '\0') |
173 | result = NULL; | 195 | result = NULL; |
@@ -184,7 +206,7 @@ static const char *extract_ssl_cipher(request_rec *r, char *a) | |||
184 | if (ap_ctx_get(r->connection->client->ctx, "ssl") != NULL) { | 206 | if (ap_ctx_get(r->connection->client->ctx, "ssl") != NULL) { |
185 | result = ssl_var_lookup(r->pool, r->server, r->connection, r, "SSL_CIPHER"); | 207 | result = ssl_var_lookup(r->pool, r->server, r->connection, r, "SSL_CIPHER"); |
186 | #ifdef DEBUG | 208 | #ifdef DEBUG |
187 | ap_log_error(APLOG_MARK,DEBUGLEVEL,r->server,"SSL_CIPHER: %s", result); | 209 | ap_log_error(APLOG_MARK,APLOG_DEBUG,r->server,"SSL_CIPHER: %s", result); |
188 | #endif | 210 | #endif |
189 | if (result != NULL && result[0] == '\0') | 211 | if (result != NULL && result[0] == '\0') |
190 | result = NULL; | 212 | result = NULL; |
@@ -232,14 +254,10 @@ static const char *extract_status(request_rec *r, char *a) | |||
232 | 254 | ||
233 | static const char *extract_bytes_sent(request_rec *r, char *a) | 255 | static const char *extract_bytes_sent(request_rec *r, char *a) |
234 | { | 256 | { |
235 | if (!r->sent_bodyct) { | 257 | if (!r->sent_bodyct || !r->bytes_sent) { |
236 | return "-"; | 258 | return "-"; |
237 | } else { | 259 | } else { |
238 | long int bs; | 260 | return apr_psprintf(r->pool, "%" APR_OFF_T_FMT, r->bytes_sent); |
239 | char dummy[40]; | ||
240 | bgetopt(r->connection->client, BO_BYTECT, &bs); | ||
241 | ap_snprintf(dummy, sizeof(dummy), "%ld", bs); | ||
242 | return pstrdup(r->pool, dummy); | ||
243 | } | 261 | } |
244 | } | 262 | } |
245 | 263 | ||
@@ -261,71 +279,141 @@ static const char *extract_header_out(request_rec *r, char *a) | |||
261 | return table_get(r->err_headers_out, a); | 279 | return table_get(r->err_headers_out, a); |
262 | } | 280 | } |
263 | */ | 281 | */ |
282 | static const char *extract_request_time_custom(request_rec *r, char *a, | ||
283 | apr_time_exp_t *xt) | ||
284 | { | ||
285 | apr_size_t retcode; | ||
286 | char tstr[MAX_STRING_LEN]; | ||
287 | apr_strftime(tstr, &retcode, sizeof(tstr), a, xt); | ||
288 | return apr_pstrdup(r->pool, tstr); | ||
289 | } | ||
290 | |||
291 | #define DEFAULT_REQUEST_TIME_SIZE 32 | ||
292 | typedef struct { | ||
293 | unsigned t; | ||
294 | char timestr[DEFAULT_REQUEST_TIME_SIZE]; | ||
295 | unsigned t_validate; | ||
296 | } cached_request_time; | ||
297 | |||
298 | #define TIME_CACHE_SIZE 4 | ||
299 | #define TIME_CACHE_MASK 3 | ||
300 | static cached_request_time request_time_cache[TIME_CACHE_SIZE]; | ||
264 | 301 | ||
265 | static const char *extract_request_time(request_rec *r, char *a) | 302 | static const char *extract_request_time(request_rec *r, char *a) |
266 | { | 303 | { |
267 | int timz; | 304 | apr_time_exp_t xt; |
268 | struct tm *t; | ||
269 | char tstr[MAX_STRING_LEN]; | ||
270 | |||
271 | t = get_gmtoff(&timz); | ||
272 | 305 | ||
306 | /* Please read comments in mod_log_config.h for more info about | ||
307 | * the I_INSIST....COMPLIANCE define | ||
308 | */ | ||
273 | if (a && *a) { /* Custom format */ | 309 | if (a && *a) { /* Custom format */ |
274 | strftime(tstr, MAX_STRING_LEN, a, t); | 310 | #ifdef I_INSIST_ON_EXTRA_CYCLES_FOR_CLF_COMPLIANCE |
311 | ap_explode_recent_localtime(&xt, apr_time_now()); | ||
312 | #else | ||
313 | ap_explode_recent_localtime(&xt, r->request_time); | ||
314 | #endif | ||
315 | return extract_request_time_custom(r, a, &xt); | ||
275 | } else { /* CLF format */ | 316 | } else { /* CLF format */ |
276 | char sign = (timz < 0 ? '-' : '+'); | 317 | /* This code uses the same technique as ap_explode_recent_localtime(): |
277 | 318 | * optimistic caching with logic to detect and correct race conditions. | |
278 | if (timz < 0) { | 319 | * See the comments in server/util_time.c for more information. |
279 | timz = -timz; | 320 | */ |
321 | cached_request_time* cached_time = apr_palloc(r->pool, | ||
322 | sizeof(*cached_time)); | ||
323 | #ifdef I_INSIST_ON_EXTRA_CYCLES_FOR_CLF_COMPLIANCE | ||
324 | apr_time_t request_time = apr_time_now(); | ||
325 | #else | ||
326 | apr_time_t request_time = r->request_time; | ||
327 | #endif | ||
328 | unsigned t_seconds = (unsigned)apr_time_sec(request_time); | ||
329 | unsigned i = t_seconds & TIME_CACHE_MASK; | ||
330 | memcpy(cached_time, &(request_time_cache[i]), sizeof(*cached_time)); | ||
331 | if ((t_seconds != cached_time->t) || | ||
332 | (t_seconds != cached_time->t_validate)) { | ||
333 | |||
334 | /* Invalid or old snapshot, so compute the proper time string | ||
335 | * and store it in the cache | ||
336 | */ | ||
337 | char sign; | ||
338 | int timz; | ||
339 | |||
340 | ap_explode_recent_localtime(&xt, r->request_time); | ||
341 | timz = xt.tm_gmtoff; | ||
342 | if (timz < 0) { | ||
343 | timz = -timz; | ||
344 | sign = '-'; | ||
345 | } | ||
346 | else { | ||
347 | sign = '+'; | ||
348 | } | ||
349 | cached_time->t = t_seconds; | ||
350 | apr_snprintf(cached_time->timestr, DEFAULT_REQUEST_TIME_SIZE, | ||
351 | "[%02d/%s/%d:%02d:%02d:%02d %c%.2d%.2d]", | ||
352 | xt.tm_mday, apr_month_snames[xt.tm_mon], | ||
353 | xt.tm_year+1900, xt.tm_hour, xt.tm_min, xt.tm_sec, | ||
354 | sign, timz / (60*60), timz % (60*60)); | ||
355 | cached_time->t_validate = t_seconds; | ||
356 | memcpy(&(request_time_cache[i]), cached_time, | ||
357 | sizeof(*cached_time)); | ||
280 | } | 358 | } |
281 | strftime(tstr, MAX_STRING_LEN, "[%d/%b/%Y:%H:%M:%S ", t); | 359 | return cached_time->timestr; |
282 | ap_snprintf(tstr + strlen(tstr), sizeof(tstr) - strlen(tstr), "%c%.2d%.2d]", sign, timz / 60, timz % 60); | ||
283 | } | 360 | } |
284 | |||
285 | return pstrdup(r->pool, tstr); | ||
286 | } | 361 | } |
287 | 362 | ||
288 | static const char *extract_request_duration(request_rec *r, char *a) | 363 | static const char *extract_request_duration(request_rec *r, char *a) |
289 | { | 364 | { |
290 | char duration[22]; /* Long enough for 2^64 */ | 365 | apr_time_t duration = apr_time_now() - r->request_time; |
366 | return apr_psprintf(r->pool, "%" APR_TIME_T_FMT, apr_time_sec(duration)); | ||
367 | } | ||
291 | 368 | ||
292 | ap_snprintf(duration, sizeof(duration), "%ld", time(NULL) - r->request_time); | 369 | static const char *extract_request_duration_microseconds(request_rec *r, char *a) __attribute__ ((unused)); |
293 | return pstrdup(r->pool, duration); | 370 | static const char *extract_request_duration_microseconds(request_rec *r, char *a) |
371 | { | ||
372 | return apr_psprintf(r->pool, "%" APR_TIME_T_FMT, | ||
373 | (apr_time_now() - r->request_time)); | ||
294 | } | 374 | } |
295 | 375 | ||
296 | static const char *extract_virtual_host(request_rec *r, char *a) | 376 | static const char *extract_virtual_host(request_rec *r, char *a) |
297 | { | 377 | { |
298 | return ap_get_server_name(r); | 378 | return apr_pstrdup(r->pool, r->server->server_hostname); |
299 | } | 379 | } |
300 | 380 | ||
301 | static const char *extract_machine_id(request_rec *r, char *a) | 381 | static const char *extract_machine_id(request_rec *r, char *a) |
302 | { | 382 | { |
303 | if (!logsql_machid) | 383 | if (!global_config.machid) |
304 | return "-"; | 384 | return "-"; |
305 | else | 385 | else |
306 | return logsql_machid; | 386 | return global_config.machid; |
307 | } | 387 | } |
308 | 388 | ||
309 | static const char *extract_server_port(request_rec *r, char *a) | 389 | static const char *extract_server_port(request_rec *r, char *a) |
310 | { | 390 | { |
311 | char portnum[22]; | 391 | return apr_psprintf(r->pool, "%u", |
312 | 392 | r->server->port ? r->server->port : ap_default_port(r)); | |
313 | ap_snprintf(portnum, sizeof(portnum), "%u", r->server->port); | ||
314 | return pstrdup(r->pool, portnum); | ||
315 | } | 393 | } |
316 | 394 | ||
317 | static const char *extract_child_pid(request_rec *r, char *a) | 395 | static const char *extract_child_pid(request_rec *r, char *a) |
318 | { | 396 | { |
319 | char pidnum[22]; | 397 | if (*a == '\0' || !strcmp(a, "pid")) { |
320 | ap_snprintf(pidnum, sizeof(pidnum), "%ld", (long) getpid()); | 398 | return apr_psprintf(r->pool, "%" APR_PID_T_FMT, getpid()); |
321 | return pstrdup(r->pool, pidnum); | 399 | } |
400 | else if (!strcmp(a, "tid")) { | ||
401 | #if APR_HAS_THREADS | ||
402 | apr_os_thread_t tid = apr_os_thread_current(); | ||
403 | #else | ||
404 | int tid = 0; /* APR will format "0" anyway but an arg is needed */ | ||
405 | #endif | ||
406 | return apr_psprintf(r->pool, "%pT", &tid); | ||
407 | } | ||
408 | /* bogus format */ | ||
409 | return a; | ||
322 | } | 410 | } |
323 | 411 | ||
324 | static const char *extract_referer(request_rec *r, char *a) | 412 | static const char *extract_referer(request_rec *r, char *a) |
325 | { | 413 | { |
326 | const char *tempref; | 414 | const char *tempref; |
327 | 415 | ||
328 | tempref = table_get(r->headers_in, "Referer"); | 416 | tempref = apr_table_get(r->headers_in, "Referer"); |
329 | if (!tempref) | 417 | if (!tempref) |
330 | { | 418 | { |
331 | return "-"; | 419 | return "-"; |
@@ -338,7 +426,7 @@ static const char *extract_agent(request_rec *r, char *a) | |||
338 | { | 426 | { |
339 | const char *tempag; | 427 | const char *tempag; |
340 | 428 | ||
341 | tempag = table_get(r->headers_in, "User-Agent"); | 429 | tempag = apr_table_get(r->headers_in, "User-Agent"); |
342 | if (!tempag) | 430 | if (!tempag) |
343 | { | 431 | { |
344 | return "-"; | 432 | return "-"; |
@@ -354,18 +442,21 @@ static const char *extract_cookie(request_rec *r, char *a) | |||
354 | char *isvalid; | 442 | char *isvalid; |
355 | char *cookiebuf; | 443 | char *cookiebuf; |
356 | 444 | ||
357 | logsql_state *cls = get_module_config(r->server->module_config, &sql_log_module); | 445 | logsql_state *cls = ap_get_module_config(r->server->module_config, |
446 | &log_sql_module); | ||
358 | 447 | ||
359 | if (cls->cookie_name != NULL) { | 448 | if (cls->cookie_name != NULL) { |
360 | #ifdef DEBUG | 449 | #ifdef DEBUG |
361 | ap_log_error(APLOG_MARK,DEBUGLEVEL,r->server,"watching for cookie '%s'", cls->cookie_name); | 450 | ap_log_rerror(APLOG_MARK,APLOG_DEBUG,0, r, |
451 | "watching for cookie '%s'", cls->cookie_name); | ||
362 | #endif | 452 | #endif |
363 | 453 | ||
364 | /* Fetch out the cookie header */ | 454 | /* Fetch out the cookie header */ |
365 | cookiestr = (char *)table_get(r->headers_in, "cookie2"); | 455 | cookiestr = (char *)apr_table_get(r->headers_in, "cookie2"); |
366 | if (cookiestr != NULL) { | 456 | if (cookiestr != NULL) { |
367 | #ifdef DEBUG | 457 | #ifdef DEBUG |
368 | ap_log_error(APLOG_MARK,DEBUGLEVEL,r->server,"Cookie2: [%s]", cookiestr); | 458 | ap_log_rerror(APLOG_MARK,APLOG_DEBUG,0, r, |
459 | "Cookie2: [%s]", cookiestr); | ||
369 | #endif | 460 | #endif |
370 | /* Does the cookie string contain one with our name? */ | 461 | /* Does the cookie string contain one with our name? */ |
371 | isvalid = strstr(cookiestr, cls->cookie_name); | 462 | isvalid = strstr(cookiestr, cls->cookie_name); |
@@ -373,7 +464,7 @@ static const char *extract_cookie(request_rec *r, char *a) | |||
373 | /* Move past the cookie name and equal sign */ | 464 | /* Move past the cookie name and equal sign */ |
374 | isvalid += strlen(cls->cookie_name) + 1; | 465 | isvalid += strlen(cls->cookie_name) + 1; |
375 | /* Duplicate it into the pool */ | 466 | /* Duplicate it into the pool */ |
376 | cookiebuf = ap_pstrdup(r->pool, isvalid); | 467 | cookiebuf = apr_pstrdup(r->pool, isvalid); |
377 | /* Segregate just this cookie out of the string | 468 | /* Segregate just this cookie out of the string |
378 | * with a terminating nul at the first semicolon */ | 469 | * with a terminating nul at the first semicolon */ |
379 | cookieend = strchr(cookiebuf, ';'); | 470 | cookieend = strchr(cookiebuf, ';'); |
@@ -383,15 +474,16 @@ static const char *extract_cookie(request_rec *r, char *a) | |||
383 | } | 474 | } |
384 | } | 475 | } |
385 | 476 | ||
386 | cookiestr = (char *)table_get(r->headers_in, "cookie"); | 477 | cookiestr = (char *)apr_table_get(r->headers_in, "cookie"); |
387 | if (cookiestr != NULL) { | 478 | if (cookiestr != NULL) { |
388 | #ifdef DEBUG | 479 | #ifdef DEBUG |
389 | ap_log_error(APLOG_MARK,DEBUGLEVEL,r->server,"Cookie: [%s]", cookiestr); | 480 | ap_log_rerror(APLOG_MARK,APLOG_DEBUG,0,r, |
481 | "Cookie: [%s]", cookiestr); | ||
390 | #endif | 482 | #endif |
391 | isvalid = strstr(cookiestr, cls->cookie_name); | 483 | isvalid = strstr(cookiestr, cls->cookie_name); |
392 | if (isvalid != NULL) { | 484 | if (isvalid != NULL) { |
393 | isvalid += strlen(cls->cookie_name) + 1; | 485 | isvalid += strlen(cls->cookie_name) + 1; |
394 | cookiebuf = ap_pstrdup(r->pool, isvalid); | 486 | cookiebuf = apr_pstrdup(r->pool, isvalid); |
395 | cookieend = strchr(cookiebuf, ';'); | 487 | cookieend = strchr(cookiebuf, ';'); |
396 | if (cookieend != NULL) | 488 | if (cookieend != NULL) |
397 | *cookieend = '\0'; | 489 | *cookieend = '\0'; |
@@ -399,15 +491,16 @@ static const char *extract_cookie(request_rec *r, char *a) | |||
399 | } | 491 | } |
400 | } | 492 | } |
401 | 493 | ||
402 | cookiestr = table_get(r->headers_out, "set-cookie"); | 494 | cookiestr = apr_table_get(r->headers_out, "set-cookie"); |
403 | if (cookiestr != NULL) { | 495 | if (cookiestr != NULL) { |
404 | #ifdef DEBUG | 496 | #ifdef DEBUG |
405 | ap_log_error(APLOG_MARK,DEBUGLEVEL,r->server,"Set-Cookie: [%s]", cookiestr); | 497 | ap_log_rerror(APLOG_MARK,APLOG_DEBUG,0,r, |
498 | "Set-Cookie: [%s]", cookiestr); | ||
406 | #endif | 499 | #endif |
407 | isvalid = strstr(cookiestr, cls->cookie_name); | 500 | isvalid = strstr(cookiestr, cls->cookie_name); |
408 | if (isvalid != NULL) { | 501 | if (isvalid != NULL) { |
409 | isvalid += strlen(cls->cookie_name) + 1; | 502 | isvalid += strlen(cls->cookie_name) + 1; |
410 | cookiebuf = ap_pstrdup(r->pool, isvalid); | 503 | cookiebuf = apr_pstrdup(r->pool, isvalid); |
411 | cookieend = strchr(cookiebuf, ';'); | 504 | cookieend = strchr(cookiebuf, ';'); |
412 | if (cookieend != NULL) | 505 | if (cookieend != NULL) |
413 | *cookieend = '\0'; | 506 | *cookieend = '\0'; |
@@ -428,14 +521,16 @@ static const char *extract_specific_cookie(request_rec *r, char *a) | |||
428 | 521 | ||
429 | if (a != NULL) { | 522 | if (a != NULL) { |
430 | #ifdef DEBUG | 523 | #ifdef DEBUG |
431 | ap_log_error(APLOG_MARK,DEBUGLEVEL,r->server,"watching for cookie '%s'", a); | 524 | ap_log_rerror(APLOG_MARK,APLOG_DEBUG,0, |
525 | r,"watching for cookie '%s'", a); | ||
432 | #endif | 526 | #endif |
433 | 527 | ||
434 | /* Fetch out the cookie header */ | 528 | /* Fetch out the cookie header */ |
435 | cookiestr = (char *)table_get(r->headers_in, "cookie2"); | 529 | cookiestr = (char *)apr_table_get(r->headers_in, "cookie2"); |
436 | if (cookiestr != NULL) { | 530 | if (cookiestr != NULL) { |
437 | #ifdef DEBUG | 531 | #ifdef DEBUG |
438 | ap_log_error(APLOG_MARK,DEBUGLEVEL,r->server,"Cookie2: [%s]", cookiestr); | 532 | ap_log_rerror(APLOG_MARK,APLOG_DEBUG,0,r, |
533 | "Cookie2: [%s]", cookiestr); | ||
439 | #endif | 534 | #endif |
440 | /* Does the cookie string contain one with our name? */ | 535 | /* Does the cookie string contain one with our name? */ |
441 | isvalid = strstr(cookiestr, a); | 536 | isvalid = strstr(cookiestr, a); |
@@ -443,7 +538,7 @@ static const char *extract_specific_cookie(request_rec *r, char *a) | |||
443 | /* Move past the cookie name and equal sign */ | 538 | /* Move past the cookie name and equal sign */ |
444 | isvalid += strlen(a) + 1; | 539 | isvalid += strlen(a) + 1; |
445 | /* Duplicate it into the pool */ | 540 | /* Duplicate it into the pool */ |
446 | cookiebuf = ap_pstrdup(r->pool, isvalid); | 541 | cookiebuf = apr_pstrdup(r->pool, isvalid); |
447 | /* Segregate just this cookie out of the string | 542 | /* Segregate just this cookie out of the string |
448 | * with a terminating nul at the first semicolon */ | 543 | * with a terminating nul at the first semicolon */ |
449 | cookieend = strchr(cookiebuf, ';'); | 544 | cookieend = strchr(cookiebuf, ';'); |
@@ -453,15 +548,16 @@ static const char *extract_specific_cookie(request_rec *r, char *a) | |||
453 | } | 548 | } |
454 | } | 549 | } |
455 | 550 | ||
456 | cookiestr = (char *)table_get(r->headers_in, "cookie"); | 551 | cookiestr = (char *)apr_table_get(r->headers_in, "cookie"); |
457 | if (cookiestr != NULL) { | 552 | if (cookiestr != NULL) { |
458 | #ifdef DEBUG | 553 | #ifdef DEBUG |
459 | ap_log_error(APLOG_MARK,DEBUGLEVEL,r->server,"Cookie: [%s]", cookiestr); | 554 | ap_log_rerror(APLOG_MARK,APLOG_DEBUG,0,r, |
555 | "Cookie: [%s]", cookiestr); | ||
460 | #endif | 556 | #endif |
461 | isvalid = strstr(cookiestr, a); | 557 | isvalid = strstr(cookiestr, a); |
462 | if (isvalid != NULL) { | 558 | if (isvalid != NULL) { |
463 | isvalid += strlen(a) + 1; | 559 | isvalid += strlen(a) + 1; |
464 | cookiebuf = ap_pstrdup(r->pool, isvalid); | 560 | cookiebuf = apr_pstrdup(r->pool, isvalid); |
465 | cookieend = strchr(cookiebuf, ';'); | 561 | cookieend = strchr(cookiebuf, ';'); |
466 | if (cookieend != NULL) | 562 | if (cookieend != NULL) |
467 | *cookieend = '\0'; | 563 | *cookieend = '\0'; |
@@ -469,15 +565,16 @@ static const char *extract_specific_cookie(request_rec *r, char *a) | |||
469 | } | 565 | } |
470 | } | 566 | } |
471 | 567 | ||
472 | cookiestr = table_get(r->headers_out, "set-cookie"); | 568 | cookiestr = apr_table_get(r->headers_out, "set-cookie"); |
473 | if (cookiestr != NULL) { | 569 | if (cookiestr != NULL) { |
474 | #ifdef DEBUG | 570 | #ifdef DEBUG |
475 | ap_log_error(APLOG_MARK,DEBUGLEVEL,r->server,"Set-Cookie: [%s]", cookiestr); | 571 | ap_log_rerror(APLOG_MARK,APLOG_DEBUG,0,r, |
572 | "Set-Cookie: [%s]", cookiestr); | ||
476 | #endif | 573 | #endif |
477 | isvalid = strstr(cookiestr, a); | 574 | isvalid = strstr(cookiestr, a); |
478 | if (isvalid != NULL) { | 575 | if (isvalid != NULL) { |
479 | isvalid += strlen(a) + 1; | 576 | isvalid += strlen(a) + 1; |
480 | cookiebuf = ap_pstrdup(r->pool, isvalid); | 577 | cookiebuf = apr_pstrdup(r->pool, isvalid); |
481 | cookieend = strchr(cookiebuf, ';'); | 578 | cookieend = strchr(cookiebuf, ';'); |
482 | if (cookieend != NULL) | 579 | if (cookieend != NULL) |
483 | *cookieend = '\0'; | 580 | *cookieend = '\0'; |
@@ -492,30 +589,27 @@ static const char *extract_specific_cookie(request_rec *r, char *a) | |||
492 | 589 | ||
493 | static const char *extract_request_timestamp(request_rec *r, char *a) | 590 | static const char *extract_request_timestamp(request_rec *r, char *a) |
494 | { | 591 | { |
495 | char tstr[32]; | 592 | return apr_psprintf(r->pool, "%ld", time(NULL)); |
496 | |||
497 | ap_snprintf(tstr, 32, "%ld", time(NULL)); | ||
498 | return pstrdup(r->pool, tstr); | ||
499 | } | 593 | } |
500 | 594 | ||
501 | /* | 595 | /* |
502 | static const char *extract_note(request_rec *r, char *a) | 596 | static const char *extract_note(request_rec *r, char *a) |
503 | { | 597 | { |
504 | return ap_table_get(r->notes, a); | 598 | return apr_table_get(r->notes, a); |
505 | 599 | ||
506 | } | 600 | } |
507 | */ | 601 | */ |
508 | 602 | ||
509 | static const char *extract_env_var(request_rec *r, char *a) | 603 | static const char *extract_env_var(request_rec *r, char *a) |
510 | { | 604 | { |
511 | return ap_table_get(r->subprocess_env, a); | 605 | return apr_table_get(r->subprocess_env, a); |
512 | } | 606 | } |
513 | 607 | ||
514 | static const char *extract_unique_id(request_rec *r, char *a) | 608 | static const char *extract_unique_id(request_rec *r, char *a) |
515 | { | 609 | { |
516 | const char *tempid; | 610 | const char *tempid; |
517 | 611 | ||
518 | tempid = ap_table_get(r->subprocess_env, "UNIQUE_ID"); | 612 | tempid = apr_table_get(r->subprocess_env, "UNIQUE_ID"); |
519 | if (!tempid) | 613 | if (!tempid) |
520 | return "-"; | 614 | return "-"; |
521 | else | 615 | else |
@@ -532,7 +626,7 @@ struct log_sql_item_list { | |||
532 | const char *sql_field_name; /* its column in SQL */ | 626 | const char *sql_field_name; /* its column in SQL */ |
533 | int want_orig_default; /* if it requires the original request prior to internal redirection */ | 627 | int want_orig_default; /* if it requires the original request prior to internal redirection */ |
534 | int string_contents; /* if it returns a string */ | 628 | int string_contents; /* if it returns a string */ |
535 | } log_sql_item_keys[] = { | 629 | } static log_sql_item_keys[] = { |
536 | 630 | ||
537 | { 'A', extract_agent, "agent", 1, 1 }, | 631 | { 'A', extract_agent, "agent", 1, 1 }, |
538 | { 'a', extract_request_args, "request_args", 1, 1 }, | 632 | { 'a', extract_request_args, "request_args", 1, 1 }, |
@@ -569,7 +663,7 @@ struct log_sql_item_list { | |||
569 | /* Routine to escape the 'dangerous' characters that would otherwise | 663 | /* Routine to escape the 'dangerous' characters that would otherwise |
570 | * corrupt the INSERT string: ', \, and " | 664 | * corrupt the INSERT string: ', \, and " |
571 | */ | 665 | */ |
572 | const char *escape_query(const char *from_str, pool *p) | 666 | static const char *escape_query(const char *from_str, apr_pool_t *p) |
573 | { | 667 | { |
574 | if (!from_str) | 668 | if (!from_str) |
575 | return NULL; | 669 | return NULL; |
@@ -581,12 +675,12 @@ const char *escape_query(const char *from_str, pool *p) | |||
581 | /* Pre-allocate a new string that could hold twice the original, which would only | 675 | /* Pre-allocate a new string that could hold twice the original, which would only |
582 | * happen if the whole original string was 'dangerous' characters. | 676 | * happen if the whole original string was 'dangerous' characters. |
583 | */ | 677 | */ |
584 | to_str = (char *) ap_palloc(p, length * 2 + 1); | 678 | to_str = (char *) apr_palloc(p, length * 2 + 1); |
585 | if (!to_str) { | 679 | if (!to_str) { |
586 | return from_str; | 680 | return from_str; |
587 | } | 681 | } |
588 | 682 | ||
589 | if (!logsql_server_p) { | 683 | if (!global_config.server_p) { |
590 | /* Well, I would have liked to use the current database charset. mysql is | 684 | /* Well, I would have liked to use the current database charset. mysql is |
591 | * unavailable, however, so I fall back to the slightly less respectful | 685 | * unavailable, however, so I fall back to the slightly less respectful |
592 | * mysql_escape_string() function that uses the default charset. | 686 | * mysql_escape_string() function that uses the default charset. |
@@ -596,7 +690,7 @@ const char *escape_query(const char *from_str, pool *p) | |||
596 | /* MySQL is available, so I'll go ahead and respect the current charset when | 690 | /* MySQL is available, so I'll go ahead and respect the current charset when |
597 | * I perform the escape. | 691 | * I perform the escape. |
598 | */ | 692 | */ |
599 | retval = mysql_real_escape_string(logsql_server_p, to_str, from_str, length); | 693 | retval = mysql_real_escape_string(global_config.server_p, to_str, from_str, length); |
600 | } | 694 | } |
601 | 695 | ||
602 | if (retval) | 696 | if (retval) |
@@ -606,7 +700,7 @@ const char *escape_query(const char *from_str, pool *p) | |||
606 | } | 700 | } |
607 | } | 701 | } |
608 | 702 | ||
609 | int open_logdb_link(server_rec* s) | 703 | static int open_logdb_link(server_rec* s) |
610 | { | 704 | { |
611 | /* Returns: | 705 | /* Returns: |
612 | 3 if preserve forced | 706 | 3 if preserve forced |
@@ -615,91 +709,89 @@ int open_logdb_link(server_rec* s) | |||
615 | 0 if unsuccessful | 709 | 0 if unsuccessful |
616 | */ | 710 | */ |
617 | 711 | ||
618 | if (logsql_forcepreserve) | 712 | if (global_config.forcepreserve) |
619 | return 3; | 713 | return 3; |
620 | 714 | ||
621 | if (logsql_server_p) | 715 | if (global_config.server_p) |
622 | return 2; | 716 | return 2; |
623 | 717 | ||
624 | if ((logsql_dbname) && (logsql_dbhost) && (logsql_dbuser) && (logsql_dbpwd)) { | 718 | if ((global_config.dbname) && (global_config.dbhost) && (global_config.dbuser) && (global_config.dbpwd)) { |
625 | mysql_init(&logsql_server); | 719 | mysql_init(&global_config.server); |
626 | logsql_server_p = mysql_real_connect(&logsql_server, logsql_dbhost, logsql_dbuser, logsql_dbpwd, logsql_dbname, logsql_tcpport, logsql_socketfile, 0); | 720 | global_config.server_p = mysql_real_connect(&global_config.server, global_config.dbhost, global_config.dbuser, global_config.dbpwd, global_config.dbname, global_config.tcpport, global_config.socketfile, 0); |
627 | 721 | ||
628 | if (logsql_server_p) { | 722 | if (global_config.server_p) { |
629 | #ifdef DEBUG | 723 | #ifdef DEBUG |
630 | ap_log_error(APLOG_MARK,DEBUGLEVEL,s,"HOST: '%s' PORT: '%d' DB: '%s' USER: '%s' SOCKET: '%s'", | 724 | ap_log_error(APLOG_MARK,APLOG_DEBUG,0,s,"HOST: '%s' PORT: '%d' DB: '%s' USER: '%s' SOCKET: '%s'", |
631 | logsql_dbhost, logsql_tcpport, logsql_dbname, logsql_dbuser, logsql_socketfile); | 725 | global_config.dbhost, global_config.tcpport, global_config.dbname, global_config.dbuser, global_config.socketfile); |
632 | #endif | 726 | #endif |
633 | return 1; | 727 | return 1; |
634 | } else { | 728 | } else { |
635 | #ifdef DEBUG | 729 | #ifdef DEBUG |
636 | ap_log_error(APLOG_MARK,DEBUGLEVEL,s,"mod_log_sql: database connection error: %s",MYSQL_ERROR(&logsql_server)); | 730 | ap_log_error(APLOG_MARK,APLOG_DEBUG,0,s,"mod_log_sql: database connection error: %s",MYSQL_ERROR(&global_config.server)); |
637 | ap_log_error(APLOG_MARK,DEBUGLEVEL,s,"HOST: '%s' PORT: '%d' DB: '%s' USER: '%s' SOCKET: '%s'", | 731 | ap_log_error(APLOG_MARK,APLOG_DEBUG,0,s,"HOST: '%s' PORT: '%d' DB: '%s' USER: '%s' SOCKET: '%s'", |
638 | logsql_dbhost, logsql_tcpport, logsql_dbname, logsql_dbuser, logsql_socketfile); | 732 | global_config.dbhost, global_config.tcpport, global_config.dbname, global_config.dbuser, global_config.socketfile); |
639 | #endif | 733 | #endif |
640 | return 0; | 734 | return 0; |
641 | } | 735 | } |
642 | } else { | 736 | } else { |
643 | ap_log_error(APLOG_MARK,ERRLEVEL,s,"mod_log_sql: insufficient configuration info to establish database link"); | 737 | ap_log_error(APLOG_MARK,APLOG_ERR,0,s,"mod_log_sql: insufficient configuration info to establish database link"); |
644 | return 0; | 738 | return 0; |
645 | } | 739 | } |
646 | } | 740 | } |
647 | 741 | ||
648 | const char *extract_table(void *data, const char *key, const char *val) | 742 | /*static const char *extract_table(void *data, const char *key, const char *val) |
649 | { | 743 | { |
650 | request_rec *r = (request_rec *)data; | 744 | request_rec *r = (request_rec *)data; |
651 | 745 | ||
652 | return ap_pstrcat(r->pool, key, " = ", val, " ", NULL); | 746 | return apr_pstrcat(r->pool, key, " = ", val, " ", NULL); |
653 | } | 747 | }*/ |
654 | 748 | ||
655 | void preserve_entry(request_rec *r, const char *query) | 749 | static void preserve_entry(request_rec *r, const char *query) |
656 | { | 750 | { |
657 | FILE *fp; | 751 | apr_file_t *fp; |
658 | logsql_state *cls = get_module_config(r->server->module_config, &sql_log_module); | 752 | logsql_state *cls = ap_get_module_config(r->server->module_config, |
753 | &log_sql_module); | ||
659 | 754 | ||
660 | fp = pfopen(r->pool, cls->preserve_file, "a"); | 755 | if (apr_file_open(&fp, cls->preserve_file,APR_APPEND, APR_OS_DEFAULT, r->pool)!=APR_SUCCESS) { |
661 | if (fp == NULL) | 756 | ap_log_error(APLOG_MARK,APLOG_ERR,0,r->server,"mod_log_sql: attempted append of local preserve file but failed."); |
662 | ap_log_error(APLOG_MARK,ERRLEVEL,r->server,"mod_log_sql: attempted append of local preserve file but failed."); | 757 | } else { |
663 | else { | 758 | apr_file_printf(fp,"%s;\n", query); |
664 | fprintf(fp,"%s;\n", query); | 759 | apr_file_close(fp); |
665 | pfclose(r->pool, fp); | ||
666 | #ifdef DEBUG | 760 | #ifdef DEBUG |
667 | ap_log_error(APLOG_MARK,DEBUGLEVEL,r->server,"mod_log_sql: entry preserved in %s", cls->preserve_file); | 761 | ap_log_error(APLOG_MARK,APLOG_DEBUG,0,r->server,"mod_log_sql: entry preserved in %s", cls->preserve_file); |
668 | #endif | 762 | #endif |
669 | } | 763 | } |
670 | } | 764 | } |
671 | 765 | ||
672 | 766 | ||
673 | /*-----------------------------------------------------*/ | 767 | /*-----------------------------------------------------* |
674 | /* safe_sql_query: perform a database query with */ | 768 | * safe_sql_query: perform a database query with * |
675 | /* a degree of safety and error checking. */ | 769 | * a degree of safety and error checking. * |
676 | /* */ | 770 | * * |
677 | /* Parms: request record, SQL insert statement */ | 771 | * Parms: request record, SQL insert statement * |
678 | /* Returns: 0 (OK) on success */ | 772 | * Returns: 0 (OK) on success * |
679 | /* 1 if have no log handle */ | 773 | * 1 if have no log handle * |
680 | /* 2 if insert delayed failed (kluge) */ | 774 | * 2 if insert delayed failed (kluge) * |
681 | /* the actual MySQL return code on error */ | 775 | * the actual MySQL return code on error * |
682 | /*-----------------------------------------------------*/ | 776 | *-----------------------------------------------------*/ |
683 | unsigned int safe_sql_query(request_rec *r, const char *query) | 777 | static unsigned int safe_sql_query(request_rec *r, const char *query) |
684 | { | 778 | { |
685 | int retval; | 779 | int retval; |
686 | struct timespec delay, remainder; | 780 | struct timespec delay, remainder; |
687 | int ret; | 781 | int ret; |
688 | void (*handler) (int); | 782 | void (*handler) (int); |
689 | logsql_state *cls; | 783 | logsql_state *cls; |
690 | unsigned int real_error; | 784 | unsigned int real_error = 0; |
691 | #ifdef WANT_DELAYED_MYSQL_INSERT | 785 | char *real_error_str = NULL; |
692 | char *real_error_str; | ||
693 | #endif | ||
694 | 786 | ||
695 | /* A failed mysql_query() may send a SIGPIPE, so we ignore that signal momentarily. */ | 787 | /* A failed mysql_query() may send a SIGPIPE, so we ignore that signal momentarily. */ |
696 | handler = signal(SIGPIPE, SIG_IGN); | 788 | handler = signal(SIGPIPE, SIG_IGN); |
697 | 789 | ||
698 | /* First attempt for the query */ | 790 | /* First attempt for the query */ |
699 | if (!logsql_server_p) { | 791 | if (!global_config.server_p) { |
700 | signal(SIGPIPE, handler); | 792 | signal(SIGPIPE, handler); |
701 | return 1; | 793 | return 1; |
702 | } else if (!(retval = mysql_query(logsql_server_p, query))) { | 794 | } else if (!(retval = mysql_query(global_config.server_p, query))) { |
703 | signal(SIGPIPE, handler); | 795 | signal(SIGPIPE, handler); |
704 | return 0; | 796 | return 0; |
705 | } | 797 | } |
@@ -707,37 +799,38 @@ unsigned int safe_sql_query(request_rec *r, const char *query) | |||
707 | /* If we ran the query and it returned an error, try to be robust. | 799 | /* If we ran the query and it returned an error, try to be robust. |
708 | * (After all, the module thought it had a valid mysql_log connection but the query | 800 | * (After all, the module thought it had a valid mysql_log connection but the query |
709 | * could have failed for a number of reasons, so we have to be extra-safe and check.) */ | 801 | * could have failed for a number of reasons, so we have to be extra-safe and check.) */ |
710 | #ifdef WANT_DELAYED_MYSQL_INSERT | 802 | if (global_config.insertdelayed) { |
711 | real_error_str = MYSQL_ERROR(logsql_server_p); | 803 | real_error_str = MYSQL_ERROR(global_config.server_p); |
712 | #else | 804 | } else { |
713 | real_error = mysql_errno(logsql_server_p); | 805 | real_error = mysql_errno(global_config.server_p); |
714 | #endif | 806 | } |
715 | 807 | ||
716 | /* Check to see if the error is "nonexistent table" */ | 808 | /* Check to see if the error is "nonexistent table" */ |
717 | #ifdef WANT_DELAYED_MYSQL_INSERT | 809 | if (global_config.insertdelayed) { |
718 | if ((strstr(real_error_str, "Table")) && (strstr(real_error_str,"doesn't exist"))) { | 810 | retval = (strstr(real_error_str, "Table")) && (strstr(real_error_str,"doesn't exist")); |
719 | #else | 811 | } else { |
720 | if (real_error == ER_NO_SUCH_TABLE) { | 812 | retval = (real_error == ER_NO_SUCH_TABLE); |
721 | #endif | 813 | } |
722 | if (logsql_createtables) { | 814 | if (retval) { |
723 | ap_log_error(APLOG_MARK,ERRLEVEL,r->server,"mod_log_sql: table doesn't exist...creating now"); | 815 | if (global_config.createtables) { |
724 | cls = get_module_config(r->server->module_config, &sql_log_module); | 816 | ap_log_error(APLOG_MARK,APLOG_ERR,0,r->server,"mod_log_sql: table doesn't exist...creating now"); |
817 | cls = ap_get_module_config(r->server->module_config, &log_sql_module); | ||
725 | if (safe_create_tables(cls, r)) { | 818 | if (safe_create_tables(cls, r)) { |
726 | ap_log_error(APLOG_MARK,ERRLEVEL,r->server,"mod_log_sql: child attempted but failed to create one or more tables for %s, preserving query", ap_get_server_name(r)); | 819 | ap_log_error(APLOG_MARK,APLOG_ERR,0,r->server,"mod_log_sql: child attempted but failed to create one or more tables for %s, preserving query", ap_get_server_name(r)); |
727 | preserve_entry(r, query); | 820 | preserve_entry(r, query); |
728 | retval = mysql_errno(logsql_server_p); | 821 | retval = mysql_errno(global_config.server_p); |
729 | } else { | 822 | } else { |
730 | ap_log_error(APLOG_MARK,ERRLEVEL,r->server,"mod_log_sql: tables successfully created - retrying query"); | 823 | ap_log_error(APLOG_MARK,APLOG_ERR,0,r->server,"mod_log_sql: tables successfully created - retrying query"); |
731 | if (mysql_query(logsql_server_p, query)) { | 824 | if (mysql_query(global_config.server_p, query)) { |
732 | ap_log_error(APLOG_MARK,ERRLEVEL,r->server,"mod_log_sql: giving up, preserving query"); | 825 | ap_log_error(APLOG_MARK,APLOG_ERR,0,r->server,"mod_log_sql: giving up, preserving query"); |
733 | preserve_entry(r, query); | 826 | preserve_entry(r, query); |
734 | retval = mysql_errno(logsql_server_p); | 827 | retval = mysql_errno(global_config.server_p); |
735 | } else | 828 | } else |
736 | ap_log_error(APLOG_MARK,ERRLEVEL,r->server,"mod_log_sql: query successful after table creation"); | 829 | ap_log_error(APLOG_MARK,APLOG_ERR,0,r->server,"mod_log_sql: query successful after table creation"); |
737 | retval = 0; | 830 | retval = 0; |
738 | } | 831 | } |
739 | } else { | 832 | } else { |
740 | ap_log_error(APLOG_MARK,ERRLEVEL,r->server,"mod_log_sql, table doesn't exist, creation denied by configuration, preserving query"); | 833 | ap_log_error(APLOG_MARK,APLOG_ERR,0,r->server,"mod_log_sql, table doesn't exist, creation denied by configuration, preserving query"); |
741 | preserve_entry(r, query); | 834 | preserve_entry(r, query); |
742 | retval = ER_NO_SUCH_TABLE; | 835 | retval = ER_NO_SUCH_TABLE; |
743 | } | 836 | } |
@@ -748,64 +841,66 @@ unsigned int safe_sql_query(request_rec *r, const char *query) | |||
748 | 841 | ||
749 | /* Handle all other types of errors */ | 842 | /* Handle all other types of errors */ |
750 | 843 | ||
751 | cls = get_module_config(r->server->module_config, &sql_log_module); | 844 | cls = ap_get_module_config(r->server->module_config, &log_sql_module); |
752 | 845 | ||
753 | /* Something went wrong, so start by trying to restart the db link. */ | 846 | /* Something went wrong, so start by trying to restart the db link. */ |
754 | #ifdef WANT_DELAYED_MYSQL_INSERT | 847 | if (global_config.insertdelayed) { |
755 | real_error = 2; | 848 | real_error = 2; |
756 | #else | 849 | } else { |
757 | real_error = mysql_errno(logsql_server_p); | 850 | real_error = mysql_errno(global_config.server_p); |
758 | #endif | 851 | } |
759 | ap_log_error(APLOG_MARK,ERRLEVEL,r->server,"mod_log_sql: first attempt failed, API said: error %d, \"%s\"", real_error, MYSQL_ERROR(logsql_server_p)); | 852 | |
760 | mysql_close(logsql_server_p); | 853 | ap_log_error(APLOG_MARK,APLOG_ERR,0,r->server,"mod_log_sql: first attempt failed, API said: error %d, \"%s\"", real_error, MYSQL_ERROR(global_config.server_p)); |
761 | logsql_server_p = NULL; | 854 | mysql_close(global_config.server_p); |
855 | global_config.server_p = NULL; | ||
762 | open_logdb_link(r->server); | 856 | open_logdb_link(r->server); |
763 | 857 | ||
764 | if (logsql_server_p == NULL) { /* still unable to link */ | 858 | if (global_config.server_p == NULL) { /* still unable to link */ |
765 | signal(SIGPIPE, handler); | 859 | signal(SIGPIPE, handler); |
766 | ap_log_error(APLOG_MARK,ERRLEVEL,r->server,"mod_log_sql: reconnect failed, unable to reach database. SQL logging stopped until child regains a db connection."); | 860 | ap_log_error(APLOG_MARK,APLOG_ERR,0,r->server,"mod_log_sql: reconnect failed, unable to reach database. SQL logging stopped until child regains a db connection."); |
767 | ap_log_error(APLOG_MARK,ERRLEVEL,r->server,"mod_log_sql: log entries are being preserved in %s", cls->preserve_file); | 861 | ap_log_error(APLOG_MARK,APLOG_ERR,0,r->server,"mod_log_sql: log entries are being preserved in %s", cls->preserve_file); |
768 | return 1; | 862 | return 1; |
769 | } else | 863 | } else |
770 | ap_log_error(APLOG_MARK,ERRLEVEL,r->server,"mod_log_sql: db reconnect successful"); | 864 | ap_log_error(APLOG_MARK,APLOG_ERR,0,r->server,"mod_log_sql: db reconnect successful"); |
771 | 865 | ||
772 | /* First sleep for a tiny amount of time. */ | 866 | /* First sleep for a tiny amount of time. */ |
773 | delay.tv_sec = 0; | 867 | delay.tv_sec = 0; |
774 | delay.tv_nsec = 250000000; /* max is 999999999 (nine nines) */ | 868 | delay.tv_nsec = 250000000; /* max is 999999999 (nine nines) */ |
775 | ret = nanosleep(&delay, &remainder); | 869 | ret = nanosleep(&delay, &remainder); |
776 | if (ret && errno != EINTR) | 870 | if (ret && errno != EINTR) |
777 | ap_log_error(APLOG_MARK,ERRLEVEL,r->server,"mod_log_sql: nanosleep unsuccessful"); | 871 | ap_log_error(APLOG_MARK,APLOG_ERR,0,r->server,"mod_log_sql: nanosleep unsuccessful"); |
778 | 872 | ||
779 | /* Then make our second attempt */ | 873 | /* Then make our second attempt */ |
780 | retval = mysql_query(logsql_server_p,query); | 874 | retval = mysql_query(global_config.server_p,query); |
781 | 875 | ||
782 | /* If this one also failed, log that and append to our local offline file */ | 876 | /* If this one also failed, log that and append to our local offline file */ |
783 | if (retval) { | 877 | if (retval) { |
784 | #ifdef WANT_DELAYED_MYSQL_INSERT | 878 | if (global_config.insertdelayed) { |
785 | real_error = 2; | 879 | real_error = 2; |
786 | #else | 880 | } else { |
787 | real_error = mysql_errno(logsql_server_p); | 881 | real_error = mysql_errno(global_config.server_p); |
788 | #endif | 882 | } |
789 | ap_log_error(APLOG_MARK,ERRLEVEL,r->server,"mod_log_sql: second attempt failed, API said: error %d, \"%s\" -- preserving", real_error, MYSQL_ERROR(logsql_server_p)); | 883 | |
884 | ap_log_error(APLOG_MARK,APLOG_ERR,0,r->server,"mod_log_sql: second attempt failed, API said: error %d, \"%s\" -- preserving", real_error, MYSQL_ERROR(global_config.server_p)); | ||
790 | preserve_entry(r, query); | 885 | preserve_entry(r, query); |
791 | retval = real_error; | 886 | retval = real_error; |
792 | } else | 887 | } else |
793 | ap_log_error(APLOG_MARK,ERRLEVEL,r->server,"mod_log_sql: second attempt successful"); | 888 | ap_log_error(APLOG_MARK,APLOG_ERR,0,r->server,"mod_log_sql: second attempt successful"); |
794 | 889 | ||
795 | /* Restore SIGPIPE to its original handler function */ | 890 | /* Restore SIGPIPE to its original handler function */ |
796 | signal(SIGPIPE, handler); | 891 | signal(SIGPIPE, handler); |
797 | return retval; | 892 | return retval; |
798 | } | 893 | } |
799 | 894 | ||
800 | /*-----------------------------------------------------*/ | 895 | /*-----------------------------------------------------* |
801 | /* safe_create_tables: create SQL table set for the */ | 896 | * safe_create_tables: create SQL table set for the * |
802 | /* virtual server represented by cls. */ | 897 | * virtual server represented by cls. * |
803 | /* */ | 898 | * * |
804 | /* Parms: virtserver structure, request record */ | 899 | * Parms: virtserver structure, request record * |
805 | /* Returns: 0 on no errors */ | 900 | * Returns: 0 on no errors * |
806 | /* mysql error code on failure */ | 901 | * mysql error code on failure * |
807 | /*-----------------------------------------------------*/ | 902 | *-----------------------------------------------------*/ |
808 | int safe_create_tables(logsql_state *cls, request_rec *r) | 903 | static int safe_create_tables(logsql_state *cls, request_rec *r) |
809 | { | 904 | { |
810 | int retval; | 905 | int retval; |
811 | unsigned int create_results; | 906 | unsigned int create_results; |
@@ -859,45 +954,45 @@ int safe_create_tables(logsql_state *cls, request_rec *r) | |||
859 | val varchar(80))"; | 954 | val varchar(80))"; |
860 | 955 | ||
861 | /* Find memory long enough to hold the whole CREATE string + \0 */ | 956 | /* Find memory long enough to hold the whole CREATE string + \0 */ |
862 | create_access = ap_pstrcat(r->pool, createprefix, cls->transfer_table_name, access_suffix, NULL); | 957 | create_access = apr_pstrcat(r->pool, createprefix, cls->transfer_table_name, access_suffix, NULL); |
863 | create_notes = ap_pstrcat(r->pool, createprefix, cls->notes_table_name, notes_suffix, NULL); | 958 | create_notes = apr_pstrcat(r->pool, createprefix, cls->notes_table_name, notes_suffix, NULL); |
864 | create_hout = ap_pstrcat(r->pool, createprefix, cls->hout_table_name, headers_suffix, NULL); | 959 | create_hout = apr_pstrcat(r->pool, createprefix, cls->hout_table_name, headers_suffix, NULL); |
865 | create_hin = ap_pstrcat(r->pool, createprefix, cls->hin_table_name, headers_suffix, NULL); | 960 | create_hin = apr_pstrcat(r->pool, createprefix, cls->hin_table_name, headers_suffix, NULL); |
866 | create_cookies= ap_pstrcat(r->pool, createprefix, cls->cookie_table_name, cookies_suffix, NULL); | 961 | create_cookies= apr_pstrcat(r->pool, createprefix, cls->cookie_table_name, cookies_suffix, NULL); |
867 | 962 | ||
868 | #ifdef DEBUG | 963 | #ifdef DEBUG |
869 | ap_log_error(APLOG_MARK,DEBUGLEVEL,r->server,"mod_log_sql: create string: %s", create_access); | 964 | ap_log_error(APLOG_MARK,APLOG_DEBUG,0,r->server,"mod_log_sql: create string: %s", create_access); |
870 | ap_log_error(APLOG_MARK,DEBUGLEVEL,r->server,"mod_log_sql: create string: %s", create_notes); | 965 | ap_log_error(APLOG_MARK,APLOG_DEBUG,0,r->server,"mod_log_sql: create string: %s", create_notes); |
871 | ap_log_error(APLOG_MARK,DEBUGLEVEL,r->server,"mod_log_sql: create string: %s", create_hout); | 966 | ap_log_error(APLOG_MARK,APLOG_DEBUG,0,r->server,"mod_log_sql: create string: %s", create_hout); |
872 | ap_log_error(APLOG_MARK,DEBUGLEVEL,r->server,"mod_log_sql: create string: %s", create_hin); | 967 | ap_log_error(APLOG_MARK,APLOG_DEBUG,0,r->server,"mod_log_sql: create string: %s", create_hin); |
873 | ap_log_error(APLOG_MARK,DEBUGLEVEL,r->server,"mod_log_sql: create string: %s", create_cookies); | 968 | ap_log_error(APLOG_MARK,APLOG_DEBUG,0,r->server,"mod_log_sql: create string: %s", create_cookies); |
874 | #endif | 969 | #endif |
875 | 970 | ||
876 | /* Assume that things worked unless told otherwise */ | 971 | /* Assume that things worked unless told otherwise */ |
877 | retval = 0; | 972 | retval = 0; |
878 | 973 | ||
879 | if ((create_results = safe_sql_query(r, create_access))) { | 974 | if ((create_results = safe_sql_query(r, create_access))) { |
880 | ap_log_error(APLOG_MARK,ERRLEVEL,r->server,"mod_log_sql: failed to create access table"); | 975 | ap_log_error(APLOG_MARK,APLOG_ERR,0,r->server,"mod_log_sql: failed to create access table"); |
881 | retval = create_results; | 976 | retval = create_results; |
882 | } | 977 | } |
883 | 978 | ||
884 | if ((create_results = safe_sql_query(r, create_notes))) { | 979 | if ((create_results = safe_sql_query(r, create_notes))) { |
885 | ap_log_error(APLOG_MARK,ERRLEVEL,r->server,"mod_log_sql: failed to create notes table"); | 980 | ap_log_error(APLOG_MARK,APLOG_ERR,0,r->server,"mod_log_sql: failed to create notes table"); |
886 | retval = create_results; | 981 | retval = create_results; |
887 | } | 982 | } |
888 | 983 | ||
889 | if ((create_results = safe_sql_query(r, create_hin))) { | 984 | if ((create_results = safe_sql_query(r, create_hin))) { |
890 | ap_log_error(APLOG_MARK,ERRLEVEL,r->server,"mod_log_sql: failed to create header_out table"); | 985 | ap_log_error(APLOG_MARK,APLOG_ERR,0,r->server,"mod_log_sql: failed to create header_out table"); |
891 | retval = create_results; | 986 | retval = create_results; |
892 | } | 987 | } |
893 | 988 | ||
894 | if ((create_results = safe_sql_query(r, create_hout))) { | 989 | if ((create_results = safe_sql_query(r, create_hout))) { |
895 | ap_log_error(APLOG_MARK,ERRLEVEL,r->server,"mod_log_sql: failed to create header_in table"); | 990 | ap_log_error(APLOG_MARK,APLOG_ERR,0,r->server,"mod_log_sql: failed to create header_in table"); |
896 | retval = create_results; | 991 | retval = create_results; |
897 | } | 992 | } |
898 | 993 | ||
899 | if ((create_results = safe_sql_query(r, create_cookies))) { | 994 | if ((create_results = safe_sql_query(r, create_cookies))) { |
900 | ap_log_error(APLOG_MARK,ERRLEVEL,r->server,"mod_log_sql: failed to create cookies table"); | 995 | ap_log_error(APLOG_MARK,APLOG_ERR,0,r->server,"mod_log_sql: failed to create cookies table"); |
901 | retval = create_results; | 996 | retval = create_results; |
902 | } | 997 | } |
903 | 998 | ||
@@ -909,220 +1004,102 @@ int safe_create_tables(logsql_state *cls, request_rec *r) | |||
909 | * to the directives found at Apache runtime. * | 1004 | * to the directives found at Apache runtime. * |
910 | * ------------------------------------------------*/ | 1005 | * ------------------------------------------------*/ |
911 | 1006 | ||
912 | const char *set_log_sql_massvirtual(cmd_parms *parms, void *dummy, int flag) | ||
913 | { | ||
914 | logsql_massvirtual = ( flag ? 1 : 0); | ||
915 | return NULL; | ||
916 | } | ||
917 | 1007 | ||
918 | const char *set_log_sql_force_preserve(cmd_parms *parms, void *dummy, int flag) | 1008 | static const char *set_global_flag_slot(cmd_parms *cmd, |
1009 | void *struct_ptr, | ||
1010 | int flag) | ||
919 | { | 1011 | { |
920 | logsql_forcepreserve = ( flag ? 1 : 0); | 1012 | int offset = (int)(long)&global_config; |
921 | return NULL; | ||
922 | } | ||
923 | 1013 | ||
924 | const char *set_log_sql_machine_id(cmd_parms *parms, void *dummy, char *arg) | 1014 | *(int *)((char *)struct_ptr + offset) = flag ? 1 : 0; |
925 | { | 1015 | |
926 | logsql_machid = arg; | 1016 | return NULL; |
927 | return NULL; | ||
928 | } | 1017 | } |
929 | 1018 | ||
930 | const char *set_log_sql_create(cmd_parms *parms, void *dummy, int flag) | 1019 | static const char *set_global_nmv_flag_slot(cmd_parms *parms, |
1020 | void *struct_ptr, | ||
1021 | int flag) | ||
931 | { | 1022 | { |
932 | if (logsql_massvirtual) | 1023 | if (global_config.massvirtual) |
933 | ap_log_error(APLOG_MARK,WARNINGLEVEL,parms->server,"mod_log_sql: do not set LogSQLCreateTables when LogSQLMassVirtualHosting is On. Ignoring."); | 1024 | return apr_psprintf(parms->pool, |
1025 | "mod_log_sql: do not set %s when LogSQLMassVirtualHosting is On.", | ||
1026 | parms->cmd->name); | ||
934 | else | 1027 | else |
935 | logsql_createtables = ( flag ? 1 : 0); | 1028 | return set_global_flag_slot(parms,struct_ptr,flag); |
936 | return NULL; | ||
937 | } | 1029 | } |
938 | 1030 | ||
939 | const char *set_log_sql_db(cmd_parms *parms, void *dummy, char *arg) | 1031 | static const char *set_global_string_slot(cmd_parms *cmd, |
1032 | void *struct_ptr, | ||
1033 | const char *arg) | ||
940 | { | 1034 | { |
941 | logsql_dbname = arg; | 1035 | int offset = (int)(long)&global_config; |
942 | return NULL; | 1036 | |
1037 | *(const char **)((char *)struct_ptr + offset) = apr_pstrdup(cmd->pool,arg); | ||
1038 | |||
1039 | return NULL; | ||
943 | } | 1040 | } |
944 | 1041 | ||
945 | const char *set_log_sql_cookie(cmd_parms *parms, void *dummy, char *arg) | 1042 | static const char *set_server_string_slot(cmd_parms *cmd, |
1043 | void *struct_ptr, | ||
1044 | const char *arg) | ||
946 | { | 1045 | { |
947 | logsql_state *cls = get_module_config(parms->server->module_config, &sql_log_module); | 1046 | int offset = (int)(long)ap_get_module_config(cmd->server->module_config, |
1047 | &log_sql_module); | ||
948 | 1048 | ||
949 | cls->cookie_name = arg; | 1049 | *(const char **)((char *)struct_ptr + offset) = arg; |
950 | return NULL; | 1050 | |
1051 | return NULL; | ||
951 | } | 1052 | } |
952 | 1053 | ||
953 | const char *set_log_sql_preserve_file(cmd_parms *parms, void *dummy, char *arg) | ||
954 | { | ||
955 | /* char *pfile; */ | ||
956 | logsql_state *cls = get_module_config(parms->server->module_config, &sql_log_module); | ||
957 | 1054 | ||
958 | /* pfile = ap_pstrcat(parms->pool, "/tmp/", arg, NULL); */ | 1055 | static const char *set_server_nmv_string_slot(cmd_parms *parms, |
959 | cls->preserve_file = arg; | 1056 | void *struct_ptr, |
960 | return NULL; | 1057 | const char *arg) |
1058 | { | ||
1059 | if (global_config.massvirtual) | ||
1060 | return apr_psprintf(parms->pool, | ||
1061 | "mod_log_sql: do not set %s when LogSQLMassVirtualHosting is On.", | ||
1062 | parms->cmd->name); | ||
1063 | else | ||
1064 | return set_server_string_slot(parms,struct_ptr,arg); | ||
961 | } | 1065 | } |
962 | 1066 | ||
963 | const char *set_log_sql_info(cmd_parms *parms, void *dummy, char *host, char *user, char *pwd) | 1067 | static const char *set_log_sql_info(cmd_parms *cmd, void *dummy, const char *host, const char *user, const char *pwd) |
964 | { | 1068 | { |
965 | if (*host != '.') { | 1069 | if (*host != '.') { |
966 | logsql_dbhost = host; | 1070 | global_config.dbhost = apr_pstrdup(cmd->pool,host); |
967 | } | 1071 | } |
968 | if (*user != '.') { | 1072 | if (*user != '.') { |
969 | logsql_dbuser = user; | 1073 | global_config.dbuser = apr_pstrdup(cmd->pool,user); |
970 | } | 1074 | } |
971 | if (*pwd != '.') { | 1075 | if (*pwd != '.') { |
972 | logsql_dbpwd = pwd; | 1076 | global_config.dbpwd = apr_pstrdup(cmd->pool,pwd); |
973 | } | 1077 | } |
974 | return NULL; | 1078 | return NULL; |
975 | } | 1079 | } |
976 | 1080 | ||
977 | const char *set_log_sql_transfer_table(cmd_parms *parms, void *dummy, char *arg) | 1081 | static const char *add_server_string_slot(cmd_parms *cmd, |
978 | { | 1082 | void *struct_ptr, |
979 | logsql_state *cls = get_module_config(parms->server->module_config, &sql_log_module); | 1083 | const char *arg) |
980 | |||
981 | if (logsql_massvirtual != 0) | ||
982 | ap_log_error(APLOG_MARK,WARNINGLEVEL,parms->server,"mod_log_sql: do not set LogSQLTransferLogTable when LogSQLMassVirtualHosting is On. Ignoring."); | ||
983 | else | ||
984 | cls->transfer_table_name = arg; | ||
985 | return NULL; | ||
986 | } | ||
987 | |||
988 | const char *set_log_sql_cookie_table(cmd_parms *parms, void *dummy, char *arg) | ||
989 | { | ||
990 | logsql_state *cls = get_module_config(parms->server->module_config, &sql_log_module); | ||
991 | |||
992 | if (logsql_massvirtual != 0) | ||
993 | ap_log_error(APLOG_MARK,WARNINGLEVEL,parms->server,"mod_log_sql: do not set LogSQLCookieLogTable when LogSQLMassVirtualHosting is On. Ignoring."); | ||
994 | else | ||
995 | cls->cookie_table_name = arg; | ||
996 | return NULL; | ||
997 | } | ||
998 | |||
999 | const char *set_log_sql_notes_table(cmd_parms *parms, void *dummy, char *arg) | ||
1000 | { | ||
1001 | logsql_state *cls = get_module_config(parms->server->module_config, &sql_log_module); | ||
1002 | |||
1003 | if (logsql_massvirtual != 0) | ||
1004 | ap_log_error(APLOG_MARK,WARNINGLEVEL,parms->server,"mod_log_sql: do not set LogSQLNotesLogTable when LogSQLMassVirtualHosting is On. Ignoring."); | ||
1005 | else | ||
1006 | cls->notes_table_name = arg; | ||
1007 | return NULL; | ||
1008 | } | ||
1009 | |||
1010 | const char *set_log_sql_hin_table(cmd_parms *parms, void *dummy, char *arg) | ||
1011 | { | ||
1012 | logsql_state *cls = get_module_config(parms->server->module_config, &sql_log_module); | ||
1013 | |||
1014 | if (logsql_massvirtual != 0) | ||
1015 | ap_log_error(APLOG_MARK,WARNINGLEVEL,parms->server,"mod_log_sql: do not set LogSQLHeadersInLogTable when LogSQLMassVirtualHosting is On. Ignoring."); | ||
1016 | else | ||
1017 | cls->hin_table_name = arg; | ||
1018 | return NULL; | ||
1019 | } | ||
1020 | |||
1021 | const char *set_log_sql_hout_table(cmd_parms *parms, void *dummy, char *arg) | ||
1022 | { | ||
1023 | logsql_state *cls = get_module_config(parms->server->module_config, &sql_log_module); | ||
1024 | |||
1025 | if (logsql_massvirtual != 0) | ||
1026 | ap_log_error(APLOG_MARK,WARNINGLEVEL,parms->server,"mod_log_sql: do not set LogSQLHeadersOutLogTable when LogSQLMassVirtualHosting is On. Ignoring."); | ||
1027 | else | ||
1028 | cls->hout_table_name = arg; | ||
1029 | return NULL; | ||
1030 | } | ||
1031 | |||
1032 | const char *set_log_sql_transfer_log_format(cmd_parms *parms, void *dummy, char *arg) | ||
1033 | { | ||
1034 | logsql_state *cls = get_module_config(parms->server->module_config, &sql_log_module); | ||
1035 | |||
1036 | cls->transfer_log_format = arg; | ||
1037 | return NULL; | ||
1038 | } | ||
1039 | |||
1040 | const char *set_log_sql_socket_file(cmd_parms *parms, void *dummy, char *arg) | ||
1041 | { | ||
1042 | logsql_socketfile = arg; | ||
1043 | |||
1044 | return NULL; | ||
1045 | } | ||
1046 | |||
1047 | const char *set_log_sql_tcp_port(cmd_parms *parms, void *dummy, char *arg) | ||
1048 | { | ||
1049 | logsql_tcpport = (unsigned int)atoi(arg); | ||
1050 | |||
1051 | return NULL; | ||
1052 | } | ||
1053 | |||
1054 | const char *add_log_sql_transfer_accept(cmd_parms *parms, void *dummy, char *arg) | ||
1055 | { | ||
1056 | char **addme; | ||
1057 | logsql_state *cls = get_module_config(parms->server->module_config, &sql_log_module); | ||
1058 | |||
1059 | addme = push_array(cls->transfer_accept_list); | ||
1060 | *addme = pstrdup(cls->transfer_accept_list->pool, arg); | ||
1061 | return NULL; | ||
1062 | } | ||
1063 | |||
1064 | const char *add_log_sql_transfer_ignore(cmd_parms *parms, void *dummy, char *arg) | ||
1065 | { | ||
1066 | char **addme; | ||
1067 | logsql_state *cls = get_module_config(parms->server->module_config, &sql_log_module); | ||
1068 | |||
1069 | addme = push_array(cls->transfer_ignore_list); | ||
1070 | *addme = pstrdup(cls->transfer_ignore_list->pool, arg); | ||
1071 | return NULL; | ||
1072 | } | ||
1073 | |||
1074 | const char *add_log_sql_remhost_ignore(cmd_parms *parms, void *dummy, char *arg) | ||
1075 | { | 1084 | { |
1076 | char **addme; | 1085 | char **addme; |
1077 | logsql_state *cls = get_module_config(parms->server->module_config, &sql_log_module); | 1086 | int offset = (int)(long)ap_get_module_config(cmd->server->module_config, |
1078 | 1087 | &log_sql_module); | |
1079 | addme = push_array(cls->remhost_ignore_list); | 1088 | apr_array_header_t *ary = *(apr_array_header_t **)((apr_array_header_t *)struct_ptr + offset); |
1080 | *addme = pstrdup(cls->remhost_ignore_list->pool, arg); | ||
1081 | return NULL; | ||
1082 | } | ||
1083 | 1089 | ||
1084 | const char *add_log_sql_note(cmd_parms *parms, void *dummy, char *arg) | 1090 | addme = apr_array_push(ary); |
1085 | { | 1091 | *addme = apr_pstrdup(ary->pool, arg); |
1086 | char **addme; | 1092 | |
1087 | logsql_state *cls = get_module_config(parms->server->module_config, &sql_log_module); | ||
1088 | |||
1089 | addme = push_array(cls->notes_list); | ||
1090 | *addme = pstrdup(cls->notes_list->pool, arg); | ||
1091 | return NULL; | 1093 | return NULL; |
1092 | } | 1094 | } |
1093 | 1095 | ||
1094 | const char *add_log_sql_hout(cmd_parms *parms, void *dummy, char *arg) | 1096 | static const char *set_log_sql_tcp_port(cmd_parms *parms, void *dummy, const char *arg) |
1095 | { | 1097 | { |
1096 | char **addme; | 1098 | global_config.tcpport = (unsigned int)atoi(arg); |
1097 | logsql_state *cls = get_module_config(parms->server->module_config, &sql_log_module); | ||
1098 | 1099 | ||
1099 | addme = push_array(cls->hout_list); | 1100 | return NULL; |
1100 | *addme = pstrdup(cls->hout_list->pool, arg); | ||
1101 | return NULL; | ||
1102 | } | ||
1103 | |||
1104 | const char *add_log_sql_hin(cmd_parms *parms, void *dummy, char *arg) | ||
1105 | { | ||
1106 | char **addme; | ||
1107 | logsql_state *cls = get_module_config(parms->server->module_config, &sql_log_module); | ||
1108 | |||
1109 | addme = push_array(cls->hin_list); | ||
1110 | *addme = pstrdup(cls->hin_list->pool, arg); | ||
1111 | return NULL; | ||
1112 | } | ||
1113 | |||
1114 | const char *add_log_sql_cookie(cmd_parms *parms, void *dummy, char *arg) | ||
1115 | { | ||
1116 | char **addme; | ||
1117 | logsql_state *cls = get_module_config(parms->server->module_config, &sql_log_module); | ||
1118 | |||
1119 | addme = push_array(cls->cookie_list); | ||
1120 | *addme = pstrdup(cls->cookie_list->pool, arg); | ||
1121 | return NULL; | ||
1122 | } | 1101 | } |
1123 | 1102 | ||
1124 | |||
1125 | |||
1126 | /*------------------------------------------------------------* | 1103 | /*------------------------------------------------------------* |
1127 | * Apache-specific hooks into the module code * | 1104 | * Apache-specific hooks into the module code * |
1128 | * that are defined in the array 'mysql_lgog_module' (at EOF) * | 1105 | * that are defined in the array 'mysql_lgog_module' (at EOF) * |
@@ -1130,6 +1107,20 @@ const char *add_log_sql_cookie(cmd_parms *parms, void *dummy, char *arg) | |||
1130 | 1107 | ||
1131 | 1108 | ||
1132 | /* | 1109 | /* |
1110 | * This function is called when an heavy-weight process (such as a child) is | ||
1111 | * being run down or destroyed. As with the child-initialisation function, | ||
1112 | * any information that needs to be recorded must be in static cells, since | ||
1113 | * there's no configuration record. | ||
1114 | * | ||
1115 | * There is no return value. | ||
1116 | */ | ||
1117 | static apr_status_t log_sql_close_link(void *data) | ||
1118 | { | ||
1119 | mysql_close(global_config.server_p); | ||
1120 | return APR_SUCCESS; | ||
1121 | } | ||
1122 | |||
1123 | /* | ||
1133 | * This function is called during server initialisation when an heavy-weight | 1124 | * This function is called during server initialisation when an heavy-weight |
1134 | * process (such as a child) is being initialised. As with the | 1125 | * process (such as a child) is being initialised. As with the |
1135 | * module-initialisation function, any information that needs to be recorded | 1126 | * module-initialisation function, any information that needs to be recorded |
@@ -1137,46 +1128,37 @@ const char *add_log_sql_cookie(cmd_parms *parms, void *dummy, char *arg) | |||
1137 | * | 1128 | * |
1138 | * There is no return value. | 1129 | * There is no return value. |
1139 | */ | 1130 | */ |
1140 | static void log_sql_child_init(server_rec *s, pool *p) | 1131 | static void log_sql_child_init(apr_pool_t *p, server_rec *s) |
1141 | { | 1132 | { |
1142 | int retval; | 1133 | apr_pool_cleanup_register(p, NULL, log_sql_close_link, log_sql_close_link); |
1134 | |||
1135 | } | ||
1143 | 1136 | ||
1144 | /* Open a link to the database */ | 1137 | static int log_sql_open(apr_pool_t *pc, apr_pool_t *p, apr_pool_t *pt, server_rec *s) |
1138 | { | ||
1139 | int retval; | ||
1140 | /* Open a link to the database */ | ||
1145 | retval = open_logdb_link(s); | 1141 | retval = open_logdb_link(s); |
1146 | if (!retval) | 1142 | if (!retval) |
1147 | ap_log_error(APLOG_MARK,ERRLEVEL,s,"mod_log_sql: child spawned but unable to open database link"); | 1143 | ap_log_error(APLOG_MARK,APLOG_ERR,0,s,"mod_log_sql: child spawned but unable to open database link"); |
1148 | 1144 | ||
1149 | #ifdef DEBUG | 1145 | #ifdef DEBUG |
1150 | if ( (retval == 1) || (retval == 2) ) | 1146 | if ( (retval == 1) || (retval == 2) ) |
1151 | ap_log_error(APLOG_MARK,DEBUGLEVEL,s,"mod_log_sql: open_logdb_link successful"); | 1147 | ap_log_error(APLOG_MARK,APLOG_DEBUG,0,s,"mod_log_sql: open_logdb_link successful"); |
1152 | if (retval == 3) | 1148 | if (retval == 3) |
1153 | ap_log_error(APLOG_MARK,DEBUGLEVEL,s,"mod_log_sql: open_logdb_link said that preservation is forced"); | 1149 | ap_log_error(APLOG_MARK,APLOG_DEBUG,0,s,"mod_log_sql: open_logdb_link said that preservation is forced"); |
1154 | #endif | 1150 | #endif |
1151 | return OK; | ||
1155 | } | 1152 | } |
1156 | |||
1157 | /* | 1153 | /* |
1158 | * This function is called when an heavy-weight process (such as a child) is | 1154 | void *log_sql_initializer(server_rec *main_server, apr_pool_t *p) |
1159 | * being run down or destroyed. As with the child-initialisation function, | ||
1160 | * any information that needs to be recorded must be in static cells, since | ||
1161 | * there's no configuration record. | ||
1162 | * | ||
1163 | * There is no return value. | ||
1164 | */ | ||
1165 | static void log_sql_child_exit(server_rec *s, pool *p) | ||
1166 | { | ||
1167 | mysql_close(logsql_server_p); | ||
1168 | } | ||
1169 | |||
1170 | |||
1171 | /* | ||
1172 | void *log_sql_initializer(server_rec *main_server, pool *p) | ||
1173 | { | 1155 | { |
1174 | server_rec *s; | 1156 | server_rec *s; |
1175 | 1157 | ||
1176 | logsql_state main_conf = ap_get_module_config(main_server->module_config, &sql_log_module); | 1158 | logsql_state main_conf = ap_get_module_config(main_server->module_config, &log_sql_module); |
1177 | 1159 | ||
1178 | for (server_rec *s = main_server; s; s = s->next) { | 1160 | for (server_rec *s = main_server; s; s = s->next) { |
1179 | conf = ap_get_module_config(s->module_config, &sql_log_module); | 1161 | conf = ap_get_module_config(s->module_config, &log_sql_module); |
1180 | if (conf->transfer_log_format == NULL && s != main_server) { | 1162 | if (conf->transfer_log_format == NULL && s != main_server) { |
1181 | *conf = *main_conf; | 1163 | *conf = *main_conf; |
1182 | } | 1164 | } |
@@ -1193,10 +1175,18 @@ void *log_sql_initializer(server_rec *main_server, pool *p) | |||
1193 | * The return value is a pointer to the created module-specific | 1175 | * The return value is a pointer to the created module-specific |
1194 | * structure. | 1176 | * structure. |
1195 | */ | 1177 | */ |
1196 | void *log_sql_make_state(pool *p, server_rec *s) | 1178 | static int log_sql_pre_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp) |
1197 | { | 1179 | { |
1180 | /* Initialize Global configuration */ | ||
1181 | memset(&global_config,0,sizeof(global_config)); | ||
1182 | global_config.socketfile = "/tmp/mysql.sock"; | ||
1183 | global_config.tcpport = 3306; | ||
1184 | return OK; | ||
1185 | } | ||
1198 | 1186 | ||
1199 | logsql_state *cls = (logsql_state *) ap_palloc(p, sizeof(logsql_state)); | 1187 | static void *log_sql_make_state(apr_pool_t *p, server_rec *s) |
1188 | { | ||
1189 | logsql_state *cls = (logsql_state *) apr_palloc(p, sizeof(logsql_state)); | ||
1200 | 1190 | ||
1201 | /* These defaults are overridable in the httpd.conf file. */ | 1191 | /* These defaults are overridable in the httpd.conf file. */ |
1202 | cls->transfer_table_name = NULL; /* No default b/c we want its absence to disable logging */ | 1192 | cls->transfer_table_name = NULL; /* No default b/c we want its absence to disable logging */ |
@@ -1207,111 +1197,32 @@ void *log_sql_make_state(pool *p, server_rec *s) | |||
1207 | cls->cookie_table_name = "cookies"; | 1197 | cls->cookie_table_name = "cookies"; |
1208 | cls->preserve_file = "/tmp/sql-preserve"; | 1198 | cls->preserve_file = "/tmp/sql-preserve"; |
1209 | 1199 | ||
1210 | cls->transfer_ignore_list = make_array(p, 1, sizeof(char *)); | 1200 | cls->transfer_ignore_list = apr_array_make(p, 1, sizeof(char *)); |
1211 | cls->transfer_accept_list = make_array(p, 1, sizeof(char *)); | 1201 | cls->transfer_accept_list = apr_array_make(p, 1, sizeof(char *)); |
1212 | cls->remhost_ignore_list = make_array(p, 1, sizeof(char *)); | 1202 | cls->remhost_ignore_list = apr_array_make(p, 1, sizeof(char *)); |
1213 | cls->notes_list = make_array(p, 1, sizeof(char *)); | 1203 | cls->notes_list = apr_array_make(p, 1, sizeof(char *)); |
1214 | cls->hin_list = make_array(p, 1, sizeof(char *)); | 1204 | cls->hin_list = apr_array_make(p, 1, sizeof(char *)); |
1215 | cls->hout_list = make_array(p, 1, sizeof(char *)); | 1205 | cls->hout_list = apr_array_make(p, 1, sizeof(char *)); |
1216 | cls->cookie_list = make_array(p, 1, sizeof(char *)); | 1206 | cls->cookie_list = apr_array_make(p, 1, sizeof(char *)); |
1217 | cls->cookie_name = NULL; | 1207 | cls->cookie_name = NULL; |
1218 | 1208 | ||
1219 | return (void *) cls; | 1209 | return (void *) cls; |
1220 | } | 1210 | } |
1221 | 1211 | ||
1222 | |||
1223 | /* Setup of the available httpd.conf configuration commands. | ||
1224 | * Structure: command, function called, NULL, where available, how many arguments, verbose description | ||
1225 | */ | ||
1226 | command_rec log_sql_cmds[] = { | ||
1227 | {"LogSQLTransferLogTable", set_log_sql_transfer_table, NULL, RSRC_CONF, TAKE1, | ||
1228 | "The database table that holds the transfer log"} | ||
1229 | , | ||
1230 | {"LogSQLNotesLogTable", set_log_sql_notes_table, NULL, RSRC_CONF, TAKE1, | ||
1231 | "The database table that holds the notes"} | ||
1232 | , | ||
1233 | {"LogSQLHeadersOutLogTable", set_log_sql_hout_table, NULL, RSRC_CONF, TAKE1, | ||
1234 | "The database table that holds the outbound headers"} | ||
1235 | , | ||
1236 | {"LogSQLHeadersInLogTable", set_log_sql_hin_table, NULL, RSRC_CONF, TAKE1, | ||
1237 | "The database table that holds the inbound headers"} | ||
1238 | , | ||
1239 | {"LogSQLCookieLogTable", set_log_sql_cookie_table, NULL, RSRC_CONF, TAKE1, | ||
1240 | "The database table that holds the cookie info"} | ||
1241 | , | ||
1242 | {"LogSQLTransferLogFormat", set_log_sql_transfer_log_format, NULL, RSRC_CONF, TAKE1, | ||
1243 | "Instruct the module what information to log to the database transfer log"} | ||
1244 | , | ||
1245 | {"LogSQLMachineID", set_log_sql_machine_id, NULL, RSRC_CONF, TAKE1, | ||
1246 | "Machine ID that the module will log, useful in web clusters to differentiate machines"} | ||
1247 | , | ||
1248 | {"LogSQLRequestAccept", add_log_sql_transfer_accept, NULL, RSRC_CONF, ITERATE, | ||
1249 | "List of URIs to accept for logging. Accesses that don't match will not be logged"} | ||
1250 | , | ||
1251 | {"LogSQLRequestIgnore", add_log_sql_transfer_ignore, NULL, RSRC_CONF, ITERATE, | ||
1252 | "List of URIs to ignore. Accesses that match will not be logged to database"} | ||
1253 | , | ||
1254 | {"LogSQLRemhostIgnore", add_log_sql_remhost_ignore, NULL, RSRC_CONF, ITERATE, | ||
1255 | "List of remote hosts to ignore. Accesses that match will not be logged to database"} | ||
1256 | , | ||
1257 | {"LogSQLDatabase", set_log_sql_db, NULL, RSRC_CONF, TAKE1, | ||
1258 | "The name of the database database for logging"} | ||
1259 | , | ||
1260 | {"LogSQLWhichCookie", set_log_sql_cookie, NULL, RSRC_CONF, TAKE1, | ||
1261 | "The single cookie that you want logged in the access_log when using the 'c' config directive"} | ||
1262 | , | ||
1263 | {"LogSQLLoginInfo", set_log_sql_info, NULL, RSRC_CONF, TAKE3, | ||
1264 | "The database host, user-id and password for logging"} | ||
1265 | , | ||
1266 | {"LogSQLCreateTables", set_log_sql_create, NULL, RSRC_CONF, FLAG, | ||
1267 | "Turn on module's capability to create its SQL tables on the fly"} | ||
1268 | , | ||
1269 | {"LogSQLMassVirtualHosting", set_log_sql_massvirtual, NULL, RSRC_CONF, FLAG, | ||
1270 | "Activates option(s) useful for ISPs performing mass virutal hosting"} | ||
1271 | , | ||
1272 | {"LogSQLForcePreserve", set_log_sql_force_preserve, NULL, RSRC_CONF, FLAG, | ||
1273 | "Forces logging to preserve file and bypasses database"} | ||
1274 | , | ||
1275 | {"LogSQLPreserveFile", set_log_sql_preserve_file, NULL, RSRC_CONF, TAKE1, | ||
1276 | "Name of the file to use for data preservation during database downtime"} | ||
1277 | , | ||
1278 | {"LogSQLSocketFile", set_log_sql_socket_file, NULL, RSRC_CONF, TAKE1, | ||
1279 | "Name of the file to employ for socket connections to database"} | ||
1280 | , | ||
1281 | {"LogSQLTCPPort", set_log_sql_tcp_port, NULL, RSRC_CONF, TAKE1, | ||
1282 | "Port number to use for TCP connections to database, defaults to 3306 if not set"} | ||
1283 | , | ||
1284 | {"LogSQLWhichNotes", add_log_sql_note, NULL, RSRC_CONF, ITERATE, | ||
1285 | "Notes that you would like to log in a separate table"} | ||
1286 | , | ||
1287 | {"LogSQLWhichHeadersOut", add_log_sql_hout, NULL, RSRC_CONF, ITERATE, | ||
1288 | "Outbound headers that you would like to log in a separate table"} | ||
1289 | , | ||
1290 | {"LogSQLWhichHeadersIn", add_log_sql_hin, NULL, RSRC_CONF, ITERATE, | ||
1291 | "Inbound headers that you would like to log in a separate table"} | ||
1292 | , | ||
1293 | {"LogSQLWhichCookies", add_log_sql_cookie, NULL, RSRC_CONF, ITERATE, | ||
1294 | "The cookie(s) that you would like to log in a separate table"} | ||
1295 | , | ||
1296 | {NULL} | ||
1297 | }; | ||
1298 | |||
1299 | |||
1300 | |||
1301 | /* Routine to perform the actual construction and execution of the relevant | 1212 | /* Routine to perform the actual construction and execution of the relevant |
1302 | * INSERT statements. | 1213 | * INSERT statements. |
1303 | */ | 1214 | */ |
1304 | int log_sql_transaction(request_rec *orig) | 1215 | static int log_sql_transaction(request_rec *orig) |
1305 | { | 1216 | { |
1306 | char **ptrptr, **ptrptr2; | 1217 | char **ptrptr, **ptrptr2; |
1307 | logsql_state *cls = get_module_config(orig->server->module_config, &sql_log_module); | 1218 | logsql_state *cls = ap_get_module_config(orig->server->module_config, &log_sql_module); |
1308 | const char *access_query; | 1219 | const char *access_query; |
1309 | request_rec *r; | 1220 | request_rec *r; |
1310 | 1221 | ||
1311 | /* We handle mass virtual hosting differently. Dynamically determine the name | 1222 | /* We handle mass virtual hosting differently. Dynamically determine the name |
1312 | * of the table from the virtual server's name, and flag it for creation. | 1223 | * of the table from the virtual server's name, and flag it for creation. |
1313 | */ | 1224 | */ |
1314 | if (logsql_massvirtual) { | 1225 | if (global_config.massvirtual) { |
1315 | char *access_base = "access_"; | 1226 | char *access_base = "access_"; |
1316 | char *notes_base = "notes_"; | 1227 | char *notes_base = "notes_"; |
1317 | char *hout_base = "headout_"; | 1228 | char *hout_base = "headout_"; |
@@ -1325,11 +1236,11 @@ int log_sql_transaction(request_rec *orig) | |||
1325 | unsigned int i; | 1236 | unsigned int i; |
1326 | 1237 | ||
1327 | /* Find memory long enough to hold the table name + \0. */ | 1238 | /* Find memory long enough to hold the table name + \0. */ |
1328 | a_tablename = ap_pstrcat(orig->pool, access_base, ap_get_server_name(orig), NULL); | 1239 | a_tablename = apr_pstrcat(orig->pool, access_base, ap_get_server_name(orig), NULL); |
1329 | n_tablename = ap_pstrcat(orig->pool, notes_base, ap_get_server_name(orig), NULL); | 1240 | n_tablename = apr_pstrcat(orig->pool, notes_base, ap_get_server_name(orig), NULL); |
1330 | i_tablename = ap_pstrcat(orig->pool, hin_base, ap_get_server_name(orig), NULL); | 1241 | i_tablename = apr_pstrcat(orig->pool, hin_base, ap_get_server_name(orig), NULL); |
1331 | o_tablename = ap_pstrcat(orig->pool, hout_base, ap_get_server_name(orig), NULL); | 1242 | o_tablename = apr_pstrcat(orig->pool, hout_base, ap_get_server_name(orig), NULL); |
1332 | c_tablename = ap_pstrcat(orig->pool, cookie_base, ap_get_server_name(orig), NULL); | 1243 | c_tablename = apr_pstrcat(orig->pool, cookie_base, ap_get_server_name(orig), NULL); |
1333 | 1244 | ||
1334 | /* Transform any dots to underscores */ | 1245 | /* Transform any dots to underscores */ |
1335 | for (i = 0; i < strlen(a_tablename); i++) { | 1246 | for (i = 0; i < strlen(a_tablename); i++) { |
@@ -1361,7 +1272,7 @@ int log_sql_transaction(request_rec *orig) | |||
1361 | cls->hout_table_name = o_tablename; | 1272 | cls->hout_table_name = o_tablename; |
1362 | cls->hin_table_name = i_tablename; | 1273 | cls->hin_table_name = i_tablename; |
1363 | cls->cookie_table_name = c_tablename; | 1274 | cls->cookie_table_name = c_tablename; |
1364 | logsql_createtables = 1; | 1275 | global_config.createtables = 1; |
1365 | } | 1276 | } |
1366 | 1277 | ||
1367 | /* Do we have enough info to log? */ | 1278 | /* Do we have enough info to log? */ |
@@ -1416,7 +1327,7 @@ int log_sql_transaction(request_rec *orig) | |||
1416 | /* Go through each element of the ignore list and compare it to the | 1327 | /* Go through each element of the ignore list and compare it to the |
1417 | * remote host. If we get a match, return without logging */ | 1328 | * remote host. If we get a match, return without logging */ |
1418 | ptrptr2 = (char **) (cls->remhost_ignore_list->elts + (cls->remhost_ignore_list->nelts * cls->remhost_ignore_list->elt_size)); | 1329 | ptrptr2 = (char **) (cls->remhost_ignore_list->elts + (cls->remhost_ignore_list->nelts * cls->remhost_ignore_list->elt_size)); |
1419 | thehost = get_remote_host(r->connection, r->per_dir_config, REMOTE_NAME); | 1330 | thehost = ap_get_remote_host(r->connection, r->per_dir_config, REMOTE_NAME, NULL); |
1420 | if (thehost) { | 1331 | if (thehost) { |
1421 | for (ptrptr = (char **) cls->remhost_ignore_list->elts; ptrptr < ptrptr2; ptrptr = (char **) ((char *) ptrptr + cls->remhost_ignore_list->elt_size)) | 1332 | for (ptrptr = (char **) cls->remhost_ignore_list->elts; ptrptr < ptrptr2; ptrptr = (char **) ((char *) ptrptr + cls->remhost_ignore_list->elt_size)) |
1422 | if (strstr(thehost, *ptrptr)) { | 1333 | if (strstr(thehost, *ptrptr)) { |
@@ -1448,10 +1359,10 @@ int log_sql_transaction(request_rec *orig) | |||
1448 | } | 1359 | } |
1449 | 1360 | ||
1450 | /* Append the fieldname and value-to-insert to the appropriate strings, quoting stringvals with ' as appropriate */ | 1361 | /* Append the fieldname and value-to-insert to the appropriate strings, quoting stringvals with ' as appropriate */ |
1451 | fields = pstrcat(r->pool, fields, (i > 0 ? "," : ""), | 1362 | fields = apr_pstrcat(r->pool, fields, (i > 0 ? "," : ""), |
1452 | log_sql_item_keys[j].sql_field_name, NULL); | 1363 | log_sql_item_keys[j].sql_field_name, NULL); |
1453 | 1364 | ||
1454 | values = pstrcat(r->pool, values, (i > 0 ? "," : ""), | 1365 | values = apr_pstrcat(r->pool, values, (i > 0 ? "," : ""), |
1455 | (log_sql_item_keys[j].string_contents ? "'" : ""), | 1366 | (log_sql_item_keys[j].string_contents ? "'" : ""), |
1456 | escape_query(formatted_item, r->pool), | 1367 | escape_query(formatted_item, r->pool), |
1457 | (log_sql_item_keys[j].string_contents ? "'" : ""), NULL); | 1368 | (log_sql_item_keys[j].string_contents ? "'" : ""), NULL); |
@@ -1469,8 +1380,8 @@ int log_sql_transaction(request_rec *orig) | |||
1469 | ptrptr2 = (char **) (cls->notes_list->elts + (cls->notes_list->nelts * cls->notes_list->elt_size)); | 1380 | ptrptr2 = (char **) (cls->notes_list->elts + (cls->notes_list->nelts * cls->notes_list->elt_size)); |
1470 | for (ptrptr = (char **) cls->notes_list->elts; ptrptr < ptrptr2; ptrptr = (char **) ((char *) ptrptr + cls->notes_list->elt_size)) { | 1381 | for (ptrptr = (char **) cls->notes_list->elts; ptrptr < ptrptr2; ptrptr = (char **) ((char *) ptrptr + cls->notes_list->elt_size)) { |
1471 | /* If the specified note (*ptrptr) exists for the current request... */ | 1382 | /* If the specified note (*ptrptr) exists for the current request... */ |
1472 | if ((theitem = ap_table_get(r->notes, *ptrptr))) { | 1383 | if ((theitem = apr_table_get(r->notes, *ptrptr))) { |
1473 | itemsets = ap_pstrcat(r->pool, itemsets, | 1384 | itemsets = apr_pstrcat(r->pool, itemsets, |
1474 | (i > 0 ? "," : ""), | 1385 | (i > 0 ? "," : ""), |
1475 | "('", | 1386 | "('", |
1476 | unique_id, | 1387 | unique_id, |
@@ -1484,9 +1395,10 @@ int log_sql_transaction(request_rec *orig) | |||
1484 | } | 1395 | } |
1485 | } | 1396 | } |
1486 | if ( itemsets != "" ) { | 1397 | if ( itemsets != "" ) { |
1487 | note_query = ap_pstrcat(r->pool, logsql_insertclause, "`", cls->notes_table_name, "` (id, item, val) values ", itemsets, NULL); | 1398 | note_query = apr_psprintf(r->pool, "insert %s into `%s` (id, item, val) values %s", |
1399 | global_config.insertdelayed?"delayed":NULL, cls->notes_table_name, itemsets); | ||
1488 | #ifdef DEBUG | 1400 | #ifdef DEBUG |
1489 | ap_log_error(APLOG_MARK,DEBUGLEVEL,orig->server,"mod_log_sql: note string: %s", note_query); | 1401 | ap_log_error(APLOG_MARK,APLOG_DEBUG,0,orig->server,"mod_log_sql: note string: %s", note_query); |
1490 | #endif | 1402 | #endif |
1491 | } | 1403 | } |
1492 | 1404 | ||
@@ -1497,8 +1409,8 @@ int log_sql_transaction(request_rec *orig) | |||
1497 | ptrptr2 = (char **) (cls->hout_list->elts + (cls->hout_list->nelts * cls->hout_list->elt_size)); | 1409 | ptrptr2 = (char **) (cls->hout_list->elts + (cls->hout_list->nelts * cls->hout_list->elt_size)); |
1498 | for (ptrptr = (char **) cls->hout_list->elts; ptrptr < ptrptr2; ptrptr = (char **) ((char *) ptrptr + cls->hout_list->elt_size)) { | 1410 | for (ptrptr = (char **) cls->hout_list->elts; ptrptr < ptrptr2; ptrptr = (char **) ((char *) ptrptr + cls->hout_list->elt_size)) { |
1499 | /* If the specified header (*ptrptr) exists for the current request... */ | 1411 | /* If the specified header (*ptrptr) exists for the current request... */ |
1500 | if ((theitem = ap_table_get(r->headers_out, *ptrptr))) { | 1412 | if ((theitem = apr_table_get(r->headers_out, *ptrptr))) { |
1501 | itemsets = ap_pstrcat(r->pool, itemsets, | 1413 | itemsets = apr_pstrcat(r->pool, itemsets, |
1502 | (i > 0 ? "," : ""), | 1414 | (i > 0 ? "," : ""), |
1503 | "('", | 1415 | "('", |
1504 | unique_id, | 1416 | unique_id, |
@@ -1512,9 +1424,10 @@ int log_sql_transaction(request_rec *orig) | |||
1512 | } | 1424 | } |
1513 | } | 1425 | } |
1514 | if ( itemsets != "" ) { | 1426 | if ( itemsets != "" ) { |
1515 | hout_query = ap_pstrcat(r->pool, logsql_insertclause, "`", cls->hout_table_name, "` (id, item, val) values ", itemsets, NULL); | 1427 | hout_query = apr_psprintf(r->pool, "insert %s into `%s` (id, item, val) values %s", |
1428 | global_config.insertdelayed?"delayed":NULL, cls->hout_table_name, itemsets); | ||
1516 | #ifdef DEBUG | 1429 | #ifdef DEBUG |
1517 | ap_log_error(APLOG_MARK,DEBUGLEVEL,orig->server,"mod_log_sql: header_out string: %s", hout_query); | 1430 | ap_log_error(APLOG_MARK,APLOG_DEBUG,0,orig->server,"mod_log_sql: header_out string: %s", hout_query); |
1518 | #endif | 1431 | #endif |
1519 | } | 1432 | } |
1520 | 1433 | ||
@@ -1526,8 +1439,8 @@ int log_sql_transaction(request_rec *orig) | |||
1526 | ptrptr2 = (char **) (cls->hin_list->elts + (cls->hin_list->nelts * cls->hin_list->elt_size)); | 1439 | ptrptr2 = (char **) (cls->hin_list->elts + (cls->hin_list->nelts * cls->hin_list->elt_size)); |
1527 | for (ptrptr = (char **) cls->hin_list->elts; ptrptr < ptrptr2; ptrptr = (char **) ((char *) ptrptr + cls->hin_list->elt_size)) { | 1440 | for (ptrptr = (char **) cls->hin_list->elts; ptrptr < ptrptr2; ptrptr = (char **) ((char *) ptrptr + cls->hin_list->elt_size)) { |
1528 | /* If the specified header (*ptrptr) exists for the current request... */ | 1441 | /* If the specified header (*ptrptr) exists for the current request... */ |
1529 | if ((theitem = ap_table_get(r->headers_in, *ptrptr))) { | 1442 | if ((theitem = apr_table_get(r->headers_in, *ptrptr))) { |
1530 | itemsets = ap_pstrcat(r->pool, itemsets, | 1443 | itemsets = apr_pstrcat(r->pool, itemsets, |
1531 | (i > 0 ? "," : ""), | 1444 | (i > 0 ? "," : ""), |
1532 | "('", | 1445 | "('", |
1533 | unique_id, | 1446 | unique_id, |
@@ -1541,9 +1454,11 @@ int log_sql_transaction(request_rec *orig) | |||
1541 | } | 1454 | } |
1542 | } | 1455 | } |
1543 | if ( itemsets != "" ) { | 1456 | if ( itemsets != "" ) { |
1544 | hin_query = ap_pstrcat(r->pool, logsql_insertclause, "`", cls->hin_table_name, "` (id, item, val) values ", itemsets, NULL); | 1457 | hin_query = apr_psprintf(r->pool, "insert %s into `%s` (id, item, val) values %s", |
1458 | global_config.insertdelayed?"delayed":NULL, cls->hin_table_name, itemsets); | ||
1459 | |||
1545 | #ifdef DEBUG | 1460 | #ifdef DEBUG |
1546 | ap_log_error(APLOG_MARK,DEBUGLEVEL,orig->server,"mod_log_sql: header_in string: %s", hin_query); | 1461 | ap_log_error(APLOG_MARK,APLOG_DEBUG,0,orig->server,"mod_log_sql: header_in string: %s", hin_query); |
1547 | #endif | 1462 | #endif |
1548 | } | 1463 | } |
1549 | 1464 | ||
@@ -1556,7 +1471,7 @@ int log_sql_transaction(request_rec *orig) | |||
1556 | for (ptrptr = (char **) cls->cookie_list->elts; ptrptr < ptrptr2; ptrptr = (char **) ((char *) ptrptr + cls->cookie_list->elt_size)) { | 1471 | for (ptrptr = (char **) cls->cookie_list->elts; ptrptr < ptrptr2; ptrptr = (char **) ((char *) ptrptr + cls->cookie_list->elt_size)) { |
1557 | /* If the specified cookie (*ptrptr) exists for the current request... */ | 1472 | /* If the specified cookie (*ptrptr) exists for the current request... */ |
1558 | if ( strncmp((theitem = extract_specific_cookie(r, *ptrptr)), "-", 1) ) { | 1473 | if ( strncmp((theitem = extract_specific_cookie(r, *ptrptr)), "-", 1) ) { |
1559 | itemsets = ap_pstrcat(r->pool, itemsets, | 1474 | itemsets = apr_pstrcat(r->pool, itemsets, |
1560 | (i > 0 ? "," : ""), | 1475 | (i > 0 ? "," : ""), |
1561 | "('", | 1476 | "('", |
1562 | unique_id, | 1477 | unique_id, |
@@ -1571,26 +1486,28 @@ int log_sql_transaction(request_rec *orig) | |||
1571 | 1486 | ||
1572 | } | 1487 | } |
1573 | if ( itemsets != "" ) { | 1488 | if ( itemsets != "" ) { |
1574 | cookie_query = ap_pstrcat(r->pool, logsql_insertclause, "`", cls->cookie_table_name, "` (id, item, val) values ", itemsets, NULL); | 1489 | cookie_query = apr_psprintf(r->pool, "insert %s into `%s` (id, item, val) values %s", |
1490 | global_config.insertdelayed?"delayed":NULL, cls->cookie_table_name, itemsets); | ||
1575 | #ifdef DEBUG | 1491 | #ifdef DEBUG |
1576 | ap_log_error(APLOG_MARK,DEBUGLEVEL,orig->server,"mod_log_sql: cookie string: %s", cookie_query); | 1492 | ap_log_error(APLOG_MARK,APLOG_DEBUG,0,orig->server,"mod_log_sql: cookie string: %s", cookie_query); |
1577 | #endif | 1493 | #endif |
1578 | } | 1494 | } |
1579 | 1495 | ||
1580 | 1496 | ||
1581 | /* Set up the actual INSERT statement */ | 1497 | /* Set up the actual INSERT statement */ |
1582 | access_query = ap_pstrcat(r->pool, logsql_insertclause, "`", cls->transfer_table_name, "` (", fields, ") values (", values, ")", NULL); | 1498 | access_query = apr_psprintf(r->pool, "insert %s into `%s` (%s) values (%s)", |
1499 | global_config.insertdelayed?"delayed":NULL, cls->transfer_table_name, fields, values); | ||
1583 | 1500 | ||
1584 | #ifdef DEBUG | 1501 | #ifdef DEBUG |
1585 | ap_log_error(APLOG_MARK,DEBUGLEVEL,r->server,"mod_log_sql: access string: %s", access_query); | 1502 | ap_log_error(APLOG_MARK,APLOG_DEBUG,0,r->server,"mod_log_sql: access string: %s", access_query); |
1586 | #endif | 1503 | #endif |
1587 | 1504 | ||
1588 | /* If the person activated force-preserve, go ahead and push all the entries | 1505 | /* If the person activated force-preserve, go ahead and push all the entries |
1589 | * into the preserve file, then return. | 1506 | * into the preserve file, then return. |
1590 | */ | 1507 | */ |
1591 | if (logsql_forcepreserve) { | 1508 | if (global_config.forcepreserve) { |
1592 | #ifdef DEBUG | 1509 | #ifdef DEBUG |
1593 | ap_log_error(APLOG_MARK,DEBUGLEVEL,orig->server,"mod_log_sql: preservation forced"); | 1510 | ap_log_error(APLOG_MARK,APLOG_DEBUG,0,orig->server,"mod_log_sql: preservation forced"); |
1594 | #endif | 1511 | #endif |
1595 | preserve_entry(orig, access_query); | 1512 | preserve_entry(orig, access_query); |
1596 | if ( note_query != NULL ) | 1513 | if ( note_query != NULL ) |
@@ -1605,12 +1522,12 @@ int log_sql_transaction(request_rec *orig) | |||
1605 | } | 1522 | } |
1606 | 1523 | ||
1607 | /* How's our mysql link integrity? */ | 1524 | /* How's our mysql link integrity? */ |
1608 | if (logsql_server_p == NULL) { | 1525 | if (global_config.server_p == NULL) { |
1609 | 1526 | ||
1610 | /* Make a try to establish the link */ | 1527 | /* Make a try to establish the link */ |
1611 | open_logdb_link(r->server); | 1528 | open_logdb_link(r->server); |
1612 | 1529 | ||
1613 | if (logsql_server_p == NULL) { | 1530 | if (global_config.server_p == NULL) { |
1614 | /* Unable to re-establish a DB link, so assume that it's really | 1531 | /* Unable to re-establish a DB link, so assume that it's really |
1615 | * gone and send the entry to the preserve file instead. | 1532 | * gone and send the entry to the preserve file instead. |
1616 | * This short-circuits safe_sql_query() during a db outage and therefore | 1533 | * This short-circuits safe_sql_query() during a db outage and therefore |
@@ -1629,7 +1546,7 @@ int log_sql_transaction(request_rec *orig) | |||
1629 | return OK; | 1546 | return OK; |
1630 | } else { | 1547 | } else { |
1631 | /* Whew, we got the DB link back */ | 1548 | /* Whew, we got the DB link back */ |
1632 | ap_log_error(APLOG_MARK,NOTICELEVEL,orig->server,"mod_log_sql: child established database connection"); | 1549 | ap_log_error(APLOG_MARK,APLOG_NOTICE,0,orig->server,"mod_log_sql: child established database connection"); |
1633 | } | 1550 | } |
1634 | } | 1551 | } |
1635 | 1552 | ||
@@ -1660,28 +1577,120 @@ int log_sql_transaction(request_rec *orig) | |||
1660 | 1577 | ||
1661 | 1578 | ||
1662 | 1579 | ||
1580 | /* Setup of the available httpd.conf configuration commands. | ||
1581 | * Structure: command, function called, NULL, where available, how many arguments, verbose description | ||
1582 | */ | ||
1583 | static const command_rec log_sql_cmds[] = { | ||
1584 | AP_INIT_TAKE1("LogSQLTransferLogTable", set_server_nmv_string_slot, | ||
1585 | (void *)APR_OFFSETOF(logsql_state, transfer_table_name), RSRC_CONF, | ||
1586 | "The database table that holds the transfer log") | ||
1587 | , | ||
1588 | AP_INIT_TAKE1("LogSQLNotesLogTable", set_server_nmv_string_slot, | ||
1589 | (void *)APR_OFFSETOF(logsql_state, notes_table_name), RSRC_CONF, | ||
1590 | "The database table that holds the notes") | ||
1591 | , | ||
1592 | AP_INIT_TAKE1("LogSQLHeadersOutLogTable", set_server_nmv_string_slot, | ||
1593 | (void *)APR_OFFSETOF(logsql_state, hout_table_name), RSRC_CONF, | ||
1594 | "The database table that holds the outbound headers") | ||
1595 | , | ||
1596 | AP_INIT_TAKE1("LogSQLHeadersInLogTable", set_server_nmv_string_slot, | ||
1597 | (void *)APR_OFFSETOF(logsql_state, hin_table_name), RSRC_CONF, | ||
1598 | "The database table that holds the inbound headers") | ||
1599 | , | ||
1600 | AP_INIT_TAKE1("LogSQLCookieLogTable", set_server_nmv_string_slot, | ||
1601 | (void *)APR_OFFSETOF(logsql_state, cookie_table_name), RSRC_CONF, | ||
1602 | "The database table that holds the cookie info") | ||
1603 | , | ||
1604 | AP_INIT_TAKE1("LogSQLTransferLogFormat", set_server_string_slot, | ||
1605 | (void *)APR_OFFSETOF(logsql_state,transfer_log_format), RSRC_CONF, | ||
1606 | "Instruct the module what information to log to the database transfer log") | ||
1607 | , | ||
1608 | AP_INIT_TAKE1("LogSQLMachineID", set_global_string_slot, | ||
1609 | (void *)APR_OFFSETOF(global_config_t, machid), RSRC_CONF, | ||
1610 | "Machine ID that the module will log, useful in web clusters to differentiate machines") | ||
1611 | , | ||
1612 | AP_INIT_ITERATE("LogSQLRequestAccept", add_server_string_slot, | ||
1613 | (void *)APR_OFFSETOF(logsql_state, transfer_accept_list), RSRC_CONF, | ||
1614 | "List of URIs to accept for logging. Accesses that don't match will not be logged") | ||
1615 | , | ||
1616 | AP_INIT_ITERATE("LogSQLRequestIgnore", add_server_string_slot, | ||
1617 | (void *)APR_OFFSETOF(logsql_state, transfer_ignore_list), RSRC_CONF, | ||
1618 | "List of URIs to ignore. Accesses that match will not be logged to database") | ||
1619 | , | ||
1620 | AP_INIT_ITERATE("LogSQLRemhostIgnore", add_server_string_slot, | ||
1621 | (void *)APR_OFFSETOF(logsql_state, remhost_ignore_list), RSRC_CONF, | ||
1622 | "List of remote hosts to ignore. Accesses that match will not be logged to database") | ||
1623 | , | ||
1624 | AP_INIT_TAKE1("LogSQLDatabase", set_global_string_slot, | ||
1625 | (void *)APR_OFFSETOF(global_config_t, dbname), RSRC_CONF, | ||
1626 | "The name of the database database for logging") | ||
1627 | , | ||
1628 | AP_INIT_TAKE1("LogSQLWhichCookie", set_server_string_slot, | ||
1629 | (void *)APR_OFFSETOF(logsql_state, cookie_name), RSRC_CONF, | ||
1630 | "The single cookie that you want logged in the access_log when using the 'c' config directive") | ||
1631 | , | ||
1632 | AP_INIT_TAKE3("LogSQLLoginInfo", set_log_sql_info, NULL, RSRC_CONF, | ||
1633 | "The database host, user-id and password for logging") | ||
1634 | , | ||
1635 | AP_INIT_FLAG("LogSQLCreateTables", set_global_nmv_flag_slot, | ||
1636 | (void *)APR_OFFSETOF(global_config_t, createtables), RSRC_CONF, | ||
1637 | "Turn on module's capability to create its SQL tables on the fly") | ||
1638 | , | ||
1639 | AP_INIT_FLAG("LogSQLMassVirtualHosting", set_global_flag_slot, | ||
1640 | (void *)APR_OFFSETOF(global_config_t, massvirtual), RSRC_CONF, | ||
1641 | "Activates option(s) useful for ISPs performing mass virutal hosting") | ||
1642 | , | ||
1643 | AP_INIT_FLAG("LogSQLDelayedInserts", set_global_flag_slot, | ||
1644 | (void *)APR_OFFSETOF(global_config_t, insertdelayed), RSRC_CONF, | ||
1645 | "Whether to use delayed inserts") | ||
1646 | , | ||
1647 | AP_INIT_FLAG("LogSQLForcePreserve", set_global_flag_slot, | ||
1648 | (void *)APR_OFFSETOF(global_config_t, forcepreserve), RSRC_CONF, | ||
1649 | "Forces logging to preserve file and bypasses database") | ||
1650 | , | ||
1651 | AP_INIT_TAKE1("LogSQLPreserveFile", set_global_string_slot, | ||
1652 | (void *)APR_OFFSETOF(logsql_state,preserve_file), RSRC_CONF, | ||
1653 | "Name of the file to use for data preservation during database downtime") | ||
1654 | , | ||
1655 | AP_INIT_TAKE1("LogSQLSocketFile", set_global_string_slot, | ||
1656 | (void *)APR_OFFSETOF(global_config_t, socketfile), RSRC_CONF, | ||
1657 | "Name of the file to employ for socket connections to database") | ||
1658 | , | ||
1659 | AP_INIT_TAKE1("LogSQLTCPPort", set_log_sql_tcp_port, NULL, RSRC_CONF, | ||
1660 | "Port number to use for TCP connections to database, defaults to 3306 if not set") | ||
1661 | , | ||
1662 | AP_INIT_ITERATE("LogSQLWhichNotes", add_server_string_slot, | ||
1663 | (void *)APR_OFFSETOF(logsql_state, notes_list), RSRC_CONF, | ||
1664 | "Notes that you would like to log in a separate table") | ||
1665 | , | ||
1666 | AP_INIT_ITERATE("LogSQLWhichHeadersOut", add_server_string_slot, | ||
1667 | (void *)APR_OFFSETOF(logsql_state, hout_list), RSRC_CONF, | ||
1668 | "Outbound headers that you would like to log in a separate table") | ||
1669 | , | ||
1670 | AP_INIT_ITERATE("LogSQLWhichHeadersIn", add_server_string_slot, | ||
1671 | (void *)APR_OFFSETOF(logsql_state, hin_list), RSRC_CONF, | ||
1672 | "Inbound headers that you would like to log in a separate table") | ||
1673 | , | ||
1674 | AP_INIT_ITERATE("LogSQLWhichCookies", add_server_string_slot, | ||
1675 | (void *)APR_OFFSETOF(logsql_state, cookie_list), RSRC_CONF, | ||
1676 | "The cookie(s) that you would like to log in a separate table") | ||
1677 | , | ||
1678 | {NULL} | ||
1679 | }; | ||
1663 | /* The configuration array that sets up the hooks into the module. */ | 1680 | /* The configuration array that sets up the hooks into the module. */ |
1664 | module sql_log_module = { | 1681 | static void register_hooks(apr_pool_t *p) { |
1665 | STANDARD_MODULE_STUFF, | 1682 | ap_hook_pre_config(log_sql_pre_config, NULL, NULL, APR_HOOK_REALLY_FIRST); |
1666 | NULL, /* module initializer */ | 1683 | ap_hook_child_init(log_sql_child_init, NULL, NULL, APR_HOOK_MIDDLE); |
1667 | NULL, /* create per-dir config */ | 1684 | ap_hook_open_logs(log_sql_open, NULL, NULL, APR_HOOK_MIDDLE); |
1668 | NULL, /* merge per-dir config */ | 1685 | ap_hook_log_transaction(log_sql_transaction, NULL, NULL, APR_HOOK_MIDDLE); |
1669 | log_sql_make_state, /* create server config */ | 1686 | } |
1670 | NULL, /* merge server config */ | 1687 | |
1671 | log_sql_cmds, /* config directive table */ | 1688 | module AP_MODULE_DECLARE_DATA log_sql_module = { |
1672 | NULL, /* [9] content handlers */ | 1689 | STANDARD20_MODULE_STUFF, |
1673 | NULL, /* [2] URI-to-filename translation */ | 1690 | NULL, /* create per-directory config structures */ |
1674 | NULL, /* [5] check/validate user_id */ | 1691 | NULL, /* merge per-directory config structures */ |
1675 | NULL, /* [6] check authorization */ | 1692 | log_sql_make_state, /* create per-server config structures */ |
1676 | NULL, /* [4] check access by host */ | 1693 | NULL, /* merge per-server config structures */ |
1677 | NULL, /* [7] MIME type checker/setter */ | 1694 | log_sql_cmds, /* command handlers */ |
1678 | NULL, /* [8] fixups */ | 1695 | register_hooks /* register hooks */ |
1679 | log_sql_transaction, /* [10] logger */ | ||
1680 | NULL /* [3] header parser */ | ||
1681 | #if MODULE_MAGIC_NUMBER >= 19970728 /* 1.3-dev or later support these additionals... */ | ||
1682 | ,log_sql_child_init, /* child process initializer */ | ||
1683 | log_sql_child_exit, /* process exit/cleanup */ | ||
1684 | NULL /* [1] post read-request */ | ||
1685 | #endif | ||
1686 | |||
1687 | }; | 1696 | }; |