2 * Copyright (C) 2005-2008 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 (1)
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) {
90 if (mysql_select_db(connection.handle,m->mysql.database) != 0) {
91 ERR(r, "MySQL ERROR: %s", mysql_error(connection.handle));
95 strcpy (connection.database, m->mysql.database);
101 chxj_close_mysql_handle();
105 connection.handle = mysql_init(&mysql_conn);
106 if (! connection.handle) {
107 ERR(r, "MySQL ERROR: %s", mysql_error(&mysql_conn));
110 if (!m->mysql.host || strcmp(m->mysql.host,"localhost") == 0) {
111 connection.host[0] = '\0';
113 strcpy(connection.host, m->mysql.host);
116 connection.handle = mysql_real_connect(&mysql_conn,connection.host,m->mysql.username,
117 m->mysql.password, NULL, m->mysql.port, m->mysql.socket_path, 0);
118 if (!connection.handle) {
119 ERR(r, "MySQL ERROR: %s. host:[%s] username:[%s] password:[%s] port:[%d] socket_path:[%s]", mysql_error(&mysql_conn),
124 m->mysql.socket_path);
128 if (!m->mysql.keep_alive) {
129 apr_pool_cleanup_register(r->pool, (void *)NULL, _mysql_cleanup, _mysql_cleanup_child);
132 if (m->mysql.username) {
133 strcpy(connection.username, m->mysql.username);
136 connection.username[0] = '\0';
139 if (mysql_select_db(connection.handle,m->mysql.database) != 0) {
140 ERR(r, "MySQL ERROR: %s", mysql_error(connection.handle));
144 strcpy (connection.database, m->mysql.database);
145 if (m->mysql.charset) {
146 apr_snprintf(query, sizeof(query)-1, "SET CHARACTER SET %s", m->mysql.charset);
147 if (mysql_query(connection.handle, query) != 0) {
148 ERR(r, "MySQL ERROR: %s: %s", mysql_error(connection.handle), r->uri);
158 chxj_mysql_exist_cookie_table(request_rec *r, mod_chxj_config *m)
161 char query[MAX_STRING_LEN];
163 apr_snprintf(query, sizeof(query)-1, "desc %s", m->mysql.tablename);
164 DBG(r, "start chxj_mysql_exist_cookie_table() query:[%s]", query);
166 if (!chxj_open_mysql_handle(r, m)) {
167 ERR(r, "failed chxj_open_mysql_handle() query:[%s]", query);
170 connection.reconnect = 0;
171 if (mysql_query(connection.handle, query) != 0) {
172 if (mysql_errno(connection.handle) == CR_SERVER_GONE_ERROR) {
173 connection.reconnect = 1;
174 sleep(CHXJ_MYSQL_RECONNECT_WAIT_TIME);
177 WRN(r, "MySQL WARN: %s: %s", mysql_error(connection.handle), r->uri);
183 result = mysql_store_result(connection.handle);
184 if (result) mysql_free_result(result);
186 DBG(r, "end chxj_mysql_exist_cookie_table() query:[%s]", query);
193 chxj_mysql_exist_cookie_table_expire(request_rec *r, mod_chxj_config *m)
196 char query[MAX_STRING_LEN];
198 apr_snprintf(query, sizeof(query)-1, "desc %s_expire", m->mysql.tablename);
200 DBG(r, "start chxj_mysql_exist_cookie_table_expire() query:[%s]", query);
203 if (!chxj_open_mysql_handle(r, m)) {
204 ERR(r, "failed chxj_open_mysql_handle() query:[%s]", query);
207 connection.reconnect = 0;
208 if (mysql_query(connection.handle, query) != 0) {
209 if (mysql_errno(connection.handle) == CR_SERVER_GONE_ERROR) {
210 connection.reconnect = 1;
211 sleep(CHXJ_MYSQL_RECONNECT_WAIT_TIME);
214 WRN(r, "MySQL WARN: %s: %s", mysql_error(connection.handle), r->uri);
219 result = mysql_store_result(connection.handle);
220 if (result) mysql_free_result(result);
222 DBG(r, "end chxj_mysql_exist_cookie_table_expire() query:[%s]", query);
229 chxj_mysql_create_cookie_table(request_rec *r, mod_chxj_config *m)
232 char query[MAX_STRING_LEN];
234 apr_snprintf(query, sizeof(query)-1, "CREATE TABLE %s (cookie_id VARCHAR(%d) NOT NULL, data TEXT, PRIMARY KEY(cookie_id)) TYPE=InnoDB;",
236 apr_base64_encode_len(APR_MD5_DIGESTSIZE) * 3);
237 DBG(r, "start chxj_mysql_create_cookie_table() query:[%s]", query);
239 if (!chxj_open_mysql_handle(r, m)) {
240 ERR(r, "failed chxj_open_mysql_handle() query:[%s]", query);
243 connection.reconnect = 0;
244 if (mysql_query(connection.handle, query) != 0) {
245 if (mysql_errno(connection.handle) == CR_SERVER_GONE_ERROR) {
246 connection.reconnect = 1;
247 sleep(CHXJ_MYSQL_RECONNECT_WAIT_TIME);
250 WRN(r, "MySQL WARN: %s: %s", mysql_error(connection.handle), r->uri);
256 result = mysql_store_result(connection.handle);
257 if (result) mysql_free_result(result);
259 DBG(r, "end chxj_mysql_create_cookie_table() query:[%s]", query);
265 chxj_mysql_create_cookie_expire_table(request_rec *r, mod_chxj_config *m)
268 char query[MAX_STRING_LEN];
270 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;",
272 apr_base64_encode_len(APR_MD5_DIGESTSIZE) * 3);
274 DBG(r, "start chxj_mysql_create_cookie_expire_table() query:[%s]", query);
277 if (!chxj_open_mysql_handle(r, m)) {
278 ERR(r, "failed chxj_open_mysql_handle() query:[%s]", query);
281 connection.reconnect = 0;
282 if (mysql_query(connection.handle, query) != 0) {
283 if (mysql_errno(connection.handle) == CR_SERVER_GONE_ERROR) {
284 connection.reconnect = 1;
285 sleep(CHXJ_MYSQL_RECONNECT_WAIT_TIME);
288 WRN(r, "MySQL WARN: %s: %s", mysql_error(connection.handle), r->uri);
294 result = mysql_store_result(connection.handle);
295 if (result) mysql_free_result(result);
297 DBG(r, "end chxj_mysql_create_cookie_expire_table() query:[%s]", query);
304 chxj_mysql_get_cookie_from_cookie_id(request_rec *r, mod_chxj_config *m, const char *cookie_id)
307 char query[MAX_STRING_LEN];
309 apr_size_t clen = strlen(cookie_id);
310 char *sql_safe_cookie_id = apr_palloc(r->pool, clen*2+1);
312 mysql_escape_string(sql_safe_cookie_id,cookie_id,clen);
314 apr_snprintf(query, sizeof(query)-1, "SELECT data, length(data) FROM %s WHERE cookie_id = '%s' FOR UPDATE;", m->mysql.tablename, sql_safe_cookie_id);
315 DBG(r, "start chxj_mysql_get_cookie_from_cookie_id() query:[%s]", query);
317 if (!chxj_open_mysql_handle(r, m)) {
318 ERR(r, "failed chxj_open_mysql_handle() query:[%s]", query);
321 connection.reconnect = 0;
322 if (mysql_query(connection.handle, query) != 0) {
323 if (mysql_errno(connection.handle) == CR_SERVER_GONE_ERROR) {
324 connection.reconnect = 1;
325 sleep(CHXJ_MYSQL_RECONNECT_WAIT_TIME);
328 WRN(r, "MySQL WARN: %s: %s", mysql_error(connection.handle), r->uri);
334 result = mysql_store_result(connection.handle);
335 if (result && (mysql_num_rows(result) >= 1)) {
336 MYSQL_ROW data = mysql_fetch_row(result);
339 ERR(r, "MySQL cookie_id:[%s] has no valid cookie_id. %s", cookie_id, r->uri);
340 mysql_free_result(result);
344 retval = (char *) apr_palloc(r->pool, len + 1);
345 memcpy(retval, data[0], len);
347 if (result) mysql_free_result(result);
349 DBG(r, "end chxj_mysql_get_cookie_from_cookie_id() query:[%s]", query);
356 chxj_mysql_get_cookie_expire_from_cookie_id(request_rec *r, mod_chxj_config *m, const char *cookie_id)
359 char query[MAX_STRING_LEN];
360 apr_size_t clen = strlen(cookie_id);
362 char *sql_safe_cookie_id = apr_palloc(r->pool, clen*2+1);
364 mysql_escape_string(sql_safe_cookie_id,cookie_id,clen);
366 apr_snprintf(query, sizeof(query)-1, "SELECT DATE_FORMAT(created_at, '%%Y%%m%%d%%H%%i%%s') FROM %s_expire WHERE cookie_id = '%s' FOR UPDATE;",
367 m->mysql.tablename, sql_safe_cookie_id);
369 DBG(r, "start chxj_mysql_get_cookie_expire_from_cookie_id() query:[%s]", query);
372 if (!chxj_open_mysql_handle(r, m)) {
373 ERR(r, "failed chxj_open_mysql_handle() query:[%s]", query);
376 connection.reconnect = 0;
377 if (mysql_query(connection.handle, query) != 0) {
378 if (mysql_errno(connection.handle) == CR_SERVER_GONE_ERROR) {
379 connection.reconnect = 1;
380 sleep(CHXJ_MYSQL_RECONNECT_WAIT_TIME);
383 WRN(r, "MySQL WARN: %s: %s", mysql_error(connection.handle), r->uri);
389 result = mysql_store_result(connection.handle);
390 if (result && (mysql_num_rows(result) >= 1)) {
391 MYSQL_ROW data = mysql_fetch_row(result);
393 ERR(r, "MySQL cookie_id:[%s] has no valid cookie_id. %s", cookie_id, r->uri);
394 mysql_free_result(result);
397 retval = (char *) apr_palloc(r->pool, 19 + 1);
398 memset(retval, 0, 19+1);
399 memcpy(retval, data[0], 19);
401 if (result) mysql_free_result(result);
403 DBG(r, "end chxj_mysql_get_cookie_expire_from_cookie_id() query:[%s]", query);
410 chxj_mysql_insert_or_update_cookie(request_rec *r, mod_chxj_config *m, const char *cookie_id, const char *data)
413 char query[MAX_STRING_LEN];
414 char *cid = ap_escape_logitem(r->pool, cookie_id);
415 char *cdt = ap_escape_logitem(r->pool, data);
417 DBG(r, "start chxj_mysql_insert_or_update_cookie()");
419 if (!chxj_open_mysql_handle(r, m)) {
420 ERR(r, "failed chxj_open_mysql_handle()");
423 connection.reconnect = 0;
424 apr_snprintf(query, sizeof(query)-1, "BEGIN;");
425 DBG(r, "query:[%s]", query);
426 if (mysql_query(connection.handle, query) != 0) {
427 if (mysql_errno(connection.handle) == CR_SERVER_GONE_ERROR) {
428 connection.reconnect = 1;
429 sleep(CHXJ_MYSQL_RECONNECT_WAIT_TIME);
432 ERR(r, "MySQL WARN: %s: %s", mysql_error(connection.handle), r->uri);
438 apr_snprintf(query, sizeof(query)-1, "INSERT INTO %s (cookie_id, data) VALUES ('%s','%s');", m->mysql.tablename, cid, cdt);
439 DBG(r, "query:[%s]", query);
440 if (mysql_query(connection.handle, query) != 0) {
441 WRN(r, "MySQL WARN: %s: %s", mysql_error(connection.handle), r->uri);
442 if (!chxj_mysql_get_cookie_from_cookie_id(r, m, cookie_id)) {
443 ERR(r, "failed chxj_mysql_get_cookie_from_cookie_id() cookie_id:[%s]", cookie_id);
446 apr_snprintf(query, sizeof(query)-1, "UPDATE %s set data = '%s' WHERE cookie_id = '%s';", m->mysql.tablename, cdt, cid);
447 DBG(r, "query:[%s]", query);
448 if (mysql_query(connection.handle, query) != 0) {
449 ERR(r, "MySQL WARN: %s: %s", mysql_error(connection.handle), r->uri);
450 chxj_mysql_rollback(r, m);
455 apr_snprintf(query, sizeof(query)-1, "COMMIT;");
456 DBG(r, "query:[%s]", query);
457 if (mysql_query(connection.handle, query) != 0) {
458 ERR(r, "MySQL WARN: %s: %s", mysql_error(connection.handle), r->uri);
459 chxj_mysql_rollback(r, m);
463 result = mysql_store_result(connection.handle);
464 if (result) mysql_free_result(result);
466 DBG(r, "end chxj_mysql_get_cookie_from_cookie_id()");
473 chxj_mysql_insert_or_update_cookie_expire(request_rec *r, mod_chxj_config *m, const char *cookie_id)
476 char query[MAX_STRING_LEN];
477 char *cid = ap_escape_logitem(r->pool, cookie_id);
479 DBG(r, "start chxj_mysql_insert_or_update_cookie_expire()");
482 if (!chxj_open_mysql_handle(r, m)) {
483 ERR(r, "failed chxj_open_mysql_handle()");
486 connection.reconnect = 0;
487 apr_snprintf(query, sizeof(query)-1, "BEGIN;");
488 DBG(r, "query:[%s]", query);
489 if (mysql_query(connection.handle, query) != 0) {
490 if (mysql_errno(connection.handle) == CR_SERVER_GONE_ERROR) {
491 connection.reconnect = 1;
492 sleep(CHXJ_MYSQL_RECONNECT_WAIT_TIME);
495 ERR(r, "MySQL WARN: %s: %s", mysql_error(connection.handle), r->uri);
501 apr_snprintf(query, sizeof(query)-1, "INSERT INTO %s_expire (cookie_id, created_at) VALUES ('%s',localtime);", m->mysql.tablename, cid);
502 DBG(r, "query:[%s]", query);
503 if (mysql_query(connection.handle, query) != 0) {
504 WRN(r, "MySQL WARN: %s: %s", mysql_error(connection.handle), r->uri);
505 if (!chxj_mysql_get_cookie_from_cookie_id(r, m, cookie_id)) {
506 ERR(r, "failed chxj_mysql_get_cookie_from_cookie_id() cookie_id:[%s]", cookie_id);
509 apr_snprintf(query, sizeof(query)-1, "UPDATE %s_expire set created_at = localtime WHERE cookie_id = '%s';", m->mysql.tablename, cid);
510 DBG(r, "query:[%s]", query);
511 if (mysql_query(connection.handle, query) != 0) {
512 ERR(r, "MySQL WARN: %s: %s", mysql_error(connection.handle), r->uri);
513 chxj_mysql_rollback(r, m);
518 apr_snprintf(query, sizeof(query)-1, "COMMIT;");
519 DBG(r, "query:[%s]", query);
520 if (mysql_query(connection.handle, query) != 0) {
521 ERR(r, "MySQL WARN: %s: %s", mysql_error(connection.handle), r->uri);
522 chxj_mysql_rollback(r, m);
526 result = mysql_store_result(connection.handle);
527 if (result) mysql_free_result(result);
529 DBG(r, "end chxj_mysql_insert_or_update_cookie_expire()");
536 chxj_mysql_rollback(request_rec *r, mod_chxj_config *m)
538 char query[MAX_STRING_LEN];
540 DBG(r, "start chxj_mysql_rollback()");
542 apr_snprintf(query, sizeof(query)-1, "ROLLBACK;");
544 if (!chxj_open_mysql_handle(r, m)) {
547 if (mysql_query(connection.handle, query) != 0) {
548 ERR(r, "MySQL ERROR: %s: %s", mysql_error(connection.handle), r->uri);
549 return 0; /* FALSE */
551 DBG(r, "end chxj_mysql_rollback()");
556 chxj_mysql_load_cookie(request_rec *r, mod_chxj_config *m, const char *cookie_id)
559 char query[MAX_STRING_LEN];
560 apr_size_t clen = strlen(cookie_id);
562 char *sql_safe_cookie_id = apr_palloc(r->pool, clen*2+1);
564 mysql_escape_string(sql_safe_cookie_id,cookie_id,clen);
566 apr_snprintf(query, sizeof(query)-1, "SELECT data, length(data) FROM %s WHERE cookie_id = '%s';", m->mysql.tablename, sql_safe_cookie_id);
568 DBG(r, "start chxj_mysql_load_cookie() query:[%s]", query);
571 if (!chxj_open_mysql_handle(r, m)) {
572 ERR(r, "failed chxj_open_mysql_handle() query:[%s]", query);
575 connection.reconnect = 1;
576 if (mysql_query(connection.handle, query) != 0) {
577 if (mysql_errno(connection.handle) == CR_SERVER_GONE_ERROR) {
578 connection.reconnect = 1;
579 sleep(CHXJ_MYSQL_RECONNECT_WAIT_TIME);
582 WRN(r, "MySQL WARN: %s: %s", mysql_error(connection.handle), r->uri);
588 result = mysql_store_result(connection.handle);
589 if (result && (mysql_num_rows(result) >= 1)) {
590 MYSQL_ROW data = mysql_fetch_row(result);
593 ERR(r, "MySQL cookie_id:[%s] has no valid cookie_id. %s", cookie_id, r->uri);
594 mysql_free_result(result);
598 retval = (char *) apr_palloc(r->pool, len + 1);
599 memcpy(retval, data[0], len);
601 if (result) mysql_free_result(result);
603 DBG(r, "end chxj_load_mysql_cookie() query:[%s]", query);
610 chxj_mysql_load_cookie_expire(request_rec *r, mod_chxj_config *m, const char *cookie_id)
613 char query[MAX_STRING_LEN];
615 apr_size_t clen = strlen(cookie_id);
616 char *sql_safe_cookie_id = apr_palloc(r->pool, clen*2+1);
618 mysql_escape_string(sql_safe_cookie_id,cookie_id,clen);
622 "SELECT DATE_FORMAT(created_at, '%%Y%%m%%d%%H%%i%%s') FROM %s_expire WHERE cookie_id = '%s';",
626 DBG(r, "start chxj_mysql_load_cookie_expire() query:[%s]", query);
629 if (!chxj_open_mysql_handle(r, m)) {
630 ERR(r, "failed chxj_open_mysql_handle() query:[%s]", query);
633 connection.reconnect = 0;
634 if (mysql_query(connection.handle, query) != 0) {
635 if (mysql_errno(connection.handle) == CR_SERVER_GONE_ERROR) {
636 connection.reconnect = 1;
637 sleep(CHXJ_MYSQL_RECONNECT_WAIT_TIME);
640 WRN(r, "MySQL WARN: %s: %s", mysql_error(connection.handle), r->uri);
646 result = mysql_store_result(connection.handle);
647 if (result && (mysql_num_rows(result) >= 1)) {
648 MYSQL_ROW data = mysql_fetch_row(result);
650 ERR(r, "MySQL cookie_id:[%s] has no valid cookie_id. %s", cookie_id, r->uri);
651 mysql_free_result(result);
654 retval = (char *) apr_palloc(r->pool, 14 + 1);
655 memcpy(retval, data[0], 14);
657 if (result) mysql_free_result(result);
659 DBG(r, "end chxj_mysql_load_cookie_expire() query:[%s]", query);
666 chxj_mysql_delete_cookie(request_rec *r, mod_chxj_config *m, const char *cookie_id)
669 char query[MAX_STRING_LEN];
670 char *cid = ap_escape_logitem(r->pool, cookie_id);
672 DBG(r, "start chxj_mysql_delete_cookie() cookie_id:[%s]", cookie_id);
675 if (!chxj_open_mysql_handle(r, m)) {
676 ERR(r, "failed chxj_open_mysql_handle()");
679 connection.reconnect = 0;
680 apr_snprintf(query, sizeof(query)-1, "BEGIN;");
681 DBG(r, "query:[%s]", query);
682 if (mysql_query(connection.handle, query) != 0) {
683 if (mysql_errno(connection.handle) == CR_SERVER_GONE_ERROR) {
684 connection.reconnect = 1;
685 sleep(CHXJ_MYSQL_RECONNECT_WAIT_TIME);
688 ERR(r, "MySQL WARN: %s: %s", mysql_error(connection.handle), r->uri);
694 if (!chxj_mysql_get_cookie_from_cookie_id(r, m, cookie_id)) {
695 ERR(r, "failed chxj_mysql_get_cookie_from_cookie_id() cookie_id:[%s]", cookie_id);
698 apr_snprintf(query, sizeof(query)-1, "DELETE FROM %s WHERE cookie_id = '%s';", m->mysql.tablename, cid);
699 DBG(r, "query:[%s]", query);
700 if (mysql_query(connection.handle, query) != 0) {
701 ERR(r, "MySQL WARN: %s: %s", mysql_error(connection.handle), r->uri);
702 chxj_mysql_rollback(r, m);
706 apr_snprintf(query, sizeof(query)-1, "COMMIT;");
707 DBG(r, "query:[%s]", query);
708 if (mysql_query(connection.handle, query) != 0) {
709 ERR(r, "MySQL WARN: %s: %s", mysql_error(connection.handle), r->uri);
710 chxj_mysql_rollback(r, m);
714 result = mysql_store_result(connection.handle);
715 if (result) mysql_free_result(result);
717 DBG(r, "end chxj_mysql_delete_cookie()");
724 chxj_mysql_delete_cookie_expire(request_rec *r, mod_chxj_config *m, const char *cookie_id)
727 char query[MAX_STRING_LEN];
728 char *cid = ap_escape_logitem(r->pool, cookie_id);
730 DBG(r, "start chxj_mysql_delete_cookie_expire() cookie_id:[%s]", cookie_id);
733 if (!chxj_open_mysql_handle(r, m)) {
734 ERR(r, "failed chxj_open_mysql_handle()");
737 connection.reconnect = 0;
738 apr_snprintf(query, sizeof(query)-1, "BEGIN;");
739 DBG(r, "query:[%s]", query);
740 if (mysql_query(connection.handle, query) != 0) {
741 if (mysql_errno(connection.handle) == CR_SERVER_GONE_ERROR) {
742 connection.reconnect = 1;
743 sleep(CHXJ_MYSQL_RECONNECT_WAIT_TIME);
746 ERR(r, "MySQL WARN: %s: %s", mysql_error(connection.handle), r->uri);
752 if (!chxj_mysql_get_cookie_expire_from_cookie_id(r, m, cookie_id)) {
753 ERR(r, "failed chxj_mysql_get_cookie_expire_from_cookie_id() cookie_id:[%s]", cookie_id);
756 apr_snprintf(query, sizeof(query)-1, "DELETE FROM %s_expire WHERE cookie_id = '%s';", m->mysql.tablename, cid);
757 DBG(r, "query:[%s]", query);
758 if (mysql_query(connection.handle, query) != 0) {
759 ERR(r, "MySQL WARN: %s: %s", mysql_error(connection.handle), r->uri);
760 chxj_mysql_rollback(r, m);
764 apr_snprintf(query, sizeof(query)-1, "COMMIT;");
765 DBG(r, "query:[%s]", query);
766 if (mysql_query(connection.handle, query) != 0) {
767 ERR(r, "MySQL WARN: %s: %s", mysql_error(connection.handle), r->uri);
768 chxj_mysql_rollback(r, m);
772 result = mysql_store_result(connection.handle);
773 if (result) mysql_free_result(result);
775 DBG(r, "end chxj_mysql_delete_cookie_expire() cookie_id:[%s]", cookie_id);
781 chxj_mysql_get_timeout_localtime(request_rec *r, mod_chxj_config *m)
784 char query[MAX_STRING_LEN];
787 DBG(r, "start chxj_mysql_get_timeout_localtime()");
789 if (!chxj_open_mysql_handle(r, m)) {
790 ERR(r, "failed chxj_open_mysql_handle()");
793 connection.reconnect = 0;
795 apr_snprintf(query, sizeof(query)-1, "SELECT DATE_SUB(localtime, interval %ld second);",
796 (m->cookie_timeout == 0) ? DEFAULT_COOKIE_TIMEOUT : m->cookie_timeout);
797 DBG(r, "query:[%s]", query);
798 if (mysql_query(connection.handle, query) != 0) {
799 if (mysql_errno(connection.handle) == CR_SERVER_GONE_ERROR) {
800 connection.reconnect = 1;
801 sleep(CHXJ_MYSQL_RECONNECT_WAIT_TIME);
804 ERR(r, "MySQL WARN: %s: %s", mysql_error(connection.handle), r->uri);
809 result = mysql_store_result(connection.handle);
810 if (result && (mysql_num_rows(result) >= 1)) {
811 MYSQL_ROW data = mysql_fetch_row(result);
813 ERR(r, "MySQL ERROR: %s: %s", mysql_error(connection.handle), r->uri);
814 mysql_free_result(result);
817 retval = (char *) apr_palloc(r->pool, 19 + 1);
818 memset(retval, 0, 19+1);
819 memcpy(retval, data[0], 19);
821 if (result) mysql_free_result(result);
823 DBG(r, "end chxj_mysql_get_timeout_localtime()");
829 chxj_mysql_delete_expired_cookie(request_rec *r, mod_chxj_config *m)
832 char query[MAX_STRING_LEN];
834 DBG(r, "start chxj_mysql_delete_expired_cookie()");
837 if (!chxj_open_mysql_handle(r, m)) {
838 ERR(r, "failed chxj_open_mysql_handle()");
841 connection.reconnect = 0;
842 apr_snprintf(query, sizeof(query)-1, "BEGIN;");
843 DBG(r, "query:[%s]", query);
844 if (mysql_query(connection.handle, query) != 0) {
845 if (mysql_errno(connection.handle) == CR_SERVER_GONE_ERROR) {
846 connection.reconnect = 1;
847 sleep(CHXJ_MYSQL_RECONNECT_WAIT_TIME);
850 ERR(r, "MySQL ERROR: %s: %s", mysql_error(connection.handle), r->uri);
856 timeout = chxj_mysql_get_timeout_localtime(r, m);
858 ERR(r, "MySQL ERROR: %s: %s", mysql_error(connection.handle), r->uri);
862 apr_snprintf(query, sizeof(query)-1, "SELECT * FROM %s_expire WHERE created_at <= '%s'", m->mysql.tablename, timeout);
863 DBG(r, "query:[%s]", query);
864 if (mysql_query(connection.handle, query) != 0) {
865 ERR(r, "MySQL WARN: %s: %s", mysql_error(connection.handle), r->uri);
866 chxj_mysql_rollback(r, m);
869 result = mysql_store_result(connection.handle);
870 if (result) mysql_free_result(result);
873 /* delete from chxj_cookie */
874 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;",
882 DBG(r, "query:[%s]", query);
883 if (mysql_query(connection.handle, query) != 0) {
884 ERR(r, "MySQL ERROR: %s: %s", mysql_error(connection.handle), r->uri);
885 chxj_mysql_rollback(r, m);
888 result = mysql_store_result(connection.handle);
889 if (result) mysql_free_result(result);
892 /* delete from chxj_cookie_expire */
893 apr_snprintf(query, sizeof(query)-1, "DELETE %s_expire FROM %s_expire WHERE %s_expire.created_at <= '%s';",
898 DBG(r, "query:[%s]", query);
899 if (mysql_query(connection.handle, query) != 0) {
900 ERR(r, "MySQL ERROR: %s: %s", mysql_error(connection.handle), r->uri);
901 chxj_mysql_rollback(r, m);
904 result = mysql_store_result(connection.handle);
905 if (result) mysql_free_result(result);
908 apr_snprintf(query, sizeof(query)-1, "COMMIT;");
909 DBG(r, "query:[%s]", query);
910 if (mysql_query(connection.handle, query) != 0) {
911 ERR(r, "MySQL WARN: %s: %s", mysql_error(connection.handle), r->uri);
912 chxj_mysql_rollback(r, m);
916 result = mysql_store_result(connection.handle);
917 if (result) mysql_free_result(result);
919 DBG(r, "end chxj_mysql_delete_expired_cookie()");
925 chxj_save_cookie_mysql(request_rec *r, mod_chxj_config *m, const char *cookie_id, const char *store_string)
927 if (! chxj_open_mysql_handle(r, m)) {
928 ERR(r, "Cannot open mysql connection");
932 if (!chxj_mysql_exist_cookie_table(r, m)) {
933 DBG(r, "not found cookie table:[%s]", m->mysql.tablename);
934 if (!chxj_mysql_create_cookie_table(r, m)) {
935 ERR(r, "cannot create cookie table:[%s]", m->mysql.tablename);
939 if (! chxj_mysql_insert_or_update_cookie(r, m, cookie_id, store_string)) {
940 ERR(r, "cannot store to cookie table:[%s]", m->mysql.tablename);
944 /* *NEED NOT* close database. */
949 chxj_update_cookie_mysql(request_rec *r, mod_chxj_config *m, const char *cookie_id, const char *store_string)
951 DBG(r, "start chxj_update_cookie_mysql() cookie_id:[%s]", cookie_id);
952 if (! chxj_open_mysql_handle(r, m)) {
953 ERR(r, "Cannot open mysql connection");
954 DBG(r, "end chxj_update_cookie_mysql() cookie_id:[%s]", cookie_id);
958 if (!chxj_mysql_exist_cookie_table(r, m)) {
959 DBG(r, "not found cookie table:[%s]", m->mysql.tablename);
960 if (!chxj_mysql_create_cookie_table(r, m)) {
961 ERR(r, "cannot create cookie table:[%s]", m->mysql.tablename);
962 DBG(r, "end chxj_update_cookie_mysql() cookie_id:[%s]", cookie_id);
966 if (! chxj_mysql_insert_or_update_cookie(r, m, cookie_id, store_string)) {
967 ERR(r, "cannot create cookie table:[%s]", m->mysql.tablename);
968 DBG(r, "end chxj_update_cookie_mysql() cookie_id:[%s]", cookie_id);
972 /* *NEED NOT* close database. */
973 /* chxj_close_mysql_handle(); */
974 DBG(r, "end chxj_update_cookie_mysql() cookie_id:[%s]", cookie_id);
980 chxj_load_cookie_mysql(request_rec *r, mod_chxj_config *m, const char *cookie_id)
984 DBG(r, "start chxj_load_cookie_mysql() cookie_id:[%s]", cookie_id);
985 if (! chxj_open_mysql_handle(r, m)) {
986 ERR(r, "Cannot open mysql connection");
987 DBG(r, "end chxj_load_cookie_mysql() cookie_id:[%s]", cookie_id);
991 if (!chxj_mysql_exist_cookie_table(r, m)) {
992 DBG(r, "not found cookie table:[%s]", m->mysql.tablename);
993 if (!chxj_mysql_create_cookie_table(r, m)) {
994 ERR(r, "cannot create cookie table:[%s]", m->mysql.tablename);
995 DBG(r, "end chxj_load_cookie_mysql() cookie_id:[%s]", cookie_id);
999 if (!(load_string = chxj_mysql_load_cookie(r, m, cookie_id))) {
1000 ERR(r, "not found cookie. cookie_id:[%s]", cookie_id);
1001 DBG(r, "end chxj_load_cookie_mysql() cookie_id:[%s]", cookie_id);
1005 /* *NEED NOT* close database. */
1006 /* chxj_close_mysql_handle(); */
1007 DBG(r, "end chxj_load_cookie_mysql() cookie_id:[%s]", cookie_id);
1013 chxj_delete_cookie_mysql(request_rec *r, mod_chxj_config *m, const char *cookie_id)
1015 DBG(r, "start chxj_delete_cookie_mysql() cookie_id=[%s]", cookie_id);
1016 if (!chxj_mysql_delete_cookie(r, m, cookie_id)) {
1017 ERR(r, "failed: chxj_mysql_delete_cookie() cookie_id:[%s]", cookie_id);
1018 DBG(r, "end chxj_delete_cookie_mysql() cookie_id=[%s]", cookie_id);
1021 DBG(r, "end chxj_delete_cookie_mysql() cookie_id=[%s]", cookie_id);
1027 chxj_save_cookie_expire_mysql(request_rec *r, mod_chxj_config *m, const char *cookie_id)
1029 DBG(r, "start chxj_save_cookie_expire_mysql() cookie_id:[%s]", cookie_id);
1030 if (! chxj_open_mysql_handle(r, m)) {
1031 ERR(r, "Cannot open mysql connection");
1032 DBG(r, "end chxj_save_cookie_expire_mysql()");
1036 if (!chxj_mysql_exist_cookie_table_expire(r, m)) {
1037 DBG(r, "not found cookie table:[%s_expire]", m->mysql.tablename);
1038 if (!chxj_mysql_create_cookie_expire_table(r, m)) {
1039 ERR(r, "cannot create cookie table:[%s_expire]", m->mysql.tablename);
1040 DBG(r, "end chxj_save_cookie_expire_mysql()");
1044 if (! chxj_mysql_insert_or_update_cookie_expire(r, m, cookie_id)) {
1045 ERR(r, "cannot create cookie table:[%s_expire]", m->mysql.tablename);
1046 DBG(r, "end chxj_save_cookie_expire_mysql()");
1050 /* *NEED NOT* close database. */
1051 /* chxj_close_mysql_handle(); */
1053 DBG(r, "end chxj_save_cookie_expire_mysql() cookie_id:[%s]", cookie_id);
1059 chxj_delete_cookie_expire_mysql(request_rec *r, mod_chxj_config *m, const char *cookie_id)
1061 DBG(r, "start chxj_delete_cookie_expire_mysql() cookie_id:[%s]", cookie_id);
1062 if (!chxj_mysql_delete_cookie_expire(r, m, cookie_id)) {
1063 ERR(r, "failed: chxj_mysql_delete_cookie() cookie_id:[%s]", cookie_id);
1064 DBG(r, "end chxj_delete_cookie_expire_mysql() cookie_id:[%s]", cookie_id);
1067 DBG(r, "end chxj_delete_cookie_expire_mysql() cookie_id:[%s]", cookie_id);
1073 chxj_cookie_expire_gc_mysql(request_rec *r, mod_chxj_config *m)
1075 DBG(r, "start chxj_cookie_expire_gc_mysql()");
1076 if (!chxj_mysql_delete_expired_cookie(r, m)) {
1077 ERR(r, "failed: chxj_mysql_delete_expired_cookie()");
1078 DBG(r, "end chxj_cookie_expire_gc_mysql()");
1081 DBG(r, "end chxj_cookie_expire_gc_mysql()");