2 * Copyright (C) 2005-2011 Atsushi Konno All rights reserved.
3 * Copyright (C) 2005 QSDN,Inc. All rights reserved.
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
17 #ifdef USE_MYSQL_COOKIE
19 #include "chxj_cookie.h"
20 #include "chxj_url_encode.h"
21 #include "chxj_apply_convrule.h"
23 #include "ap_release.h"
28 #include "apr_base64.h"
38 #define CHXJ_MYSQL_RECONNECT_WAIT_TIME (5000)
39 #define CHXJ_MYSQL_RECONNECT_COUNT (3)
50 static mysql_connection connection = {NULL, "", "", "", 0, 0};
54 _mysql_cleanup(void *UNUSED(notused))
56 chxj_close_mysql_handle();
61 _mysql_cleanup_child(void *UNUSED(notused))
68 chxj_close_mysql_handle()
70 if (connection.handle) {
71 mysql_close(connection.handle);
72 connection.handle = NULL;
77 chxj_open_mysql_handle(request_rec *r, mod_chxj_config *m)
79 static MYSQL mysql_conn;
80 char query[MAX_STRING_LEN];
82 if (connection.handle && connection.reconnect == 0) {
83 if ((!m->mysql.host || (strcasecmp(m->mysql.host, "localhost") == 0)) && connection.host[0] == '\0'
84 && (m->mysql.username && strcmp(m->mysql.username, connection.username) == 0)) {
86 if (m->mysql.database && strcmp(m->mysql.database, connection.database) == 0) {
87 DBG(r,"REQ[%X] already connected",TO_ADDR(r));
88 DBG(r,"REQ[%X] end chxj_open_mysql_handle()",TO_ADDR(r));
92 if (mysql_select_db(connection.handle,m->mysql.database) != 0) {
93 ERR(r, "%s:%d MySQL ERROR: %s", APLOG_MARK, mysql_error(connection.handle));
97 strcpy (connection.database, m->mysql.database);
98 DBG(r,"REQ[%X] already connected. new database:[%s]", TO_ADDR(r),m->mysql.database);
105 chxj_close_mysql_handle();
106 connection.handle = mysql_init(&mysql_conn);
107 if (! connection.handle) {
108 ERR(r, "%s:%d MySQL ERROR: %s", APLOG_MARK, mysql_error(&mysql_conn));
112 if (!m->mysql.host || strcmp(m->mysql.host,"localhost") == 0) {
113 connection.host[0] = '\0';
115 strcpy(connection.host, m->mysql.host);
118 connection.handle = mysql_real_connect(&mysql_conn,connection.host,m->mysql.username,
119 m->mysql.password, NULL, m->mysql.port, m->mysql.socket_path, 0);
120 if (!connection.handle) {
121 ERR(r,"REQ[%X] MySQL ERROR: %s. host:[%s] username:[%s] password:[%s] port:[%d] socket_path:[%s]",
123 mysql_error(&mysql_conn),
128 m->mysql.socket_path);
129 DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
133 apr_pool_cleanup_register(r->pool, (void *)NULL, _mysql_cleanup, _mysql_cleanup_child);
134 if (m->mysql.username) {
135 strcpy(connection.username, m->mysql.username);
138 connection.username[0] = '\0';
141 if (mysql_select_db(connection.handle,m->mysql.database) != 0) {
142 ERR(r, "%s:%d MySQL ERROR: %s", APLOG_MARK, mysql_error(connection.handle));
146 strcpy (connection.database, m->mysql.database);
147 if (m->mysql.charset) {
148 apr_snprintf(query, sizeof(query)-1, "SET CHARACTER SET %s", m->mysql.charset);
149 if (mysql_query(connection.handle, query) != 0) {
150 ERR(r, "REQ[%X] %s:%d MySQL ERROR: %s: %s", TO_ADDR(r),APLOG_MARK, mysql_error(connection.handle), r->uri);
155 DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
161 chxj_mysql_exist_cookie_table(request_rec *r, mod_chxj_config *m)
164 char query[MAX_STRING_LEN];
166 apr_interval_time_t wait_time = CHXJ_MYSQL_RECONNECT_WAIT_TIME;
168 DBG(r,"REQ[%X] start %s()",TO_ADDR(r),__func__);
169 apr_snprintf(query, sizeof(query)-1, "desc %s", m->mysql.tablename);
170 DBG(r,"REQ[%X] query:[%s]", TO_ADDR(r),query);
172 if (!chxj_open_mysql_handle(r, m)) {
173 ERR(r, "%s:%d failed chxj_open_mysql_handle() query:[%s]", APLOG_MARK, query);
176 connection.reconnect = 0;
177 if (mysql_query(connection.handle, query) != 0) {
178 if (mysql_errno(connection.handle) == CR_SERVER_GONE_ERROR) {
179 connection.reconnect = 1;
181 if (retry_count >= CHXJ_MYSQL_RECONNECT_COUNT) {
182 ERR(r, "%s:%d MySQL ERROR: %s: %s(retry over)", APLOG_MARK, mysql_error(connection.handle), r->uri);
185 apr_sleep(wait_time);
188 WRN(r, "%s:%d MySQL WARN: %s: %s", APLOG_MARK, mysql_error(connection.handle), r->uri);
194 result = mysql_store_result(connection.handle);
195 if (result) mysql_free_result(result);
197 DBG(r,"REQ[%X] query:[%s]", TO_ADDR(r),query);
198 DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
205 chxj_mysql_exist_cookie_table_expire(request_rec *r, mod_chxj_config *m)
208 char query[MAX_STRING_LEN];
210 apr_interval_time_t wait_time = CHXJ_MYSQL_RECONNECT_WAIT_TIME;
212 DBG(r,"REQ[%X] start %s()",TO_ADDR(r),__func__);
213 apr_snprintf(query, sizeof(query)-1, "desc %s_expire", m->mysql.tablename);
214 DBG(r,"REQ[%X] query:[%s]",TO_ADDR(r),query);
217 if (!chxj_open_mysql_handle(r, m)) {
218 ERR(r, "%s:%d failed chxj_open_mysql_handle() query:[%s]", APLOG_MARK, query);
221 connection.reconnect = 0;
222 if (mysql_query(connection.handle, query) != 0) {
223 if (mysql_errno(connection.handle) == CR_SERVER_GONE_ERROR) {
224 connection.reconnect = 1;
226 if (retry_count >= CHXJ_MYSQL_RECONNECT_COUNT) {
227 ERR(r, "%s:%d MySQL ERROR: %s: %s(retry over)", APLOG_MARK, mysql_error(connection.handle), r->uri);
230 apr_sleep(wait_time);
233 WRN(r, "%s:%d MySQL WARN: %s: %s", APLOG_MARK, mysql_error(connection.handle), r->uri);
238 result = mysql_store_result(connection.handle);
239 if (result) mysql_free_result(result);
241 DBG(r,"REQ[%X] query:[%s]", TO_ADDR(r),query);
242 DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
249 chxj_mysql_create_cookie_table(request_rec *r, mod_chxj_config *m)
252 char query[MAX_STRING_LEN];
254 apr_interval_time_t wait_time = CHXJ_MYSQL_RECONNECT_WAIT_TIME;
256 DBG(r,"REQ[%X] start %s()",TO_ADDR(r),__func__);
257 apr_snprintf(query, sizeof(query)-1, "CREATE TABLE %s (cookie_id VARCHAR(%d) NOT NULL, data TEXT, PRIMARY KEY(cookie_id)) TYPE=InnoDB;",
259 apr_base64_encode_len(APR_MD5_DIGESTSIZE) * 3);
260 DBG(r,"REQ[%X] query:[%s]", TO_ADDR(r),query);
262 if (!chxj_open_mysql_handle(r, m)) {
263 ERR(r, "%s:%d failed chxj_open_mysql_handle() query:[%s]", APLOG_MARK, query);
266 connection.reconnect = 0;
267 if (mysql_query(connection.handle, query) != 0) {
268 if (mysql_errno(connection.handle) == CR_SERVER_GONE_ERROR) {
269 connection.reconnect = 1;
271 if (retry_count >= CHXJ_MYSQL_RECONNECT_COUNT) {
272 ERR(r, "%s:%d MySQL ERROR: %s: %s(retry over)", APLOG_MARK, mysql_error(connection.handle), r->uri);
275 apr_sleep(wait_time);
278 WRN(r, "%s:%d MySQL WARN: %s: %s", APLOG_MARK, mysql_error(connection.handle), r->uri);
284 result = mysql_store_result(connection.handle);
285 if (result) mysql_free_result(result);
287 DBG(r,"REQ[%X] query:[%s]", TO_ADDR(r),query);
288 DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
294 chxj_mysql_create_cookie_expire_table(request_rec *r, mod_chxj_config *m)
297 char query[MAX_STRING_LEN];
299 apr_interval_time_t wait_time = CHXJ_MYSQL_RECONNECT_WAIT_TIME;
301 DBG(r,"REQ[%X] start %s()",TO_ADDR(r),__func__);
302 apr_snprintf(query, sizeof(query)-1, "CREATE TABLE %s_expire (cookie_id VARCHAR(%d) NOT NULL, created_at DATETIME, PRIMARY KEY(cookie_id)) TYPE=InnoDB;",
304 apr_base64_encode_len(APR_MD5_DIGESTSIZE) * 3);
306 DBG(r,"REQ[%X] query:[%s]", TO_ADDR(r),query);
309 if (!chxj_open_mysql_handle(r, m)) {
310 ERR(r, "%s:%d failed chxj_open_mysql_handle() query:[%s]", APLOG_MARK, query);
313 connection.reconnect = 0;
314 if (mysql_query(connection.handle, query) != 0) {
315 if (mysql_errno(connection.handle) == CR_SERVER_GONE_ERROR) {
316 connection.reconnect = 1;
318 if (retry_count >= CHXJ_MYSQL_RECONNECT_COUNT) {
319 ERR(r, "%s:%d MySQL ERROR: %s: %s(retry over)", APLOG_MARK, mysql_error(connection.handle), r->uri);
322 apr_sleep(wait_time);
325 WRN(r, "%s:%d MySQL WARN: %s: %s", APLOG_MARK, mysql_error(connection.handle), r->uri);
331 result = mysql_store_result(connection.handle);
332 if (result) mysql_free_result(result);
334 DBG(r,"REQ[%X] query:[%s]", TO_ADDR(r),query);
335 DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
342 chxj_mysql_get_cookie_from_cookie_id(request_rec *r, mod_chxj_config *m, const char *cookie_id)
345 char query[MAX_STRING_LEN];
347 apr_size_t clen = strlen(cookie_id);
348 char *sql_safe_cookie_id = apr_palloc(r->pool, clen*2+1);
350 apr_interval_time_t wait_time = CHXJ_MYSQL_RECONNECT_WAIT_TIME;
352 DBG(r,"REQ[%X] start %s()",TO_ADDR(r),__func__);
353 mysql_escape_string(sql_safe_cookie_id,cookie_id,clen);
355 apr_snprintf(query, sizeof(query)-1, "SELECT data, length(data) FROM %s WHERE cookie_id = '%s'", m->mysql.tablename, sql_safe_cookie_id);
356 DBG(r,"REQ[%X] query:[%s]",TO_ADDR(r),query);
358 if (!chxj_open_mysql_handle(r, m)) {
359 ERR(r, "%s:%d failed chxj_open_mysql_handle() query:[%s]", APLOG_MARK, query);
362 connection.reconnect = 0;
363 if (mysql_query(connection.handle, query) != 0) {
364 if (mysql_errno(connection.handle) == CR_SERVER_GONE_ERROR) {
365 connection.reconnect = 1;
367 if (retry_count >= CHXJ_MYSQL_RECONNECT_COUNT) {
368 ERR(r, "%s:%d MySQL ERROR: %s: %s(retry over)", APLOG_MARK, mysql_error(connection.handle), r->uri);
371 apr_sleep(wait_time);
374 WRN(r, "%s:%d MySQL WARN: %s: %s", APLOG_MARK, mysql_error(connection.handle), r->uri);
380 result = mysql_store_result(connection.handle);
381 if (result && (mysql_num_rows(result) >= 1)) {
382 MYSQL_ROW data = mysql_fetch_row(result);
385 mysql_free_result(result);
386 ERR(r, "%s:%d MySQL cookie_id:[%s] has no valid cookie_id. %s", APLOG_MARK, cookie_id, r->uri);
390 retval = (char *) apr_palloc(r->pool, len + 1);
391 memcpy(retval, data[0], len);
393 if (result) mysql_free_result(result);
396 DBG(r,"REQ[%X] query:[%s]", TO_ADDR(r),query);
397 DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
404 chxj_mysql_get_cookie_expire_from_cookie_id(request_rec *r, mod_chxj_config *m, const char *cookie_id)
407 char query[MAX_STRING_LEN];
408 apr_size_t clen = strlen(cookie_id);
410 char *sql_safe_cookie_id = apr_palloc(r->pool, clen*2+1);
412 apr_interval_time_t wait_time = CHXJ_MYSQL_RECONNECT_WAIT_TIME;
414 DBG(r,"REQ[%X] start %s()",TO_ADDR(r),__func__);
415 mysql_escape_string(sql_safe_cookie_id,cookie_id,clen);
417 apr_snprintf(query, sizeof(query)-1, "SELECT DATE_FORMAT(created_at, '%%Y%%m%%d%%H%%i%%s') FROM %s_expire WHERE cookie_id = '%s'",
418 m->mysql.tablename, sql_safe_cookie_id);
420 DBG(r,"REQ[%X] query:[%s]", TO_ADDR(r),query);
423 if (!chxj_open_mysql_handle(r, m)) {
424 ERR(r, "%s:%d failed chxj_open_mysql_handle() query:[%s]", APLOG_MARK, query);
427 connection.reconnect = 0;
428 if (mysql_query(connection.handle, query) != 0) {
429 if (mysql_errno(connection.handle) == CR_SERVER_GONE_ERROR) {
430 connection.reconnect = 1;
432 if (retry_count >= CHXJ_MYSQL_RECONNECT_COUNT) {
433 ERR(r, "%s:%d MySQL ERROR: %s: %s(retry over)", APLOG_MARK, mysql_error(connection.handle), r->uri);
436 apr_sleep(wait_time);
439 WRN(r, "%s:%d MySQL WARN: %s: %s", APLOG_MARK, mysql_error(connection.handle), r->uri);
445 result = mysql_store_result(connection.handle);
446 if (result && (mysql_num_rows(result) >= 1)) {
447 MYSQL_ROW data = mysql_fetch_row(result);
449 mysql_free_result(result);
450 ERR(r, "%s:%d MySQL cookie_id:[%s] has no valid cookie_id. %s", APLOG_MARK, cookie_id, r->uri);
453 retval = (char *) apr_palloc(r->pool, 19 + 1);
454 memset(retval, 0, 19+1);
455 memcpy(retval, data[0], 19);
457 if (result) mysql_free_result(result);
459 DBG(r,"REQ[%X] query:[%s] retval:[%s]", TO_ADDR(r),query, retval);
460 DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
467 chxj_mysql_insert_or_update_cookie(request_rec *r, mod_chxj_config *m, const char *cookie_id, const char *data)
470 char query[MAX_STRING_LEN];
471 char *cid = ap_escape_logitem(r->pool, cookie_id);
472 char *cdt = ap_escape_logitem(r->pool, data);
474 apr_interval_time_t wait_time = CHXJ_MYSQL_RECONNECT_WAIT_TIME;
476 DBG(r,"REQ[%X] start %s()",TO_ADDR(r),__func__);
477 DBG(r,"REQ[%X] data:[%s]", TO_ADDR(r),data);
479 if (!chxj_open_mysql_handle(r, m)) {
480 ERR(r, "%s:%d failed chxj_open_mysql_handle()", APLOG_MARK);
483 connection.reconnect = 0;
484 apr_snprintf(query, sizeof(query)-1, "BEGIN;");
485 DBG(r, "query:[%s]", query);
486 if (mysql_query(connection.handle, query) != 0) {
487 if (mysql_errno(connection.handle) == CR_SERVER_GONE_ERROR) {
488 connection.reconnect = 1;
490 if (retry_count >= CHXJ_MYSQL_RECONNECT_COUNT) {
491 ERR(r, "%s:%d MySQL ERROR: %s: %s(retry over)", APLOG_MARK, mysql_error(connection.handle), r->uri);
494 apr_sleep(wait_time);
497 ERR(r, "%s:%d MySQL WARN: %s: %s", APLOG_MARK, mysql_error(connection.handle), r->uri);
503 apr_snprintf(query, sizeof(query)-1, "INSERT INTO %s (cookie_id, data) VALUES ('%s','%s');", m->mysql.tablename, cid, cdt);
504 DBG(r,"REQ[%X] query:[%s]", TO_ADDR(r),query);
505 if (mysql_query(connection.handle, query) != 0) {
506 WRN(r, "MySQL WARN: %s: %s", mysql_error(connection.handle), r->uri);
507 if (!chxj_mysql_get_cookie_from_cookie_id(r, m, cookie_id)) {
508 ERR(r, "%s:%d failed chxj_mysql_get_cookie_from_cookie_id() cookie_id:[%s]", APLOG_MARK, cookie_id);
511 apr_snprintf(query, sizeof(query)-1, "UPDATE %s set data = '%s' WHERE cookie_id = '%s';", m->mysql.tablename, cdt, cid);
512 DBG(r,"REQ[%X] query:[%s]", TO_ADDR(r),query);
513 if (mysql_query(connection.handle, query) != 0) {
514 ERR(r, "%s:%d MySQL WARN: %s: %s", APLOG_MARK, mysql_error(connection.handle), r->uri);
515 chxj_mysql_rollback(r, m);
520 apr_snprintf(query, sizeof(query)-1, "COMMIT;");
521 DBG(r,"REQ[%X] query:[%s]",TO_ADDR(r),query);
522 if (mysql_query(connection.handle, query) != 0) {
523 ERR(r, "%s:%d MySQL WARN: %s: %s", APLOG_MARK, mysql_error(connection.handle), r->uri);
524 chxj_mysql_rollback(r, m);
528 result = mysql_store_result(connection.handle);
529 if (result) mysql_free_result(result);
531 DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
538 chxj_mysql_insert_or_update_cookie_expire(request_rec *r, mod_chxj_config *m, const char *cookie_id)
541 char query[MAX_STRING_LEN];
542 char *cid = ap_escape_logitem(r->pool, cookie_id);
544 apr_interval_time_t wait_time = CHXJ_MYSQL_RECONNECT_WAIT_TIME;
546 DBG(r,"REQ[%X] start %s()",TO_ADDR(r),__func__);
549 if (!chxj_open_mysql_handle(r, m)) {
550 ERR(r, "%s:%d failed chxj_open_mysql_handle()", APLOG_MARK);
553 connection.reconnect = 0;
554 apr_snprintf(query, sizeof(query)-1, "BEGIN;");
555 DBG(r,"REQ[%X] query:[%s]",TO_ADDR(r),query);
556 if (mysql_query(connection.handle, query) != 0) {
557 if (mysql_errno(connection.handle) == CR_SERVER_GONE_ERROR) {
558 connection.reconnect = 1;
560 if (retry_count >= CHXJ_MYSQL_RECONNECT_COUNT) {
561 ERR(r, "%s:%d MySQL ERROR: %s: %s(retry over)", APLOG_MARK, mysql_error(connection.handle), r->uri);
564 apr_sleep(wait_time);
567 ERR(r, "%s:%d MySQL WARN: %s: %s", APLOG_MARK,mysql_error(connection.handle), r->uri);
573 apr_snprintf(query, sizeof(query)-1, "INSERT INTO %s_expire (cookie_id, created_at) VALUES ('%s',localtime);", m->mysql.tablename, cid);
574 DBG(r,"REQ[%X] query:[%s]", TO_ADDR(r),query);
575 if (mysql_query(connection.handle, query) != 0) {
576 WRN(r, "MySQL WARN: %s: %s", mysql_error(connection.handle), r->uri);
577 if (!chxj_mysql_get_cookie_from_cookie_id(r, m, cookie_id)) {
578 ERR(r, "%s:%d failed chxj_mysql_get_cookie_from_cookie_id() cookie_id:[%s]", APLOG_MARK, cookie_id);
581 apr_snprintf(query, sizeof(query)-1, "UPDATE %s_expire set created_at = localtime WHERE cookie_id = '%s';", m->mysql.tablename, cid);
582 DBG(r,"REQ[%X] query:[%s]",TO_ADDR(r),query);
583 if (mysql_query(connection.handle, query) != 0) {
584 ERR(r, "%s:%d MySQL WARN: %s: %s", APLOG_MARK, mysql_error(connection.handle), r->uri);
585 chxj_mysql_rollback(r, m);
590 apr_snprintf(query, sizeof(query)-1, "COMMIT;");
591 DBG(r,"REQ[%X] query:[%s]",TO_ADDR(r),query);
592 if (mysql_query(connection.handle, query) != 0) {
593 ERR(r, "%s:%d MySQL WARN: %s: %s", APLOG_MARK, mysql_error(connection.handle), r->uri);
594 chxj_mysql_rollback(r, m);
598 result = mysql_store_result(connection.handle);
599 if (result) mysql_free_result(result);
601 DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
608 chxj_mysql_rollback(request_rec *r, mod_chxj_config *m)
610 char query[MAX_STRING_LEN];
612 DBG(r,"REQ[%X] start %s()",TO_ADDR(r),__func__);
614 apr_snprintf(query, sizeof(query)-1, "ROLLBACK;");
616 if (!chxj_open_mysql_handle(r, m)) {
617 DBG(r, "end chxj_mysql_rollback()");
620 if (mysql_query(connection.handle, query) != 0) {
621 ERR(r, "%s:%d MySQL ERROR: %s: %s", APLOG_MARK, mysql_error(connection.handle), r->uri);
622 return 0; /* FALSE */
624 DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
629 chxj_mysql_load_cookie(request_rec *r, mod_chxj_config *m, const char *cookie_id)
632 char query[MAX_STRING_LEN];
633 apr_size_t clen = strlen(cookie_id);
635 char *sql_safe_cookie_id = apr_palloc(r->pool, clen*2+1);
637 apr_interval_time_t wait_time = CHXJ_MYSQL_RECONNECT_WAIT_TIME;
639 DBG(r,"REQ[%X] start %s()",TO_ADDR(r),__func__);
640 mysql_escape_string(sql_safe_cookie_id,cookie_id,clen);
642 apr_snprintf(query, sizeof(query)-1, "SELECT data, length(data) FROM %s WHERE cookie_id = '%s';", m->mysql.tablename, sql_safe_cookie_id);
644 DBG(r, "REQ[%X] query:[%s]", TO_ADDR(r),query);
647 if (!chxj_open_mysql_handle(r, m)) {
648 ERR(r, "%s:%d failed chxj_open_mysql_handle() query:[%s]", APLOG_MARK, query);
651 connection.reconnect = 0;
652 if (mysql_query(connection.handle, query) != 0) {
653 if (mysql_errno(connection.handle) == CR_SERVER_GONE_ERROR) {
654 connection.reconnect = 1;
656 if (retry_count >= CHXJ_MYSQL_RECONNECT_COUNT) {
657 ERR(r, "%s:%d MySQL ERROR: %s: %s(retry over)", APLOG_MARK, mysql_error(connection.handle), r->uri);
660 apr_sleep(wait_time);
663 WRN(r, "%s:%d MySQL WARN: %s: %s", APLOG_MARK, mysql_error(connection.handle), r->uri);
669 result = mysql_store_result(connection.handle);
670 if (result && (mysql_num_rows(result) >= 1)) {
671 MYSQL_ROW data = mysql_fetch_row(result);
674 ERR(r, "%s:%d MySQL cookie_id:[%s] has no valid cookie_id. %s", APLOG_MARK, cookie_id, r->uri);
675 mysql_free_result(result);
679 retval = (char *) apr_palloc(r->pool, len + 1);
680 memset(retval, 0, len + 1);
681 memcpy(retval, data[0], len);
683 if (result) mysql_free_result(result);
685 DBG(r,"REQ[%X] query:[%s]", TO_ADDR(r),query);
686 DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
693 chxj_mysql_load_cookie_expire(request_rec *r, mod_chxj_config *m, const char *cookie_id)
696 char query[MAX_STRING_LEN];
698 apr_size_t clen = strlen(cookie_id);
699 char *sql_safe_cookie_id = apr_palloc(r->pool, clen*2+1);
701 apr_interval_time_t wait_time = CHXJ_MYSQL_RECONNECT_WAIT_TIME;
703 DBG(r,"REQ[%X] start %s()",TO_ADDR(r),__func__);
704 mysql_escape_string(sql_safe_cookie_id,cookie_id,clen);
708 "SELECT DATE_FORMAT(created_at, '%%Y%%m%%d%%H%%i%%s') FROM %s_expire WHERE cookie_id = '%s';",
712 DBG(r,"REQ[%X] query:[%s]", TO_ADDR(r),query);
715 if (!chxj_open_mysql_handle(r, m)) {
716 ERR(r, "%s:%d failed chxj_open_mysql_handle() query:[%s]", APLOG_MARK,query);
719 connection.reconnect = 0;
720 if (mysql_query(connection.handle, query) != 0) {
721 if (mysql_errno(connection.handle) == CR_SERVER_GONE_ERROR) {
722 connection.reconnect = 1;
724 if (retry_count >= CHXJ_MYSQL_RECONNECT_COUNT) {
725 ERR(r, "%s:%d MySQL ERROR: %s: %s(retry over)", APLOG_MARK,mysql_error(connection.handle), r->uri);
728 apr_sleep(wait_time);
731 WRN(r, "%s:%d MySQL WARN: %s: %s", APLOG_MARK, mysql_error(connection.handle), r->uri);
737 result = mysql_store_result(connection.handle);
738 if (result && (mysql_num_rows(result) >= 1)) {
739 MYSQL_ROW data = mysql_fetch_row(result);
741 ERR(r, "%s:%d MySQL cookie_id:[%s] has no valid cookie_id. %s", APLOG_MARK,cookie_id, r->uri);
742 mysql_free_result(result);
745 retval = (char *) apr_palloc(r->pool, 14 + 1);
746 memcpy(retval, data[0], 14);
748 if (result) mysql_free_result(result);
750 DBG(r,"REQ[%X] query:[%s]", TO_ADDR(r),query);
751 DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
758 chxj_mysql_delete_cookie(request_rec *r, mod_chxj_config *m, const char *cookie_id)
761 char query[MAX_STRING_LEN];
762 char *cid = ap_escape_logitem(r->pool, cookie_id);
764 apr_interval_time_t wait_time = CHXJ_MYSQL_RECONNECT_WAIT_TIME;
766 DBG(r,"REQ[%X] start %s()",TO_ADDR(r),__func__);
767 DBG(r,"REQ[%X] cookie_id:[%s]", TO_ADDR(r),cookie_id);
770 if (!chxj_open_mysql_handle(r, m)) {
771 ERR(r, "%s:%d failed chxj_open_mysql_handle()", APLOG_MARK);
774 connection.reconnect = 0;
775 apr_snprintf(query, sizeof(query)-1, "BEGIN;");
776 DBG(r,"REQ[%X] query:[%s]", TO_ADDR(r),query);
777 if (mysql_query(connection.handle, query) != 0) {
778 if (mysql_errno(connection.handle) == CR_SERVER_GONE_ERROR) {
779 connection.reconnect = 1;
781 if (retry_count >= CHXJ_MYSQL_RECONNECT_COUNT) {
782 ERR(r, "%s:%d MySQL ERROR: %s: %s(retry over)", APLOG_MARK,mysql_error(connection.handle), r->uri);
785 apr_sleep(wait_time);
788 ERR(r, "%s:%d MySQL WARN: %s: %s", APLOG_MARK, mysql_error(connection.handle), r->uri);
794 if (!chxj_mysql_get_cookie_from_cookie_id(r, m, cookie_id)) {
795 ERR(r, "%s:%d failed chxj_mysql_get_cookie_from_cookie_id() cookie_id:[%s]", APLOG_MARK,cookie_id);
798 apr_snprintf(query, sizeof(query)-1, "DELETE FROM %s WHERE cookie_id = '%s';", m->mysql.tablename, cid);
799 DBG(r,"REQ[%X] query:[%s]", TO_ADDR(r),query);
800 if (mysql_query(connection.handle, query) != 0) {
801 ERR(r, "%s:%d MySQL WARN: %s: %s", APLOG_MARK, mysql_error(connection.handle), r->uri);
802 chxj_mysql_rollback(r, m);
806 apr_snprintf(query, sizeof(query)-1, "COMMIT;");
807 DBG(r,"REQ[%X] query:[%s]",TO_ADDR(r),query);
808 if (mysql_query(connection.handle, query) != 0) {
809 ERR(r, "%s:%d MySQL WARN: %s: %s", APLOG_MARK, mysql_error(connection.handle), r->uri);
810 chxj_mysql_rollback(r, m);
814 result = mysql_store_result(connection.handle);
815 if (result) mysql_free_result(result);
817 DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
824 chxj_mysql_delete_cookie_expire(request_rec *r, mod_chxj_config *m, const char *cookie_id)
827 char query[MAX_STRING_LEN];
828 char *cid = ap_escape_logitem(r->pool, cookie_id);
830 apr_interval_time_t wait_time = CHXJ_MYSQL_RECONNECT_WAIT_TIME;
832 DBG(r,"REQ[%X] start %s()",TO_ADDR(r),__func__);
833 DBG(r,"REQ[%X] cookie_id:[%s]", TO_ADDR(r),cookie_id);
836 if (!chxj_open_mysql_handle(r, m)) {
837 ERR(r, "%s:%d failed chxj_open_mysql_handle()", APLOG_MARK);
840 connection.reconnect = 0;
841 apr_snprintf(query, sizeof(query)-1, "BEGIN;");
842 DBG(r,"REQ[%X] query:[%s]",TO_ADDR(r),query);
843 if (mysql_query(connection.handle, query) != 0) {
844 if (mysql_errno(connection.handle) == CR_SERVER_GONE_ERROR) {
845 connection.reconnect = 1;
847 if (retry_count >= CHXJ_MYSQL_RECONNECT_COUNT) {
848 ERR(r, "%s:%d MySQL ERROR: %s: %s(retry over)", APLOG_MARK,mysql_error(connection.handle), r->uri);
851 apr_sleep(wait_time);
854 ERR(r, "%s:%d MySQL WARN: %s: %s", APLOG_MARK,mysql_error(connection.handle), r->uri);
860 if (!chxj_mysql_get_cookie_expire_from_cookie_id(r, m, cookie_id)) {
861 ERR(r, "%s:%d failed chxj_mysql_get_cookie_expire_from_cookie_id() cookie_id:[%s]", APLOG_MARK,cookie_id);
864 apr_snprintf(query, sizeof(query)-1, "DELETE FROM %s_expire WHERE cookie_id = '%s';", m->mysql.tablename, cid);
865 DBG(r,"REQ[%X] query:[%s]",TO_ADDR(r),query);
866 if (mysql_query(connection.handle, query) != 0) {
867 ERR(r, "%s:%d MySQL WARN: %s: %s", APLOG_MARK,mysql_error(connection.handle), r->uri);
868 chxj_mysql_rollback(r, m);
872 apr_snprintf(query, sizeof(query)-1, "COMMIT;");
873 DBG(r,"REQ[%X] query:[%s]",TO_ADDR(r),query);
874 if (mysql_query(connection.handle, query) != 0) {
875 ERR(r, "%s:%d MySQL WARN: %s: %s", APLOG_MARK, mysql_error(connection.handle), r->uri);
876 chxj_mysql_rollback(r, m);
880 result = mysql_store_result(connection.handle);
881 if (result) mysql_free_result(result);
883 DBG(r,"REQ[%X] cookie_id:[%s]",TO_ADDR(r),cookie_id);
884 DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
890 chxj_mysql_get_timeout_localtime(request_rec *r, mod_chxj_config *m)
893 char query[MAX_STRING_LEN];
896 apr_interval_time_t wait_time = CHXJ_MYSQL_RECONNECT_WAIT_TIME;
898 DBG(r,"REQ[%X] start %s()",TO_ADDR(r),__func__);
900 if (!chxj_open_mysql_handle(r, m)) {
901 ERR(r, "%s:%d failed chxj_open_mysql_handle()", APLOG_MARK);
904 connection.reconnect = 0;
905 apr_snprintf(query, sizeof(query)-1, "SELECT DATE_SUB(localtime, interval %ld second);",
906 (m->cookie_timeout == 0) ? DEFAULT_COOKIE_TIMEOUT : m->cookie_timeout);
907 DBG(r,"REQ[%X] query:[%s]",TO_ADDR(r),query);
908 if (mysql_query(connection.handle, query) != 0) {
909 if (mysql_errno(connection.handle) == CR_SERVER_GONE_ERROR) {
910 connection.reconnect = 1;
912 if (retry_count >= CHXJ_MYSQL_RECONNECT_COUNT) {
913 ERR(r, "%s:%d MySQL ERROR: %s: %s(retry over)", APLOG_MARK, mysql_error(connection.handle), r->uri);
916 apr_sleep(wait_time);
919 ERR(r, "%s:%d MySQL WARN: %s: %s", APLOG_MARK, mysql_error(connection.handle), r->uri);
924 result = mysql_store_result(connection.handle);
925 if (result && (mysql_num_rows(result) >= 1)) {
926 MYSQL_ROW data = mysql_fetch_row(result);
928 ERR(r, "%s:%d MySQL ERROR: %s: %s", APLOG_MARK, mysql_error(connection.handle), r->uri);
929 mysql_free_result(result);
932 retval = (char *) apr_palloc(r->pool, 19 + 1);
933 memset(retval, 0, 19+1);
934 memcpy(retval, data[0], 19);
936 if (result) mysql_free_result(result);
938 DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
944 chxj_mysql_delete_expired_cookie(request_rec *r, mod_chxj_config *m)
947 char query[MAX_STRING_LEN];
950 apr_interval_time_t wait_time = CHXJ_MYSQL_RECONNECT_WAIT_TIME;
952 DBG(r,"REQ[%X] start %s()",TO_ADDR(r),__func__);
955 if (!chxj_open_mysql_handle(r, m)) {
956 ERR(r, "%s:%d failed chxj_open_mysql_handle()", APLOG_MARK);
959 connection.reconnect = 0;
960 apr_snprintf(query, sizeof(query)-1, "BEGIN;");
961 DBG(r,"REQ[%X] query:[%s]", TO_ADDR(r),query);
962 if (mysql_query(connection.handle, query) != 0) {
963 if (mysql_errno(connection.handle) == CR_SERVER_GONE_ERROR) {
964 connection.reconnect = 1;
966 if (retry_count >= CHXJ_MYSQL_RECONNECT_COUNT) {
967 ERR(r, "%s:%d MySQL ERROR: %s: %s(retry over)", APLOG_MARK,mysql_error(connection.handle), r->uri);
970 apr_sleep(wait_time);
973 ERR(r, "%s:%d MySQL ERROR: %s: %s", APLOG_MARK,mysql_error(connection.handle), r->uri);
979 timeout = chxj_mysql_get_timeout_localtime(r, m);
981 ERR(r, "%s:%d MySQL ERROR: %s: %s", APLOG_MARK, mysql_error(connection.handle), r->uri);
985 apr_snprintf(query, sizeof(query)-1, "SELECT * FROM %s_expire WHERE created_at <= '%s'", m->mysql.tablename, timeout);
986 DBG(r,"REQ[%X] query:[%s]",TO_ADDR(r),query);
987 if (mysql_query(connection.handle, query) != 0) {
988 ERR(r, "%s:%d MySQL WARN: %s: %s", APLOG_MARK,mysql_error(connection.handle), r->uri);
989 chxj_mysql_rollback(r, m);
992 result = mysql_store_result(connection.handle);
993 if (result) mysql_free_result(result);
996 /* delete from chxj_cookie */
997 apr_snprintf(query, sizeof(query)-1, "DELETE %s FROM %s, %s_expire WHERE %s_expire.created_at <= '%s' AND %s.cookie_id = %s_expire.cookie_id;",
1004 m->mysql.tablename);
1005 DBG(r,"REQ[%X] query:[%s]",TO_ADDR(r),query);
1006 if (mysql_query(connection.handle, query) != 0) {
1007 ERR(r, "%s:%d MySQL ERROR: %s: %s", APLOG_MARK, mysql_error(connection.handle), r->uri);
1008 chxj_mysql_rollback(r, m);
1011 result = mysql_store_result(connection.handle);
1012 if (result) mysql_free_result(result);
1015 /* delete from chxj_cookie_expire */
1016 apr_snprintf(query, sizeof(query)-1, "DELETE %s_expire FROM %s_expire WHERE %s_expire.created_at <= '%s';",
1021 DBG(r,"REQ[%X] query:[%s]",TO_ADDR(r),query);
1022 if (mysql_query(connection.handle, query) != 0) {
1023 ERR(r, "%s:%d MySQL ERROR: %s: %s", APLOG_MARK, mysql_error(connection.handle), r->uri);
1024 chxj_mysql_rollback(r, m);
1027 result = mysql_store_result(connection.handle);
1028 if (result) mysql_free_result(result);
1031 apr_snprintf(query, sizeof(query)-1, "COMMIT;");
1032 DBG(r,"REQ[%X] query:[%s]",TO_ADDR(r),query);
1033 if (mysql_query(connection.handle, query) != 0) {
1034 ERR(r, "%s:%d MySQL WARN: %s: %s", APLOG_MARK, mysql_error(connection.handle), r->uri);
1035 chxj_mysql_rollback(r, m);
1039 result = mysql_store_result(connection.handle);
1040 if (result) mysql_free_result(result);
1042 DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
1057 chxj_save_cookie_mysql(request_rec *r, mod_chxj_config *m, const char *cookie_id, const char *store_string)
1059 DBG(r,"REQ[%X] start %s()",TO_ADDR(r),__func__);
1060 if (! chxj_open_mysql_handle(r, m)) {
1061 ERR(r, "Cannot open mysql connection");
1062 DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
1066 if (!chxj_mysql_exist_cookie_table(r, m)) {
1067 DBG(r,"REQ[%X] not found cookie table:[%s]", TO_ADDR(r),m->mysql.tablename);
1068 if (!chxj_mysql_create_cookie_table(r, m)) {
1069 ERR(r, "cannot create cookie table:[%s]", m->mysql.tablename);
1070 DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
1074 if (! chxj_mysql_insert_or_update_cookie(r, m, cookie_id, store_string)) {
1075 ERR(r, "cannot store to cookie table:[%s]", m->mysql.tablename);
1076 DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
1080 /* *NEED NOT* close database. */
1081 DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
1086 chxj_update_cookie_mysql(request_rec *r, mod_chxj_config *m, const char *cookie_id, const char *store_string)
1088 DBG(r,"REQ[%X] start %s()",TO_ADDR(r),__func__);
1089 DBG(r,"REQ[%X] cookie_id:[%s]", TO_ADDR(r),cookie_id);
1090 if (! chxj_open_mysql_handle(r, m)) {
1091 ERR(r, "Cannot open mysql connection");
1092 DBG(r,"REQ[%X] cookie_id:[%s]", TO_ADDR(r),cookie_id);
1093 DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
1097 if (!chxj_mysql_exist_cookie_table(r, m)) {
1098 DBG(r,"REQ[%X] not found cookie table:[%s]",TO_ADDR(r),m->mysql.tablename);
1099 if (!chxj_mysql_create_cookie_table(r, m)) {
1100 ERR(r, "cannot create cookie table:[%s]", m->mysql.tablename);
1101 DBG(r,"REQ[%X] cookie_id:[%s]", TO_ADDR(r),cookie_id);
1102 DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
1106 if (! chxj_mysql_insert_or_update_cookie(r, m, cookie_id, store_string)) {
1107 ERR(r, "cannot create cookie table:[%s]", m->mysql.tablename);
1108 DBG(r,"REQ[%X] cookie_id:[%s]", TO_ADDR(r),cookie_id);
1109 DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
1113 /* *NEED NOT* close database. */
1114 /* chxj_close_mysql_handle(); */
1115 DBG(r,"REQ[%X] cookie_id:[%s]", TO_ADDR(r),cookie_id);
1116 DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
1122 chxj_load_cookie_mysql(request_rec *r, mod_chxj_config *m, const char *cookie_id)
1126 DBG(r,"REQ[%X] start %s()",TO_ADDR(r),__func__);
1127 DBG(r,"REQ[%X] cookie_id:[%s]", TO_ADDR(r),cookie_id);
1128 if (! chxj_open_mysql_handle(r, m)) {
1129 ERR(r, "Cannot open mysql connection");
1130 DBG(r,"REQ[%X] cookie_id:[%s]", TO_ADDR(r),cookie_id);
1131 DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
1135 if (!chxj_mysql_exist_cookie_table(r, m)) {
1136 DBG(r,"REQ[%X] not found cookie table:[%s]", TO_ADDR(r),m->mysql.tablename);
1137 if (!chxj_mysql_create_cookie_table(r, m)) {
1138 ERR(r, "cannot create cookie table:[%s]", m->mysql.tablename);
1139 DBG(r,"REQ[%X] cookie_id:[%s]", TO_ADDR(r),cookie_id);
1140 DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
1144 if (!(load_string = chxj_mysql_load_cookie(r, m, cookie_id))) {
1145 ERR(r, "%s:%d not found cookie. cookie_id:[%s]", APLOG_MARK, cookie_id);
1146 DBG(r,"REQ[%X] cookie_id:[%s]", TO_ADDR(r),cookie_id);
1147 DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
1151 /* *NEED NOT* close database. */
1152 /* chxj_close_mysql_handle(); */
1153 DBG(r,"REQ[%X] cookie_id:[%s]", TO_ADDR(r),cookie_id);
1154 DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
1160 chxj_delete_cookie_mysql(request_rec *r, mod_chxj_config *m, const char *cookie_id)
1162 DBG(r,"REQ[%X] start %s()",TO_ADDR(r),__func__);
1163 DBG(r,"REQ[%X] cookie_id=[%s]", TO_ADDR(r),cookie_id);
1164 if (! chxj_open_mysql_handle(r, m)) {
1165 ERR(r, "%s:%d Cannot open mysql connection cookie_id=[%s]", APLOG_MARK, cookie_id);
1168 if (!chxj_mysql_exist_cookie_table(r, m)) {
1169 DBG(r,"REQ[%X] not found cookie table:[%s]", TO_ADDR(r),m->mysql.tablename);
1170 if (!chxj_mysql_create_cookie_table(r, m)) {
1171 ERR(r, "%s:%d cannot create cookie table:[%s]", APLOG_MARK, m->mysql.tablename);
1176 if (!chxj_mysql_delete_cookie(r, m, cookie_id)) {
1177 ERR(r, "%s:%d failed: chxj_mysql_delete_cookie() cookie_id:[%s]", APLOG_MARK, cookie_id);
1181 DBG(r,"REQ[%X] cookie_id=[%s]", TO_ADDR(r),cookie_id);
1182 DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
1188 chxj_save_cookie_expire_mysql(request_rec *r, mod_chxj_config *m, const char *cookie_id)
1190 DBG(r,"REQ[%X] start %s()",TO_ADDR(r),__func__);
1191 DBG(r,"REQ[%X] cookie_id:[%s]", TO_ADDR(r),cookie_id);
1192 if (! chxj_open_mysql_handle(r, m)) {
1193 ERR(r, "%s:%d Cannot open mysql connection cookie_id=[%s]",APLOG_MARK, cookie_id);
1197 if (!chxj_mysql_exist_cookie_table_expire(r, m)) {
1198 DBG(r,"REQ[%X] not found cookie table:[%s_expire]", TO_ADDR(r),m->mysql.tablename);
1199 if (!chxj_mysql_create_cookie_expire_table(r, m)) {
1200 ERR(r, "%s:%d cannot create cookie table:[%s_expire] cookie_id:[%s]", APLOG_MARK, m->mysql.tablename, cookie_id);
1204 if (! chxj_mysql_insert_or_update_cookie_expire(r, m, cookie_id)) {
1205 ERR(r, "%s:%d cannot create cookie table:[%s_expire] cookie_id:[%s]", APLOG_MARK, m->mysql.tablename, cookie_id);
1209 /* *NEED NOT* close database. */
1210 /* chxj_close_mysql_handle(); */
1212 DBG(r,"REQ[%X] cookie_id:[%s]", TO_ADDR(r),cookie_id);
1213 DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
1219 chxj_delete_cookie_expire_mysql(request_rec *r, mod_chxj_config *m, const char *cookie_id)
1221 DBG(r,"REQ[%X] start %s()",TO_ADDR(r),__func__);
1222 DBG(r,"REQ[%X] cookie_id:[%s]", TO_ADDR(r),cookie_id);
1223 if (! chxj_open_mysql_handle(r, m)) {
1224 ERR(r, "%s:%d Cannot open mysql connection", APLOG_MARK);
1228 if (!chxj_mysql_exist_cookie_table_expire(r, m)) {
1229 DBG(r,"REQ[%X] not found cookie table:[%s_expire]", TO_ADDR(r),m->mysql.tablename);
1230 if (!chxj_mysql_create_cookie_expire_table(r, m)) {
1231 ERR(r, "%s:%d cannot create cookie table:[%s_expire] cookie_id:[%s]", APLOG_MARK, m->mysql.tablename, cookie_id);
1235 if (!chxj_mysql_delete_cookie_expire(r, m, cookie_id)) {
1236 ERR(r, "%s:%d failed: chxj_mysql_delete_cookie() cookie_id:[%s]", APLOG_MARK, cookie_id);
1240 DBG(r,"REQ[%X] cookie_id:[%s]", TO_ADDR(r),cookie_id);
1241 DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
1247 chxj_cookie_expire_gc_mysql(request_rec *r, mod_chxj_config *m)
1249 DBG(r,"REQ[%X] start %s()",TO_ADDR(r),__func__);
1250 if (! chxj_open_mysql_handle(r, m)) {
1251 ERR(r, "Cannot open mysql connection");
1252 DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
1255 if (!chxj_mysql_exist_cookie_table_expire(r, m)) {
1256 DBG(r,"REQ[%X] not found cookie table:[%s_expire]", TO_ADDR(r),m->mysql.tablename);
1257 if (!chxj_mysql_create_cookie_expire_table(r, m)) {
1258 ERR(r, "%s:%d cannot create cookie table:[%s_expire]", APLOG_MARK, m->mysql.tablename);
1262 if (!chxj_mysql_delete_expired_cookie(r, m)) {
1263 ERR(r, "%s:%d failed: chxj_mysql_delete_expired_cookie()", APLOG_MARK);
1267 DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
1273 chxj_cookie_lock_mysql(request_rec *r, mod_chxj_config *m)
1276 char query[MAX_STRING_LEN];
1277 DBG(r,"REQ[%X] start %s()",TO_ADDR(r),__func__);
1278 if (! chxj_open_mysql_handle(r, m)) {
1279 ERR(r, "Cannot open mysql connection");
1280 DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
1283 if (!chxj_mysql_exist_cookie_table_expire(r, m)) {
1284 DBG(r,"REQ[%X] not found cookie table:[%s_expire]", TO_ADDR(r),m->mysql.tablename);
1285 if (!chxj_mysql_create_cookie_expire_table(r, m)) {
1286 ERR(r, "cannot create cookie table:[%s_expire]", m->mysql.tablename);
1287 DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
1291 apr_snprintf(query, sizeof(query)-1, "LOCK TABLES %s WRITE", m->mysql.tablename);
1292 DBG(r,"REQ[%X] query:[%s]", TO_ADDR(r),query);
1293 if (mysql_query(connection.handle, query) != 0) {
1294 chxj_mysql_rollback(r, m);
1295 ERR(r, "MySQL WARN: %s: %s", mysql_error(connection.handle), r->uri);
1299 result = mysql_store_result(connection.handle);
1300 if (result) mysql_free_result(result);
1302 DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
1308 chxj_cookie_unlock_mysql(request_rec *r, mod_chxj_config *UNUSED(m))
1310 char query[MAX_STRING_LEN];
1311 if (r) DBG(r, "REQ[%X] start %s()",TO_ADDR(r),__func__);
1312 apr_snprintf(query, sizeof(query)-1, "UNLOCK TABLES");
1313 if (mysql_query(connection.handle, query) != 0) {
1315 ERR(r, "MySQL WARN: %s: %s", mysql_error(connection.handle), r->uri);
1316 DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);
1320 if (r) DBG(r,"REQ[%X] end %s()",TO_ADDR(r),__func__);