diff options
Diffstat (limited to 'src/mysql.c')
-rw-r--r-- | src/mysql.c | 68 |
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 @@ | |||
1 | /* This file is part of vmod-dbrw | 1 | /* This file is part of vmod-dbrw |
2 | Copyright (C) 2013-2014 Sergey Poznyakoff | 2 | Copyright (C) 2013-2018 Sergey Poznyakoff |
3 | 3 | ||
4 | Vmod-dbrw is free software; you can redistribute it and/or modify | 4 | Vmod-dbrw is free software; you can redistribute it and/or modify |
5 | it under the terms of the GNU General Public License as published by | 5 | it under the terms of the GNU General Public License as published by |
@@ -21,7 +21,7 @@ | |||
21 | 21 | ||
22 | struct vmod_mysql_data | 22 | struct vmod_mysql_data |
23 | { | 23 | { |
24 | MYSQL *mysql; | 24 | MYSQL mysql; |
25 | MYSQL_RES *result; | 25 | MYSQL_RES *result; |
26 | char *buffer; | 26 | char *buffer; |
27 | size_t bufsize; | 27 | size_t bufsize; |
@@ -33,12 +33,12 @@ check_errno(struct dbrw_connection *conn) | |||
33 | { | 33 | { |
34 | struct vmod_mysql_data *mp = conn->data; | 34 | struct vmod_mysql_data *mp = conn->data; |
35 | 35 | ||
36 | switch (mysql_errno(mp->mysql)) { | 36 | switch (mysql_errno(&mp->mysql)) { |
37 | case CR_SERVER_GONE_ERROR: | 37 | case CR_SERVER_GONE_ERROR: |
38 | case CR_SERVER_LOST: | 38 | case CR_SERVER_LOST: |
39 | case ER_SERVER_SHUTDOWN: | 39 | case ER_SERVER_SHUTDOWN: |
40 | case ER_ABORTING_CONNECTION: | 40 | case ER_ABORTING_CONNECTION: |
41 | dbrw_error("query failed: %s", mysql_error(mp->mysql)); | 41 | dbrw_error("query failed: %s", mysql_error(&mp->mysql)); |
42 | sql_disconnect(conn); | 42 | sql_disconnect(conn); |
43 | if (conn->state == state_error) { | 43 | if (conn->state == state_error) { |
44 | conn->state = state_disabled; | 44 | conn->state = state_disabled; |
@@ -58,13 +58,13 @@ check_errno(struct dbrw_connection *conn) | |||
58 | case ER_FIELD_SPECIFIED_TWICE: | 58 | case ER_FIELD_SPECIFIED_TWICE: |
59 | case ER_NO_SUCH_TABLE: | 59 | case ER_NO_SUCH_TABLE: |
60 | case ER_NOT_ALLOWED_COMMAND: | 60 | case ER_NOT_ALLOWED_COMMAND: |
61 | dbrw_error("query failed: %s", mysql_error(mp->mysql)); | 61 | dbrw_error("query failed: %s", mysql_error(&mp->mysql)); |
62 | dbrw_error("disabling MySQL connection"); | 62 | dbrw_error("disabling MySQL connection"); |
63 | sql_disconnect(conn); | 63 | sql_disconnect(conn); |
64 | conn->state = state_disabled; | 64 | conn->state = state_disabled; |
65 | break; | 65 | break; |
66 | default: | 66 | default: |
67 | dbrw_error("query failed: %s", mysql_error(mp->mysql)); | 67 | dbrw_error("query failed: %s", mysql_error(&mp->mysql)); |
68 | } | 68 | } |
69 | } | 69 | } |
70 | 70 | ||
@@ -88,7 +88,6 @@ s_mysql_destroy(struct dbrw_connection *conn) | |||
88 | { | 88 | { |
89 | struct vmod_mysql_data *mp = conn->data; | 89 | struct vmod_mysql_data *mp = conn->data; |
90 | free(mp->buffer); | 90 | free(mp->buffer); |
91 | free(mp->mysql); | ||
92 | free(mp); | 91 | free(mp); |
93 | conn->data = NULL; | 92 | conn->data = NULL; |
94 | } | 93 | } |
@@ -102,14 +101,7 @@ s_mysql_connect(struct dbrw_connection *conn) | |||
102 | char *s; | 101 | char *s; |
103 | int port = 0; | 102 | int port = 0; |
104 | 103 | ||
105 | mp->mysql = malloc(sizeof(MYSQL)); | 104 | mysql_init(&mp->mysql); |
106 | if (!mp->mysql) { | ||
107 | dbrw_error("not enough memory"); | ||
108 | conn->state = state_disabled; | ||
109 | return -1; | ||
110 | } | ||
111 | |||
112 | mysql_init(mp->mysql); | ||
113 | 105 | ||
114 | host = findparam(conn->conf->param, "server"); | 106 | host = findparam(conn->conf->param, "server"); |
115 | if (host && host[0] == '/') { | 107 | if (host && host[0] == '/') { |
@@ -123,17 +115,17 @@ s_mysql_connect(struct dbrw_connection *conn) | |||
123 | 115 | ||
124 | s = findparam(conn->conf->param, "config"); | 116 | s = findparam(conn->conf->param, "config"); |
125 | if (s) | 117 | if (s) |
126 | mysql_options(mp->mysql, MYSQL_READ_DEFAULT_FILE, s); | 118 | mysql_options(&mp->mysql, MYSQL_READ_DEFAULT_FILE, s); |
127 | 119 | ||
128 | s = findparam(conn->conf->param, "group"); | 120 | s = findparam(conn->conf->param, "group"); |
129 | if (s) | 121 | if (s) |
130 | mysql_options(mp->mysql, MYSQL_READ_DEFAULT_GROUP, s); | 122 | mysql_options(&mp->mysql, MYSQL_READ_DEFAULT_GROUP, s); |
131 | 123 | ||
132 | s = findparam(conn->conf->param, "cacert"); | 124 | s = findparam(conn->conf->param, "cacert"); |
133 | if (s) | 125 | if (s) |
134 | mysql_ssl_set(mp->mysql, NULL, NULL, s, NULL, NULL); | 126 | mysql_ssl_set(&mp->mysql, NULL, NULL, s, NULL, NULL); |
135 | debug(conn->conf, 1, ("connecting to database")); | 127 | debug(conn->conf, 1, ("connecting to database")); |
136 | if (!mysql_real_connect(mp->mysql, | 128 | if (!mysql_real_connect(&mp->mysql, |
137 | host, | 129 | host, |
138 | findparam(conn->conf->param, "user"), | 130 | findparam(conn->conf->param, "user"), |
139 | findparam(conn->conf->param, "password"), | 131 | findparam(conn->conf->param, "password"), |
@@ -141,7 +133,7 @@ s_mysql_connect(struct dbrw_connection *conn) | |||
141 | port, | 133 | port, |
142 | socket_name, | 134 | socket_name, |
143 | CLIENT_MULTI_RESULTS)) { | 135 | CLIENT_MULTI_RESULTS)) { |
144 | dbrw_error("cannot connect: %s", mysql_error(mp->mysql)); | 136 | dbrw_error("cannot connect: %s", mysql_error(&mp->mysql)); |
145 | return -1; | 137 | return -1; |
146 | } | 138 | } |
147 | debug(conn->conf, 1, ("connected to database")); | 139 | debug(conn->conf, 1, ("connected to database")); |
@@ -153,7 +145,7 @@ static int | |||
153 | s_mysql_disconnect(struct dbrw_connection *conn) | 145 | s_mysql_disconnect(struct dbrw_connection *conn) |
154 | { | 146 | { |
155 | struct vmod_mysql_data *mp = conn->data; | 147 | struct vmod_mysql_data *mp = conn->data; |
156 | mysql_close(mp->mysql); | 148 | mysql_close(&mp->mysql); |
157 | return 0; | 149 | return 0; |
158 | } | 150 | } |
159 | 151 | ||
@@ -166,8 +158,7 @@ s_mysql_query(struct dbrw_connection *conn, const char *query) | |||
166 | MYSQL *mysql; | 158 | MYSQL *mysql; |
167 | 159 | ||
168 | for (i = 0; i < 10; i++) { | 160 | for (i = 0; i < 10; i++) { |
169 | mysql = mp->mysql; | 161 | rc = mysql_query(&mp->mysql, query); |
170 | rc = mysql_query(mysql, query); | ||
171 | if (rc) { | 162 | if (rc) { |
172 | check_errno(conn); | 163 | check_errno(conn); |
173 | if (conn->state != state_init) | 164 | if (conn->state != state_init) |
@@ -177,13 +168,13 @@ s_mysql_query(struct dbrw_connection *conn, const char *query) | |||
177 | return -1; | 168 | return -1; |
178 | continue; | 169 | continue; |
179 | } | 170 | } |
180 | mp->result = mysql_store_result(mp->mysql); | 171 | mp->result = mysql_store_result(&mp->mysql); |
181 | if (mp->result) { | 172 | if (mp->result) { |
182 | conn->state = state_result; | 173 | conn->state = state_result; |
183 | rc = 0; | 174 | rc = 0; |
184 | } else if (mysql_field_count(mp->mysql)) { | 175 | } else if (mysql_field_count(&mp->mysql)) { |
185 | dbrw_error("cannot store result: %s", | 176 | dbrw_error("cannot store result: %s", |
186 | mysql_error(mp->mysql)); | 177 | mysql_error(&mp->mysql)); |
187 | conn->state = state_error; | 178 | conn->state = state_error; |
188 | rc = 1; | 179 | rc = 1; |
189 | } else | 180 | } else |
@@ -267,7 +258,7 @@ s_mysql_escape (struct dbrw_connection *conn, const char *arg) | |||
267 | mp->bufsize = size; | 258 | mp->bufsize = size; |
268 | } | 259 | } |
269 | 260 | ||
270 | mysql_real_escape_string(mp->mysql, mp->buffer, arg, len); | 261 | mysql_real_escape_string(&mp->mysql, mp->buffer, arg, len); |
271 | 262 | ||
272 | p = strdup(mp->buffer); | 263 | p = strdup(mp->buffer); |
273 | if (!p) | 264 | if (!p) |
@@ -275,6 +266,26 @@ s_mysql_escape (struct dbrw_connection *conn, const char *arg) | |||
275 | return p; | 266 | return p; |
276 | } | 267 | } |
277 | 268 | ||
269 | static int | ||
270 | s_mysql_idle_timeout(struct dbrw_connection *conn) | ||
271 | { | ||
272 | const char *res; | ||
273 | int n; | ||
274 | if (sql_connect(conn) || conn->state != state_connected) | ||
275 | return -1; | ||
276 | if (sql_query(conn, | ||
277 | "SHOW VARIABLES WHERE Variable_name = 'wait_timeout'")) | ||
278 | return -1; | ||
279 | res = sql_get_column(conn, 0, 1); | ||
280 | if (res) | ||
281 | n = atoi(res); | ||
282 | else | ||
283 | n = -1; | ||
284 | sql_free_result(conn); | ||
285 | return n; | ||
286 | } | ||
287 | |||
288 | |||
278 | struct dbrw_backend mysql_backend = { | 289 | struct dbrw_backend mysql_backend = { |
279 | "mysql", | 290 | "mysql", |
280 | s_mysql_init, | 291 | s_mysql_init, |
@@ -286,5 +297,6 @@ struct dbrw_backend mysql_backend = { | |||
286 | s_mysql_num_tuples, | 297 | s_mysql_num_tuples, |
287 | s_mysql_num_fields, | 298 | s_mysql_num_fields, |
288 | s_mysql_free_result, | 299 | s_mysql_free_result, |
289 | s_mysql_get_column | 300 | s_mysql_get_column, |
301 | s_mysql_idle_timeout | ||
290 | }; | 302 | }; |