aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org>2019-02-15 10:49:14 +0200
committerSergey Poznyakoff <gray@gnu.org>2019-02-15 10:51:50 +0200
commitd10bd129fc392283b60db2f0ef426f4e16ffd8bf (patch)
treea354a8aac47213ed141a86923ad7cc90a0537fef
parent49ab7b5fa7843a77605b91adf8a3689794fc091a (diff)
downloadvmod-dbrw-d10bd129fc392283b60db2f0ef426f4e16ffd8bf.tar.gz
vmod-dbrw-d10bd129fc392283b60db2f0ef426f4e16ffd8bf.tar.bz2
Improve error handling in mysql.c
* src/mysql.c (check_errno): Always print the failed query in full. Don't treat ER_PARSE_ERROR and ER_EMPTY_QUERY as fatal errors.
-rw-r--r--src/mysql.c14
1 files changed, 7 insertions, 7 deletions
diff --git a/src/mysql.c b/src/mysql.c
index d97200a..1391743d 100644
--- a/src/mysql.c
+++ b/src/mysql.c
@@ -20,60 +20,60 @@
#include <mysql/mysqld_error.h>
struct vmod_mysql_data
{
MYSQL mysql;
MYSQL_RES *result;
char *buffer;
size_t bufsize;
};
static void
-check_errno(struct dbrw_connection *conn)
+check_errno(struct dbrw_connection *conn, char const *query)
{
struct vmod_mysql_data *mp = conn->data;
+ dbrw_error("query failed: %s", query);
+ dbrw_error("%s", mysql_error(&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));
sql_disconnect(conn);
if (conn->state == state_error) {
conn->state = state_disabled;
dbrw_error("disabling MySQL connection");
}
break;
case ER_UNKNOWN_COM_ERROR:
case ER_ACCESS_DENIED_ERROR:
case ER_BAD_DB_ERROR:
case ER_WRONG_DB_NAME:
case ER_BAD_FIELD_ERROR:
case ER_BAD_HOST_ERROR:
case ER_BAD_TABLE_ERROR:
case ER_WRONG_FIELD_SPEC:
- case ER_PARSE_ERROR:
- case ER_EMPTY_QUERY:
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("disabling MySQL connection");
sql_disconnect(conn);
conn->state = state_disabled;
break;
+ case ER_EMPTY_QUERY:
+ case ER_PARSE_ERROR:
default:
- dbrw_error("query failed: %s", mysql_error(&mp->mysql));
+ break;
}
}
/* ************************************************************************* */
/* Interface routines */
static int
s_mysql_init(struct dbrw_connection *conn)
{
struct vmod_mysql_data *mp = calloc(1, sizeof (*mp));
if (!mp) {
dbrw_error("not enough memory");
@@ -151,25 +151,25 @@ s_mysql_disconnect(struct dbrw_connection *conn)
static int
s_mysql_query(struct dbrw_connection *conn, const char *query)
{
struct vmod_mysql_data *mp = conn->data;
int rc;
int i;
MYSQL *mysql;
for (i = 0; i < 10; i++) {
rc = mysql_query(&mp->mysql, query);
if (rc) {
- check_errno(conn);
+ check_errno(conn, query);
if (conn->state != state_init)
return -1;
sql_connect(conn);
if (conn->state != state_connected)
return -1;
continue;
}
mp->result = mysql_store_result(&mp->mysql);
if (mp->result) {
conn->state = state_result;
rc = 0;
} else if (mysql_field_count(&mp->mysql)) {

Return to:

Send suggestions and report system problems to the System administrator.