30 RCSID(
"$Id: b3bedf83d808b8df0bf3d7f1803888dc84b03f52 $")
32 #define LOG_PREFIX "sql - db2"
34 #include <freeradius-devel/server/base.h>
35 #include <freeradius-devel/util/debug.h>
50 DEBUG2(
"Socket destructor called, closing socket");
54 SQLFreeHandle(SQL_HANDLE_DBC, conn->
dbc_handle);
75 SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &(conn->
env_handle));
81 SQLSetConnectAttr(conn->
dbc_handle, SQL_ATTR_LOGIN_TIMEOUT, &timeout_ms, SQL_IS_UINTEGER);
100 if (row != SQL_SUCCESS) {
101 ERROR(
"could not connect to DB2 server %s",
config->sql_server);
125 row = SQLExecDirect(conn->
stmt, db2_query, SQL_NTS);
126 if(row != SQL_SUCCESS) {
128 ERROR(
"Could not execute statement \"%s\"", query);
142 SQLSMALLINT fields, len, i;
147 SQLNumResultCols(conn->
stmt, &fields);
150 MEM(
names = talloc_array(query_ctx,
char const *, fields));
152 for (i = 0; i < fields; i++) {
155 switch (SQLColAttribute(conn->
stmt, i, SQL_DESC_BASE_COLUMN_NAME,
156 field,
sizeof(field), &len, NULL)) {
157 case SQL_INVALID_HANDLE:
159 ERROR(
"Failed retrieving field name at index %i", i);
167 MEM(p = talloc_array(
names,
char, (
size_t)len + 1));
168 strlcpy(p, field, (
size_t)len + 1);
180 SQLINTEGER len, slen;
186 TALLOC_FREE(query_ctx->
row);
189 SQLNumResultCols(conn->
stmt, &c);
192 if (SQLFetch(conn->
stmt) == SQL_NO_DATA_FOUND) {
198 for (i = 0; i < c; i++) {
200 SQLColAttribute(conn->
stmt, i + 1, SQL_DESC_DISPLAY_SIZE, NULL, 0, NULL, &len);
202 MEM(row[i] = talloc_array(row,
char, len + 1));
205 SQLGetData(conn->
stmt, i + 1, SQL_C_CHAR, row[i], len + 1, &slen);
206 if (slen == SQL_NULL_DATA) row[i][0] =
'\0';
209 query_ctx->
row = row;
219 conn = query_ctx->handle->conn;
220 TALLOC_FREE(query_ctx->row);
221 SQLFreeHandle(SQL_HANDLE_STMT, conn->
stmt);
250 SQLGetDiagRec(SQL_HANDLE_STMT, conn->
stmt, 1, (SQLCHAR *) state, &
err,
251 (SQLCHAR *) errbuff,
sizeof(errbuff), &rl);
252 if (errbuff[0] ==
'\0')
return 0;
270 SQLRowCount(conn->
stmt, &c);
unlang_action_t
Returned by unlang_op_t calls, determine the next action of the interpreter.
#define UNCONST(_type, _ptr)
Remove const qualification from a pointer.
#define FR_TIMEVAL_TO_MS(_x)
static fr_time_delta_t timeout
#define MODULE_MAGIC_INIT
Stop people using different module/library/server versions together.
static const conf_parser_t config[]
rlm_rcode_t
Return codes indicating the result of the module call.
Prototypes and functions for the SQL module.
void * conn
Database specific connection handle.
char const * query_str
Query string to run.
sql_rcode_t
Action to take at end of an SQL query.
@ RLM_SQL_ERROR
General connection/server error.
@ RLM_SQL_NO_MORE_ROWS
No more rows available.
rlm_sql_handle_t * handle
Connection handle this query is being run on.
rlm_sql_row_t row
Row data from the last query.
sql_rcode_t rcode
Result code.
rlm_sql_driver_t rlm_sql_db2
static sql_rcode_t sql_fields(char const **out[], fr_sql_query_t *query_ctx, UNUSED rlm_sql_config_t const *config)
static unlang_action_t sql_query(rlm_rcode_t *p_result, UNUSED int *priority, request_t *request, void *uctx)
static unlang_action_t sql_fetch_row(rlm_rcode_t *p_result, UNUSED int *priority, UNUSED request_t *request, void *uctx)
static size_t sql_error(TALLOC_CTX *ctx, sql_log_entry_t out[], NDEBUG_UNUSED size_t outlen, fr_sql_query_t *query_ctx, UNUSED rlm_sql_config_t const *config)
Retrieves any errors associated with the query context.
static sql_rcode_t sql_finish_query(UNUSED fr_sql_query_t *query_ctx, UNUSED rlm_sql_config_t const *config)
static int _sql_socket_destructor(rlm_sql_db2_conn_t *conn)
static sql_rcode_t sql_free_result(fr_sql_query_t *query_, UNUSED rlm_sql_config_t const *config)
static int sql_affected_rows(fr_sql_query_t *query_ctx, UNUSED rlm_sql_config_t const *config)
static sql_rcode_t sql_socket_init(rlm_sql_handle_t *handle, rlm_sql_config_t const *config, UNUSED fr_time_delta_t timeout)
MEM(pair_append_request(&vp, attr_eap_aka_sim_identity) >=0)
size_t strlcpy(char *dst, char const *src, size_t siz)
module_t common
Common fields for all loadable modules.
char * talloc_typed_asprintf(TALLOC_CTX *ctx, char const *fmt,...)
Call talloc vasprintf, setting the type on the new chunk correctly.
static const char * names[8]
A time delta, a difference in time measured in nanoseconds.
static size_t char ** out