aboutsummaryrefslogtreecommitdiff
path: root/src/mysql.c
diff options
context:
space:
mode:
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 @@
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
22struct vmod_mysql_data 22struct 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
153s_mysql_disconnect(struct dbrw_connection *conn) 145s_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
269static int
270s_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
278struct dbrw_backend mysql_backend = { 289struct 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};

Return to:

Send suggestions and report system problems to the System administrator.