From 16769e5104fc8f973b37846140c6bbb843608770 Mon Sep 17 00:00:00 2001 From: Arran Cudbard-Bell Date: Thu, 12 Jan 2017 18:13:06 +0000 Subject: [PATCH] Use a proper rcode for no more rows # Conflicts: # src/modules/rlm_sql/drivers/rlm_sql_db2/rlm_sql_db2.c # src/modules/rlm_sql/drivers/rlm_sql_firebird/rlm_sql_firebird.c # src/modules/rlm_sql/drivers/rlm_sql_iodbc/rlm_sql_iodbc.c # src/modules/rlm_sql/drivers/rlm_sql_postgresql/rlm_sql_postgresql.c # src/modules/rlm_sql/drivers/rlm_sql_sqlite/rlm_sql_sqlite.c # src/modules/rlm_sql/drivers/rlm_sql_unixodbc/rlm_sql_unixodbc.c # src/modules/rlm_sql/rlm_sql.c # src/modules/rlm_sql/sql.c --- .../drivers/rlm_sql_cassandra/rlm_sql_cassandra.c | 2 +- src/modules/rlm_sql/drivers/rlm_sql_db2/rlm_sql_db2.c | 2 +- .../drivers/rlm_sql_firebird/rlm_sql_firebird.c | 3 ++- .../rlm_sql/drivers/rlm_sql_freetds/rlm_sql_freetds.c | 2 +- .../rlm_sql/drivers/rlm_sql_iodbc/rlm_sql_iodbc.c | 4 +++- .../rlm_sql/drivers/rlm_sql_mysql/rlm_sql_mysql.c | 3 +++ .../rlm_sql/drivers/rlm_sql_null/rlm_sql_null.c | 2 +- .../rlm_sql/drivers/rlm_sql_oracle/rlm_sql_oracle.c | 2 +- .../drivers/rlm_sql_postgresql/rlm_sql_postgresql.c | 6 ++++-- .../rlm_sql/drivers/rlm_sql_sqlite/rlm_sql_sqlite.c | 6 +++--- .../drivers/rlm_sql_unixodbc/rlm_sql_unixodbc.c | 2 +- src/modules/rlm_sql/rlm_sql.c | 8 ++++---- src/modules/rlm_sql/rlm_sql.h | 11 ++++++----- src/modules/rlm_sql/sql.c | 3 ++- 14 files changed, 33 insertions(+), 23 deletions(-) diff --git a/src/modules/rlm_sql/drivers/rlm_sql_cassandra/rlm_sql_cassandra.c b/src/modules/rlm_sql/drivers/rlm_sql_cassandra/rlm_sql_cassandra.c index 49b8754f3226..b9e84058218d 100644 --- a/src/modules/rlm_sql/drivers/rlm_sql_cassandra/rlm_sql_cassandra.c +++ b/src/modules/rlm_sql/drivers/rlm_sql_cassandra/rlm_sql_cassandra.c @@ -513,7 +513,7 @@ do {\ if (!conn->iterator) conn->iterator = cass_iterator_from_result(conn->result); if (!conn->iterator) return RLM_SQL_OK; /* no result */ - if (!cass_iterator_next(conn->iterator)) return RLM_SQL_OK; /* no more rows */ + if (!cass_iterator_next(conn->iterator)) return RLM_SQL_NO_MORE_ROWS; /* no more rows */ cass_row = cass_iterator_get_row(conn->iterator); /* this shouldn't fail ? */ fields = sql_num_fields(handle, config); /* get the number of fields... */ diff --git a/src/modules/rlm_sql/drivers/rlm_sql_db2/rlm_sql_db2.c b/src/modules/rlm_sql/drivers/rlm_sql_db2/rlm_sql_db2.c index a920d78c7b2f..0766949d30c1 100644 --- a/src/modules/rlm_sql/drivers/rlm_sql_db2/rlm_sql_db2.c +++ b/src/modules/rlm_sql/drivers/rlm_sql_db2/rlm_sql_db2.c @@ -207,7 +207,7 @@ static sql_rcode_t sql_fetch_row(rlm_sql_row_t *out, rlm_sql_handle_t *handle, r c = sql_num_fields(handle, config); /* advance cursor */ - if (SQLFetch(conn->stmt) == SQL_NO_DATA_FOUND) return RLM_SQL_ERROR; + if (SQLFetch(conn->stmt) == SQL_NO_DATA_FOUND) return RLM_SQL_NO_MORE_ROWS; MEM(row = (rlm_sql_row_t)talloc_zero_array(handle, char *, c + 1)); for (i = 0; i < c; i++) { diff --git a/src/modules/rlm_sql/drivers/rlm_sql_firebird/rlm_sql_firebird.c b/src/modules/rlm_sql/drivers/rlm_sql_firebird/rlm_sql_firebird.c index 35c1495a8fe9..b8a76466cb11 100644 --- a/src/modules/rlm_sql/drivers/rlm_sql_firebird/rlm_sql_firebird.c +++ b/src/modules/rlm_sql/drivers/rlm_sql_firebird/rlm_sql_firebird.c @@ -211,7 +211,8 @@ static sql_rcode_t sql_fetch_row(rlm_sql_row_t *out, rlm_sql_handle_t *handle, U if (conn->statement_type != isc_info_sql_stmt_exec_procedure) { res = fb_fetch(conn); - if (res == 100) return RLM_SQL_OK; + if (res == 100) return RLM_SQL_NO_MORE_ROWS; + if (res) { ERROR("Fetch problem: %s", conn->error); diff --git a/src/modules/rlm_sql/drivers/rlm_sql_freetds/rlm_sql_freetds.c b/src/modules/rlm_sql/drivers/rlm_sql_freetds/rlm_sql_freetds.c index 8140d2e780e1..f870a356ad3f 100644 --- a/src/modules/rlm_sql/drivers/rlm_sql_freetds/rlm_sql_freetds.c +++ b/src/modules/rlm_sql/drivers/rlm_sql_freetds/rlm_sql_freetds.c @@ -588,7 +588,7 @@ static sql_rcode_t sql_fetch_row(rlm_sql_row_t *out, rlm_sql_handle_t *handle, U return RLM_SQL_RECONNECT; case CS_END_DATA: - return RLM_SQL_OK; + return RLM_SQL_NO_MORE_ROWS; case CS_SUCCEED: *out = handle->row = conn->results; diff --git a/src/modules/rlm_sql/drivers/rlm_sql_iodbc/rlm_sql_iodbc.c b/src/modules/rlm_sql/drivers/rlm_sql_iodbc/rlm_sql_iodbc.c index 617b81a34c04..8449b0199a1a 100644 --- a/src/modules/rlm_sql/drivers/rlm_sql_iodbc/rlm_sql_iodbc.c +++ b/src/modules/rlm_sql/drivers/rlm_sql_iodbc/rlm_sql_iodbc.c @@ -240,7 +240,9 @@ static sql_rcode_t sql_fetch_row(rlm_sql_row_t *out, rlm_sql_handle_t *handle, U *out = handle->row = NULL; - if ((rc = SQLFetch(conn->stmt)) == SQL_NO_DATA_FOUND) return 0; + rc = SQLFetch(conn->stmt); + if (rc == SQL_NO_DATA_FOUND) return RLM_SQL_NO_MORE_ROWS; + /* XXX Check rc for database down, if so, return RLM_SQL_RECONNECT */ *out = handle->row = conn->row; diff --git a/src/modules/rlm_sql/drivers/rlm_sql_mysql/rlm_sql_mysql.c b/src/modules/rlm_sql/drivers/rlm_sql_mysql/rlm_sql_mysql.c index fb9818558e10..1c4174f704c9 100644 --- a/src/modules/rlm_sql/drivers/rlm_sql_mysql/rlm_sql_mysql.c +++ b/src/modules/rlm_sql/drivers/rlm_sql_mysql/rlm_sql_mysql.c @@ -485,7 +485,10 @@ static sql_rcode_t sql_fetch_row(rlm_sql_row_t *out, rlm_sql_handle_t *handle, r goto retry_fetch_row; } } else if (ret > 0) return sql_check_error(NULL, ret); + + /* If ret is 0 then there are no more rows */ #endif + return RLM_SQL_NO_MORE_ROWS; } return RLM_SQL_OK; } diff --git a/src/modules/rlm_sql/drivers/rlm_sql_null/rlm_sql_null.c b/src/modules/rlm_sql/drivers/rlm_sql_null/rlm_sql_null.c index 722729e515e4..bee81dac6ec5 100644 --- a/src/modules/rlm_sql/drivers/rlm_sql_null/rlm_sql_null.c +++ b/src/modules/rlm_sql/drivers/rlm_sql_null/rlm_sql_null.c @@ -66,7 +66,7 @@ static sql_rcode_t sql_fetch_row(rlm_sql_row_t *out, UNUSED rlm_sql_handle_t *ha { *out = NULL; - return 0; + return RLM_SQL_NO_MORE_ROWS; } static sql_rcode_t sql_free_result(UNUSED rlm_sql_handle_t * handle, UNUSED rlm_sql_config_t *config) diff --git a/src/modules/rlm_sql/drivers/rlm_sql_oracle/rlm_sql_oracle.c b/src/modules/rlm_sql/drivers/rlm_sql_oracle/rlm_sql_oracle.c index b2e7732d6028..59ac82afd51d 100644 --- a/src/modules/rlm_sql/drivers/rlm_sql_oracle/rlm_sql_oracle.c +++ b/src/modules/rlm_sql/drivers/rlm_sql_oracle/rlm_sql_oracle.c @@ -452,7 +452,7 @@ static sql_rcode_t sql_fetch_row(rlm_sql_row_t *out, rlm_sql_handle_t *handle, r if (status == OCI_NO_DATA) { handle->row = 0; - return RLM_SQL_OK; + return RLM_SQL_NO_MORE_ROWS; } if (status == OCI_ERROR) { diff --git a/src/modules/rlm_sql/drivers/rlm_sql_postgresql/rlm_sql_postgresql.c b/src/modules/rlm_sql/drivers/rlm_sql_postgresql/rlm_sql_postgresql.c index 1047351dc874..c4b7df273360 100644 --- a/src/modules/rlm_sql/drivers/rlm_sql_postgresql/rlm_sql_postgresql.c +++ b/src/modules/rlm_sql/drivers/rlm_sql_postgresql/rlm_sql_postgresql.c @@ -315,7 +315,7 @@ static sql_rcode_t sql_fetch_row(rlm_sql_row_t *out, rlm_sql_handle_t *handle, U *out = NULL; handle->row = NULL; - if (conn->cur_row >= PQntuples(conn->result)) return RLM_SQL_OK; + if (conn->cur_row >= PQntuples(conn->result)) return RLM_SQL_NO_MORE_ROWS; free_result_row(conn); @@ -331,9 +331,11 @@ static sql_rcode_t sql_fetch_row(rlm_sql_row_t *out, rlm_sql_handle_t *handle, U } conn->cur_row++; *out = handle->row = conn->row; + + return RLM_SQL_OK; } - return RLM_SQL_OK; + return RLM_SQL_NO_MORE_ROWS; } static int sql_num_fields(rlm_sql_handle_t * handle, UNUSED rlm_sql_config_t *config) diff --git a/src/modules/rlm_sql/drivers/rlm_sql_sqlite/rlm_sql_sqlite.c b/src/modules/rlm_sql/drivers/rlm_sql_sqlite/rlm_sql_sqlite.c index 01d2f41f052f..6997b3e1bd4d 100644 --- a/src/modules/rlm_sql/drivers/rlm_sql_sqlite/rlm_sql_sqlite.c +++ b/src/modules/rlm_sql/drivers/rlm_sql_sqlite/rlm_sql_sqlite.c @@ -541,9 +541,9 @@ static sql_rcode_t sql_fetch_row(rlm_sql_row_t *out, rlm_sql_handle_t *handle, r if (sql_check_error(conn->db, status) != RLM_SQL_OK) return RLM_SQL_ERROR; /* - * No more rows to process (were done) + * No more rows to process (we're done) */ - if (status == SQLITE_DONE) return RLM_SQL_OK; + if (status == SQLITE_DONE) return RLM_SQL_NO_MORE_ROWS; /* * We only need to do this once per result set, because @@ -622,7 +622,7 @@ static sql_rcode_t sql_free_result(rlm_sql_handle_t *handle, UNUSED rlm_sql_conf * It's just the last error that occurred processing the * statement. */ - return 0; + return RLM_SQL_OK; } /** Retrieves any errors associated with the connection handle diff --git a/src/modules/rlm_sql/drivers/rlm_sql_unixodbc/rlm_sql_unixodbc.c b/src/modules/rlm_sql/drivers/rlm_sql_unixodbc/rlm_sql_unixodbc.c index 5bc67e121d43..e0f682f30955 100644 --- a/src/modules/rlm_sql/drivers/rlm_sql_unixodbc/rlm_sql_unixodbc.c +++ b/src/modules/rlm_sql/drivers/rlm_sql_unixodbc/rlm_sql_unixodbc.c @@ -237,7 +237,7 @@ static sql_rcode_t sql_fetch_row(rlm_sql_row_t *out, rlm_sql_handle_t *handle, r handle->row = NULL; err_handle = SQLFetch(conn->stmt); - if (err_handle == SQL_NO_DATA_FOUND) return RLM_SQL_OK; + if (err_handle == SQL_NO_DATA_FOUND) return RLM_SQL_NO_MORE_ROWS; if ((state = sql_check_error(err_handle, handle, config))) return state; diff --git a/src/modules/rlm_sql/rlm_sql.c b/src/modules/rlm_sql/rlm_sql.c index a019b738941b..b3ca1c1a8f0e 100644 --- a/src/modules/rlm_sql/rlm_sql.c +++ b/src/modules/rlm_sql/rlm_sql.c @@ -198,7 +198,7 @@ static ssize_t sql_xlat(UNUSED TALLOC_CTX *ctx, char **out, UNUSED size_t outlen if (rcode != RLM_SQL_OK) goto query_error; rcode = rlm_sql_fetch_row(&row, inst, request, &handle); - if (rcode) { + if (rcode != RLM_SQL_OK) { (inst->driver->sql_finish_select_query)(handle, inst->config); goto query_error; } @@ -472,7 +472,7 @@ static int generate_sql_clients(rlm_sql_t *inst) if (rlm_sql_select_query(inst, NULL, &handle, inst->config->client_query) != RLM_SQL_OK) return -1; - while ((rlm_sql_fetch_row(&row, inst, NULL, &handle) == 0) && (row = handle->row)) { + while ((rlm_sql_fetch_row(&row, inst, NULL, &handle) == RLM_SQL_OK) && (row = handle->row)) { char *server = NULL; i++; @@ -745,7 +745,7 @@ static int sql_get_grouplist(rlm_sql_t const *inst, rlm_sql_handle_t **handle, R talloc_free(expanded); if (ret != RLM_SQL_OK) return -1; - while (rlm_sql_fetch_row(&row, inst, request, handle) == 0) { + while (rlm_sql_fetch_row(&row, inst, request, handle) == RLM_SQL_OK) { row = (*handle)->row; if (!row) break; @@ -1809,7 +1809,7 @@ static rlm_rcode_t mod_checksimul(void *instance, UNUSED void *thread, REQUEST * call_num = vp->vp_strvalue; } - while (rlm_sql_fetch_row(&row, inst, request, &handle) == 0) { + while (rlm_sql_fetch_row(&row, inst, request, &handle) == RLM_SQL_OK) { row = handle->row; if (!row) { break; diff --git a/src/modules/rlm_sql/rlm_sql.h b/src/modules/rlm_sql/rlm_sql.h index 5cfd8884bd2e..ce47ef882e2e 100644 --- a/src/modules/rlm_sql/rlm_sql.h +++ b/src/modules/rlm_sql/rlm_sql.h @@ -45,11 +45,12 @@ RCSIDH(rlm_sql_h, "$Id$") /* SQL Errors */ typedef enum { - RLM_SQL_QUERY_INVALID = -3, //!< Query syntax error - RLM_SQL_ERROR = -2, //!< General connection/server error - RLM_SQL_OK = 0, //!< Success - RLM_SQL_RECONNECT = 1, //!< Stale connection, should reconnect - RLM_SQL_ALT_QUERY = 2 //!< Key constraint violation + RLM_SQL_QUERY_INVALID = -3, //!< Query syntax error. + RLM_SQL_ERROR = -2, //!< General connection/server error. + RLM_SQL_OK = 0, //!< Success. + RLM_SQL_RECONNECT = 1, //!< Stale connection, should reconnect. + RLM_SQL_ALT_QUERY, //!< Key constraint violation, use an alternative query. + RLM_SQL_NO_MORE_ROWS, //!< No more rows available } sql_rcode_t; typedef enum { diff --git a/src/modules/rlm_sql/sql.c b/src/modules/rlm_sql/sql.c index e8f65995039b..82b92d7e8ff4 100644 --- a/src/modules/rlm_sql/sql.c +++ b/src/modules/rlm_sql/sql.c @@ -49,6 +49,7 @@ const FR_NAME_NUMBER sql_rcode_table[] = { { "server error", RLM_SQL_ERROR }, { "query invalid", RLM_SQL_QUERY_INVALID }, { "no connection", RLM_SQL_RECONNECT }, + { "no more rows", RLM_SQL_NO_MORE_ROWS }, { NULL, 0 } }; @@ -495,7 +496,7 @@ int sql_getvpdata(TALLOC_CTX *ctx, rlm_sql_t const *inst, REQUEST *request, rlm_ rcode = rlm_sql_select_query(inst, request, handle, query); if (rcode != RLM_SQL_OK) return -1; /* error handled by rlm_sql_select_query */ - while (rlm_sql_fetch_row(&row, inst, request, handle) == 0) { + while (rlm_sql_fetch_row(&row, inst, request, handle) == RLM_SQL_OK) { if (!row) break; if (sql_fr_pair_list_afrom_str(ctx, request, pair, row) != 0) { REDEBUG("Error parsing user data from database result");