Use a proper rcode for no more rows
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Thu, 12 Jan 2017 18:13:06 +0000 (18:13 +0000)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Thu, 12 Jan 2017 18:49:16 +0000 (18:49 +0000)
13 files changed:
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_freetds/rlm_sql_freetds.c
src/modules/rlm_sql/drivers/rlm_sql_iodbc/rlm_sql_iodbc.c
src/modules/rlm_sql/drivers/rlm_sql_mysql/rlm_sql_mysql.c
src/modules/rlm_sql/drivers/rlm_sql_null/rlm_sql_null.c
src/modules/rlm_sql/drivers/rlm_sql_oracle/rlm_sql_oracle.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/rlm_sql.h
src/modules/rlm_sql/sql.c

index 0eb1ce5..7f922b3 100644 (file)
@@ -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)
index 7a811bb..966ddc3 100644 (file)
@@ -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);
index cf248d7..ad52cca 100644 (file)
@@ -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;
index 682b240..6545b67 100644 (file)
@@ -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;
index 91d161f..25f0ac7 100644 (file)
@@ -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;
 }
index 1a2dce1..ee450d1 100644 (file)
@@ -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)
index 4dfa0ef..9ddb31c 100644 (file)
@@ -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) {
index eb348df..1afe07d 100644 (file)
@@ -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)
index 0b76d9a..c94831d 100644 (file)
@@ -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;
 }
index c940c20..9c7d30a 100644 (file)
@@ -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)
index 7536ebd..b6fbf37 100644 (file)
@@ -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;
index 9a3c6b3..a241353 100644 (file)
@@ -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 {
index 643d68a..51ba11d 100644 (file)
@@ -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) {