2 * sql_mysql.c SQL Module
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 * Copyright 2000 The FreeRADIUS server project
21 * Copyright 2000 Mike Machado <mike@innercite.com>
22 * Copyright 2000 Alan DeKok <aland@ox.org>
34 /*************************************************************************
36 * Function: sql_create_socket
38 * Purpose: Establish connection to the db
40 *************************************************************************/
42 sql_create_socket(SQL_INST * inst)
47 sqlsocket = rad_malloc(sizeof(SQLSOCK));
49 mysql_init(&(sqlsocket->conn));
52 mysql_real_connect(&(sqlsocket->conn), inst->config->sql_server,
53 inst->config->sql_login, inst->config->sql_password,
54 inst->config->sql_db, 0, NULL, CLIENT_FOUND_ROWS))) {
55 radlog(L_ERR, "rlm_sql: Couldn't connect socket to MySQL server %s@%s:%s",
56 inst->config->sql_login, inst->config->sql_server,
57 inst->config->sql_db);
58 radlog(L_ERR, "rlm_sql: Mysql error '%s'",
59 mysql_error(&sqlsocket->conn));
60 sqlsocket->sock = NULL;
67 /*************************************************************************
71 * Purpose: Issue a query to the database
73 *************************************************************************/
75 sql_query(SQL_INST * inst, SQLSOCK * sqlsocket, char *querystr)
78 if (inst->config->sqltrace)
79 DEBUG("query: %s", querystr);
80 if (sqlsocket->sock == NULL) {
81 radlog(L_ERR, "Socket not connected");
84 return mysql_query(sqlsocket->sock, querystr);
88 /*************************************************************************
90 * Function: sql_select_query
92 * Purpose: Issue a select query to the database
94 *************************************************************************/
96 sql_select_query(SQL_INST * inst, SQLSOCK * sqlsocket, char *querystr)
99 if (inst->config->sqltrace)
101 if (sqlsocket->sock == NULL) {
102 radlog(L_ERR, "Socket not connected");
105 mysql_query(sqlsocket->sock, querystr);
106 if (sql_store_result(sqlsocket) && sql_num_fields(sqlsocket))
113 /*************************************************************************
115 * Function: sql_store_result
117 * Purpose: database specific store_result function. Returns a result
120 *************************************************************************/
122 sql_store_result(SQLSOCK * sqlsocket)
125 if (sqlsocket->sock == NULL) {
126 radlog(L_ERR, "Socket not connected");
129 if (!(sqlsocket->result = mysql_store_result(sqlsocket->sock))) {
130 radlog(L_ERR, "MYSQL Error: Cannot get result");
131 radlog(L_ERR, "MYSQL Error: %s", mysql_error(sqlsocket->sock));
139 /*************************************************************************
141 * Function: sql_num_fields
143 * Purpose: database specific num_fields function. Returns number
144 * of columns from query
146 *************************************************************************/
148 sql_num_fields(SQLSOCK * sqlsocket)
153 #if MYSQL_VERSION_ID >= 32224
154 if (!(num = mysql_field_count(sqlsocket->sock))) {
156 if (!(num = mysql_num_fields(sqlsocket->sock))) {
158 radlog(L_ERR, "MYSQL Error: Cannot get result");
159 radlog(L_ERR, "MYSQL error: %s", mysql_error(sqlsocket->sock));
165 /*************************************************************************
167 * Function: sql_num_rows
169 * Purpose: database specific num_rows. Returns number of rows in
172 *************************************************************************/
174 sql_num_rows(SQLSOCK * sqlsocket)
177 return mysql_num_rows(sqlsocket->result);
181 /*************************************************************************
183 * Function: sql_fetch_row
185 * Purpose: database specific fetch_row. Returns a SQL_ROW struct
186 * with all the data for the query
188 *************************************************************************/
190 sql_fetch_row(SQLSOCK * sqlsocket)
193 return mysql_fetch_row(sqlsocket->result);
198 /*************************************************************************
200 * Function: sql_free_result
202 * Purpose: database specific free_result. Frees memory allocated
205 *************************************************************************/
207 sql_free_result(SQLSOCK * sqlsocket)
210 if (sqlsocket->result) {
211 mysql_free_result(sqlsocket->result);
217 /*************************************************************************
219 * Function: sql_error
221 * Purpose: database specific error. Returns error associated with
224 *************************************************************************/
226 sql_error(SQLSOCK * sqlsocket)
229 return mysql_error(sqlsocket->sock);
233 /*************************************************************************
235 * Function: sql_close
237 * Purpose: database specific close. Closes an open database
240 *************************************************************************/
242 sql_close(SQLSOCK * sqlsocket)
245 mysql_close(sqlsocket->sock);
246 sqlsocket->sock = NULL;
250 /*************************************************************************
252 * Function: sql_finish_query
254 * Purpose: End the query, such as freeing memory
256 *************************************************************************/
258 sql_finish_query(SQLSOCK * sqlsocket)
265 /*************************************************************************
267 * Function: sql_finish_select_query
269 * Purpose: End the select query, such as freeing memory or result
271 *************************************************************************/
273 sql_finish_select_query(SQLSOCK * sqlsocket)
276 sql_free_result(sqlsocket);
280 /*************************************************************************
282 * Function: sql_affected_rows
284 * Purpose: End the select query, such as freeing memory or result
286 *************************************************************************/
288 sql_affected_rows(SQLSOCK * sqlsocket)
291 return mysql_affected_rows(sqlsocket->sock);
295 /*************************************************************************
297 * Function: sql_escape_string
299 * Purpose: Esacpe "'" and any other wierd charactors
301 *************************************************************************/
303 sql_escape_string(char *to, char *from, int length)
306 mysql_escape_string(to, from, length);