diff options
Diffstat (limited to 'mod_log_sql_mysql.c')
-rw-r--r-- | mod_log_sql_mysql.c | 30 |
1 files changed, 20 insertions, 10 deletions
diff --git a/mod_log_sql_mysql.c b/mod_log_sql_mysql.c index 3749d64..e8a149e 100644 --- a/mod_log_sql_mysql.c +++ b/mod_log_sql_mysql.c | |||
@@ -109,13 +109,22 @@ static const char *log_sql_mysql_escape(const char *from_str, apr_pool_t *p, | |||
109 | return from_str; | 109 | return from_str; |
110 | } | 110 | } |
111 | } | 111 | } |
112 | 112 | #if defined(WIN32) | |
113 | #define SIGNAL_GRAB | ||
114 | #define SIGNAL_RELEASE | ||
115 | #define SIGNAL_VAR | ||
116 | #else | ||
117 | #define SIGNAL_VAR void (*handler) (int) | ||
118 | #define SIGNAL_GRAB handler = signal(SIGPIPE, SIG_IGN) | ||
119 | #define SIGNAL_RELEASE signal(SIGPIPE, handler); | ||
120 | #endif | ||
113 | /* Run a mysql insert query and return a categorized error or success */ | 121 | /* Run a mysql insert query and return a categorized error or success */ |
114 | static logsql_query_ret log_sql_mysql_query(request_rec *r,logsql_dbconnection *db, | 122 | static logsql_query_ret log_sql_mysql_query(request_rec *r,logsql_dbconnection *db, |
115 | const char *query) | 123 | const char *query) |
116 | { | 124 | { |
117 | int retval; | 125 | int retval; |
118 | void (*handler) (int); | 126 | SIGNAL_VAR |
127 | |||
119 | unsigned int real_error = 0; | 128 | unsigned int real_error = 0; |
120 | /*const char *real_error_str = NULL;*/ | 129 | /*const char *real_error_str = NULL;*/ |
121 | 130 | ||
@@ -124,12 +133,13 @@ static logsql_query_ret log_sql_mysql_query(request_rec *r,logsql_dbconnection * | |||
124 | if (!dblink) { | 133 | if (!dblink) { |
125 | return LOGSQL_QUERY_NOLINK; | 134 | return LOGSQL_QUERY_NOLINK; |
126 | } | 135 | } |
136 | |||
127 | /* A failed mysql_query() may send a SIGPIPE, so we ignore that signal momentarily. */ | 137 | /* A failed mysql_query() may send a SIGPIPE, so we ignore that signal momentarily. */ |
128 | handler = signal(SIGPIPE, SIG_IGN); | 138 | SIGNAL_GRAB |
129 | 139 | ||
130 | /* Run the query */ | 140 | /* Run the query */ |
131 | if (!(retval = mysql_query(dblink, query))) { | 141 | if (!(retval = mysql_query(dblink, query))) { |
132 | signal(SIGPIPE, handler); | 142 | SIGNAL_RELEASE |
133 | return LOGSQL_QUERY_SUCCESS; | 143 | return LOGSQL_QUERY_SUCCESS; |
134 | } | 144 | } |
135 | /* Check to see if the error is "nonexistent table" */ | 145 | /* Check to see if the error is "nonexistent table" */ |
@@ -138,12 +148,12 @@ static logsql_query_ret log_sql_mysql_query(request_rec *r,logsql_dbconnection * | |||
138 | if (real_error == ER_NO_SUCH_TABLE) { | 148 | if (real_error == ER_NO_SUCH_TABLE) { |
139 | log_error(APLOG_MARK,APLOG_ERR,0, r->server,"table does not exist, preserving query"); | 149 | log_error(APLOG_MARK,APLOG_ERR,0, r->server,"table does not exist, preserving query"); |
140 | /* Restore SIGPIPE to its original handler function */ | 150 | /* Restore SIGPIPE to its original handler function */ |
141 | signal(SIGPIPE, handler); | 151 | SIGNAL_RELEASE |
142 | return LOGSQL_QUERY_NOTABLE; | 152 | return LOGSQL_QUERY_NOTABLE; |
143 | } | 153 | } |
144 | 154 | ||
145 | /* Restore SIGPIPE to its original handler function */ | 155 | /* Restore SIGPIPE to its original handler function */ |
146 | signal(SIGPIPE, handler); | 156 | SIGNAL_RELEASE |
147 | return LOGSQL_QUERY_FAIL; | 157 | return LOGSQL_QUERY_FAIL; |
148 | } | 158 | } |
149 | 159 | ||
@@ -153,7 +163,7 @@ static logsql_table_ret log_sql_mysql_create(request_rec *r, logsql_dbconnection | |||
153 | { | 163 | { |
154 | int retval; | 164 | int retval; |
155 | const char *tabletype = apr_table_get(db->parms,"tabletype"); | 165 | const char *tabletype = apr_table_get(db->parms,"tabletype"); |
156 | void (*handler) (int); | 166 | SIGNAL_VAR |
157 | char *type_suffix = NULL; | 167 | char *type_suffix = NULL; |
158 | 168 | ||
159 | char *create_prefix = "create table if not exists `"; | 169 | char *create_prefix = "create table if not exists `"; |
@@ -220,16 +230,16 @@ static logsql_table_ret log_sql_mysql_create(request_rec *r, logsql_dbconnection | |||
220 | return LOGSQL_QUERY_NOLINK; | 230 | return LOGSQL_QUERY_NOLINK; |
221 | } | 231 | } |
222 | /* A failed mysql_query() may send a SIGPIPE, so we ignore that signal momentarily. */ | 232 | /* A failed mysql_query() may send a SIGPIPE, so we ignore that signal momentarily. */ |
223 | handler = signal(SIGPIPE, SIG_IGN); | 233 | SIGNAL_GRAB |
224 | 234 | ||
225 | /* Run the create query */ | 235 | /* Run the create query */ |
226 | if ((retval = mysql_query(dblink, create_sql))) { | 236 | if ((retval = mysql_query(dblink, create_sql))) { |
227 | log_error(APLOG_MARK,APLOG_ERR,0, r->server,"failed to create table: %s", | 237 | log_error(APLOG_MARK,APLOG_ERR,0, r->server,"failed to create table: %s", |
228 | table_name); | 238 | table_name); |
229 | signal(SIGPIPE, handler); | 239 | SIGNAL_RELEASE |
230 | return LOGSQL_TABLE_FAIL; | 240 | return LOGSQL_TABLE_FAIL; |
231 | } | 241 | } |
232 | signal(SIGPIPE, handler); | 242 | SIGNAL_RELEASE |
233 | return LOGSQL_TABLE_SUCCESS; | 243 | return LOGSQL_TABLE_SUCCESS; |
234 | } | 244 | } |
235 | 245 | ||