summaryrefslogtreecommitdiffstats
path: root/mod_log_sql.c
diff options
context:
space:
mode:
Diffstat (limited to 'mod_log_sql.c')
-rw-r--r--mod_log_sql.c193
1 files changed, 178 insertions, 15 deletions
diff --git a/mod_log_sql.c b/mod_log_sql.c
index 6726163..ecdfcf0 100644
--- a/mod_log_sql.c
+++ b/mod_log_sql.c
@@ -1,4 +1,4 @@
1/* $Id: mod_log_sql.c,v 1.13 2002/05/16 21:35:12 helios Exp $ */ 1/* $Id: mod_log_sql.c,v 1.14 2002/05/24 20:52:39 helios Exp $ */
2 2
3/* --------* 3/* --------*
4 * DEFINES * 4 * DEFINES *
@@ -71,7 +71,11 @@ typedef struct {
71 array_header *transfer_ignore_list; 71 array_header *transfer_ignore_list;
72 array_header *remhost_ignore_list; 72 array_header *remhost_ignore_list;
73 array_header *notes_list; 73 array_header *notes_list;
74 array_header *hout_list;
75 array_header *hin_list;
74 char *notes_table_name; 76 char *notes_table_name;
77 char *hout_table_name;
78 char *hin_table_name;
75 char *transfer_table_name; 79 char *transfer_table_name;
76 char *transfer_log_format; 80 char *transfer_log_format;
77 char *preserve_file; 81 char *preserve_file;
@@ -718,6 +722,28 @@ const char *set_log_sql_notes_table(cmd_parms *parms, void *dummy, char *arg)
718 return NULL; 722 return NULL;
719} 723}
720 724
725const char *set_log_sql_hin_table(cmd_parms *parms, void *dummy, char *arg)
726{
727 log_sql_state *cls = get_module_config(parms->server->module_config, &mysql_log_module);
728
729 if (massvirtual != 0)
730 ap_log_error(APLOG_MARK,WARNINGLEVEL,parms->server,"mod_log_sql: do not set LogSQLHeadersInLogTable when LogSQLMassVirtualHosting is On. Ignoring.");
731 else
732 cls->hin_table_name = arg;
733 return NULL;
734}
735
736const char *set_log_sql_hout_table(cmd_parms *parms, void *dummy, char *arg)
737{
738 log_sql_state *cls = get_module_config(parms->server->module_config, &mysql_log_module);
739
740 if (massvirtual != 0)
741 ap_log_error(APLOG_MARK,WARNINGLEVEL,parms->server,"mod_log_sql: do not set LogSQLHeadersOutLogTable when LogSQLMassVirtualHosting is On. Ignoring.");
742 else
743 cls->hout_table_name = arg;
744 return NULL;
745}
746
721const char *set_log_sql_transfer_log_format(cmd_parms *parms, void *dummy, char *arg) 747const char *set_log_sql_transfer_log_format(cmd_parms *parms, void *dummy, char *arg)
722{ 748{
723 log_sql_state *cls = get_module_config(parms->server->module_config, &mysql_log_module); 749 log_sql_state *cls = get_module_config(parms->server->module_config, &mysql_log_module);
@@ -733,7 +759,6 @@ const char *set_log_sql_socket_file(cmd_parms *parms, void *dummy, char *arg)
733 return NULL; 759 return NULL;
734} 760}
735 761
736
737const char *add_log_sql_referer_ignore(cmd_parms *parms, void *dummy, char *arg) 762const char *add_log_sql_referer_ignore(cmd_parms *parms, void *dummy, char *arg)
738{ 763{
739 char **addme; 764 char **addme;
@@ -774,6 +799,26 @@ const char *add_log_sql_note(cmd_parms *parms, void *dummy, char *arg)
774 return NULL; 799 return NULL;
775} 800}
776 801
802const char *add_log_sql_hout(cmd_parms *parms, void *dummy, char *arg)
803{
804 char **addme;
805 log_sql_state *cls = get_module_config(parms->server->module_config, &mysql_log_module);
806
807 addme = push_array(cls->hout_list);
808 *addme = pstrdup(cls->hout_list->pool, arg);
809 return NULL;
810}
811
812const char *add_log_sql_hin(cmd_parms *parms, void *dummy, char *arg)
813{
814 char **addme;
815 log_sql_state *cls = get_module_config(parms->server->module_config, &mysql_log_module);
816
817 addme = push_array(cls->hin_list);
818 *addme = pstrdup(cls->hin_list->pool, arg);
819 return NULL;
820}
821
777 822
778 823
779 824
@@ -850,12 +895,16 @@ void *log_sql_make_state(pool *p, server_rec *s)
850 cls->transfer_table_name = NULL; 895 cls->transfer_table_name = NULL;
851 cls->transfer_log_format = NULL; 896 cls->transfer_log_format = NULL;
852 cls->notes_table_name = "notes"; 897 cls->notes_table_name = "notes";
898 cls->hin_table_name = "headers_in";
899 cls->hout_table_name = "headers_out";
853 900
854 cls->referer_ignore_list = make_array(p, 1, sizeof(char *)); 901 cls->referer_ignore_list = make_array(p, 1, sizeof(char *));
855 cls->transfer_ignore_list = make_array(p, 1, sizeof(char *)); 902 cls->transfer_ignore_list = make_array(p, 1, sizeof(char *));
856 cls->remhost_ignore_list = make_array(p, 1, sizeof(char *)); 903 cls->remhost_ignore_list = make_array(p, 1, sizeof(char *));
857 cls->notes_list = make_array(p, 1, sizeof(char *)); 904 cls->notes_list = make_array(p, 1, sizeof(char *));
858 cls->table_made = 0; 905 cls->hin_list = make_array(p, 1, sizeof(char *));
906 cls->hout_list = make_array(p, 1, sizeof(char *));
907 cls->table_made = 0;
859 908
860 cls->preserve_file = "/tmp/sql-preserve"; 909 cls->preserve_file = "/tmp/sql-preserve";
861 cls->cookie_name = NULL; 910 cls->cookie_name = NULL;
@@ -874,6 +923,12 @@ command_rec log_sql_cmds[] = {
874 {"LogSQLNotesLogTable", set_log_sql_notes_table, NULL, RSRC_CONF, TAKE1, 923 {"LogSQLNotesLogTable", set_log_sql_notes_table, NULL, RSRC_CONF, TAKE1,
875 "The database table that holds the notes"} 924 "The database table that holds the notes"}
876 , 925 ,
926 {"LogSQLHeadersOutLogTable", set_log_sql_hout_table, NULL, RSRC_CONF, TAKE1,
927 "The database table that holds the outbound headers"}
928 ,
929 {"LogSQLHeadersInLogTable", set_log_sql_hin_table, NULL, RSRC_CONF, TAKE1,
930 "The database table that holds the inbound headers"}
931 ,
877 {"LogSQLTransferLogFormat", set_log_sql_transfer_log_format, NULL, RSRC_CONF, TAKE1, 932 {"LogSQLTransferLogFormat", set_log_sql_transfer_log_format, NULL, RSRC_CONF, TAKE1,
878 "Instruct the module what information to log to the database transfer log"} 933 "Instruct the module what information to log to the database transfer log"}
879 , 934 ,
@@ -908,7 +963,13 @@ command_rec log_sql_cmds[] = {
908 "Name of the file to employ for socket connections to database"} 963 "Name of the file to employ for socket connections to database"}
909 , 964 ,
910 {"LogSQLWhichNotes", add_log_sql_note, NULL, RSRC_CONF, ITERATE, 965 {"LogSQLWhichNotes", add_log_sql_note, NULL, RSRC_CONF, ITERATE,
911 "Members of the 'notes' table that you would like to log"} 966 "Members of the 'notes' that you would like to log"}
967 ,
968 {"LogSQLWhichHeadersOut", add_log_sql_hout, NULL, RSRC_CONF, ITERATE,
969 "Members of the 'headers out' that you would like to log"}
970 ,
971 {"LogSQLWhichHeadersIn", add_log_sql_hin, NULL, RSRC_CONF, ITERATE,
972 "Members of the 'headers in' that you would like to log"}
912 , 973 ,
913 {NULL} 974 {NULL}
914}; 975};
@@ -931,13 +992,19 @@ int log_sql_transaction(request_rec *orig)
931 if ( massvirtual == 1 ) { 992 if ( massvirtual == 1 ) {
932 char *access_base = "access_"; 993 char *access_base = "access_";
933 char *notes_base = "notes_"; 994 char *notes_base = "notes_";
995 char *hout_base = "headout_";
996 char *hin_base = "headin_";
934 char *a_tablename; 997 char *a_tablename;
935 char *n_tablename; 998 char *n_tablename;
999 char *i_tablename;
1000 char *o_tablename;
936 int i; 1001 int i;
937 1002
938 /* Find memory long enough to hold the table name + \0. */ 1003 /* Find memory long enough to hold the table name + \0. */
939 a_tablename = ap_pstrcat(orig->pool, access_base, ap_get_server_name(orig), NULL); 1004 a_tablename = ap_pstrcat(orig->pool, access_base, ap_get_server_name(orig), NULL);
940 n_tablename = ap_pstrcat(orig->pool, notes_base, ap_get_server_name(orig), NULL); 1005 n_tablename = ap_pstrcat(orig->pool, notes_base, ap_get_server_name(orig), NULL);
1006 i_tablename = ap_pstrcat(orig->pool, hin_base, ap_get_server_name(orig), NULL);
1007 o_tablename = ap_pstrcat(orig->pool, hout_base, ap_get_server_name(orig), NULL);
941 1008
942 /* Transform any dots or dashes to underscores */ 1009 /* Transform any dots or dashes to underscores */
943 for (i = 0; i < strlen(a_tablename); i++) { 1010 for (i = 0; i < strlen(a_tablename); i++) {
@@ -948,12 +1015,22 @@ int log_sql_transaction(request_rec *orig)
948 if ( (n_tablename[i] == '.') || (n_tablename[i] == '-') ) 1015 if ( (n_tablename[i] == '.') || (n_tablename[i] == '-') )
949 n_tablename[i] = '_'; 1016 n_tablename[i] = '_';
950 } 1017 }
1018 for (i = 0; i < strlen(i_tablename); i++) {
1019 if ( (i_tablename[i] == '.') || (i_tablename[i] == '-') )
1020 i_tablename[i] = '_';
1021 }
1022 for (i = 0; i < strlen(o_tablename); i++) {
1023 if ( (o_tablename[i] == '.') || (o_tablename[i] == '-') )
1024 o_tablename[i] = '_';
1025 }
951 1026
952 /* Tell this virtual server its transfer table name, and 1027 /* Tell this virtual server its transfer table name, and
953 * turn on create_tables, which is implied by massvirtual. 1028 * turn on create_tables, which is implied by massvirtual.
954 */ 1029 */
955 cls->transfer_table_name = a_tablename; 1030 cls->transfer_table_name = a_tablename;
956 cls->notes_table_name = n_tablename; 1031 cls->notes_table_name = n_tablename;
1032 cls->hout_table_name = o_tablename;
1033 cls->hin_table_name = i_tablename;
957 create_tables = 1; 1034 create_tables = 1;
958 } 1035 }
959 1036
@@ -962,16 +1039,20 @@ int log_sql_transaction(request_rec *orig)
962 return DECLINED; 1039 return DECLINED;
963 } else { 1040 } else {
964 const char *thehost; 1041 const char *thehost;
965 const char *thenote; 1042 const char *theitem;
966 char *fields = "", *values = ""; 1043 char *fields = "", *values = "";
967 char *notesets = ""; 1044 char *itemsets = "";
968 char *note_query = NULL; 1045 char *note_query = NULL;
1046 char *hin_query = NULL;
1047 char *hout_query = NULL;
969 const char *unique_id; 1048 const char *unique_id;
970 const char *formatted_item; 1049 const char *formatted_item;
971 int i, j, length; 1050 int i, j, length;
972 char *create_access = NULL; 1051 char *create_access = NULL;
973 char *create_notes = NULL; 1052 char *create_notes = NULL;
974 int create_results_access, create_results_notes; 1053 char *create_hout = NULL;
1054 char *create_hin = NULL;
1055 int create_results_access, create_results_notes, create_results_hout, create_results_hin;
975 1056
976 for (r = orig; r->next; r = r->next) { 1057 for (r = orig; r->next; r = r->next) {
977 continue; 1058 continue;
@@ -1057,27 +1138,86 @@ int log_sql_transaction(request_rec *orig)
1057 ptrptr2 = (char **) (cls->notes_list->elts + (cls->notes_list->nelts * cls->notes_list->elt_size)); 1138 ptrptr2 = (char **) (cls->notes_list->elts + (cls->notes_list->nelts * cls->notes_list->elt_size));
1058 for (ptrptr = (char **) cls->notes_list->elts; ptrptr < ptrptr2; ptrptr = (char **) ((char *) ptrptr + cls->notes_list->elt_size)) { 1139 for (ptrptr = (char **) cls->notes_list->elts; ptrptr < ptrptr2; ptrptr = (char **) ((char *) ptrptr + cls->notes_list->elt_size)) {
1059 /* If the specified note (*ptrptr) exists for the current request... */ 1140 /* If the specified note (*ptrptr) exists for the current request... */
1060 if ((thenote = ap_table_get(r->notes, *ptrptr))) { 1141 if ((theitem = ap_table_get(r->notes, *ptrptr))) {
1061 notesets = ap_pstrcat(r->pool, notesets, 1142 itemsets = ap_pstrcat(r->pool, itemsets,
1062 (i > 0 ? "," : ""), 1143 (i > 0 ? "," : ""),
1063 "('", 1144 "('",
1064 unique_id, 1145 unique_id,
1065 "','", 1146 "','",
1066 escape_query(*ptrptr, r->pool), 1147 escape_query(*ptrptr, r->pool),
1067 "','", 1148 "','",
1068 escape_query(thenote, r->pool), 1149 escape_query(theitem, r->pool),
1069 "')", 1150 "')",
1070 NULL); 1151 NULL);
1071 i++; 1152 i++;
1072 } 1153 }
1073 } 1154 }
1074 if ( notesets != "" ) { 1155 if ( itemsets != "" ) {
1075 note_query = ap_pstrcat(r->pool, "insert into ", cls->notes_table_name, " (id, item, val) values ", notesets, NULL); 1156 note_query = ap_pstrcat(r->pool, "insert into ", cls->notes_table_name, " (id, item, val) values ", itemsets, NULL);
1076 #ifdef DEBUG 1157 #ifdef DEBUG
1077 ap_log_error(APLOG_MARK,DEBUGLEVEL,orig->server,"mod_log_sql: note string: %s", note_query); 1158 ap_log_error(APLOG_MARK,DEBUGLEVEL,orig->server,"mod_log_sql: note string: %s", note_query);
1078 #endif 1159 #endif
1079 } 1160 }
1080 1161
1162 /* Work through the list of headers-out defined by LogSQLHeadersOutToLog */
1163 i = 0;
1164 itemsets = "";
1165
1166 ptrptr2 = (char **) (cls->hout_list->elts + (cls->hout_list->nelts * cls->hout_list->elt_size));
1167 for (ptrptr = (char **) cls->hout_list->elts; ptrptr < ptrptr2; ptrptr = (char **) ((char *) ptrptr + cls->hout_list->elt_size)) {
1168 /* If the specified note (*ptrptr) exists for the current request... */
1169 if ((theitem = ap_table_get(r->headers_out, *ptrptr))) {
1170 itemsets = ap_pstrcat(r->pool, itemsets,
1171 (i > 0 ? "," : ""),
1172 "('",
1173 unique_id,
1174 "','",
1175 escape_query(*ptrptr, r->pool),
1176 "','",
1177 escape_query(theitem, r->pool),
1178 "')",
1179 NULL);
1180 i++;
1181 }
1182 }
1183 if ( itemsets != "" ) {
1184 hout_query = ap_pstrcat(r->pool, "insert into ", cls->hout_table_name, " (id, item, val) values ", itemsets, NULL);
1185 #ifdef DEBUG
1186 ap_log_error(APLOG_MARK,DEBUGLEVEL,orig->server,"mod_log_sql: header_out string: %s", hout_query);
1187 #endif
1188 }
1189
1190
1191 /* Work through the list of headers-in defined by LogSQLHeadersInToLog */
1192 i = 0;
1193 itemsets = "";
1194
1195 ptrptr2 = (char **) (cls->hin_list->elts + (cls->hin_list->nelts * cls->hin_list->elt_size));
1196 for (ptrptr = (char **) cls->hin_list->elts; ptrptr < ptrptr2; ptrptr = (char **) ((char *) ptrptr + cls->hin_list->elt_size)) {
1197 /* If the specified note (*ptrptr) exists for the current request... */
1198 if ((theitem = ap_table_get(r->headers_in, *ptrptr))) {
1199 itemsets = ap_pstrcat(r->pool, itemsets,
1200 (i > 0 ? "," : ""),
1201 "('",
1202 unique_id,
1203 "','",
1204 escape_query(*ptrptr, r->pool),
1205 "','",
1206 escape_query(theitem, r->pool),
1207 "')",
1208 NULL);
1209 i++;
1210 }
1211 }
1212 if ( itemsets != "" ) {
1213 hin_query = ap_pstrcat(r->pool, "insert into ", cls->hin_table_name, " (id, item, val) values ", itemsets, NULL);
1214 #ifdef DEBUG
1215 ap_log_error(APLOG_MARK,DEBUGLEVEL,orig->server,"mod_log_sql: header_in string: %s", hin_query);
1216 #endif
1217 }
1218
1219
1220
1081 /* Is this virtual server's table flagged as made? We flag it as such in order 1221 /* Is this virtual server's table flagged as made? We flag it as such in order
1082 * to avoid extra processing with each request. If it's not flagged as made, 1222 * to avoid extra processing with each request. If it's not flagged as made,
1083 * set up the CREATE string. 1223 * set up the CREATE string.
@@ -1114,13 +1254,22 @@ int log_sql_transaction(request_rec *orig)
1114 item varchar(80),\ 1254 item varchar(80),\
1115 val varchar(80))"; 1255 val varchar(80))";
1116 1256
1257 char *headers_suffix =
1258 " (id char(19),\
1259 item varchar(80),\
1260 val varchar(80))";
1261
1117 /* Find memory long enough to hold the whole CREATE string + \0 */ 1262 /* Find memory long enough to hold the whole CREATE string + \0 */
1118 create_access = ap_pstrcat(orig->pool, createprefix, cls->transfer_table_name, access_suffix, NULL); 1263 create_access = ap_pstrcat(orig->pool, createprefix, cls->transfer_table_name, access_suffix, NULL);
1119 create_notes = ap_pstrcat(orig->pool, createprefix, cls->notes_table_name, notes_suffix, NULL); 1264 create_notes = ap_pstrcat(orig->pool, createprefix, cls->notes_table_name, notes_suffix, NULL);
1265 create_hout = ap_pstrcat(orig->pool, createprefix, cls->hout_table_name, headers_suffix, NULL);
1266 create_hin = ap_pstrcat(orig->pool, createprefix, cls->hin_table_name, headers_suffix, NULL);
1120 1267
1121 #ifdef DEBUG 1268 #ifdef DEBUG
1122 ap_log_error(APLOG_MARK,DEBUGLEVEL,orig->server,"create string: %s", create_access); 1269 ap_log_error(APLOG_MARK,DEBUGLEVEL,orig->server,"create string: %s", create_access);
1123 ap_log_error(APLOG_MARK,DEBUGLEVEL,orig->server,"create string: %s", create_notes); 1270 ap_log_error(APLOG_MARK,DEBUGLEVEL,orig->server,"create string: %s", create_notes);
1271 ap_log_error(APLOG_MARK,DEBUGLEVEL,orig->server,"create string: %s", create_hout);
1272 ap_log_error(APLOG_MARK,DEBUGLEVEL,orig->server,"create string: %s", create_hin);
1124 #endif 1273 #endif
1125 1274
1126 } 1275 }
@@ -1144,7 +1293,13 @@ int log_sql_transaction(request_rec *orig)
1144 * gone and send the entry to the preserve file instead. 1293 * gone and send the entry to the preserve file instead.
1145 * Note that we don't keep logging the db error over and over. */ 1294 * Note that we don't keep logging the db error over and over. */
1146 preserve_entry(orig, access_query); 1295 preserve_entry(orig, access_query);
1147 preserve_entry(orig, note_query); 1296 if ( note_query != NULL )
1297 preserve_entry(orig, note_query);
1298 if ( hin_query != NULL )
1299 preserve_entry(orig, hin_query);
1300 if ( hout_query != NULL )
1301 preserve_entry(orig, hout_query);
1302
1148 return OK; 1303 return OK;
1149 } else { 1304 } else {
1150 /* Whew, we got the DB link back */ 1305 /* Whew, we got the DB link back */
@@ -1159,9 +1314,11 @@ int log_sql_transaction(request_rec *orig)
1159 /* Make the tables if we're supposed to. */ 1314 /* Make the tables if we're supposed to. */
1160 if ((cls->table_made != 1) && (create_tables != 0)) { 1315 if ((cls->table_made != 1) && (create_tables != 0)) {
1161 create_results_access = safe_mysql_query(orig, create_access); 1316 create_results_access = safe_mysql_query(orig, create_access);
1162 create_results_notes = safe_mysql_query(orig,create_notes); 1317 create_results_notes = safe_mysql_query(orig, create_notes);
1318 create_results_hin = safe_mysql_query(orig, create_hin);
1319 create_results_hout = safe_mysql_query(orig, create_hout);
1163 1320
1164 if ( (create_results_access == 0) && (create_results_notes == 0) ) 1321 if ( (create_results_access == 0) && (create_results_notes == 0) && (create_results_hin == 0) && (create_results_hout == 0) )
1165 cls->table_made = 1; 1322 cls->table_made = 1;
1166 else 1323 else
1167 ap_log_error(APLOG_MARK,ERRLEVEL,orig->server,"mod_log_sql: failed to create all tables, see preserve file"); 1324 ap_log_error(APLOG_MARK,ERRLEVEL,orig->server,"mod_log_sql: failed to create all tables, see preserve file");
@@ -1173,6 +1330,12 @@ int log_sql_transaction(request_rec *orig)
1173 /* If notes are available to log, make the notes-table insert */ 1330 /* If notes are available to log, make the notes-table insert */
1174 if ( note_query != NULL ) 1331 if ( note_query != NULL )
1175 safe_mysql_query(orig, note_query); 1332 safe_mysql_query(orig, note_query);
1333
1334 if ( hout_query != NULL )
1335 safe_mysql_query(orig, hout_query);
1336
1337 if ( hin_query != NULL )
1338 safe_mysql_query(orig, hin_query);
1176 1339
1177 return OK; 1340 return OK;
1178 } 1341 }