2 * sql_firebird.c Part of Firebird rlm_sql driver
4 * Copyright 2006 Vitaly Bodzhgua <vitaly@easteara.net>
10 /* Forward declarations */
11 static char *sql_error(SQLSOCK *sqlsocket, SQL_CONFIG *config);
12 static int sql_free_result(SQLSOCK *sqlsocket, SQL_CONFIG *config);
13 static int sql_affected_rows(SQLSOCK *sqlsocket, SQL_CONFIG *config);
14 static int sql_num_fields(SQLSOCK *sqlsocket, SQL_CONFIG *config);
15 static int sql_finish_query(SQLSOCK *sqlsocket, SQL_CONFIG *config);
17 /*************************************************************************
19 * Function: sql_init_socket
21 * Purpose: Establish connection to the db
23 *************************************************************************/
24 static int sql_init_socket(SQLSOCK *sqlsocket, SQL_CONFIG *config) {
25 rlm_sql_firebird_sock *firebird_sock;
29 if (!sqlsocket->conn) {
30 sqlsocket->conn = (rlm_sql_firebird_sock *)rad_malloc(sizeof(rlm_sql_firebird_sock));
31 if (!sqlsocket->conn) return -1;
34 firebird_sock = sqlsocket->conn;
36 res=fb_init_socket(firebird_sock);
39 if (fb_connect(firebird_sock,config)) {
40 radlog(L_ERR, "rlm_sql_firebird: Connection failed %s\n", firebird_sock->lasterror);
48 /*************************************************************************
50 * Function: sql_destroy_socket
52 * Purpose: Free socket and private connection data
54 *************************************************************************/
55 static int sql_destroy_socket(SQLSOCK *sqlsocket, SQL_CONFIG *config)
57 free(sqlsocket->conn);
58 sqlsocket->conn = NULL;
63 /*************************************************************************
67 * Purpose: Issue a non-SELECT query (ie: update/delete/insert) to
70 *************************************************************************/
72 static int sql_query(SQLSOCK *sqlsocket, SQL_CONFIG *config, char *querystr) {
73 rlm_sql_firebird_sock *firebird_sock = sqlsocket->conn;
76 radlog(L_DBG, "query: %s", querystr);
80 if (fb_sql_query(firebird_sock,querystr)) {
81 if (firebird_sock->sql_code==DEADLOCK_SQL_CODE) {
83 if (deadlock_trys<=DEADLOCK_TRYS) {
84 radlog(L_INFO, "rlm_sql_firebird,sql_query: deadlock, try again query '%s'\n",querystr);
85 goto TryAgainIfDeadlock;
88 radlog(L_ERR, "rlm_sql_firebird,sql_query error:sql_code=%i, error='%s'\n",
89 firebird_sock->sql_code,
90 firebird_sock->lasterror);
91 radlog(L_ERR, "rlm_sql_firebird, Problem with query: '%s'\n", querystr);
98 /*************************************************************************
100 * Function: sql_select_query
102 * Purpose: Issue a select query to the database
104 *************************************************************************/
105 static int sql_select_query(SQLSOCK *sqlsocket, SQL_CONFIG *config, char *querystr) {
106 rlm_sql_firebird_sock *firebird_sock = sqlsocket->conn;
107 if (sql_query(sqlsocket, config, querystr)) return -1;
113 /*************************************************************************
115 * Function: sql_store_result
117 * Purpose: database specific store_result function. Returns a result
120 *************************************************************************/
121 static int sql_store_result(SQLSOCK *sqlsocket, SQL_CONFIG *config) {
127 /*************************************************************************
129 * Function: sql_num_fields
131 * Purpose: database specific num_fields function. Returns number
132 * of columns from query
134 *************************************************************************/
135 static int sql_num_fields(SQLSOCK *sqlsocket, SQL_CONFIG *config) {
136 return ((rlm_sql_firebird_sock *) sqlsocket->conn)->sqlda_out->sqld;
140 /*************************************************************************
142 * Function: sql_num_rows
144 * Purpose: database specific num_rows. Returns number of rows in
147 *************************************************************************/
148 static int sql_num_rows(SQLSOCK *sqlsocket, SQL_CONFIG *config) {
153 /*************************************************************************
155 * Function: sql_fetch_row
157 * Purpose: database specific fetch_row. Returns a SQL_ROW struct
158 * with all the data for the query in 'sqlsocket->row'. Returns
159 * 0 on success, -1 on failure, SQL_DOWN if 'database is down'.
161 *************************************************************************/
162 static int sql_fetch_row(SQLSOCK *sqlsocket, SQL_CONFIG *config) {
163 rlm_sql_firebird_sock *firebird_sock = sqlsocket->conn;
166 sqlsocket->row = NULL;
167 if (firebird_sock->statement_type!=isc_info_sql_stmt_exec_procedure) {
168 res=fb_fetch(firebird_sock);
169 if (res==100) return 0;
171 radlog(L_ERR, "rlm_sql_firebird. Fetch problem:'%s'\n", firebird_sock->lasterror);
174 } else firebird_sock->statement_type=0;
175 fb_store_row(firebird_sock);
177 sqlsocket->row = firebird_sock->row;
182 /*************************************************************************
184 * Function: sql_finish_select_query
186 * Purpose: End the select query, such as freeing memory or result
188 *************************************************************************/
189 static int sql_finish_select_query(SQLSOCK * sqlsocket, SQL_CONFIG *config) {
190 sql_finish_query(sqlsocket,config);
194 /*************************************************************************
196 * Function: sql_finish_query
198 * Purpose: End the query, such as freeing memory
200 *************************************************************************/
201 static int sql_finish_query(SQLSOCK *sqlsocket, SQL_CONFIG *config) {
202 sql_free_result(sqlsocket,config);
206 /*************************************************************************
208 * Function: sql_free_result
210 * Purpose: database specific free_result. Frees memory allocated
213 *************************************************************************/
214 static int sql_free_result(SQLSOCK *sqlsocket, SQL_CONFIG *config) {
215 fb_free_result((rlm_sql_firebird_sock *) sqlsocket->conn);
220 /*************************************************************************
222 * Function: sql_close
224 * Purpose: database specific close. Closes an open database
225 * connection and cleans up any open handles.
227 *************************************************************************/
228 static int sql_close(SQLSOCK *sqlsocket, SQL_CONFIG *config) {
229 fb_destroy_socket((rlm_sql_firebird_sock *) sqlsocket->conn);
233 /*************************************************************************
235 * Function: sql_error
237 * Purpose: database specific error. Returns error associated with
240 *************************************************************************/
241 static char *sql_error(SQLSOCK *sqlsocket, SQL_CONFIG *config) {
242 rlm_sql_firebird_sock *firebird_sock = sqlsocket->conn;
243 return firebird_sock->lasterror;
246 /*************************************************************************
248 * Function: sql_affected_rows
250 * Purpose: Return the number of rows affected by the query (update,
253 *************************************************************************/
254 static int sql_affected_rows(SQLSOCK *sqlsocket, SQL_CONFIG *config) {
259 /* Exported to rlm_sql */
260 rlm_sql_module_t rlm_sql_firebird = {
274 sql_finish_select_query,