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.c203
1 files changed, 98 insertions, 105 deletions
diff --git a/mod_log_sql.c b/mod_log_sql.c
index 498e717..abebd04 100644
--- a/mod_log_sql.c
+++ b/mod_log_sql.c
@@ -1,4 +1,4 @@
1/* $Header: /home/cvs/mod_log_sql/mod_log_sql.c,v 1.10 2004/01/20 20:36:41 urkle Exp $ */ 1/* $Header: /home/cvs/mod_log_sql/mod_log_sql.c,v 1.11 2004/01/21 04:34:21 urkle Exp $ */
2/* --------* 2/* --------*
3 * DEFINES * 3 * DEFINES *
4 * --------*/ 4 * --------*/
@@ -116,27 +116,38 @@ typedef struct {
116static int safe_create_tables(logsql_state *cls, request_rec *r); 116static int safe_create_tables(logsql_state *cls, request_rec *r);
117 117
118typedef struct { 118typedef struct {
119 log_sql_item_func *func; /* its extraction function */ 119 char key; /* item letter character */
120 const char *sql_field_name; /* its column in SQL */ 120 log_sql_item_func *func; /* its extraction function */
121 int want_orig_default; /* if it requires the original request prior to internal redirection */ 121 const char *sql_field_name; /* its column in SQL */
122 int string_contents; /* if it returns a string */ 122 int want_orig_default; /* if it requires the original request prior to internal redirection */
123 int string_contents; /* if it returns a string */
123} log_sql_item; 124} log_sql_item;
124 125
125static apr_hash_t *log_sql_hash; 126static apr_array_header_t *log_sql_item_list;
126 127
127/* Registration Function for extract functions */ 128/* Registration Function for extract functions */
128LOGSQL_DECLARE(void) log_sql_register_item(apr_pool_t *p, char *key, 129LOGSQL_DECLARE(void) log_sql_register_item(apr_pool_t *p, char key,
129 log_sql_item_func *func, const char *sql_field_name, 130 log_sql_item_func *func, const char *sql_field_name,
130 int want_orig_default, int string_contents) 131 int want_orig_default, int string_contents)
131{ 132{
132 log_sql_item *item = apr_palloc(p, sizeof(log_sql_item)); 133 log_sql_item *item = apr_array_push(log_sql_item_list);
133 /*item->key = */ 134 item->key = key;
134 item->func = func; 135 item->func = func;
135 item->sql_field_name = sql_field_name; 136 item->sql_field_name = sql_field_name;
136 item->want_orig_default = want_orig_default; 137 item->want_orig_default = want_orig_default;
137 item->string_contents = string_contents; 138 item->string_contents = string_contents;
138 /* TODO: find apache 13 way of doing this */ 139}
139 apr_hash_set(log_sql_hash, key, APR_HASH_KEY_STRING, item); 140
141/* Search through item array */
142static inline log_sql_item *log_sql_get_item(char key)
143{
144 int itr;
145 for(itr=0; itr<log_sql_item_list->nelts; itr++) {
146 if (((log_sql_item *)log_sql_item_list->elts)[itr].key == key) {
147 return &((log_sql_item *)log_sql_item_list->elts)[itr];
148 }
149 }
150 return NULL;
140} 151}
141 152
142/* Include all the extract functions */ 153/* Include all the extract functions */
@@ -613,7 +624,7 @@ static const char *set_log_sql_tcp_port(cmd_parms *parms, void *dummy, const cha
613 * Apache-specific hooks into the module code * 624 * Apache-specific hooks into the module code *
614 * that are defined in the array 'mysql_lgog_module' (at EOF) * 625 * that are defined in the array 'mysql_lgog_module' (at EOF) *
615 *------------------------------------------------------------*/ 626 *------------------------------------------------------------*/
616 627/* Closing mysql link: child_exit(1.3), pool registration(2.0) */
617#if defined(WITH_APACHE20) 628#if defined(WITH_APACHE20)
618static apr_status_t log_sql_close_link(void *data) 629static apr_status_t log_sql_close_link(void *data)
619{ 630{
@@ -626,14 +637,8 @@ static void log_sql_child_exit(server_rec *s, apr_pool_t *p)
626 mysql_close(global_config.server_p); 637 mysql_close(global_config.server_p);
627} 638}
628#endif 639#endif
629/* 640
630 * This function is called during server initialisation when an heavy-weight 641/* Child Init */
631 * process (such as a child) is being initialised. As with the
632 * module-initialisation function, any information that needs to be recorded
633 * must be in static cells, since there's no configuration record.
634 *
635 * There is no return value.
636 */
637#if defined(WITH_APACHE20) 642#if defined(WITH_APACHE20)
638static void log_sql_child_init(apr_pool_t *p, server_rec *s) 643static void log_sql_child_init(apr_pool_t *p, server_rec *s)
639{ 644{
@@ -680,7 +685,7 @@ void *log_sql_initializer(server_rec *main_server, apr_pool_t *p)
680#if defined(WITH_APACHE20) 685#if defined(WITH_APACHE20)
681static int log_sql_pre_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp) 686static int log_sql_pre_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp)
682#elif defined(WITH_APACHE13) 687#elif defined(WITH_APACHE13)
683static void log_sql_pre_config(server_rec *s, apr_pool_t *p) 688static void log_sql_module_init(server_rec *s, apr_pool_t *p)
684#endif 689#endif
685{ 690{
686 /* Initialize Global configuration */ 691 /* Initialize Global configuration */
@@ -688,33 +693,33 @@ static void log_sql_pre_config(server_rec *s, apr_pool_t *p)
688 global_config.socketfile = "/tmp/mysql.sock"; 693 global_config.socketfile = "/tmp/mysql.sock";
689 if (!global_config.tcpport) 694 if (!global_config.tcpport)
690 global_config.tcpport = 3306; 695 global_config.tcpport = 3306;
691 if (!log_sql_hash) 696 if (!log_sql_item_list)
692 log_sql_hash = apr_hash_make(p); 697 log_sql_item_list = apr_array_make(p,10,sizeof(log_sql_item));
693 698
694 /* Register handlers */ 699 /* Register handlers */
695 log_sql_register_item(p,"A", extract_agent, "agent", 1, 1); 700 log_sql_register_item(p,'A', extract_agent, "agent", 1, 1);
696 log_sql_register_item(p,"a", extract_request_args, "request_args", 1, 1); 701 log_sql_register_item(p,'a', extract_request_args, "request_args", 1, 1);
697 log_sql_register_item(p,"b", extract_bytes_sent, "bytes_sent", 0, 0); 702 log_sql_register_item(p,'b', extract_bytes_sent, "bytes_sent", 0, 0);
698 log_sql_register_item(p,"c", extract_cookie, "cookie", 0, 1); 703 log_sql_register_item(p,'c', extract_cookie, "cookie", 0, 1);
699 log_sql_register_item(p,"e", extract_env_var, "env_var", 0, 1); 704 log_sql_register_item(p,'e', extract_env_var, "env_var", 0, 1);
700 log_sql_register_item(p,"f", extract_request_file, "request_file", 0, 1); 705 log_sql_register_item(p,'f', extract_request_file, "request_file", 0, 1);
701 log_sql_register_item(p,"H", extract_request_protocol, "request_protocol", 0, 1); 706 log_sql_register_item(p,'H', extract_request_protocol, "request_protocol", 0, 1);
702 log_sql_register_item(p,"h", extract_remote_host, "remote_host", 0, 1); 707 log_sql_register_item(p,'h', extract_remote_host, "remote_host", 0, 1);
703 log_sql_register_item(p,"I", extract_unique_id, "id", 0, 1); 708 log_sql_register_item(p,'I', extract_unique_id, "id", 0, 1);
704 log_sql_register_item(p,"l", extract_remote_logname, "remote_logname", 0, 1); 709 log_sql_register_item(p,'l', extract_remote_logname, "remote_logname", 0, 1);
705 log_sql_register_item(p,"m", extract_request_method, "request_method", 0, 1); 710 log_sql_register_item(p,'m', extract_request_method, "request_method", 0, 1);
706 log_sql_register_item(p,"M", extract_machine_id, "machine_id", 0, 1); 711 log_sql_register_item(p,'M', extract_machine_id, "machine_id", 0, 1);
707 log_sql_register_item(p,"P", extract_child_pid, "child_pid", 0, 0); 712 log_sql_register_item(p,'P', extract_child_pid, "child_pid", 0, 0);
708 log_sql_register_item(p,"p", extract_server_port, "server_port", 0, 0); 713 log_sql_register_item(p,'p', extract_server_port, "server_port", 0, 0);
709 log_sql_register_item(p,"R", extract_referer, "referer", 1, 1); 714 log_sql_register_item(p,'R', extract_referer, "referer", 1, 1);
710 log_sql_register_item(p,"r", extract_request_line, "request_line", 1, 1); 715 log_sql_register_item(p,'r', extract_request_line, "request_line", 1, 1);
711 log_sql_register_item(p,"S", extract_request_timestamp, "time_stamp", 0, 0); 716 log_sql_register_item(p,'S', extract_request_timestamp, "time_stamp", 0, 0);
712 log_sql_register_item(p,"s", extract_status, "status", 1, 0); 717 log_sql_register_item(p,'s', extract_status, "status", 1, 0);
713 log_sql_register_item(p,"T", extract_request_duration, "request_duration", 1, 0); 718 log_sql_register_item(p,'T', extract_request_duration, "request_duration", 1, 0);
714 log_sql_register_item(p,"t", extract_request_time, "request_time", 0, 1); 719 log_sql_register_item(p,'t', extract_request_time, "request_time", 0, 1);
715 log_sql_register_item(p,"u", extract_remote_user, "remote_user", 0, 1); 720 log_sql_register_item(p,'u', extract_remote_user, "remote_user", 0, 1);
716 log_sql_register_item(p,"U", extract_request_uri, "request_uri", 1, 1); 721 log_sql_register_item(p,'U', extract_request_uri, "request_uri", 1, 1);
717 log_sql_register_item(p,"v", extract_virtual_host, "virtual_host", 0, 1); 722 log_sql_register_item(p,'v', extract_virtual_host, "virtual_host", 0, 1);
718 723
719#if defined(WITH_APACHE20) 724#if defined(WITH_APACHE20)
720 return OK; 725 return OK;
@@ -822,21 +827,23 @@ static int log_sql_transaction(request_rec *orig)
822 logsql_state *cls = ap_get_module_config(orig->server->module_config, &log_sql_module); 827 logsql_state *cls = ap_get_module_config(orig->server->module_config, &log_sql_module);
823 const char *access_query; 828 const char *access_query;
824 request_rec *r; 829 request_rec *r;
830 char *transfer_tablename = cls->transfer_table_name;
831 char *notes_tablename = cls->notes_table_name;
832 char *hout_tablename = cls->hout_table_name;
833 char *hin_tablename = cls->hin_table_name;
834 char *cookie_tablename = cls->cookie_table_name;
825 835
826 /* We handle mass virtual hosting differently. Dynamically determine the name 836 /* We handle mass virtual hosting differently. Dynamically determine the name
827 * of the table from the virtual server's name, and flag it for creation. 837 * of the table from the virtual server's name, and flag it for creation.
828 */ 838 */
829 if (global_config.massvirtual) { 839 if (global_config.massvirtual) {
840 /* TODO: Make these configurable? */
830 char *access_base = "access_"; 841 char *access_base = "access_";
831 char *notes_base = "notes_"; 842 char *notes_base = "notes_";
832 char *hout_base = "headout_"; 843 char *hout_base = "headout_";
833 char *hin_base = "headin_"; 844 char *hin_base = "headin_";
834 char *cookie_base = "cookies_"; 845 char *cookie_base = "cookies_";
835 char *a_tablename; 846
836 char *n_tablename;
837 char *i_tablename;
838 char *o_tablename;
839 char *c_tablename;
840 847
841 /* Determint the hostname and convert it to all lower-case; */ 848 /* Determint the hostname and convert it to all lower-case; */
842 char *servername = apr_pstrdup(orig->pool,(char *)ap_get_server_name(orig)); 849 char *servername = apr_pstrdup(orig->pool,(char *)ap_get_server_name(orig));
@@ -848,25 +855,21 @@ static int log_sql_transaction(request_rec *orig)
848 } 855 }
849 856
850 /* Find memory long enough to hold the table name + \0. */ 857 /* Find memory long enough to hold the table name + \0. */
851 a_tablename = apr_pstrcat(orig->pool, access_base, servername, NULL); 858 transfer_tablename = apr_pstrcat(orig->pool, access_base, servername, NULL);
852 n_tablename = apr_pstrcat(orig->pool, notes_base, servername, NULL); 859 notes_tablename = apr_pstrcat(orig->pool, notes_base, servername, NULL);
853 i_tablename = apr_pstrcat(orig->pool, hin_base, servername, NULL); 860 hin_tablename = apr_pstrcat(orig->pool, hin_base, servername, NULL);
854 o_tablename = apr_pstrcat(orig->pool, hout_base, servername, NULL); 861 hout_tablename = apr_pstrcat(orig->pool, hout_base, servername, NULL);
855 c_tablename = apr_pstrcat(orig->pool, cookie_base, servername, NULL); 862 cookie_tablename = apr_pstrcat(orig->pool, cookie_base, servername, NULL);
856 863
857 /* Tell this virtual server its transfer table name, and 864 /* Tell this virtual server its transfer table name, and
858 * turn on create_tables, which is implied by massvirtual. 865 * turn on create_tables, which is implied by massvirtual.
859 */ 866 */
860 cls->transfer_table_name = a_tablename; 867
861 cls->notes_table_name = n_tablename;
862 cls->hout_table_name = o_tablename;
863 cls->hin_table_name = i_tablename;
864 cls->cookie_table_name = c_tablename;
865 global_config.createtables = 1; 868 global_config.createtables = 1;
866 } 869 }
867 870
868 /* Do we have enough info to log? */ 871 /* Do we have enough info to log? */
869 if (!cls->transfer_table_name) { 872 if (!transfer_tablename) {
870 return DECLINED; 873 return DECLINED;
871 } else { 874 } else {
872 const char *thehost; 875 const char *thehost;
@@ -879,7 +882,8 @@ static int log_sql_transaction(request_rec *orig)
879 char *cookie_query = NULL; 882 char *cookie_query = NULL;
880 const char *unique_id; 883 const char *unique_id;
881 const char *formatted_item; 884 const char *formatted_item;
882 int i, j, length; 885 char *s;
886 int i;
883 int proceed; 887 int proceed;
884 888
885 for (r = orig; r->next; r = r->next) { 889 for (r = orig; r->next; r = r->next) {
@@ -925,42 +929,34 @@ static int log_sql_transaction(request_rec *orig)
925 } 929 }
926 } 930 }
927 931
928 length = strlen(cls->transfer_log_format);
929 932
930 /* Iterate through the format characters and set up the INSERT string according to 933 /* Iterate through the format characters and set up the INSERT string according to
931 * what the user has configured. */ 934 * what the user has configured. */
932 for (i = 0; i < length; i++) { 935 i = 0;
933 j = 0; 936 for (s = cls->transfer_log_format; *s != '\0' ; s++) {
934 937 log_sql_item *item = log_sql_get_item(*s);
935 while (log_sql_item_keys[j].ch) { 938
936 939 /* Yes, this key is one of the configured keys.
937 if (log_sql_item_keys[j].ch == cls->transfer_log_format[i]) { 940 * Call the key's function and put the returned value into 'formatted_item' */
938 /* Yes, this key is one of the configured keys. 941 formatted_item = item->func(item->want_orig_default ? orig : r, "");
939 * Call the key's function and put the returned value into 'formatted_item' */ 942
940 formatted_item = log_sql_item_keys[j].func(log_sql_item_keys[j].want_orig_default ? orig : r, ""); 943 /* Massage 'formatted_item' for proper SQL eligibility... */
941 944 if (!formatted_item) {
942 /* Massage 'formatted_item' for proper SQL eligibility... */ 945 formatted_item = "";
943 if (!formatted_item) { 946 } else if (formatted_item[0] == '-' && formatted_item[1] == '\0' && !item->string_contents) {
944 formatted_item = ""; 947 /* If apache tried to log a '-' character for a numeric field, convert that to a zero
945 } else if (formatted_item[0] == '-' && formatted_item[1] == '\0' && !log_sql_item_keys[j].string_contents) { 948 * because the database expects a numeral and will reject the '-' character. */
946 /* If apache tried to log a '-' character for a numeric field, convert that to a zero 949 formatted_item = "0";
947 * because the database expects a numeral and will reject the '-' character. */
948 formatted_item = "0";
949 }
950
951 /* Append the fieldname and value-to-insert to the appropriate strings, quoting stringvals with ' as appropriate */
952 fields = apr_pstrcat(r->pool, fields, (i > 0 ? "," : ""),
953 log_sql_item_keys[j].sql_field_name, NULL);
954
955 values = apr_pstrcat(r->pool, values, (i > 0 ? "," : ""),
956 (log_sql_item_keys[j].string_contents ? "'" : ""),
957 escape_query(formatted_item, r->pool),
958 (log_sql_item_keys[j].string_contents ? "'" : ""), NULL);
959 break;
960 }
961 j++;
962
963 } 950 }
951
952 /* Append the fieldname and value-to-insert to the appropriate strings, quoting stringvals with ' as appropriate */
953 fields = apr_pstrcat(r->pool, fields, (i ? "," : ""),
954 item->sql_field_name, NULL);
955 values = apr_pstrcat(r->pool, values, (i ? "," : ""),
956 (item->string_contents ? "'" : ""),
957 escape_query(formatted_item, r->pool),
958 (item->string_contents ? "'" : ""), NULL);
959 i = 1;
964 } 960 }
965 961
966 /* Work through the list of notes defined by LogSQLWhichNotes */ 962 /* Work through the list of notes defined by LogSQLWhichNotes */
@@ -986,7 +982,7 @@ static int log_sql_transaction(request_rec *orig)
986 } 982 }
987 if ( itemsets != "" ) { 983 if ( itemsets != "" ) {
988 note_query = apr_psprintf(r->pool, "insert %s into `%s` (id, item, val) values %s", 984 note_query = apr_psprintf(r->pool, "insert %s into `%s` (id, item, val) values %s",
989 global_config.insertdelayed?"delayed":"", cls->notes_table_name, itemsets); 985 global_config.insertdelayed?"delayed":"", notes_tablename, itemsets);
990 986
991 #ifdef DEBUG 987 #ifdef DEBUG
992 log_error(APLOG_MARK,APLOG_DEBUG,orig->server,"mod_log_sql: note string: %s", note_query); 988 log_error(APLOG_MARK,APLOG_DEBUG,orig->server,"mod_log_sql: note string: %s", note_query);
@@ -1016,7 +1012,7 @@ static int log_sql_transaction(request_rec *orig)
1016 } 1012 }
1017 if ( itemsets != "" ) { 1013 if ( itemsets != "" ) {
1018 hout_query = apr_psprintf(r->pool, "insert %s into `%s` (id, item, val) values %s", 1014 hout_query = apr_psprintf(r->pool, "insert %s into `%s` (id, item, val) values %s",
1019 global_config.insertdelayed?"delayed":"", cls->hout_table_name, itemsets); 1015 global_config.insertdelayed?"delayed":"", hout_tablename, itemsets);
1020 1016
1021 #ifdef DEBUG 1017 #ifdef DEBUG
1022 log_error(APLOG_MARK,APLOG_DEBUG,orig->server,"mod_log_sql: header_out string: %s", hout_query); 1018 log_error(APLOG_MARK,APLOG_DEBUG,orig->server,"mod_log_sql: header_out string: %s", hout_query);
@@ -1047,7 +1043,7 @@ static int log_sql_transaction(request_rec *orig)
1047 } 1043 }
1048 if ( itemsets != "" ) { 1044 if ( itemsets != "" ) {
1049 hin_query = apr_psprintf(r->pool, "insert %s into `%s` (id, item, val) values %s", 1045 hin_query = apr_psprintf(r->pool, "insert %s into `%s` (id, item, val) values %s",
1050 global_config.insertdelayed?"delayed":"", cls->hin_table_name, itemsets); 1046 global_config.insertdelayed?"delayed":"", hin_tablename, itemsets);
1051 1047
1052 #ifdef DEBUG 1048 #ifdef DEBUG
1053 log_error(APLOG_MARK,APLOG_DEBUG,orig->server,"mod_log_sql: header_in string: %s", hin_query); 1049 log_error(APLOG_MARK,APLOG_DEBUG,orig->server,"mod_log_sql: header_in string: %s", hin_query);
@@ -1079,7 +1075,7 @@ static int log_sql_transaction(request_rec *orig)
1079 } 1075 }
1080 if ( itemsets != "" ) { 1076 if ( itemsets != "" ) {
1081 cookie_query = apr_psprintf(r->pool, "insert %s into `%s` (id, item, val) values %s", 1077 cookie_query = apr_psprintf(r->pool, "insert %s into `%s` (id, item, val) values %s",
1082 global_config.insertdelayed?"delayed":"", cls->cookie_table_name, itemsets); 1078 global_config.insertdelayed?"delayed":"", cookie_tablename, itemsets);
1083 1079
1084 #ifdef DEBUG 1080 #ifdef DEBUG
1085 log_error(APLOG_MARK,APLOG_DEBUG,orig->server,"mod_log_sql: cookie string: %s", cookie_query); 1081 log_error(APLOG_MARK,APLOG_DEBUG,orig->server,"mod_log_sql: cookie string: %s", cookie_query);
@@ -1089,7 +1085,7 @@ static int log_sql_transaction(request_rec *orig)
1089 1085
1090 /* Set up the actual INSERT statement */ 1086 /* Set up the actual INSERT statement */
1091 access_query = apr_psprintf(r->pool, "insert %s into `%s` (%s) values (%s)", 1087 access_query = apr_psprintf(r->pool, "insert %s into `%s` (%s) values (%s)",
1092 global_config.insertdelayed?"delayed":"", cls->transfer_table_name, fields, values); 1088 global_config.insertdelayed?"delayed":"", transfer_tablename, fields, values);
1093 1089
1094 #ifdef DEBUG 1090 #ifdef DEBUG
1095 log_error(APLOG_MARK,APLOG_DEBUG,r->server,"mod_log_sql: access string: %s", access_query); 1091 log_error(APLOG_MARK,APLOG_DEBUG,r->server,"mod_log_sql: access string: %s", access_query);
@@ -1168,8 +1164,6 @@ static int log_sql_transaction(request_rec *orig)
1168} 1164}
1169 1165
1170 1166
1171
1172
1173/* Setup of the available httpd.conf configuration commands. 1167/* Setup of the available httpd.conf configuration commands.
1174 * Structure: command, function called, NULL, where available, how many arguments, verbose description 1168 * Structure: command, function called, NULL, where available, how many arguments, verbose description
1175 */ 1169 */
@@ -1274,8 +1268,8 @@ static const command_rec log_sql_cmds[] = {
1274 , 1268 ,
1275 {NULL} 1269 {NULL}
1276}; 1270};
1277#if defined(WITH_APACHE20)
1278/* The configuration array that sets up the hooks into the module. */ 1271/* The configuration array that sets up the hooks into the module. */
1272#if defined(WITH_APACHE20)
1279static void register_hooks(apr_pool_t *p) { 1273static void register_hooks(apr_pool_t *p) {
1280 ap_hook_pre_config(log_sql_pre_config, NULL, NULL, APR_HOOK_REALLY_FIRST); 1274 ap_hook_pre_config(log_sql_pre_config, NULL, NULL, APR_HOOK_REALLY_FIRST);
1281 ap_hook_child_init(log_sql_child_init, NULL, NULL, APR_HOOK_MIDDLE); 1275 ap_hook_child_init(log_sql_child_init, NULL, NULL, APR_HOOK_MIDDLE);
@@ -1293,10 +1287,9 @@ module AP_MODULE_DECLARE_DATA log_sql_module = {
1293 register_hooks /* register hooks */ 1287 register_hooks /* register hooks */
1294}; 1288};
1295#elif defined(WITH_APACHE13) 1289#elif defined(WITH_APACHE13)
1296/* The configuration array that sets up the hooks into the module. */
1297module log_sql_module = { 1290module log_sql_module = {
1298 STANDARD_MODULE_STUFF, 1291 STANDARD_MODULE_STUFF,
1299 log_sql_pre_config, /* module initializer */ 1292 log_sql_module_init, /* module initializer */
1300 NULL, /* create per-dir config */ 1293 NULL, /* create per-dir config */
1301 NULL, /* merge per-dir config */ 1294 NULL, /* merge per-dir config */
1302 log_sql_make_state, /* create server config */ 1295 log_sql_make_state, /* create server config */