30 RCSID(
"$Id: fce6190b02baa14b7030a24ef7f7c3ff89c22d28 $")
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);
122 memcpy(&db2_query, &query,
sizeof(query));
124 row = SQLExecDirect(conn->
stmt, db2_query, SQL_NTS);
125 if(row != SQL_SUCCESS) {
127 ERROR(
"Could not execute statement \"%s\"", query);
146 SQLNumResultCols(conn->
stmt, &c);
154 SQLSMALLINT fields, len, i;
159 SQLNumResultCols(conn->
stmt, &fields);
162 MEM(
names = talloc_array(handle,
char const *, fields));
164 for (i = 0; i < fields; i++) {
167 switch (SQLColAttribute(conn->
stmt, i, SQL_DESC_BASE_COLUMN_NAME,
168 field,
sizeof(field), &len, NULL)) {
169 case SQL_INVALID_HANDLE:
171 ERROR(
"Failed retrieving field name at index %i", i);
179 MEM(p = talloc_array(
names,
char, (
size_t)len + 1));
180 strlcpy(p, field, (
size_t)len + 1);
191 SQLINTEGER len, slen;
197 TALLOC_FREE(handle->
row);
206 for (i = 0; i < c; i++) {
208 SQLColAttribute(conn->
stmt, i + 1, SQL_DESC_DISPLAY_SIZE, NULL, 0, NULL, &len);
210 MEM(row[i] = talloc_array(row,
char, len + 1));
213 SQLGetData(conn->
stmt, i + 1, SQL_C_CHAR, row[i], len + 1, &slen);
214 if (slen == SQL_NULL_DATA) row[i][0] =
'\0';
227 TALLOC_FREE(handle->
row);
228 SQLFreeHandle(SQL_HANDLE_STMT, conn->
stmt);
257 SQLGetDiagRec(SQL_HANDLE_STMT, conn->
stmt, 1, (SQLCHAR *) state, &
err,
258 (SQLCHAR *) errbuff,
sizeof(errbuff), &rl);
259 if (errbuff[0] ==
'\0')
return 0;
282 SQLRowCount(conn->
stmt, &c);
#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[]
Prototypes and functions for the SQL module.
void * conn
Database specific connection handle.
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_row_t row
Row data from the last query.
rlm_sql_driver_t rlm_sql_db2
static sql_rcode_t sql_fetch_row(rlm_sql_row_t *out, rlm_sql_handle_t *handle, rlm_sql_config_t const *config)
static sql_rcode_t sql_finish_query(UNUSED rlm_sql_handle_t *handle, UNUSED rlm_sql_config_t const *config)
static sql_rcode_t sql_free_result(rlm_sql_handle_t *handle, UNUSED rlm_sql_config_t const *config)
static size_t sql_error(TALLOC_CTX *ctx, sql_log_entry_t out[], NDEBUG_UNUSED size_t outlen, rlm_sql_handle_t *handle, UNUSED rlm_sql_config_t const *config)
Retrieves any errors associated with the connection handle.
static int _sql_socket_destructor(rlm_sql_db2_conn_t *conn)
static sql_rcode_t sql_query(rlm_sql_handle_t *handle, UNUSED rlm_sql_config_t const *config, char const *query)
static sql_rcode_t sql_select_query(rlm_sql_handle_t *handle, rlm_sql_config_t const *config, char const *query)
static sql_rcode_t sql_finish_select_query(rlm_sql_handle_t *handle, rlm_sql_config_t const *config)
static int sql_affected_rows(rlm_sql_handle_t *handle, UNUSED rlm_sql_config_t const *config)
static int sql_num_fields(rlm_sql_handle_t *handle, 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)
static sql_rcode_t sql_fields(char const **out[], rlm_sql_handle_t *handle, UNUSED rlm_sql_config_t const *config)
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