diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2013-09-13 13:56:32 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2013-09-13 14:03:14 +0300 |
commit | 0b7dd9ce3d77e4d99de006f3a3a86134e2d7f809 (patch) | |
tree | 69bf78aaa7dc871c6efdb755b7aae2da6d69e7ce | |
parent | 3b6a737cd2fb7a523dd63109f86c88b2996cdc3a (diff) | |
download | vmod-dbrw-0b7dd9ce3d77e4d99de006f3a3a86134e2d7f809.tar.gz vmod-dbrw-0b7dd9ce3d77e4d99de006f3a3a86134e2d7f809.tar.bz2 |
Bugfixes.
* src/mysql.c (check_errno): Improve diagnostics.
(s_mysql_query): Set state depending on the result of the
operation and on whether it is supposed to return tuples.
* src/pgsql.c (s_pgsql_query): Likewise.
* src/sql.c (sql_query): Backend is responsible for switching states.
* src/vmod_dbrw.c (vmod_config): Don't call atoi with NULL argument.
-rw-r--r-- | src/mysql.c | 18 | ||||
-rw-r--r-- | src/pgsql.c | 37 | ||||
-rw-r--r-- | src/sql.c | 4 | ||||
-rw-r--r-- | src/vmod_dbrw.c | 2 |
4 files changed, 34 insertions, 27 deletions
diff --git a/src/mysql.c b/src/mysql.c index c777ac6..acef21c 100644 --- a/src/mysql.c +++ b/src/mysql.c @@ -35,17 +35,17 @@ check_errno(struct dbrw_connection *conn) 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; - syslog(LOG_DAEMON|LOG_NOTICE, - "disabling MySQL connection"); + 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: @@ -55,15 +55,16 @@ check_errno(struct dbrw_connection *conn) 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; - syslog(LOG_DAEMON|LOG_NOTICE, "disabling MySQL connection"); } } /* ************************************************************************* */ /* Interface routines */ @@ -170,18 +171,23 @@ s_mysql_query(struct dbrw_connection *conn, const char *query) return -1; sql_connect(conn); if (conn->state != state_connected) return -1; continue; } - if (!(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)) { dbrw_error("cannot store result: %s", - mysql_error (mp->mysql)); + mysql_error(mp->mysql)); conn->state = state_error; rc = 1; - } + } else + rc = 0; break; } return rc; } static int diff --git a/src/pgsql.c b/src/pgsql.c index 4e3642e..d06f243 100644 --- a/src/pgsql.c +++ b/src/pgsql.c @@ -89,29 +89,32 @@ s_pgsql_disconnect(struct dbrw_connection *conn) return 0; } static int s_pgsql_query(struct dbrw_connection *conn, const char *query) { - struct vmod_pgsql_data *dp = conn->data; - ExecStatusType stat; - - dp->res = PQexec(dp->pgconn, query); - stat = PQresultStatus(dp->res); - - if (stat != PGRES_COMMAND_OK && stat != PGRES_TUPLES_OK) { - dbrw_error("query failed: %s", PQerrorMessage(dp->pgconn)); - dbrw_error("the failed query was: %s", query); - if (dp->res) { - PQclear(dp->res); - dp->res = NULL; - } - return 1; - } - - return 0; + struct vmod_pgsql_data *dp = conn->data; + ExecStatusType stat; + + dp->res = PQexec(dp->pgconn, query); + stat = PQresultStatus(dp->res); + + if (stat == PGRES_TUPLES_OK) + conn->state = state_result; + else if (stat != PGRES_COMMAND_OK) { + dbrw_error("query failed: %s", PQerrorMessage(dp->pgconn)); + dbrw_error("the failed query was: %s", query); + if (dp->res) { + PQclear(dp->res); + dp->res = NULL; + } + PQfinish(dp->pgconn); + conn->state = state_disabled; + return 1; + } + return 0; } static int s_pgsql_free_result(struct dbrw_connection *conn) { struct vmod_pgsql_data *dp = conn->data; @@ -140,16 +140,14 @@ sql_query(struct dbrw_connection *conn, const char *input) break; default: return 1; } } while (conn->state != state_connected); - if (conn->conf->backend->sql_query(conn, input) == 0) { - conn->state = state_result; + if (conn->conf->backend->sql_query(conn, input) == 0) return 0; - } return 1; } unsigned sql_num_tuples(struct dbrw_connection *conn) { diff --git a/src/vmod_dbrw.c b/src/vmod_dbrw.c index 4085157..f7723a2 100644 --- a/src/vmod_dbrw.c +++ b/src/vmod_dbrw.c @@ -241,13 +241,13 @@ vmod_config(struct sess *sp, struct vmod_priv *priv, const char *bkname, conf->query = NULL; conf->param = NULL; return; } s = findparam(conf->param, "debug"); - conf->debug_level = atoi(s); + conf->debug_level = s ? atoi(s) : 0; conf->qdisp = QDISP_NONE; conf->regflags = REG_EXTENDED; conf->status[0] = 0; s = findparam(conf->param, "flags"); |