Skip to content

Commit

Permalink
Add sql_fields for mysql and postgres too
Browse files Browse the repository at this point in the history
  • Loading branch information
arr2036 committed Apr 29, 2015
1 parent 5337086 commit b8e86d7
Show file tree
Hide file tree
Showing 3 changed files with 63 additions and 15 deletions.
27 changes: 27 additions & 0 deletions src/modules/rlm_sql/drivers/rlm_sql_mysql/rlm_sql_mysql.c
Original file line number Diff line number Diff line change
Expand Up @@ -436,6 +436,32 @@ static int sql_num_rows(rlm_sql_handle_t *handle, UNUSED rlm_sql_config_t *confi
return 0;
}

static sql_rcode_t sql_fields(char const **out[], rlm_sql_handle_t *handle, UNUSED rlm_sql_config_t *config)
{
rlm_sql_mysql_conn_t *conn = handle->conn;

unsigned int fields, i;
MYSQL_FIELD *field_info;
char const **names;

fields = mysql_num_fields(conn->result);
if (fields == 0) return RLM_SQL_ERROR;

/*
* https://bugs.mysql.com/bug.php?id=32318
* Hints that we don't have to free field_info.
*/
field_info = mysql_fetch_fields(conn->result);
if (!field_info) return RLM_SQL_ERROR;

MEM(names = talloc_zero_array(handle, char const *, fields + 1));

for (i = 0; i < fields; i++) names[i] = field_info[i].name;
*out = names;

return RLM_SQL_OK;
}

static sql_rcode_t sql_fetch_row(rlm_sql_handle_t *handle, rlm_sql_config_t *config)
{
rlm_sql_mysql_conn_t *conn = handle->conn;
Expand Down Expand Up @@ -699,6 +725,7 @@ rlm_sql_module_t rlm_sql_mysql = {
.sql_num_fields = sql_num_fields,
.sql_num_rows = sql_num_rows,
.sql_affected_rows = sql_affected_rows,
.sql_fields = sql_fields,
.sql_fetch_row = sql_fetch_row,
.sql_free_result = sql_free_result,
.sql_error = sql_error,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -356,6 +356,24 @@ static sql_rcode_t sql_select_query(rlm_sql_handle_t * handle, rlm_sql_config_t
return sql_query(handle, config, query);
}

static sql_rcode_t sql_fields(char const **out[], rlm_sql_handle_t *handle, UNUSED rlm_sql_config_t *config)
{
rlm_sql_postgres_conn_t *conn = handle->conn;

int fields, i;
char const **names;

fields = PQnfields(conn->result);
if (fields <= 0) return RLM_SQL_ERROR;

MEM(names = talloc_zero_array(handle, char const *, fields + 1));

for (i = 0; i < fields; i++) names[i] = PQfname(conn->result, i);
*out = names;

return RLM_SQL_OK;
}

static sql_rcode_t sql_fetch_row(rlm_sql_handle_t *handle, UNUSED rlm_sql_config_t *config)
{

Expand Down Expand Up @@ -464,6 +482,7 @@ rlm_sql_module_t rlm_sql_postgresql = {
.sql_query = sql_query,
.sql_select_query = sql_select_query,
.sql_num_fields = sql_num_fields,
.sql_fields = sql_fields,
.sql_fetch_row = sql_fetch_row,
.sql_error = sql_error,
.sql_finish_query = sql_free_result,
Expand Down
32 changes: 17 additions & 15 deletions src/modules/rlm_sql/drivers/rlm_sql_sqlite/rlm_sql_sqlite.c
Original file line number Diff line number Diff line change
Expand Up @@ -495,31 +495,33 @@ static int sql_num_fields(rlm_sql_handle_t *handle, UNUSED rlm_sql_config_t *con
return 0;
}

static sql_rcode_t sql_fields(char const **out[], rlm_sql_handle_t *handle, UNUSED rlm_sql_config_t *config)
static int sql_num_rows(rlm_sql_handle_t *handle, UNUSED rlm_sql_config_t *config)
{
rlm_sql_sqlite_conn_t *conn = handle->conn;

int columns, i;
char const **names;

columns = sqlite3_column_count(conn->statement);
names = talloc_zero_array(handle, char const *, columns + 1);

for (i = 0; i < columns; i++) names[i] = sqlite3_column_name(conn->statement, i);
*out = names;
if (conn->statement) {
return sqlite3_data_count(conn->statement);
}

return RLM_SQL_OK;
return 0;
}

static int sql_num_rows(rlm_sql_handle_t *handle, UNUSED rlm_sql_config_t *config)
static sql_rcode_t sql_fields(char const **out[], rlm_sql_handle_t *handle, UNUSED rlm_sql_config_t *config)
{
rlm_sql_sqlite_conn_t *conn = handle->conn;

if (conn->statement) {
return sqlite3_data_count(conn->statement);
}
int fields, i;
char const **names;

return 0;
fields = sqlite3_column_count(conn->statement);
if (fields <= 0) return RLM_SQL_ERROR;

MEM(names = talloc_zero_array(handle, char const *, fields + 1));

for (i = 0; i < fields; i++) names[i] = sqlite3_column_name(conn->statement, i);
*out = names;

return RLM_SQL_OK;
}

static sql_rcode_t sql_fetch_row(rlm_sql_handle_t *handle, rlm_sql_config_t *config)
Expand Down

0 comments on commit b8e86d7

Please sign in to comment.