From: Arran Cudbard-Bell Date: Thu, 12 Jan 2017 18:13:06 +0000 (+0000) Subject: Use a proper rcode for no more rows X-Git-Tag: release_3_0_13~73 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8cf46c98e336a69894d2470ba6988ca4042c4985;p=thirdparty%2Ffreeradius-server.git Use a proper rcode for no more rows --- 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 0eb1ce5ef2c..7f922b389e6 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 @@ -189,12 +189,14 @@ static sql_rcode_t sql_fetch_row(rlm_sql_handle_t *handle, rlm_sql_config_t *con memset(retval, 0, c*sizeof(char*)+1); /* advance cursor */ - if(SQLFetch(conn->stmt) == SQL_NO_DATA_FOUND) { + if (SQLFetch(conn->stmt) == SQL_NO_DATA_FOUND) { handle->row = NULL; - goto error; + for (i = 0; i < c; i++) free(retval[i]); + free(retval); + return RLM_SQL_NO_MORE_ROWS; } - for(i = 0; i < c; i++) { + for (i = 0; i < c; i++) { /* get column length */ SQLColAttribute(conn->stmt, i+1, SQL_DESC_DISPLAY_SIZE, NULL, 0, NULL, &len); @@ -209,14 +211,6 @@ static sql_rcode_t sql_fetch_row(rlm_sql_handle_t *handle, rlm_sql_config_t *con handle->row = retval; return RLM_SQL_OK; - -error: - for(i = 0; i < c; i++) { - free(retval[i]); - } - free(retval); - - return RLM_SQL_ERROR; } static sql_rcode_t sql_free_result(rlm_sql_handle_t *handle, UNUSED rlm_sql_config_t *config) 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 7a811bb593f..966ddc3914e 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 @@ -216,7 +216,7 @@ static sql_rcode_t sql_fetch_row(rlm_sql_handle_t *handle, UNUSED rlm_sql_config if (conn->statement_type != isc_info_sql_stmt_exec_procedure) { res = fb_fetch(conn); if (res == 100) { - return 0; + return RLM_SQL_NO_MORE_ROWS; } if (res) { @@ -225,7 +225,7 @@ static sql_rcode_t sql_fetch_row(rlm_sql_handle_t *handle, UNUSED rlm_sql_config return RLM_SQL_ERROR; } } else { - conn->statement_type=0; + conn->statement_type = 0; } fb_store_row(conn); 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 cf248d7413a..ad52cca2d79 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 @@ -585,7 +585,7 @@ static sql_rcode_t sql_fetch_row(rlm_sql_handle_t *handle, UNUSED rlm_sql_config return RLM_SQL_RECONNECT; case CS_END_DATA: - return RLM_SQL_OK; + return RLM_SQL_NO_MORE_ROWS; case CS_SUCCEED: 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 682b2404636..6545b677207 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,9 +240,9 @@ static sql_rcode_t sql_fetch_row(rlm_sql_handle_t *handle, UNUSED rlm_sql_config handle->row = NULL; - if((rc = SQLFetch(conn->stmt)) == SQL_NO_DATA_FOUND) { - return 0; - } + rc = 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 */ 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 91d161fc3d5..25f0ac78690 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 @@ -493,7 +493,10 @@ retry_fetch_row: 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 1a2dce18a65..ee450d16b77 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 @@ -64,7 +64,7 @@ static sql_rcode_t sql_fetch_row(rlm_sql_handle_t * handle, UNUSED rlm_sql_confi { handle->row = 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 4dfa0efe595..9ddb31cea23 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 @@ -447,7 +447,7 @@ static sql_rcode_t sql_fetch_row(rlm_sql_handle_t *handle, rlm_sql_config_t *con 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 eb348df2e2c..1afe07d2d95 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 @@ -414,8 +414,7 @@ static sql_rcode_t sql_fetch_row(rlm_sql_handle_t *handle, UNUSED rlm_sql_config handle->row = NULL; - if (conn->cur_row >= PQntuples(conn->result)) - return 0; + if (conn->cur_row >= PQntuples(conn->result)) return RLM_SQL_NO_MORE_ROWS; free_result_row(conn); @@ -431,9 +430,11 @@ static sql_rcode_t sql_fetch_row(rlm_sql_handle_t *handle, UNUSED rlm_sql_config } conn->cur_row++; handle->row = conn->row; + } else { + return RLM_SQL_NO_MORE_ROWS; } - return 0; + return RLM_SQL_OK; } 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 0b76d9a4e66..c94831da322 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 @@ -678,9 +678,7 @@ static sql_rcode_t sql_fetch_row(rlm_sql_handle_t *handle, rlm_sql_config_t *con /* * No more rows to process (were done) */ - if (status == SQLITE_DONE) { - return 1; - } + if (status == SQLITE_DONE) return RLM_SQL_NO_MORE_ROWS; /* * We only need to do this once per result set, because @@ -732,7 +730,7 @@ static sql_rcode_t sql_fetch_row(rlm_sql_handle_t *handle, rlm_sql_config_t *con } } - return 0; + return RLM_SQL_OK; } static sql_rcode_t sql_free_result(rlm_sql_handle_t *handle, UNUSED rlm_sql_config_t *config) @@ -754,7 +752,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 @@ -795,9 +793,7 @@ static int sql_affected_rows(rlm_sql_handle_t *handle, { rlm_sql_sqlite_conn_t *conn = handle->conn; - if (conn->db) { - return sqlite3_changes(conn->db); - } + if (conn->db) return sqlite3_changes(conn->db); return -1; } 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 c940c204120..9c7d30a34c5 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 @@ -228,14 +228,12 @@ static sql_rcode_t sql_fetch_row(rlm_sql_handle_t *handle, rlm_sql_config_t *con handle->row = NULL; err_handle = SQLFetch(conn->stmt); - if(err_handle == SQL_NO_DATA_FOUND) { - return 0; - } + if (err_handle == SQL_NO_DATA_FOUND) return RLM_SQL_NO_MORE_ROWS; if ((state = sql_check_error(err_handle, handle, config))) return state; handle->row = conn->row; - return 0; + return RLM_SQL_OK; } static sql_rcode_t sql_finish_select_query(rlm_sql_handle_t * handle, rlm_sql_config_t *config) diff --git a/src/modules/rlm_sql/rlm_sql.c b/src/modules/rlm_sql/rlm_sql.c index 7536ebdd3e5..b6fbf37021e 100644 --- a/src/modules/rlm_sql/rlm_sql.c +++ b/src/modules/rlm_sql/rlm_sql.c @@ -226,7 +226,7 @@ static ssize_t sql_xlat(void *instance, REQUEST *request, char const *query, cha if (rcode != RLM_SQL_OK) goto query_error; rcode = rlm_sql_fetch_row(inst, request, &handle); - if (rcode) { + if (rcode != RLM_SQL_OK) { (inst->module->sql_finish_select_query)(handle, inst->config); goto query_error; } @@ -286,7 +286,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(inst, NULL, &handle) == 0) && (row = handle->row)) { + while ((rlm_sql_fetch_row(inst, NULL, &handle) == RLM_SQL_OK) && (row = handle->row)) { int num_rows; char *server = NULL; @@ -547,7 +547,7 @@ static int sql_get_grouplist(rlm_sql_t *inst, rlm_sql_handle_t **handle, REQUEST talloc_free(expanded); if (ret != RLM_SQL_OK) return -1; - while (rlm_sql_fetch_row(inst, request, handle) == 0) { + while (rlm_sql_fetch_row(inst, request, handle) == RLM_SQL_OK) { row = (*handle)->row; if (!row) break; @@ -1602,7 +1602,7 @@ static rlm_rcode_t mod_checksimul(void *instance, REQUEST * request) call_num = vp->vp_strvalue; } - while (rlm_sql_fetch_row(inst, request, &handle) == 0) { + while (rlm_sql_fetch_row(inst, request, &handle) == RLM_SQL_OK) { int num_rows; row = handle->row; diff --git a/src/modules/rlm_sql/rlm_sql.h b/src/modules/rlm_sql/rlm_sql.h index 9a3c6b3a977..a241353a4d7 100644 --- a/src/modules/rlm_sql/rlm_sql.h +++ b/src/modules/rlm_sql/rlm_sql.h @@ -42,11 +42,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 643d68ab4de..51ba11d979c 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 } }; @@ -489,7 +490,7 @@ int sql_getvpdata(TALLOC_CTX *ctx, rlm_sql_t *inst, REQUEST *request, rlm_sql_ha 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(inst, request, handle) == 0) { + while (rlm_sql_fetch_row(inst, request, handle) == RLM_SQL_OK) { row = (*handle)->row; if (!row) break; if (sql_fr_pair_list_afrom_str(ctx, request, pair, row) != 0) {