diff options
author | Edward Rudd | 2004-06-03 04:32:08 +0000 |
---|---|---|
committer | Edward Rudd | 2004-06-03 04:32:08 +0000 |
commit | 21122f1bb734aa00fc14564d801ea9dc4804c793 (patch) | |
tree | 3d4920b9a47a3528de8c4ac80c402853e9d14719 | |
parent | f73dc64cd6dba290a7e062520a421de2b02f82a4 (diff) |
moved quoting of fields to DB driver
fixed segfault in the mysql escape string function
DBi driver working with postgresql.
-rw-r--r-- | CHANGELOG | 5 | ||||
-rw-r--r-- | Makefile.in | 3 | ||||
-rw-r--r-- | apache13.h | 1 | ||||
-rw-r--r-- | configure.ac | 10 | ||||
-rw-r--r-- | docs/manual.xml | 23 | ||||
-rw-r--r-- | mod_log_sql.c | 48 | ||||
-rw-r--r-- | mod_log_sql.h | 9 | ||||
-rw-r--r-- | mod_log_sql.prj | 15 | ||||
-rw-r--r-- | mod_log_sql_mysql.c | 14 |
9 files changed, 91 insertions, 37 deletions
@@ -1,3 +1,8 @@ | |||
1 | ?: ? | ||
2 | * Added DBI support | ||
3 | * fixed segfault in the mysql driver escape_string function | ||
4 | * switched escape_string driver function to include the string quotes. | ||
5 | |||
1 | 1.98: 2004-04-12 | 6 | 1.98: 2004-04-12 |
2 | * re-fixed apache.m4 to better detect APR and APU code | 7 | * re-fixed apache.m4 to better detect APR and APU code |
3 | * fixed for win32 compilation under apache 2 | 8 | * fixed for win32 compilation under apache 2 |
diff --git a/Makefile.in b/Makefile.in index 07278d3..5b4f368 100644 --- a/Makefile.in +++ b/Makefile.in | |||
@@ -130,6 +130,9 @@ $(dbiTARGET): $(dbiSOURCES) $(HEADERS) | |||
130 | install: $(TARGETS) install-subdirs | 130 | install: $(TARGETS) install-subdirs |
131 | @@APXS_BIN@ -i $(TARGET); \ | 131 | @@APXS_BIN@ -i $(TARGET); \ |
132 | @APXS_BIN@ -n $(mysqlNAME) -i $(mysqlTARGET); \ | 132 | @APXS_BIN@ -n $(mysqlNAME) -i $(mysqlTARGET); \ |
133 | if test @WANT_DBI_MOD@ -eq 1; then \ | ||
134 | @APXS_BIN@ -n $(dbiNAME) -i $(dbiTARGET); \ | ||
135 | fi; \ | ||
133 | if test @WANT_SSL_MOD@ -eq 1; then \ | 136 | if test @WANT_SSL_MOD@ -eq 1; then \ |
134 | @APXS_BIN@ -n $(sslNAME) -i $(sslTARGET); \ | 137 | @APXS_BIN@ -n $(sslNAME) -i $(sslTARGET); \ |
135 | fi; \ | 138 | fi; \ |
@@ -54,6 +54,7 @@ | |||
54 | 54 | ||
55 | #define apr_pool_create(a,b) *(a) = ap_make_sub_pool(b) | 55 | #define apr_pool_create(a,b) *(a) = ap_make_sub_pool(b) |
56 | #define apr_pool_destroy ap_destroy_pool | 56 | #define apr_pool_destroy ap_destroy_pool |
57 | #define apr_pool_cleanup_register ap_register_cleanup | ||
57 | #define apr_palloc ap_palloc | 58 | #define apr_palloc ap_palloc |
58 | #define apr_pcalloc ap_pcalloc | 59 | #define apr_pcalloc ap_pcalloc |
59 | #define apr_pstrdup ap_pstrdup | 60 | #define apr_pstrdup ap_pstrdup |
diff --git a/configure.ac b/configure.ac index 42e2bde..d10ad4f 100644 --- a/configure.ac +++ b/configure.ac | |||
@@ -1,5 +1,5 @@ | |||
1 | dnl Required initializer | 1 | dnl Required initializer |
2 | AC_INIT(mod_log_sql, 1.98) | 2 | AC_INIT(mod_log_sql, 1.99) |
3 | OOO_CONFIG_NICE(config.nice) | 3 | OOO_CONFIG_NICE(config.nice) |
4 | AC_PREREQ(2.53) | 4 | AC_PREREQ(2.53) |
5 | AC_CONFIG_HEADERS(config.h) | 5 | AC_CONFIG_HEADERS(config.h) |
@@ -35,7 +35,13 @@ WANT_MYSQL_MOD=1 | |||
35 | AC_SUBST(WANT_MYSQL_MOD) | 35 | AC_SUBST(WANT_MYSQL_MOD) |
36 | WANT_PGSQL_MOD=0 | 36 | WANT_PGSQL_MOD=0 |
37 | AC_SUBST(WANT_PGSQL_MOD) | 37 | AC_SUBST(WANT_PGSQL_MOD) |
38 | WANT_DBI_MOD=0 | 38 | WANT_DBI_MOD=1 |
39 | DBI_LDFLAGS="" | ||
40 | DBI_LIBS="-ldbi" | ||
41 | DBI_CFLAGS="" | ||
42 | AC_SUBST(DBI_LDFLAGS) | ||
43 | AC_SUBST(DBI_LIBS) | ||
44 | AC_SUBST(DBI_CFLAGS) | ||
39 | AC_SUBST(WANT_DBI_MOD) | 45 | AC_SUBST(WANT_DBI_MOD) |
40 | 46 | ||
41 | case "$target" in | 47 | case "$target" in |
diff --git a/docs/manual.xml b/docs/manual.xml index 880bf03..267e9e0 100644 --- a/docs/manual.xml +++ b/docs/manual.xml | |||
@@ -707,6 +707,23 @@ where a.id=n.id and a.id='PPIDskBRH30AAGPtAsg';</screen> | |||
707 | </listitem> | 707 | </listitem> |
708 | </varlistentry> | 708 | </varlistentry> |
709 | <varlistentry> | 709 | <varlistentry> |
710 | <term>LogSQLDisablePreserve</term> | ||
711 | <listitem> | ||
712 | <cmdsynopsis> | ||
713 | <command>LogSQLDisablePreserve</command> | ||
714 | <arg choice="req">flag</arg> | ||
715 | </cmdsynopsis> | ||
716 | <simpara>Example: LogDisablePreserve On</simpara> | ||
717 | <simpara>Default: Off</simpara> | ||
718 | <simpara>Context; main server config</simpara> | ||
719 | <para>This option can be enabled to completely disable the preserve file fail back. This may be useful for servers where the file-system is read-only.</para> | ||
720 | <para>If the database is not available those log entries will be lost.</para> | ||
721 | <note> | ||
722 | <para>This is defined only once in the <filename moreinfo="none">httpd.conf</filename> file.</para> | ||
723 | </note> | ||
724 | </listitem> | ||
725 | </varlistentry> | ||
726 | <varlistentry> | ||
710 | <term>LogSQLMachineID</term> | 727 | <term>LogSQLMachineID</term> |
711 | <listitem> | 728 | <listitem> |
712 | <cmdsynopsis sepchar=" "> | 729 | <cmdsynopsis sepchar=" "> |
@@ -1104,7 +1121,7 @@ where a.id=n.id and a.id='PPIDskBRH30AAGPtAsg';</screen> | |||
1104 | <listitem> | 1121 | <listitem> |
1105 | <cmdsynopsis sepchar=" "> | 1122 | <cmdsynopsis sepchar=" "> |
1106 | <command moreinfo="none">LogSQLRequestAccept</command> | 1123 | <command moreinfo="none">LogSQLRequestAccept</command> |
1107 | <arg choice="req" rep="repeat"><replaceable>hostname</replaceable></arg> | 1124 | <arg choice="req" rep="repeat"><replaceable>substring</replaceable></arg> |
1108 | </cmdsynopsis> | 1125 | </cmdsynopsis> |
1109 | <simpara>Example: LogSQLRequestAccept .html .php .jpg</simpara> | 1126 | <simpara>Example: LogSQLRequestAccept .html .php .jpg</simpara> |
1110 | <simpara>Default: if not specified, all requests are 'accepted'</simpara> | 1127 | <simpara>Default: if not specified, all requests are 'accepted'</simpara> |
@@ -1121,7 +1138,7 @@ where a.id=n.id and a.id='PPIDskBRH30AAGPtAsg';</screen> | |||
1121 | <listitem> | 1138 | <listitem> |
1122 | <cmdsynopsis sepchar=" "> | 1139 | <cmdsynopsis sepchar=" "> |
1123 | <command moreinfo="none">LogSQLRequestIgnore</command> | 1140 | <command moreinfo="none">LogSQLRequestIgnore</command> |
1124 | <arg choice="req" rep="repeat"><replaceable>hostname</replaceable></arg> | 1141 | <arg choice="req" rep="repeat"><replaceable>substring</replaceable></arg> |
1125 | </cmdsynopsis> | 1142 | </cmdsynopsis> |
1126 | <simpara>Example: LogSQLRequestIgnore root.exe cmd.exe default.ida favicon.ico</simpara> | 1143 | <simpara>Example: LogSQLRequestIgnore root.exe cmd.exe default.ida favicon.ico</simpara> |
1127 | <simpara>Context: virtual host</simpara> | 1144 | <simpara>Context: virtual host</simpara> |
@@ -1578,7 +1595,7 @@ ErrorLog /var/log/httpd/server-messages </programlisting> | |||
1578 | API said: error 2013, Lost connection to MySQL server during query | 1595 | API said: error 2013, Lost connection to MySQL server during query |
1579 | [Tue Nov 12 19:04:10 2002] [error] mod_log_sql: reconnect successful | 1596 | [Tue Nov 12 19:04:10 2002] [error] mod_log_sql: reconnect successful |
1580 | [Tue Nov 12 19:04:10 2002] [error] mod_log_sql: second attempt successful</screen> | 1597 | [Tue Nov 12 19:04:10 2002] [error] mod_log_sql: second attempt successful</screen> |
1581 | <para>Reference: <ulink url="http://www.mysql.com/documentation/mysql/bychapter/manual_Problems.html#Gone_away">MySQL documentation</ulink></para> | 1598 | <para>Reference: <ulink url="http://dev.mysql.com/doc/mysql/en/Gone_away.html">MySQL documentation</ulink></para> |
1582 | </answer> | 1599 | </answer> |
1583 | </qandaentry> | 1600 | </qandaentry> |
1584 | <qandaentry> | 1601 | <qandaentry> |
diff --git a/mod_log_sql.c b/mod_log_sql.c index fc9dcc0..dace2d4 100644 --- a/mod_log_sql.c +++ b/mod_log_sql.c | |||
@@ -504,6 +504,8 @@ static void log_sql_module_init(server_rec *s, apr_pool_t *p) | |||
504 | cls->preserve_file = default_p; | 504 | cls->preserve_file = default_p; |
505 | } | 505 | } |
506 | } | 506 | } |
507 | global_config.db.p = p; | ||
508 | |||
507 | #if defined(WITH_APACHE20) | 509 | #if defined(WITH_APACHE20) |
508 | return OK; | 510 | return OK; |
509 | #endif | 511 | #endif |
@@ -908,9 +910,7 @@ static int log_sql_transaction(request_rec *orig) | |||
908 | fields = apr_pstrcat(r->pool, fields, (i ? "," : ""), | 910 | fields = apr_pstrcat(r->pool, fields, (i ? "," : ""), |
909 | item->sql_field_name, NULL); | 911 | item->sql_field_name, NULL); |
910 | values = apr_pstrcat(r->pool, values, (i ? "," : ""), | 912 | values = apr_pstrcat(r->pool, values, (i ? "," : ""), |
911 | (item->string_contents ? "'" : ""), | 913 | global_config.driver->escape(formatted_item, r->pool,&global_config.db), NULL); |
912 | global_config.driver->escape(formatted_item, r->pool,&global_config.db), | ||
913 | (item->string_contents ? "'" : ""), NULL); | ||
914 | } | 914 | } |
915 | 915 | ||
916 | /* Work through the list of notes defined by LogSQLWhichNotes */ | 916 | /* Work through the list of notes defined by LogSQLWhichNotes */ |
@@ -923,19 +923,19 @@ static int log_sql_transaction(request_rec *orig) | |||
923 | if ((theitem = apr_table_get(r->notes, *ptrptr))) { | 923 | if ((theitem = apr_table_get(r->notes, *ptrptr))) { |
924 | itemsets = apr_pstrcat(r->pool, itemsets, | 924 | itemsets = apr_pstrcat(r->pool, itemsets, |
925 | (i > 0 ? "," : ""), | 925 | (i > 0 ? "," : ""), |
926 | "('", | 926 | "(", |
927 | unique_id, | 927 | unique_id, |
928 | "','", | 928 | ",", |
929 | global_config.driver->escape(*ptrptr, r->pool,&global_config.db), | 929 | global_config.driver->escape(*ptrptr, r->pool,&global_config.db), |
930 | "','", | 930 | ",", |
931 | global_config.driver->escape(theitem, r->pool,&global_config.db), | 931 | global_config.driver->escape(theitem, r->pool,&global_config.db), |
932 | "')", | 932 | ")", |
933 | NULL); | 933 | NULL); |
934 | i++; | 934 | i++; |
935 | } | 935 | } |
936 | } | 936 | } |
937 | if ( itemsets != "" ) { | 937 | if ( itemsets != "" ) { |
938 | note_query = apr_psprintf(r->pool, "insert %s into `%s` (id, item, val) values %s", | 938 | note_query = apr_psprintf(r->pool, "insert %s into %s (id, item, val) values %s", |
939 | /*global_config.insertdelayed?"delayed":*/"", notes_tablename, itemsets); | 939 | /*global_config.insertdelayed?"delayed":*/"", notes_tablename, itemsets); |
940 | 940 | ||
941 | log_error(APLOG_MARK,APLOG_DEBUG,0, orig->server,"mod_log_sql: note string: %s", note_query); | 941 | log_error(APLOG_MARK,APLOG_DEBUG,0, orig->server,"mod_log_sql: note string: %s", note_query); |
@@ -951,19 +951,19 @@ static int log_sql_transaction(request_rec *orig) | |||
951 | if ((theitem = apr_table_get(r->headers_out, *ptrptr))) { | 951 | if ((theitem = apr_table_get(r->headers_out, *ptrptr))) { |
952 | itemsets = apr_pstrcat(r->pool, itemsets, | 952 | itemsets = apr_pstrcat(r->pool, itemsets, |
953 | (i > 0 ? "," : ""), | 953 | (i > 0 ? "," : ""), |
954 | "('", | 954 | "(", |
955 | unique_id, | 955 | unique_id, |
956 | "','", | 956 | ",", |
957 | global_config.driver->escape(*ptrptr, r->pool,&global_config.db), | 957 | global_config.driver->escape(*ptrptr, r->pool,&global_config.db), |
958 | "','", | 958 | ",", |
959 | global_config.driver->escape(theitem, r->pool,&global_config.db), | 959 | global_config.driver->escape(theitem, r->pool,&global_config.db), |
960 | "')", | 960 | ")", |
961 | NULL); | 961 | NULL); |
962 | i++; | 962 | i++; |
963 | } | 963 | } |
964 | } | 964 | } |
965 | if ( itemsets != "" ) { | 965 | if ( itemsets != "" ) { |
966 | hout_query = apr_psprintf(r->pool, "insert %s into `%s` (id, item, val) values %s", | 966 | hout_query = apr_psprintf(r->pool, "insert %s into %s (id, item, val) values %s", |
967 | /*global_config.insertdelayed?"delayed":*/"", hout_tablename, itemsets); | 967 | /*global_config.insertdelayed?"delayed":*/"", hout_tablename, itemsets); |
968 | 968 | ||
969 | log_error(APLOG_MARK,APLOG_DEBUG,0, orig->server,"mod_log_sql: header_out string: %s", hout_query); | 969 | log_error(APLOG_MARK,APLOG_DEBUG,0, orig->server,"mod_log_sql: header_out string: %s", hout_query); |
@@ -980,19 +980,19 @@ static int log_sql_transaction(request_rec *orig) | |||
980 | if ((theitem = apr_table_get(r->headers_in, *ptrptr))) { | 980 | if ((theitem = apr_table_get(r->headers_in, *ptrptr))) { |
981 | itemsets = apr_pstrcat(r->pool, itemsets, | 981 | itemsets = apr_pstrcat(r->pool, itemsets, |
982 | (i > 0 ? "," : ""), | 982 | (i > 0 ? "," : ""), |
983 | "('", | 983 | "(", |
984 | unique_id, | 984 | unique_id, |
985 | "','", | 985 | ",", |
986 | global_config.driver->escape(*ptrptr, r->pool,&global_config.db), | 986 | global_config.driver->escape(*ptrptr, r->pool,&global_config.db), |
987 | "','", | 987 | ",", |
988 | global_config.driver->escape(theitem, r->pool,&global_config.db), | 988 | global_config.driver->escape(theitem, r->pool,&global_config.db), |
989 | "')", | 989 | ")", |
990 | NULL); | 990 | NULL); |
991 | i++; | 991 | i++; |
992 | } | 992 | } |
993 | } | 993 | } |
994 | if ( itemsets != "" ) { | 994 | if ( itemsets != "" ) { |
995 | hin_query = apr_psprintf(r->pool, "insert %s into `%s` (id, item, val) values %s", | 995 | hin_query = apr_psprintf(r->pool, "insert %s into %s (id, item, val) values %s", |
996 | /*global_config.insertdelayed?"delayed":*/"", hin_tablename, itemsets); | 996 | /*global_config.insertdelayed?"delayed":*/"", hin_tablename, itemsets); |
997 | 997 | ||
998 | log_error(APLOG_MARK,APLOG_DEBUG,0, orig->server,"mod_log_sql: header_in string: %s", hin_query); | 998 | log_error(APLOG_MARK,APLOG_DEBUG,0, orig->server,"mod_log_sql: header_in string: %s", hin_query); |
@@ -1009,20 +1009,20 @@ static int log_sql_transaction(request_rec *orig) | |||
1009 | if ( strncmp((theitem = extract_specific_cookie(r, *ptrptr)), "-", 1) ) { | 1009 | if ( strncmp((theitem = extract_specific_cookie(r, *ptrptr)), "-", 1) ) { |
1010 | itemsets = apr_pstrcat(r->pool, itemsets, | 1010 | itemsets = apr_pstrcat(r->pool, itemsets, |
1011 | (i > 0 ? "," : ""), | 1011 | (i > 0 ? "," : ""), |
1012 | "('", | 1012 | "(", |
1013 | unique_id, | 1013 | unique_id, |
1014 | "','", | 1014 | ",", |
1015 | global_config.driver->escape(*ptrptr, r->pool,&global_config.db), | 1015 | global_config.driver->escape(*ptrptr, r->pool,&global_config.db), |
1016 | "','", | 1016 | ",", |
1017 | global_config.driver->escape(theitem, r->pool,&global_config.db), | 1017 | global_config.driver->escape(theitem, r->pool,&global_config.db), |
1018 | "')", | 1018 | ")", |
1019 | NULL); | 1019 | NULL); |
1020 | i++; | 1020 | i++; |
1021 | } | 1021 | } |
1022 | 1022 | ||
1023 | } | 1023 | } |
1024 | if ( itemsets != "" ) { | 1024 | if ( itemsets != "" ) { |
1025 | cookie_query = apr_psprintf(r->pool, "insert %s into `%s` (id, item, val) values %s", | 1025 | cookie_query = apr_psprintf(r->pool, "insert %s into %s (id, item, val) values %s", |
1026 | /*global_config.insertdelayed?"delayed":*/"", cookie_tablename, itemsets); | 1026 | /*global_config.insertdelayed?"delayed":*/"", cookie_tablename, itemsets); |
1027 | 1027 | ||
1028 | log_error(APLOG_MARK,APLOG_DEBUG,0, orig->server,"mod_log_sql: cookie string: %s", cookie_query); | 1028 | log_error(APLOG_MARK,APLOG_DEBUG,0, orig->server,"mod_log_sql: cookie string: %s", cookie_query); |
@@ -1030,7 +1030,7 @@ static int log_sql_transaction(request_rec *orig) | |||
1030 | 1030 | ||
1031 | 1031 | ||
1032 | /* Set up the actual INSERT statement */ | 1032 | /* Set up the actual INSERT statement */ |
1033 | access_query = apr_psprintf(r->pool, "insert %s into `%s` (%s) values (%s)", | 1033 | access_query = apr_psprintf(r->pool, "insert %s into %s (%s) values (%s)", |
1034 | /*global_config.insertdelayed?"delayed":*/"", transfer_tablename, fields, values); | 1034 | /*global_config.insertdelayed?"delayed":*/"", transfer_tablename, fields, values); |
1035 | 1035 | ||
1036 | log_error(APLOG_MARK,APLOG_DEBUG,0, r->server,"mod_log_sql: access string: %s", access_query); | 1036 | log_error(APLOG_MARK,APLOG_DEBUG,0, r->server,"mod_log_sql: access string: %s", access_query); |
diff --git a/mod_log_sql.h b/mod_log_sql.h index 56aa2c3..e708f57 100644 --- a/mod_log_sql.h +++ b/mod_log_sql.h | |||
@@ -36,6 +36,7 @@ LOGSQL_DECLARE(void) log_sql_register_item(server_rec *s, apr_pool_t *p, | |||
36 | typedef struct { | 36 | typedef struct { |
37 | int connected; /* Are we connected to the DB */ | 37 | int connected; /* Are we connected to the DB */ |
38 | void *handle; /* DB specific connection pointer */ | 38 | void *handle; /* DB specific connection pointer */ |
39 | apr_pool_t *p; /* Pool to allocate handle off of */ | ||
39 | apr_table_t *parms; /* DB connection parameters */ | 40 | apr_table_t *parms; /* DB connection parameters */ |
40 | } logsql_dbconnection; | 41 | } logsql_dbconnection; |
41 | 42 | ||
@@ -79,7 +80,7 @@ typedef enum { | |||
79 | 80 | ||
80 | typedef struct { | 81 | typedef struct { |
81 | /* NULL terminated list of drivers strings */ | 82 | /* NULL terminated list of drivers strings */ |
82 | char **provided_drivers; | 83 | const char **provided_drivers; |
83 | /* create a connection to the underlying database layer */ | 84 | /* create a connection to the underlying database layer */ |
84 | logsql_opendb_ret (*connect)(server_rec *s, logsql_dbconnection *db); | 85 | logsql_opendb_ret (*connect)(server_rec *s, logsql_dbconnection *db); |
85 | /* disconnect from the underlying database layer */ | 86 | /* disconnect from the underlying database layer */ |
@@ -119,6 +120,12 @@ LOGSQL_DECLARE(void) log_sql_register_driver(apr_pool_t *p, | |||
119 | #endif | 120 | #endif |
120 | 121 | ||
121 | #if defined(WITH_APACHE20) | 122 | #if defined(WITH_APACHE20) |
123 | # define LOGSQL_SHUTDOWN \ | ||
124 | static | ||
125 | #endif | ||
126 | |||
127 | |||
128 | #if defined(WITH_APACHE20) | ||
122 | #define LOGSQL_REGISTER_RETURN return OK; | 129 | #define LOGSQL_REGISTER_RETURN return OK; |
123 | #elif defined(WITH_APACHE13) | 130 | #elif defined(WITH_APACHE13) |
124 | #define LOGSQL_REGISTER_RETURN | 131 | #define LOGSQL_REGISTER_RETURN |
diff --git a/mod_log_sql.prj b/mod_log_sql.prj index bb04bb2..df61439 100644 --- a/mod_log_sql.prj +++ b/mod_log_sql.prj | |||
@@ -49,6 +49,18 @@ project.menu.need.terminal=0 | |||
49 | 49 | ||
50 | project.configure.options= | 50 | project.configure.options= |
51 | anjuta.program.arguments= | 51 | anjuta.program.arguments= |
52 | preferences.indent.automatic=1 | ||
53 | preferences.use.tabs=0 | ||
54 | preferences.indent.opening=0 | ||
55 | preferences.indent.closing=0 | ||
56 | preferences.tabsize=4 | ||
57 | preferences.indent.size=4 | ||
58 | preferences.autoformat.style=Style of Kangleipak | ||
59 | preferences.autoformat.custom.style= -i8 -sc -bli0 -bl0 -cbi0 -ss | ||
60 | preferences.autoformat.disable=0 | ||
61 | preferences.debugger.command=gdb | ||
62 | preferences.ui.designer=glade '$(project.name).glade' | ||
63 | preferences.help.browser=devhelp -s '$(current.file.selection)' | ||
52 | 64 | ||
53 | module.include.name=. | 65 | module.include.name=. |
54 | module.include.type= | 66 | module.include.type= |
@@ -70,7 +82,8 @@ module.source.files=\ | |||
70 | mod_log_sql_ssl.c\ | 82 | mod_log_sql_ssl.c\ |
71 | mod_log_sql_mysql.c\ | 83 | mod_log_sql_mysql.c\ |
72 | contrib/make_combined_log.pl\ | 84 | contrib/make_combined_log.pl\ |
73 | mod_log_sql_pgsql.c | 85 | mod_log_sql_pgsql.c\ |
86 | mod_log_sql_dbi.c | ||
74 | 87 | ||
75 | module.pixmap.name=. | 88 | module.pixmap.name=. |
76 | module.pixmap.type= | 89 | module.pixmap.type= |
diff --git a/mod_log_sql_mysql.c b/mod_log_sql_mysql.c index e64044e..f058110 100644 --- a/mod_log_sql_mysql.c +++ b/mod_log_sql_mysql.c | |||
@@ -55,7 +55,7 @@ static logsql_opendb_ret log_sql_mysql_connect(server_rec *s, logsql_dbconnectio | |||
55 | host, tcpport, database, user, socketfile); | 55 | host, tcpport, database, user, socketfile); |
56 | return LOGSQL_OPENDB_SUCCESS; | 56 | return LOGSQL_OPENDB_SUCCESS; |
57 | } else { | 57 | } else { |
58 | log_error(APLOG_MARK,APLOG_DEBUG,0, s,"mod_log_sql: database connection error: %s", | 58 | log_error(APLOG_MARK,APLOG_ERR,0, s,"mod_log_sql: database connection error: %s", |
59 | MYSQL_ERROR(dblink)); | 59 | MYSQL_ERROR(dblink)); |
60 | log_error(APLOG_MARK,APLOG_DEBUG, 0, s,"HOST: '%s' PORT: '%d' DB: '%s' USER: '%s' SOCKET: '%s'", | 60 | log_error(APLOG_MARK,APLOG_DEBUG, 0, s,"HOST: '%s' PORT: '%d' DB: '%s' USER: '%s' SOCKET: '%s'", |
61 | host, tcpport, database, user, socketfile); | 61 | host, tcpport, database, user, socketfile); |
@@ -85,23 +85,24 @@ static const char *log_sql_mysql_escape(const char *from_str, apr_pool_t *p, | |||
85 | /* Pre-allocate a new string that could hold twice the original, which would only | 85 | /* Pre-allocate a new string that could hold twice the original, which would only |
86 | * happen if the whole original string was 'dangerous' characters. | 86 | * happen if the whole original string was 'dangerous' characters. |
87 | */ | 87 | */ |
88 | to_str = (char *) apr_palloc(p, length * 2 + 1); | 88 | to_str = (char *) apr_palloc(p, length * 2 + 3); |
89 | if (!to_str) { | 89 | if (!to_str) { |
90 | return from_str; | 90 | return from_str; |
91 | } | 91 | } |
92 | 92 | strcpy(to_str, "'"); | |
93 | if (!db->connected) { | 93 | if (!db->connected) { |
94 | /* Well, I would have liked to use the current database charset. mysql is | 94 | /* Well, I would have liked to use the current database charset. mysql is |
95 | * unavailable, however, so I fall back to the slightly less respectful | 95 | * unavailable, however, so I fall back to the slightly less respectful |
96 | * mysql_escape_string() function that uses the default charset. | 96 | * mysql_escape_string() function that uses the default charset. |
97 | */ | 97 | */ |
98 | retval = mysql_escape_string(to_str, from_str, length); | 98 | retval = mysql_escape_string(to_str+1, from_str, length); |
99 | } else { | 99 | } else { |
100 | /* MySQL is available, so I'll go ahead and respect the current charset when | 100 | /* MySQL is available, so I'll go ahead and respect the current charset when |
101 | * I perform the escape. | 101 | * I perform the escape. |
102 | */ | 102 | */ |
103 | retval = mysql_real_escape_string((MYSQL *)db->handle, to_str, from_str, length); | 103 | retval = mysql_real_escape_string((MYSQL *)db->handle, to_str+1, from_str, length); |
104 | } | 104 | } |
105 | strcat(to_str,"'"); | ||
105 | 106 | ||
106 | if (retval) | 107 | if (retval) |
107 | return to_str; | 108 | return to_str; |
@@ -109,6 +110,7 @@ static const char *log_sql_mysql_escape(const char *from_str, apr_pool_t *p, | |||
109 | return from_str; | 110 | return from_str; |
110 | } | 111 | } |
111 | } | 112 | } |
113 | |||
112 | #if defined(WIN32) | 114 | #if defined(WIN32) |
113 | #define SIGNAL_GRAB | 115 | #define SIGNAL_GRAB |
114 | #define SIGNAL_RELEASE | 116 | #define SIGNAL_RELEASE |
@@ -243,7 +245,7 @@ static logsql_table_ret log_sql_mysql_create(request_rec *r, logsql_dbconnection | |||
243 | return LOGSQL_TABLE_SUCCESS; | 245 | return LOGSQL_TABLE_SUCCESS; |
244 | } | 246 | } |
245 | 247 | ||
246 | static char *supported_drivers[] = {"mysql",NULL}; | 248 | static const char *supported_drivers[] = {"mysql",NULL}; |
247 | static logsql_dbdriver mysql_driver = { | 249 | static logsql_dbdriver mysql_driver = { |
248 | supported_drivers, | 250 | supported_drivers, |
249 | log_sql_mysql_connect, /* open DB connection */ | 251 | log_sql_mysql_connect, /* open DB connection */ |