aboutsummaryrefslogtreecommitdiff
path: root/src/mysql.c
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2018-01-30 23:00:05 +0200
committerSergey Poznyakoff <gray@gnu.org.ua>2018-01-30 23:06:11 +0200
commit4fef83230e851189fd3541f095c47a952968a411 (patch)
tree021413ec3602ca4d0e0a0ee0f588d0a2782155ae /src/mysql.c
parente946449ccf15a0f44f402b03812d31d5f8ef4f7b (diff)
downloadvmod-dbrw-4fef83230e851189fd3541f095c47a952968a411.tar.gz
vmod-dbrw-4fef83230e851189fd3541f095c47a952968a411.tar.bz2
Introduce connection idle timeout.
* NEWS: Updated. * configure.ac: Version 2.2.90 * doc/vmod-dbrw.3: Document connection idle timeout. * doc/vmod-dbrw.texi: Likewise. * src/dbrw.h (dbrw_backend) <sql_idle_timeout>: New method. (dbrw_config)<idle_timeout>: New member. (dbrw_connection)<timestamp>: New member. (sql_idle_timeout): New proto. * src/mysql.c (vmod_mysql_data) <mysql>: Change storage. All uses changed. (s_mysql_idle_timeout): New function. * src/sql.c (sql_idle_timeout): New function. (sql_query): Update connection timestamp. (sql_idle_timeout): New function. * src/vmod_dbrw.c (dbrw_connection_get): Force disconnect if connection remained idle for too long. Initialize cfg->idle_timeout. (vmod_config): New parameter 'timeout='
Diffstat (limited to 'src/mysql.c')
-rw-r--r--src/mysql.c68
1 files changed, 40 insertions, 28 deletions
diff --git a/src/mysql.c b/src/mysql.c
index d7406ca..d97200a 100644
--- a/src/mysql.c
+++ b/src/mysql.c
@@ -1,5 +1,5 @@
/* This file is part of vmod-dbrw
- Copyright (C) 2013-2014 Sergey Poznyakoff
+ Copyright (C) 2013-2018 Sergey Poznyakoff
Vmod-dbrw is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -21,7 +21,7 @@
struct vmod_mysql_data
{
- MYSQL *mysql;
+ MYSQL mysql;
MYSQL_RES *result;
char *buffer;
size_t bufsize;
@@ -33,12 +33,12 @@ check_errno(struct dbrw_connection *conn)
{
struct vmod_mysql_data *mp = conn->data;
- switch (mysql_errno(mp->mysql)) {
+ switch (mysql_errno(&mp->mysql)) {
case CR_SERVER_GONE_ERROR:
case CR_SERVER_LOST:
case ER_SERVER_SHUTDOWN:
case ER_ABORTING_CONNECTION:
- dbrw_error("query failed: %s", mysql_error(mp->mysql));
+ dbrw_error("query failed: %s", mysql_error(&mp->mysql));
sql_disconnect(conn);
if (conn->state == state_error) {
conn->state = state_disabled;
@@ -58,13 +58,13 @@ check_errno(struct dbrw_connection *conn)
case ER_FIELD_SPECIFIED_TWICE:
case ER_NO_SUCH_TABLE:
case ER_NOT_ALLOWED_COMMAND:
- dbrw_error("query failed: %s", mysql_error(mp->mysql));
+ dbrw_error("query failed: %s", mysql_error(&mp->mysql));
dbrw_error("disabling MySQL connection");
sql_disconnect(conn);
conn->state = state_disabled;
break;
default:
- dbrw_error("query failed: %s", mysql_error(mp->mysql));
+ dbrw_error("query failed: %s", mysql_error(&mp->mysql));
}
}
@@ -88,7 +88,6 @@ s_mysql_destroy(struct dbrw_connection *conn)
{
struct vmod_mysql_data *mp = conn->data;
free(mp->buffer);
- free(mp->mysql);
free(mp);
conn->data = NULL;
}
@@ -102,14 +101,7 @@ s_mysql_connect(struct dbrw_connection *conn)
char *s;
int port = 0;
- mp->mysql = malloc(sizeof(MYSQL));
- if (!mp->mysql) {
- dbrw_error("not enough memory");
- conn->state = state_disabled;
- return -1;
- }
-
- mysql_init(mp->mysql);
+ mysql_init(&mp->mysql);
host = findparam(conn->conf->param, "server");
if (host && host[0] == '/') {
@@ -123,17 +115,17 @@ s_mysql_connect(struct dbrw_connection *conn)
s = findparam(conn->conf->param, "config");
if (s)
- mysql_options(mp->mysql, MYSQL_READ_DEFAULT_FILE, s);
+ mysql_options(&mp->mysql, MYSQL_READ_DEFAULT_FILE, s);
s = findparam(conn->conf->param, "group");
if (s)
- mysql_options(mp->mysql, MYSQL_READ_DEFAULT_GROUP, s);
+ mysql_options(&mp->mysql, MYSQL_READ_DEFAULT_GROUP, s);
s = findparam(conn->conf->param, "cacert");
if (s)
- mysql_ssl_set(mp->mysql, NULL, NULL, s, NULL, NULL);
+ mysql_ssl_set(&mp->mysql, NULL, NULL, s, NULL, NULL);
debug(conn->conf, 1, ("connecting to database"));
- if (!mysql_real_connect(mp->mysql,
+ if (!mysql_real_connect(&mp->mysql,
host,
findparam(conn->conf->param, "user"),
findparam(conn->conf->param, "password"),
@@ -141,7 +133,7 @@ s_mysql_connect(struct dbrw_connection *conn)
port,
socket_name,
CLIENT_MULTI_RESULTS)) {
- dbrw_error("cannot connect: %s", mysql_error(mp->mysql));
+ dbrw_error("cannot connect: %s", mysql_error(&mp->mysql));
return -1;
}
debug(conn->conf, 1, ("connected to database"));
@@ -153,7 +145,7 @@ static int
s_mysql_disconnect(struct dbrw_connection *conn)
{
struct vmod_mysql_data *mp = conn->data;
- mysql_close(mp->mysql);
+ mysql_close(&mp->mysql);
return 0;
}
@@ -166,8 +158,7 @@ s_mysql_query(struct dbrw_connection *conn, const char *query)
MYSQL *mysql;
for (i = 0; i < 10; i++) {
- mysql = mp->mysql;
- rc = mysql_query(mysql, query);
+ rc = mysql_query(&mp->mysql, query);
if (rc) {
check_errno(conn);
if (conn->state != state_init)
@@ -177,13 +168,13 @@ s_mysql_query(struct dbrw_connection *conn, const char *query)
return -1;
continue;
}
- mp->result = mysql_store_result(mp->mysql);
+ mp->result = mysql_store_result(&mp->mysql);
if (mp->result) {
conn->state = state_result;
rc = 0;
- } else if (mysql_field_count(mp->mysql)) {
+ } else if (mysql_field_count(&mp->mysql)) {
dbrw_error("cannot store result: %s",
- mysql_error(mp->mysql));
+ mysql_error(&mp->mysql));
conn->state = state_error;
rc = 1;
} else
@@ -267,7 +258,7 @@ s_mysql_escape (struct dbrw_connection *conn, const char *arg)
mp->bufsize = size;
}
- mysql_real_escape_string(mp->mysql, mp->buffer, arg, len);
+ mysql_real_escape_string(&mp->mysql, mp->buffer, arg, len);
p = strdup(mp->buffer);
if (!p)
@@ -275,6 +266,26 @@ s_mysql_escape (struct dbrw_connection *conn, const char *arg)
return p;
}
+static int
+s_mysql_idle_timeout(struct dbrw_connection *conn)
+{
+ const char *res;
+ int n;
+ if (sql_connect(conn) || conn->state != state_connected)
+ return -1;
+ if (sql_query(conn,
+ "SHOW VARIABLES WHERE Variable_name = 'wait_timeout'"))
+ return -1;
+ res = sql_get_column(conn, 0, 1);
+ if (res)
+ n = atoi(res);
+ else
+ n = -1;
+ sql_free_result(conn);
+ return n;
+}
+
+
struct dbrw_backend mysql_backend = {
"mysql",
s_mysql_init,
@@ -286,5 +297,6 @@ struct dbrw_backend mysql_backend = {
s_mysql_num_tuples,
s_mysql_num_fields,
s_mysql_free_result,
- s_mysql_get_column
+ s_mysql_get_column,
+ s_mysql_idle_timeout
};

Return to:

Send suggestions and report system problems to the System administrator.