diff options
| -rw-r--r-- | CHANGELOG | 8 | ||||
| -rw-r--r-- | Makefile | 4 | ||||
| -rw-r--r-- | mod_log_sql.c | 275 |
3 files changed, 163 insertions, 124 deletions
| @@ -1,4 +1,4 @@ | |||
| 1 | $Id: CHANGELOG,v 1.14 2002/06/27 20:09:17 helios Exp $ | 1 | $Id: CHANGELOG,v 1.15 2002/09/04 18:46:00 helios Exp $ |
| 2 | 2 | ||
| 3 | 3 | ||
| 4 | TODO: | 4 | TODO: |
| @@ -14,6 +14,9 @@ TODO: | |||
| 14 | * new format char: IP as bigint? | 14 | * new format char: IP as bigint? |
| 15 | * socket-based middleman daemon with configurable conns? | 15 | * socket-based middleman daemon with configurable conns? |
| 16 | 16 | ||
| 17 | * go ahead and allow dashes - quote the table name! | ||
| 18 | * maxlength of request field should be longer | ||
| 19 | |||
| 17 | 20 | ||
| 18 | CHANGES: | 21 | CHANGES: |
| 19 | 22 | ||
| @@ -57,7 +60,10 @@ CHANGES: | |||
| 57 | everything it was supposed to (preserve entries, etc.) but not notify | 60 | everything it was supposed to (preserve entries, etc.) but not notify |
| 58 | the sysadmin. Added a log message to alert sysadmin if MySQL is | 61 | the sysadmin. Added a log message to alert sysadmin if MySQL is |
| 59 | unreachable at startup. | 62 | unreachable at startup. |
| 63 | * New config key 'I' to extract & log unique_id, provided by mod_unique_id. | ||
| 60 | * Migrated to the Artistic License (as used by Perl). | 64 | * Migrated to the Artistic License (as used by Perl). |
| 65 | * Moved table creation into its own callable function | ||
| 66 | * Robustifying table creation | ||
| 61 | 67 | ||
| 62 | 68 | ||
| 63 | 1.16: | 69 | 1.16: |
| @@ -1,8 +1,8 @@ | |||
| 1 | # $Id: Makefile,v 1.10 2002/05/14 21:47:14 helios Exp $ | 1 | # $Id: Makefile,v 1.11 2002/09/04 18:46:00 helios Exp $ |
| 2 | MLMVERS = 1.17 | 2 | MLMVERS = 1.17 |
| 3 | 3 | ||
| 4 | # Where you unpacked your Apache tarball -- the source. | 4 | # Where you unpacked your Apache tarball -- the source. |
| 5 | APACHESOURCE = /usr/local/src/apache_1.3.22 | 5 | APACHESOURCE = /usr/local/src/apache_1.3.26 |
| 6 | 6 | ||
| 7 | # Where Apache [got|will get] installed | 7 | # Where Apache [got|will get] installed |
| 8 | APACHEINST = /usr/local/Apache | 8 | APACHEINST = /usr/local/Apache |
diff --git a/mod_log_sql.c b/mod_log_sql.c index db9b3a3..a0cceb2 100644 --- a/mod_log_sql.c +++ b/mod_log_sql.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $Id: mod_log_sql.c,v 1.15 2002/06/27 20:09:17 helios Exp $ */ | 1 | /* $Id: mod_log_sql.c,v 1.16 2002/09/04 18:46:00 helios Exp $ */ |
| 2 | 2 | ||
| 3 | /* --------* | 3 | /* --------* |
| 4 | * DEFINES * | 4 | * DEFINES * |
| @@ -436,16 +436,16 @@ struct log_sql_item_list { | |||
| 436 | } log_sql_item_keys[] = { | 436 | } log_sql_item_keys[] = { |
| 437 | 437 | ||
| 438 | { 'A', extract_agent, "agent", 1, 1 }, | 438 | { 'A', extract_agent, "agent", 1, 1 }, |
| 439 | { 'b', extract_bytes_sent, "bytes_sent", 0, 0 }, | 439 | { 'b', extract_bytes_sent, "bytes_sent", 0, 0 }, |
| 440 | { 'c', extract_cookie, "cookie", 0, 1 }, | 440 | { 'c', extract_cookie, "cookie", 0, 1 }, |
| 441 | { 'e', extract_env_var, "env_var", 0, 1 }, | 441 | { 'e', extract_env_var, "env_var", 0, 1 }, |
| 442 | { 'f', extract_request_file, "request_file", 0, 1 }, | 442 | { 'f', extract_request_file, "request_file", 0, 1 }, |
| 443 | { 'H', extract_request_protocol, "request_protocol", 0, 1 }, | 443 | { 'H', extract_request_protocol, "request_protocol", 0, 1 }, |
| 444 | { 'h', extract_remote_host, "remote_host", 0, 1 }, | 444 | { 'h', extract_remote_host, "remote_host", 0, 1 }, |
| 445 | { 'i', extract_header_in, "header_in", 0, 1 }, | 445 | { 'i', extract_header_in, "header_in", 0, 1 }, |
| 446 | { 'I', extract_unique_id, "id", 0, 1 }, | 446 | { 'I', extract_unique_id, "id", 0, 1 }, |
| 447 | { 'l', extract_remote_logname, "remote_logname", 0, 1 }, | 447 | { 'l', extract_remote_logname, "remote_logname", 0, 1 }, |
| 448 | { 'm', extract_request_method, "request_method", 0, 1 }, | 448 | { 'm', extract_request_method, "request_method", 0, 1 }, |
| 449 | { 'n', extract_note, "note", 0, 1 }, | 449 | { 'n', extract_note, "note", 0, 1 }, |
| 450 | { 'o', extract_header_out, "header_out", 0, 1 }, | 450 | { 'o', extract_header_out, "header_out", 0, 1 }, |
| 451 | { 'P', extract_child_pid, "child_pid", 0, 0 }, | 451 | { 'P', extract_child_pid, "child_pid", 0, 0 }, |
| @@ -565,21 +565,25 @@ void preserve_entry(request_rec *r, const char *query) | |||
| 565 | else { | 565 | else { |
| 566 | fprintf(fp,"%s;\n", query); | 566 | fprintf(fp,"%s;\n", query); |
| 567 | pfclose(r->pool, fp); | 567 | pfclose(r->pool, fp); |
| 568 | #ifdef DEBUG | ||
| 569 | ap_log_error(APLOG_MARK,DEBUGLEVEL,r->server,"mod_log_sql: entry preserved in %s", cls->preserve_file); | ||
| 570 | #endif | ||
| 568 | } | 571 | } |
| 569 | } | 572 | } |
| 570 | 573 | ||
| 574 | |||
| 571 | /*-----------------------------------------------------*/ | 575 | /*-----------------------------------------------------*/ |
| 572 | /* safe_mysql_query: perform a database query with */ | 576 | /* safe_mysql_query: perform a database query with */ |
| 573 | /* a degree of safety and error checking. */ | 577 | /* a degree of safety and error checking. */ |
| 574 | /* */ | 578 | /* */ |
| 575 | /* Parms: request record, SQL insert statement */ | 579 | /* Parms: request record, SQL insert statement */ |
| 576 | /* Returns: 0 (OK) on success */ | 580 | /* Returns: 0 (OK) on success */ |
| 577 | /* -1 if have no log handle */ | 581 | /* 1 if have no log handle */ |
| 578 | /* actual MySQL return code on error */ | 582 | /* actual MySQL return code on error */ |
| 579 | /*-----------------------------------------------------*/ | 583 | /*-----------------------------------------------------*/ |
| 580 | int safe_mysql_query(request_rec *r, const char *query) | 584 | unsigned int safe_mysql_query(request_rec *r, const char *query) |
| 581 | { | 585 | { |
| 582 | int retval; | 586 | unsigned int retval; |
| 583 | unsigned int real_error; | 587 | unsigned int real_error; |
| 584 | struct timespec delay, remainder; | 588 | struct timespec delay, remainder; |
| 585 | int ret; | 589 | int ret; |
| @@ -593,21 +597,20 @@ int safe_mysql_query(request_rec *r, const char *query) | |||
| 593 | if (mysql_log != NULL) | 597 | if (mysql_log != NULL) |
| 594 | retval = mysql_query(mysql_log, query); | 598 | retval = mysql_query(mysql_log, query); |
| 595 | else | 599 | else |
| 596 | return -1; | 600 | return 1; |
| 597 | 601 | ||
| 598 | /* If we ran the query and it returned an error, try to be graceful. | 602 | if ( retval != 0 ) |
| 599 | * (The module thought it had a valid mysql_log connection but the query | ||
| 600 | * might have failed, so we have to be extra-safe and check.) | ||
| 601 | */ | ||
| 602 | if ( retval != 0 ) | ||
| 603 | { | 603 | { |
| 604 | /* If we ran the query and it returned an error, try to be robust. | ||
| 605 | * (After all, the module thought it had a valid mysql_log connection but the query | ||
| 606 | * could have failed for a number of reasons, so we have to be extra-safe and check.) */ | ||
| 607 | |||
| 604 | log_sql_state *cls = get_module_config(r->server->module_config, &mysql_log_module); | 608 | log_sql_state *cls = get_module_config(r->server->module_config, &mysql_log_module); |
| 605 | 609 | ||
| 606 | real_error = mysql_errno(mysql_log); | 610 | real_error = mysql_errno(mysql_log); /* What really happened? */ |
| 607 | 611 | ||
| 608 | /* Something went wrong, so start by trying to restart the db link. */ | 612 | /* Something went wrong, so start by trying to restart the db link. */ |
| 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)); | 613 | 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)); |
| 610 | |||
| 611 | mysql_close(mysql_log); | 614 | mysql_close(mysql_log); |
| 612 | mysql_log = NULL; | 615 | mysql_log = NULL; |
| 613 | open_logdb_link(); | 616 | open_logdb_link(); |
| @@ -616,20 +619,18 @@ int safe_mysql_query(request_rec *r, const char *query) | |||
| 616 | signal(SIGPIPE, handler); | 619 | signal(SIGPIPE, handler); |
| 617 | 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."); | 620 | 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."); |
| 618 | ap_log_error(APLOG_MARK,ERRLEVEL,r->server,"mod_log_sql: log entries are being preserved in %s", cls->preserve_file); | 621 | ap_log_error(APLOG_MARK,ERRLEVEL,r->server,"mod_log_sql: log entries are being preserved in %s", cls->preserve_file); |
| 619 | preserve_entry(r, query); | 622 | return 1; |
| 620 | return retval; | 623 | } else |
| 621 | } else { | ||
| 622 | ap_log_error(APLOG_MARK,ERRLEVEL,r->server,"mod_log_sql: reconnect successful"); | 624 | ap_log_error(APLOG_MARK,ERRLEVEL,r->server,"mod_log_sql: reconnect successful"); |
| 623 | } | ||
| 624 | 625 | ||
| 625 | /* Attempt a single re-try... First sleep for a tiny amount of time. */ | 626 | /* First sleep for a tiny amount of time. */ |
| 626 | delay.tv_sec = 0; | 627 | delay.tv_sec = 0; |
| 627 | delay.tv_nsec = 250000000; /* max is 999999999 (nine nines) */ | 628 | delay.tv_nsec = 250000000; /* max is 999999999 (nine nines) */ |
| 628 | ret = nanosleep(&delay, &remainder); | 629 | ret = nanosleep(&delay, &remainder); |
| 629 | if (ret && errno != EINTR) | 630 | if (ret && errno != EINTR) |
| 630 | ap_log_error(APLOG_MARK,ERRLEVEL,r->server,"mod_log_sql: nanosleep unsuccessful"); | 631 | ap_log_error(APLOG_MARK,ERRLEVEL,r->server,"mod_log_sql: nanosleep unsuccessful"); |
| 631 | 632 | ||
| 632 | /* Now make our second attempt */ | 633 | /* Then make our second attempt */ |
| 633 | retval = mysql_query(mysql_log,query); | 634 | retval = mysql_query(mysql_log,query); |
| 634 | 635 | ||
| 635 | /* If this one also failed, log that and append to our local offline file */ | 636 | /* If this one also failed, log that and append to our local offline file */ |
| @@ -637,11 +638,9 @@ int safe_mysql_query(request_rec *r, const char *query) | |||
| 637 | { | 638 | { |
| 638 | real_error = mysql_errno(mysql_log); | 639 | 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)); | 640 | 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)); |
| 640 | preserve_entry(r, query); | 641 | retval = real_error; |
| 641 | ap_log_error(APLOG_MARK,ERRLEVEL,r->server,"mod_log_sql: entry preserved in %s", cls->preserve_file); | 642 | } else |
| 642 | } else { | ||
| 643 | ap_log_error(APLOG_MARK,ERRLEVEL,r->server,"mod_log_sql: second attempt successful"); | 643 | ap_log_error(APLOG_MARK,ERRLEVEL,r->server,"mod_log_sql: second attempt successful"); |
| 644 | } | ||
| 645 | } | 644 | } |
| 646 | 645 | ||
| 647 | /* Restore SIGPIPE to its original handler function */ | 646 | /* Restore SIGPIPE to its original handler function */ |
| @@ -650,6 +649,102 @@ int safe_mysql_query(request_rec *r, const char *query) | |||
| 650 | return retval; | 649 | return retval; |
| 651 | } | 650 | } |
| 652 | 651 | ||
| 652 | /*-----------------------------------------------------*/ | ||
| 653 | /* safe_create_tables: create SQL table set for the */ | ||
| 654 | /* virtual server represented by cls. */ | ||
| 655 | /* */ | ||
| 656 | /* Parms: virtserver structure, request record */ | ||
| 657 | /* Returns: 0 on no errors */ | ||
| 658 | /* mysql error code on failure */ | ||
| 659 | /*-----------------------------------------------------*/ | ||
| 660 | int safe_create_tables(log_sql_state *cls, request_rec *r) | ||
| 661 | { | ||
| 662 | int retval; | ||
| 663 | unsigned int create_results; | ||
| 664 | char *create_access = NULL; | ||
| 665 | char *create_notes = NULL; | ||
| 666 | char *create_hout = NULL; | ||
| 667 | char *create_hin = NULL; | ||
| 668 | |||
| 669 | char *createprefix = "create table if not exists "; | ||
| 670 | char *access_suffix = | ||
| 671 | " (id char(19),\ | ||
| 672 | agent varchar(255),\ | ||
| 673 | bytes_sent int unsigned,\ | ||
| 674 | child_pid smallint unsigned,\ | ||
| 675 | cookie varchar(255),\ | ||
| 676 | request_file varchar(255),\ | ||
| 677 | referer varchar(255),\ | ||
| 678 | remote_host varchar(50),\ | ||
| 679 | remote_logname varchar(50),\ | ||
| 680 | remote_user varchar(50),\ | ||
| 681 | request_duration smallint unsigned,\ | ||
| 682 | request_line varchar(255),\ | ||
| 683 | request_method varchar(6),\ | ||
| 684 | request_protocol varchar(10),\ | ||
| 685 | request_time char(28),\ | ||
| 686 | request_uri varchar(50),\ | ||
| 687 | server_port smallint unsigned,\ | ||
| 688 | ssl_cipher varchar(25),\ | ||
| 689 | ssl_keysize smallint unsigned,\ | ||
| 690 | ssl_maxkeysize smallint unsigned,\ | ||
| 691 | status smallint unsigned,\ | ||
| 692 | time_stamp int unsigned,\ | ||
| 693 | virtual_host varchar(50))"; | ||
| 694 | |||
| 695 | char *notes_suffix = | ||
| 696 | " (id char(19),\ | ||
| 697 | item varchar(80),\ | ||
| 698 | val varchar(80))"; | ||
| 699 | |||
| 700 | char *headers_suffix = | ||
| 701 | " (id char(19),\ | ||
| 702 | item varchar(80),\ | ||
| 703 | val varchar(80))"; | ||
| 704 | |||
| 705 | /* Find memory long enough to hold the whole CREATE string + \0 */ | ||
| 706 | create_access = ap_pstrcat(r->pool, createprefix, cls->transfer_table_name, access_suffix, NULL); | ||
| 707 | create_notes = ap_pstrcat(r->pool, createprefix, cls->notes_table_name, notes_suffix, NULL); | ||
| 708 | create_hout = ap_pstrcat(r->pool, createprefix, cls->hout_table_name, headers_suffix, NULL); | ||
| 709 | create_hin = ap_pstrcat(r->pool, createprefix, cls->hin_table_name, headers_suffix, NULL); | ||
| 710 | |||
| 711 | #ifdef DEBUG | ||
| 712 | ap_log_error(APLOG_MARK,DEBUGLEVEL,r->server,"mod_log_sql: create string: %s", create_access); | ||
| 713 | ap_log_error(APLOG_MARK,DEBUGLEVEL,r->server,"mod_log_sql: create string: %s", create_notes); | ||
| 714 | ap_log_error(APLOG_MARK,DEBUGLEVEL,r->server,"mod_log_sql: create string: %s", create_hout); | ||
| 715 | ap_log_error(APLOG_MARK,DEBUGLEVEL,r->server,"mod_log_sql: create string: %s", create_hin); | ||
| 716 | #endif | ||
| 717 | |||
| 718 | /* Assume that things worked unless told otherwise */ | ||
| 719 | cls->table_made = 1; | ||
| 720 | retval = 0; | ||
| 721 | |||
| 722 | if ((create_results = safe_mysql_query(r, create_access)) != 0) { | ||
| 723 | cls->table_made = 0; | ||
| 724 | ap_log_error(APLOG_MARK,ERRLEVEL,r->server,"mod_log_sql: failed to create access table"); | ||
| 725 | retval = create_results; | ||
| 726 | } | ||
| 727 | |||
| 728 | if ((create_results = safe_mysql_query(r, create_notes)) != 0) { | ||
| 729 | cls->table_made = 0; | ||
| 730 | ap_log_error(APLOG_MARK,ERRLEVEL,r->server,"mod_log_sql: failed to create notes table"); | ||
| 731 | retval = create_results; | ||
| 732 | } | ||
| 733 | |||
| 734 | if ((create_results = safe_mysql_query(r, create_hin)) != 0) { | ||
| 735 | cls->table_made = 0; | ||
| 736 | ap_log_error(APLOG_MARK,ERRLEVEL,r->server,"mod_log_sql: failed to create header_out table"); | ||
| 737 | retval = create_results; | ||
| 738 | } | ||
| 739 | |||
| 740 | if ((create_results = safe_mysql_query(r, create_hout)) != 0) { | ||
| 741 | cls->table_made = 0; | ||
| 742 | ap_log_error(APLOG_MARK,ERRLEVEL,r->server,"mod_log_sql: failed to create header_in table"); | ||
| 743 | retval = create_results; | ||
| 744 | } | ||
| 745 | |||
| 746 | return retval; | ||
| 747 | } | ||
| 653 | 748 | ||
| 654 | /* ------------------------------------------------* | 749 | /* ------------------------------------------------* |
| 655 | * Command handlers that are called according * | 750 | * Command handlers that are called according * |
| @@ -1060,20 +1155,12 @@ int log_sql_transaction(request_rec *orig) | |||
| 1060 | const char *unique_id; | 1155 | const char *unique_id; |
| 1061 | const char *formatted_item; | 1156 | const char *formatted_item; |
| 1062 | int i, j, length; | 1157 | int i, j, length; |
| 1063 | char *create_access = NULL; | 1158 | int result; |
| 1064 | char *create_notes = NULL; | ||
| 1065 | char *create_hout = NULL; | ||
| 1066 | char *create_hin = NULL; | ||
| 1067 | int create_results; | ||
| 1068 | 1159 | ||
| 1069 | for (r = orig; r->next; r = r->next) { | 1160 | for (r = orig; r->next; r = r->next) { |
| 1070 | continue; | 1161 | continue; |
| 1071 | } | 1162 | } |
| 1072 | 1163 | ||
| 1073 | #ifdef DEBUG | ||
| 1074 | /*ap_table_do(trace, orig, orig->subprocess_env, NULL);*/ | ||
| 1075 | #endif | ||
| 1076 | |||
| 1077 | /* The following is a stolen upsetting mess of pointers, I'm sorry. | 1164 | /* The following is a stolen upsetting mess of pointers, I'm sorry. |
| 1078 | * Anyone with the motiviation and/or the time should feel free | 1165 | * Anyone with the motiviation and/or the time should feel free |
| 1079 | * to make this cleaner. :) */ | 1166 | * to make this cleaner. :) */ |
| @@ -1228,64 +1315,6 @@ int log_sql_transaction(request_rec *orig) | |||
| 1228 | #endif | 1315 | #endif |
| 1229 | } | 1316 | } |
| 1230 | 1317 | ||
| 1231 | |||
| 1232 | |||
| 1233 | /* Is this virtual server's table flagged as made? We flag it as such in order | ||
| 1234 | * to avoid extra processing with each request. If it's not flagged as made, | ||
| 1235 | * set up the CREATE string. | ||
| 1236 | */ | ||
| 1237 | if ((cls->table_made != 1) && (create_tables != 0)) { | ||
| 1238 | char *createprefix = "create table if not exists "; | ||
| 1239 | char *access_suffix = | ||
| 1240 | " (id char(19),\ | ||
| 1241 | agent varchar(255),\ | ||
| 1242 | bytes_sent int unsigned,\ | ||
| 1243 | child_pid smallint unsigned,\ | ||
| 1244 | cookie varchar(255),\ | ||
| 1245 | request_file varchar(255),\ | ||
| 1246 | referer varchar(255),\ | ||
| 1247 | remote_host varchar(50),\ | ||
| 1248 | remote_logname varchar(50),\ | ||
| 1249 | remote_user varchar(50),\ | ||
| 1250 | request_duration smallint unsigned,\ | ||
| 1251 | request_line varchar(255),\ | ||
| 1252 | request_method varchar(6),\ | ||
| 1253 | request_protocol varchar(10),\ | ||
| 1254 | request_time char(28),\ | ||
| 1255 | request_uri varchar(50),\ | ||
| 1256 | server_port smallint unsigned,\ | ||
| 1257 | ssl_cipher varchar(25),\ | ||
| 1258 | ssl_keysize smallint unsigned,\ | ||
| 1259 | ssl_maxkeysize smallint unsigned,\ | ||
| 1260 | status smallint unsigned,\ | ||
| 1261 | time_stamp int unsigned,\ | ||
| 1262 | virtual_host varchar(50))"; | ||
| 1263 | |||
| 1264 | char *notes_suffix = | ||
| 1265 | " (id char(19),\ | ||
| 1266 | item varchar(80),\ | ||
| 1267 | val varchar(80))"; | ||
| 1268 | |||
| 1269 | char *headers_suffix = | ||
| 1270 | " (id char(19),\ | ||
| 1271 | item varchar(80),\ | ||
| 1272 | val varchar(80))"; | ||
| 1273 | |||
| 1274 | /* Find memory long enough to hold the whole CREATE string + \0 */ | ||
| 1275 | create_access = ap_pstrcat(orig->pool, createprefix, cls->transfer_table_name, access_suffix, NULL); | ||
| 1276 | create_notes = ap_pstrcat(orig->pool, createprefix, cls->notes_table_name, notes_suffix, NULL); | ||
| 1277 | create_hout = ap_pstrcat(orig->pool, createprefix, cls->hout_table_name, headers_suffix, NULL); | ||
| 1278 | create_hin = ap_pstrcat(orig->pool, createprefix, cls->hin_table_name, headers_suffix, NULL); | ||
| 1279 | |||
| 1280 | #ifdef DEBUG | ||
| 1281 | ap_log_error(APLOG_MARK,DEBUGLEVEL,orig->server,"mod_log_sql: create string: %s", create_access); | ||
| 1282 | ap_log_error(APLOG_MARK,DEBUGLEVEL,orig->server,"mod_log_sql: create string: %s", create_notes); | ||
| 1283 | ap_log_error(APLOG_MARK,DEBUGLEVEL,orig->server,"mod_log_sql: create string: %s", create_hout); | ||
| 1284 | ap_log_error(APLOG_MARK,DEBUGLEVEL,orig->server,"mod_log_sql: create string: %s", create_hin); | ||
| 1285 | #endif | ||
| 1286 | |||
| 1287 | } | ||
| 1288 | |||
| 1289 | /* Set up the actual INSERT statement */ | 1318 | /* Set up the actual INSERT statement */ |
| 1290 | access_query = ap_pstrcat(r->pool, "insert into ", cls->transfer_table_name, " (", fields, ") values (", values, ")", NULL); | 1319 | access_query = ap_pstrcat(r->pool, "insert into ", cls->transfer_table_name, " (", fields, ") values (", values, ")", NULL); |
| 1291 | 1320 | ||
| @@ -1293,7 +1322,6 @@ int log_sql_transaction(request_rec *orig) | |||
| 1293 | ap_log_error(APLOG_MARK,DEBUGLEVEL,r->server,"mod_log_sql: access string: %s", access_query); | 1322 | ap_log_error(APLOG_MARK,DEBUGLEVEL,r->server,"mod_log_sql: access string: %s", access_query); |
| 1294 | #endif | 1323 | #endif |
| 1295 | 1324 | ||
| 1296 | |||
| 1297 | /* How's our mysql link integrity? */ | 1325 | /* How's our mysql link integrity? */ |
| 1298 | if (mysql_log == NULL) { | 1326 | if (mysql_log == NULL) { |
| 1299 | 1327 | ||
| @@ -1322,38 +1350,43 @@ int log_sql_transaction(request_rec *orig) | |||
| 1322 | } | 1350 | } |
| 1323 | 1351 | ||
| 1324 | 1352 | ||
| 1325 | /* So as of here we have a non-null value of mysql_log. */ | 1353 | /* ---> So as of here we have a non-null value of mysql_log. <--- */ |
| 1354 | /* ---> i.e. we have a good MySQL connection. <--- */ | ||
| 1326 | 1355 | ||
| 1327 | 1356 | ||
| 1328 | /* Make the tables if we're supposed to. */ | 1357 | /* Make the tables if we're supposed to. */ |
| 1329 | if ((cls->table_made != 1) && (create_tables != 0)) { | 1358 | if ((cls->table_made != 1) && (create_tables != 0)) { |
| 1330 | 1359 | result = safe_create_tables(cls, orig); | |
| 1331 | /* Assume it will be made successfully...*/ | 1360 | if (result != 0) |
| 1332 | cls->table_made = 1; | 1361 | ap_log_error(APLOG_MARK,ERRLEVEL,orig->server,"mod_log_sql: child attempted but failed to create one or more tables for %s", ap_get_server_name(orig)); |
| 1333 | 1362 | else | |
| 1334 | if ((create_results = safe_mysql_query(orig, create_access)) != 0) { | 1363 | ap_log_error(APLOG_MARK,NOTICELEVEL,orig->server,"mod_log_sql: no problems creating tables for %s", ap_get_server_name(orig)); |
| 1335 | cls->table_made = 0; | ||
| 1336 | ap_log_error(APLOG_MARK,ERRLEVEL,orig->server,"mod_log_sql: failed to create access table, 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 | } | ||
| 1353 | } | 1364 | } |
| 1354 | 1365 | ||
| 1355 | /* Make the access-table insert */ | 1366 | /* Make the access-table insert */ |
| 1356 | safe_mysql_query(orig, access_query); | 1367 | result = safe_mysql_query(orig, access_query); |
| 1368 | |||
| 1369 | /* It failed, but NOT because table didn't exist */ | ||
| 1370 | if ( (result != 0) && (result != 1146) ) | ||
| 1371 | preserve_entry(orig,access_query); | ||
| 1372 | |||
| 1373 | /* It failed because table didn't exist */ | ||
| 1374 | if (result == 1146) { | ||
| 1375 | ap_log_error(APLOG_MARK,ERRLEVEL,orig->server,"mod_log_sql: hmm, table didn't yet exist; creating"); | ||
| 1376 | result = safe_create_tables(cls, orig); | ||
| 1377 | if (result != 0) { | ||
| 1378 | ap_log_error(APLOG_MARK,ERRLEVEL,orig->server,"mod_log_sql: child attempted but failed to create one or more tables for %s, preserving query", ap_get_server_name(orig)); | ||
| 1379 | preserve_entry(orig,access_query); | ||
| 1380 | } else { | ||
| 1381 | ap_log_error(APLOG_MARK,ERRLEVEL,orig->server,"mod_log_sql: table successfully created, query will now be retried"); | ||
| 1382 | result = safe_mysql_query(orig, access_query); | ||
| 1383 | if (result != 0 ) { | ||
| 1384 | ap_log_error(APLOG_MARK,ERRLEVEL,orig->server,"mod_log_sql: giving up, preserving query"); | ||
| 1385 | preserve_entry(orig,access_query); | ||
| 1386 | return OK; | ||
| 1387 | } | ||
| 1388 | } | ||
| 1389 | } | ||
| 1357 | 1390 | ||
| 1358 | /* Log the optional notes, headers, etc. */ | 1391 | /* Log the optional notes, headers, etc. */ |
| 1359 | if ( note_query != NULL ) | 1392 | if ( note_query != NULL ) |
