summaryrefslogtreecommitdiffstatsabout
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG20
-rw-r--r--INSTALL25
-rw-r--r--LICENSE164
-rw-r--r--mod_log_sql.c76
4 files changed, 193 insertions, 92 deletions
diff --git a/CHANGELOG b/CHANGELOG
index 68d3247..27a4535 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,4 +1,4 @@
1$Id: CHANGELOG,v 1.13 2002/05/24 20:52:39 helios Exp $ 1$Id: CHANGELOG,v 1.14 2002/06/27 20:09:17 helios Exp $
2 2
3 3
4TODO: 4TODO:
@@ -10,6 +10,9 @@ TODO:
10* port to Apache 2.x 10* port to Apache 2.x
11* does determining table name in massvirtual mode upon every request 11* does determining table name in massvirtual mode upon every request
12 cause performance degradation? If so fix. 12 cause performance degradation? If so fix.
13* LogSQLRotateLogs directive with daily/monthly/weekly/etc.
14* new format char: IP as bigint?
15* socket-based middleman daemon with configurable conns?
13 16
14 17
15CHANGES: 18CHANGES:
@@ -44,7 +47,18 @@ CHANGES:
44* Config directives used to begin with MySQL, now begin with LogSQL. 47* Config directives used to begin with MySQL, now begin with LogSQL.
45 This is for database inspecificity. In your httpd.conf just do 48 This is for database inspecificity. In your httpd.conf just do
46 a search-and-replace. 49 a search-and-replace.
47 50* More robust table-creation code with error checking. [The race condition
51 that several users have reported may still exist, but this will go a long
52 way toward debugging the condition.]
53* Fixed bug whereby a MySQL connection was abandoned on reopen; the old
54 connection is now properly closed first.
55* Minor: remind user not to set createtables when massvirtual is on.
56* If Apache started but MySQL was unavailable, the module would do
57 everything it was supposed to (preserve entries, etc.) but not notify
58 the sysadmin. Added a log message to alert sysadmin if MySQL is
59 unreachable at startup.
60* Migrated to the Artistic License (as used by Perl).
61
48 62
491.16: 631.16:
50* Moved all the user DEFINEs inside the .c file -- splitting them 64* Moved all the user DEFINEs inside the .c file -- splitting them
@@ -87,7 +101,7 @@ CHANGES:
87* Reduced sleep time on a retry to 1/4 second from 1/2 second. 101* Reduced sleep time on a retry to 1/4 second from 1/2 second.
88* Confirmed that this module will compile with -pedantic ... but not 102* Confirmed that this module will compile with -pedantic ... but not
89 with -ansi. :-) 103 with -ansi. :-)
90 104
91 105
921.15: 1061.15:
93* Vastly improved error reporting is a lot clearer about lost db 107* Vastly improved error reporting is a lot clearer about lost db
diff --git a/INSTALL b/INSTALL
index 03adc35..7c48c21 100644
--- a/INSTALL
+++ b/INSTALL
@@ -1,4 +1,4 @@
1$Id: INSTALL,v 1.8 2002/05/14 21:47:14 helios Exp $ 1$Id: INSTALL,v 1.9 2002/06/27 20:09:17 helios Exp $
2 2
3 3
4Requirements 4Requirements
@@ -65,26 +65,19 @@ For folks interested in using this module as an Apache DSO:
65 EXAMPLE: 65 EXAMPLE:
66 # /usr/sbin/apxs -i -c -L/usr/lib/mysql -lmysqlclient -lz mod_log_sql.c 66 # /usr/sbin/apxs -i -c -L/usr/lib/mysql -lmysqlclient -lz mod_log_sql.c
67 67
68 You should see something like this: 68 You should see something similar to this:
69 69
70 gcc -fpic -DSHARED_MODULE -I/usr/local/Apache/include -c mod_log_sql.c 70 gcc -fpic -DSHARED_MODULE -I/usr/local/apache/include -c mod_log_mysql.c
71 ld -Bshareable -o mod_log_sql.so mod_log_sql.o 71 gcc -shared -o mod_log_mysql.so mod_log_mysql.o -L/usr/local/lib/mysql/ -lmysqlclient -lz
72 cp mod_log_sql.so <your path to Apache libexec>/mod_log_sql.so 72 cp mod_log_mysql.so /usr/local/apache/libexec/mod_log_mysql.so
73 chmod 755 <your path to Apache libexec>/mod_log_sql.so 73 chmod 755 /usr/local/apache/libexec/mod_log_mysql.so
74 [activating module blah in /path/to/apache/etc/httpd.conf]
75 74
764) Add the following stanzas to your httpd.conf file. Put the second stanza 754) Add the following lines to your httpd.conf file. Put the second line
77 somewhere after the ClearModuleList directive. 76 somewhere after the ClearModuleList directive.
78 77
79 <IfDefine HAVE_LOG_MYSQL> 78 LoadModule mysql_log_module libexec/mod_log_sql.so
80 LoadModule mysql_log_module modules/mod_log_sql.so
81 </IfDefine>
82
83
84 <IfDefine HAVE_LOG_MYSQL>
85 AddModule mod_log_sql.c
86 </IfDefine>
87 79
80 AddModule mod_log_sql.c
88 81
895) Now go to step (9) in the instructions below to configure httpd.conf... 825) Now go to step (9) in the instructions below to configure httpd.conf...
90 83
diff --git a/LICENSE b/LICENSE
index 5d855ea..1b82b9d 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,55 +1,121 @@
1$Id: LICENSE,v 1.3 2002/05/14 21:50:51 helios Exp $ 1$Id: LICENSE,v 1.4 2002/06/27 20:09:17 helios Exp $
2 2
3Copyright (c) 2002 Christopher B. Powell. All rights reserved. 3Copyright (c) 2002 Christopher B. Powell. All rights reserved.
4Portions copyright (c) 2000 The Apache Software Foundation. 4Portions copyright (c) 2000 The Apache Software Foundation.
5 5
6Redistribution and use in source and binary forms, with or without 6
7modification, are permitted provided that the following conditions 7Preamble
8are met: 8
9 9The intent of this document is to state the conditions under which a
101. Redistributions of source code must retain the above copyright 10Package may be copied, such that the Copyright Holder maintains some
11 notice, this list of conditions and the following disclaimer. 11semblance of artistic control over the development of the package,
12 12while giving the users of the package the right to use and distribute
132. Redistributions in binary form must reproduce the above copyright 13the Package in a more-or-less customary fashion, plus the right to make
14 notice, this list of conditions and the following disclaimer in 14reasonable modifications.
15 the documentation and/or other materials provided with the 15
16 distribution. 16
17 17Definitions:
183. The end-user documentation included with the redistribution, 18
19 if any, must include the following acknowledgment: 19* "Package" refers to the collection of files distributed by the
20 "This product includes software developed by the 20 Copyright Holder, and derivatives of that collection of files created
21 Apache Software Foundation (http://www.apache.org/) 21 through textual modification.
22 and by Christopher Powell, mod_log_mysql Module Maintainer 22
23 (http://www.grubbybaby.com/mod_log_mysql/)." 23* "Standard Version" refers to such a Package if it has not been
24 Alternately, this acknowledgment may appear in the software itself, 24 modified, or has been modified in accordance with the wishes of the
25 if and wherever such third-party acknowledgments normally appear. 25 Copyright Holder.
26 26
274. The names "mod_log_mysql" and "mod_log_sql" must 27* "Copyright Holder" is Christopher B. Powell, <chris@grubbybaby.com>.
28 not be used to endorse or promote products derived from this 28
29 software without prior written permission. For written 29* "You" is you, if you're thinking about copying or distributing this
30 permission, please contact <chris@grubbybaby.com>. 30 Package.
31 31
325. Products derived from this software may not be called 32* "Reasonable copying fee" is whatever you can justify on the basis of
33 "mod_log_mysql" or "mod_log_sql", nor may "mod_log_mysql" or 33 media cost, duplication charges, time of people involved, and so on.
34 "mod_log_sql" appear in their names, without prior written permission 34 (You will not be required to justify it to the Copyright Holder, but
35 of Christopher B. Powell. 35 only to the computing community at large as a market that must bear the
36 36 fee.)
376. Redistributions of any form whatsoever must retain the following 37
38 acknowledgment: "This product includes software developed by 38* "Freely Available" means that no fee is charged for the item itself,
39 Christopher B. Powell <chris@grubbybaby.com> for use in the 39 though there may be fees involved in handling the item. It also means
40 mod_log_mysql project (http://www.grubbybaby.com/mod_log_mysql/). 40 that recipients of the item may redistribute it under the same
41 41 conditions they received it.
42THIS SOFTWARE IS PROVIDED `AS IS'' AND ANY EXPRESSED OR IMPLIED 42
43WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 43
44OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 441. You may make and give away verbatim copies of the source form of the
45DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR 45Standard Version of this Package without restriction, provided that you
46ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 46duplicate all of the original copyright notices and associated
47SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 47disclaimers.
48LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF 48
49USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 492. You may apply bug fixes, portability fixes and other modifications
50ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 50derived from the Public Domain or from the Copyright Holder. A Package
51OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 51modified in such a way shall still be considered the Standard Version.
52OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 52
53SUCH DAMAGE. 533. You may otherwise modify your copy of this Package in any way,
54provided that you insert a prominent notice in each changed file
55stating how and when you changed that file, and provided that you do at
56least ONE of the following:
57
58 a) place your modifications in the Public Domain or otherwise make
59 them Freely Available, such as by posting said modifications to
60 Usenet or an equivalent medium, or placing the modifications on a
61 major archive site such as ftp.uu.net, or by allowing the
62 Copyright Holder to include your modifications in the Standard
63 Version of the Package.
64
65 b) use the modified Package only within your corporation or
66 organization.
67
68 c) rename any non-standard executables so the names do not
69 conflict with standard executables, which must also be provided,
70 and provide a separate manual page for each non-standard
71 executable that clearly documents how it differs from the Standard
72 Version.
73
74 d) make other distribution arrangements with the Copyright Holder.
75
764. You may distribute the programs of this Package in object code or
77executable form, provided that you do at least ONE of the following:
78
79 a) distribute a Standard Version of the executables and library
80 files, together with instructions (in the manual page or
81 equivalent) on where to get the Standard Version.
82
83 b) accompany the distribution with the machine-readable source of
84 the Package with your modifications.
85
86 c) accompany any non-standard executables with their corresponding
87 Standard Version executables, giving the non-standard executables
88 non-standard names, and clearly documenting the differences in
89 manual pages (or equivalent), together with instructions on where
90 to get the Standard Version.
91
92 d) make other distribution arrangements with the Copyright Holder.
93
945. You may charge a reasonable copying fee for any distribution of this
95Package. You may charge any fee you choose for support of this Package.
96You may not charge a fee for this Package itself. However, you may
97distribute this Package in aggregate with other (possibly commercial)
98programs as part of a larger (possibly commercial) software
99distribution provided that you do not advertise this Package as a
100product of your own.
101
1026. The scripts and library files supplied as input to or produced as
103output from the programs of this Package do not automatically fall
104under the copyright of this Package, but belong to whomever generated
105them, and may be sold commercially, and may be aggregated with this
106Package.
107
1087. C or perl subroutines supplied by you and linked into this Package
109shall not be considered part of this Package.
110
1118. The name of the Copyright Holder may not be used to endorse or
112promote products derived from this software without specific prior
113written permission.
114
1159. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED
116WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
117MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
118
119The End
54 120
55 121
diff --git a/mod_log_sql.c b/mod_log_sql.c
index ecdfcf0..db9b3a3 100644
--- a/mod_log_sql.c
+++ b/mod_log_sql.c
@@ -1,4 +1,4 @@
1/* $Id: mod_log_sql.c,v 1.14 2002/05/24 20:52:39 helios Exp $ */ 1/* $Id: mod_log_sql.c,v 1.15 2002/06/27 20:09:17 helios Exp $ */
2 2
3/* --------* 3/* --------*
4 * DEFINES * 4 * DEFINES *
@@ -574,11 +574,13 @@ void preserve_entry(request_rec *r, const char *query)
574/* */ 574/* */
575/* Parms: request record, SQL insert statement */ 575/* Parms: request record, SQL insert statement */
576/* Returns: 0 (OK) on success */ 576/* Returns: 0 (OK) on success */
577/* mysql return code on error */ 577/* -1 if have no log handle */
578/* actual MySQL return code on error */
578/*-----------------------------------------------------*/ 579/*-----------------------------------------------------*/
579int safe_mysql_query(request_rec *r, const char *query) 580int safe_mysql_query(request_rec *r, const char *query)
580{ 581{
581 int retval; 582 int retval;
583 unsigned int real_error;
582 struct timespec delay, remainder; 584 struct timespec delay, remainder;
583 int ret; 585 int ret;
584 void (*handler) (int); 586 void (*handler) (int);
@@ -591,19 +593,22 @@ int safe_mysql_query(request_rec *r, const char *query)
591 if (mysql_log != NULL) 593 if (mysql_log != NULL)
592 retval = mysql_query(mysql_log, query); 594 retval = mysql_query(mysql_log, query);
593 else 595 else
594 return 1; 596 return -1;
595 597
596 /* If we ran the query and it returned an error, try to be graceful. 598 /* If we ran the query and it returned an error, try to be graceful.
597 * (The module thought it had a valid mysql_log connection but the query 599 * (The module thought it had a valid mysql_log connection but the query
598 * might have failed, so we have to check.) 600 * might have failed, so we have to be extra-safe and check.)
599 */ 601 */
600 if ( retval != 0 ) 602 if ( retval != 0 )
601 { 603 {
602 log_sql_state *cls = get_module_config(r->server->module_config, &mysql_log_module); 604 log_sql_state *cls = get_module_config(r->server->module_config, &mysql_log_module);
605
606 real_error = mysql_errno(mysql_log);
603 607
604 /* Something went wrong, so start by trying to restart the db link. */ 608 /* Something went wrong, so start by trying to restart the db link. */
605 ap_log_error(APLOG_MARK,ERRLEVEL,r->server,"mod_log_sql: first attempt failed, API said: %s", MYSQL_ERROR(mysql_log)); 609 ap_log_error(APLOG_MARK,ERRLEVEL,r->server,"mod_log_sql: first attempt failed, API said: error %d, %s", real_error, MYSQL_ERROR(mysql_log));
606 610
611 mysql_close(mysql_log);
607 mysql_log = NULL; 612 mysql_log = NULL;
608 open_logdb_link(); 613 open_logdb_link();
609 614
@@ -630,7 +635,8 @@ int safe_mysql_query(request_rec *r, const char *query)
630 /* If this one also failed, log that and append to our local offline file */ 635 /* If this one also failed, log that and append to our local offline file */
631 if ( retval != 0 ) 636 if ( retval != 0 )
632 { 637 {
633 ap_log_error(APLOG_MARK,ERRLEVEL,r->server,"mod_log_sql: second attempt failed, API said: %s", MYSQL_ERROR(mysql_log)); 638 real_error = mysql_errno(mysql_log);
639 ap_log_error(APLOG_MARK,ERRLEVEL,r->server,"mod_log_sql: second attempt failed, API said: error %d, %s", real_error, MYSQL_ERROR(mysql_log));
634 preserve_entry(r, query); 640 preserve_entry(r, query);
635 ap_log_error(APLOG_MARK,ERRLEVEL,r->server,"mod_log_sql: entry preserved in %s", cls->preserve_file); 641 ap_log_error(APLOG_MARK,ERRLEVEL,r->server,"mod_log_sql: entry preserved in %s", cls->preserve_file);
636 } else { 642 } else {
@@ -658,7 +664,10 @@ const char *set_log_sql_massvirtual(cmd_parms *parms, void *dummy, int flag)
658 664
659const char *set_log_sql_create(cmd_parms *parms, void *dummy, int flag) 665const char *set_log_sql_create(cmd_parms *parms, void *dummy, int flag)
660{ 666{
661 create_tables = ( flag ? 1 : 0); 667 if (massvirtual != 0)
668 ap_log_error(APLOG_MARK,WARNINGLEVEL,parms->server,"mod_log_sql: do not set LogSQLCreateTables when LogSQLMassVirtualHosting is On. Ignoring.");
669 else
670 create_tables = ( flag ? 1 : 0);
662 return NULL; 671 return NULL;
663} 672}
664 673
@@ -841,6 +850,9 @@ static void log_sql_child_init(server_rec *s, pool *p)
841 int retval; 850 int retval;
842 851
843 retval = open_logdb_link(); 852 retval = open_logdb_link();
853 if (retval == 0)
854 ap_log_error(APLOG_MARK,ERRLEVEL,s,"mod_log_sql: child spawned but unable to open database link");
855
844 #ifdef DEBUG 856 #ifdef DEBUG
845 if (retval > 0) { 857 if (retval > 0) {
846 ap_log_error(APLOG_MARK,DEBUGLEVEL,s,"mod_log_sql: open_logdb_link successful"); 858 ap_log_error(APLOG_MARK,DEBUGLEVEL,s,"mod_log_sql: open_logdb_link successful");
@@ -1052,7 +1064,7 @@ int log_sql_transaction(request_rec *orig)
1052 char *create_notes = NULL; 1064 char *create_notes = NULL;
1053 char *create_hout = NULL; 1065 char *create_hout = NULL;
1054 char *create_hin = NULL; 1066 char *create_hin = NULL;
1055 int create_results_access, create_results_notes, create_results_hout, create_results_hin; 1067 int create_results;
1056 1068
1057 for (r = orig; r->next; r = r->next) { 1069 for (r = orig; r->next; r = r->next) {
1058 continue; 1070 continue;
@@ -1266,10 +1278,10 @@ int log_sql_transaction(request_rec *orig)
1266 create_hin = ap_pstrcat(orig->pool, createprefix, cls->hin_table_name, headers_suffix, NULL); 1278 create_hin = ap_pstrcat(orig->pool, createprefix, cls->hin_table_name, headers_suffix, NULL);
1267 1279
1268 #ifdef DEBUG 1280 #ifdef DEBUG
1269 ap_log_error(APLOG_MARK,DEBUGLEVEL,orig->server,"create string: %s", create_access); 1281 ap_log_error(APLOG_MARK,DEBUGLEVEL,orig->server,"mod_log_sql: create string: %s", create_access);
1270 ap_log_error(APLOG_MARK,DEBUGLEVEL,orig->server,"create string: %s", create_notes); 1282 ap_log_error(APLOG_MARK,DEBUGLEVEL,orig->server,"mod_log_sql: create string: %s", create_notes);
1271 ap_log_error(APLOG_MARK,DEBUGLEVEL,orig->server,"create string: %s", create_hout); 1283 ap_log_error(APLOG_MARK,DEBUGLEVEL,orig->server,"mod_log_sql: create string: %s", create_hout);
1272 ap_log_error(APLOG_MARK,DEBUGLEVEL,orig->server,"create string: %s", create_hin); 1284 ap_log_error(APLOG_MARK,DEBUGLEVEL,orig->server,"mod_log_sql: create string: %s", create_hin);
1273 #endif 1285 #endif
1274 1286
1275 } 1287 }
@@ -1278,7 +1290,7 @@ int log_sql_transaction(request_rec *orig)
1278 access_query = ap_pstrcat(r->pool, "insert into ", cls->transfer_table_name, " (", fields, ") values (", values, ")", NULL); 1290 access_query = ap_pstrcat(r->pool, "insert into ", cls->transfer_table_name, " (", fields, ") values (", values, ")", NULL);
1279 1291
1280 #ifdef DEBUG 1292 #ifdef DEBUG
1281 ap_log_error(APLOG_MARK,DEBUGLEVEL,r->server,"insert string: %s", access_query); 1293 ap_log_error(APLOG_MARK,DEBUGLEVEL,r->server,"mod_log_sql: access string: %s", access_query);
1282 #endif 1294 #endif
1283 1295
1284 1296
@@ -1291,7 +1303,9 @@ int log_sql_transaction(request_rec *orig)
1291 if (mysql_log == NULL) { 1303 if (mysql_log == NULL) {
1292 /* Unable to re-establish a DB link, so assume that it's really 1304 /* Unable to re-establish a DB link, so assume that it's really
1293 * gone and send the entry to the preserve file instead. 1305 * gone and send the entry to the preserve file instead.
1294 * Note that we don't keep logging the db error over and over. */ 1306 * This short-circuits safe_mysql_query during a db outage and therefore
1307 * we don't keep logging the db error over and over.
1308 */
1295 preserve_entry(orig, access_query); 1309 preserve_entry(orig, access_query);
1296 if ( note_query != NULL ) 1310 if ( note_query != NULL )
1297 preserve_entry(orig, note_query); 1311 preserve_entry(orig, note_query);
@@ -1313,21 +1327,35 @@ int log_sql_transaction(request_rec *orig)
1313 1327
1314 /* Make the tables if we're supposed to. */ 1328 /* Make the tables if we're supposed to. */
1315 if ((cls->table_made != 1) && (create_tables != 0)) { 1329 if ((cls->table_made != 1) && (create_tables != 0)) {
1316 create_results_access = safe_mysql_query(orig, create_access); 1330
1317 create_results_notes = safe_mysql_query(orig, create_notes); 1331 /* Assume it will be made successfully...*/
1318 create_results_hin = safe_mysql_query(orig, create_hin); 1332 cls->table_made = 1;
1319 create_results_hout = safe_mysql_query(orig, create_hout);
1320 1333
1321 if ( (create_results_access == 0) && (create_results_notes == 0) && (create_results_hin == 0) && (create_results_hout == 0) ) 1334 if ((create_results = safe_mysql_query(orig, create_access)) != 0) {
1322 cls->table_made = 1; 1335 cls->table_made = 0;
1323 else 1336 ap_log_error(APLOG_MARK,ERRLEVEL,orig->server,"mod_log_sql: failed to create access table, see preserve file");
1324 ap_log_error(APLOG_MARK,ERRLEVEL,orig->server,"mod_log_sql: failed to create all tables, see preserve file"); 1337 }
1338
1339 if ((create_results = safe_mysql_query(orig, create_notes)) != 0) {
1340 cls->table_made = 0;
1341 ap_log_error(APLOG_MARK,ERRLEVEL,orig->server,"mod_log_sql: failed to create notes table, see preserve file");
1342 }
1343
1344 if ((create_results = safe_mysql_query(orig, create_hin)) != 0) {
1345 cls->table_made = 0;
1346 ap_log_error(APLOG_MARK,ERRLEVEL,orig->server,"mod_log_sql: failed to create header_out table, see preserve file");
1347 }
1348
1349 if ((create_results = safe_mysql_query(orig, create_hout)) != 0) {
1350 cls->table_made = 0;
1351 ap_log_error(APLOG_MARK,ERRLEVEL,orig->server,"mod_log_sql: failed to create header_in table, see preserve file");
1352 }
1325 } 1353 }
1326 1354
1327 /* Make the access-table insert */ 1355 /* Make the access-table insert */
1328 safe_mysql_query(orig, access_query); 1356 safe_mysql_query(orig, access_query);
1329 1357
1330 /* If notes are available to log, make the notes-table insert */ 1358 /* Log the optional notes, headers, etc. */
1331 if ( note_query != NULL ) 1359 if ( note_query != NULL )
1332 safe_mysql_query(orig, note_query); 1360 safe_mysql_query(orig, note_query);
1333 1361