Compiles with new ICRADIUS code, but BADLY BROKEN. DO NOT USE YET :)
[freeradius.git] / src / modules / rlm_sql / sql_module.c
1 /*
2  * sql_module.c - MySQL routines for FreeRADIUS SQL module 
3  *
4  * Mike Machado <mike@innercite.com>
5  */
6
7 #include <stdio.h>
8 #include <sys/stat.h>
9 #include <stdlib.h>
10 #include <string.h>
11
12 #include        "radiusd.h"
13 #include        "rlm_sql.h"
14
15
16 /*************************************************************************
17  *
18  *      Function: sql_query
19  *
20  *      Purpose: Issue a query to the database
21  *
22  *************************************************************************/
23 SQLSOCK *sql_create_socket(void) {
24         SQLSOCK *socket;
25
26         if ((socket = malloc(sizeof(SQLSOCK))) == NULL) {
27                 log(L_CONS|L_ERR, "sql_create_socket: no memory");
28                 exit(1);
29         }
30
31         mysql_init(&(socket->conn));
32         if (!(socket->sock = mysql_real_connect(&(socket->conn), sql->config->sql_server, sql->config->sql_login, sql->config->sql_password, sql->config->sql_db, 0, NULL, 0))) {
33                 log(L_ERR, "Init: Couldn't connect socket to MySQL server %s@%s:%s", sql->config->sql_login, sql->config->sql_server, sql->config->sql_db);
34                 socket->sock = NULL;
35                 return NULL;
36         }
37         return socket;
38 }
39
40 /*************************************************************************
41  *
42  *      Function: sql_query
43  *
44  *      Purpose: Issue a query to the database
45  *
46  *************************************************************************/
47 int sql_query(SQLSOCK *socket, char *querystr) {
48
49         if (sql->config->sqltrace)
50                 DEBUG(querystr);
51          if (socket->sock == NULL) {
52                 log(L_ERR, "Socket not connected");
53                 return 0;
54         }
55         return mysql_query(socket->sock, querystr);
56 }
57
58
59 /*************************************************************************
60  *
61  *      Function: sql_select_query
62  *
63  *      Purpose: Issue a select query to the database
64  *
65  *************************************************************************/
66 int sql_select_query(SQLSOCK *socket, char *querystr) {
67
68         if (sql->config->sqltrace)
69                 DEBUG(querystr);
70         if (socket->sock == NULL) {
71                 log(L_ERR, "Socket not connected");
72                 return 0;
73         }
74         mysql_query(socket->sock, querystr);
75         if (sql_store_result(socket) && sql_num_fields(socket)) 
76                 return 1;
77         else
78                 return 0;
79 }
80
81
82 /*************************************************************************
83  *
84  *      Function: sql_store_result
85  *
86  *      Purpose: database specific store_result function. Returns a result
87  *               set for the query.
88  *
89  *************************************************************************/
90 int sql_store_result(SQLSOCK *socket) {
91
92         if (socket->sock == NULL) {
93                 log(L_ERR, "Socket not connected");
94                 return 0;
95         }
96         if (!(socket->result = mysql_store_result(socket->sock))) {
97                 log(L_ERR,"MYSQL Error: Cannot get result");
98                 log(L_ERR,"MYSQL Error: %s",mysql_error(socket->sock));
99                 return 0;
100         }
101         return 1;
102
103 }
104
105
106 /*************************************************************************
107  *
108  *      Function: sql_num_fields
109  *
110  *      Purpose: database specific num_fields function. Returns number
111  *               of columns from query
112  *
113  *************************************************************************/
114 int sql_num_fields(SQLSOCK *socket) {
115
116         int     num = 0;
117 #if MYSQL_VERSION_ID >= 32224
118         if (!(num = mysql_field_count(socket->sock))) {
119 #else
120         if (!(num = mysql_num_fields(socket->sock))) {
121 #endif
122                 log(L_ERR,"MYSQL Error: Cannot get result");
123                 log(L_ERR,"MYSQL error: %s",mysql_error(socket->sock));
124         }
125         return num;
126 }
127
128
129 /*************************************************************************
130  *
131  *      Function: sql_num_rows
132  *
133  *      Purpose: database specific num_rows. Returns number of rows in
134  *               query
135  *
136  *************************************************************************/
137 int sql_num_rows(SQLSOCK *socket) {
138
139         return mysql_num_rows(socket->result);
140 }
141
142
143 /*************************************************************************
144  *
145  *      Function: sql_fetch_row
146  *
147  *      Purpose: database specific fetch_row. Returns a SQL_RES struct
148  *               with all the data for the query
149  *
150  *************************************************************************/
151 SQL_ROW sql_fetch_row(SQLSOCK *socket) {
152
153         return mysql_fetch_row(socket->result);
154 }
155
156
157
158 /*************************************************************************
159  *
160  *      Function: sql_free_result
161  *
162  *      Purpose: database specific free_result. Frees memory allocated
163  *               for a result set
164  *
165  *************************************************************************/
166 void sql_free_result(SQLSOCK *socket) {
167
168         mysql_free_result(socket->result);
169 }
170
171
172
173 /*************************************************************************
174  *
175  *      Function: sql_error
176  *
177  *      Purpose: database specific error. Returns error associated with
178  *               connection
179  *
180  *************************************************************************/
181 char *sql_error(SQLSOCK *socket) {
182
183         return mysql_error(socket->sock);
184 }
185
186
187 /*************************************************************************
188  *
189  *      Function: sql_close
190  *
191  *      Purpose: database specific close. Closes an open database
192  *               connection
193  *
194  *************************************************************************/
195 void sql_close(SQLSOCK *socket) {
196
197         mysql_close(socket->sock);
198         socket->sock = NULL;
199 }
200
201
202 /*************************************************************************
203  *
204  *      Function: sql_finish_query
205  *
206  *      Purpose: End the query, such as freeing memory
207  *
208  *************************************************************************/
209 void sql_finish_query(SQLSOCK *socket) {
210
211 }
212
213
214
215 /*************************************************************************
216  *
217  *      Function: sql_finish_select_query
218  *
219  *      Purpose: End the select query, such as freeing memory or result
220  *
221  *************************************************************************/
222 void sql_finish_select_query(SQLSOCK *socket) {
223
224         sql_free_result(socket);
225 }
226
227
228 /*************************************************************************
229  *
230  *      Function: sql_affected_rows
231  *
232  *      Purpose: End the select query, such as freeing memory or result
233  *
234  *************************************************************************/
235 int sql_affected_rows(SQLSOCK *socket) {
236
237         return mysql_affected_rows(socket->sock);
238 }
239
240
241 /*************************************************************************
242  *
243  *      Function: sql_escape_string
244  *
245  *      Purpose: Esacpe "'" and any other wierd charactors
246  *
247  *************************************************************************/
248 int sql_escape_string(char *to, char *from, int length) {
249
250         mysql_escape_string(to, from, length);
251         return 1;
252 }