summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG13
-rw-r--r--mod_log_sql.c193
2 files changed, 188 insertions, 18 deletions
diff --git a/CHANGELOG b/CHANGELOG
index 8f53074..68d3247 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,16 +1,17 @@
1$Id: CHANGELOG,v 1.12 2002/05/16 21:35:12 helios Exp $ 1$Id: CHANGELOG,v 1.13 2002/05/24 20:52:39 helios Exp $
2 2
3 3
4TODO: 4TODO:
5* Full commenting of the code.
6* Rethink documentation flow and rewrite? 5* Rethink documentation flow and rewrite?
7* Port connection portion to other DBMS? Genericize the module? Start with PostgreSQL. 6* Port connection portion to other DBMS? Genericize the module? Start with PostgreSQL.
8* check for mandatory conf directives / syntax quit if not 7* check for mandatory conf directives / syntax quit if not
8* GNU autoconf
9* merge server config into vh config 9* merge server config into vh config
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 13
14
14CHANGES: 15CHANGES:
15 16
161.17: 171.17:
@@ -20,6 +21,9 @@ CHANGES:
20 custom modules that provide loggable info in the notes, e.g. mod_gzip. 21 custom modules that provide loggable info in the notes, e.g. mod_gzip.
21 A new directive MySQLWhichNotes configures which notes to log to the 22 A new directive MySQLWhichNotes configures which notes to log to the
22 notes_log table. 23 notes_log table.
24* Added capability of logging inbound and outbound headers. New directives
25 LogSQLWhichHeadersIn and LogSQLWhichHeadersOut configure which headers to
26 capture. Headers are stored in their own table or tables.
23* Fixed potential segfault in preserve file function due to silly pfclose 27* Fixed potential segfault in preserve file function due to silly pfclose
24 placement. (Only affected user if the preserve file couldn't 28 placement. (Only affected user if the preserve file couldn't
25 be opened.) 29 be opened.)
@@ -37,7 +41,10 @@ CHANGES:
37 of database inspecificity. More to come. 41 of database inspecificity. More to come.
38* Simplified error messages. 42* Simplified error messages.
39* Table creation now uses safe_mysql_query and checks the result. 43* Table creation now uses safe_mysql_query and checks the result.
40 44* Config directives used to begin with MySQL, now begin with LogSQL.
45 This is for database inspecificity. In your httpd.conf just do
46 a search-and-replace.
47
41 48
421.16: 491.16:
43* Moved all the user DEFINEs inside the .c file -- splitting them 50* Moved all the user DEFINEs inside the .c file -- splitting them
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 }