2 * sql_module.c - MySQL routines for FreeRADIUS SQL module
4 * Mike Machado <mike@innercite.com>
16 /*************************************************************************
20 * Purpose: Issue a query to the database
22 *************************************************************************/
23 SQLSOCK *sql_create_socket(void) {
26 if ((socket = malloc(sizeof(SQLSOCK))) == NULL) {
27 log(L_CONS|L_ERR, "sql_create_socket: no memory");
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);
40 /*************************************************************************
44 * Purpose: Issue a query to the database
46 *************************************************************************/
47 int sql_query(SQLSOCK *socket, char *querystr) {
49 if (sql->config->sqltrace)
51 if (socket->sock == NULL) {
52 log(L_ERR, "Socket not connected");
55 return mysql_query(socket->sock, querystr);
59 /*************************************************************************
61 * Function: sql_select_query
63 * Purpose: Issue a select query to the database
65 *************************************************************************/
66 int sql_select_query(SQLSOCK *socket, char *querystr) {
68 if (sql->config->sqltrace)
70 if (socket->sock == NULL) {
71 log(L_ERR, "Socket not connected");
74 mysql_query(socket->sock, querystr);
75 if (sql_store_result(socket) && sql_num_fields(socket))
82 /*************************************************************************
84 * Function: sql_store_result
86 * Purpose: database specific store_result function. Returns a result
89 *************************************************************************/
90 int sql_store_result(SQLSOCK *socket) {
92 if (socket->sock == NULL) {
93 log(L_ERR, "Socket not connected");
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));
106 /*************************************************************************
108 * Function: sql_num_fields
110 * Purpose: database specific num_fields function. Returns number
111 * of columns from query
113 *************************************************************************/
114 int sql_num_fields(SQLSOCK *socket) {
117 #if MYSQL_VERSION_ID >= 32224
118 if (!(num = mysql_field_count(socket->sock))) {
120 if (!(num = mysql_num_fields(socket->sock))) {
122 log(L_ERR,"MYSQL Error: Cannot get result");
123 log(L_ERR,"MYSQL error: %s",mysql_error(socket->sock));
129 /*************************************************************************
131 * Function: sql_num_rows
133 * Purpose: database specific num_rows. Returns number of rows in
136 *************************************************************************/
137 int sql_num_rows(SQLSOCK *socket) {
139 return mysql_num_rows(socket->result);
143 /*************************************************************************
145 * Function: sql_fetch_row
147 * Purpose: database specific fetch_row. Returns a SQL_RES struct
148 * with all the data for the query
150 *************************************************************************/
151 SQL_ROW sql_fetch_row(SQLSOCK *socket) {
153 return mysql_fetch_row(socket->result);
158 /*************************************************************************
160 * Function: sql_free_result
162 * Purpose: database specific free_result. Frees memory allocated
165 *************************************************************************/
166 void sql_free_result(SQLSOCK *socket) {
168 mysql_free_result(socket->result);
173 /*************************************************************************
175 * Function: sql_error
177 * Purpose: database specific error. Returns error associated with
180 *************************************************************************/
181 char *sql_error(SQLSOCK *socket) {
183 return mysql_error(socket->sock);
187 /*************************************************************************
189 * Function: sql_close
191 * Purpose: database specific close. Closes an open database
194 *************************************************************************/
195 void sql_close(SQLSOCK *socket) {
197 mysql_close(socket->sock);
202 /*************************************************************************
204 * Function: sql_finish_query
206 * Purpose: End the query, such as freeing memory
208 *************************************************************************/
209 void sql_finish_query(SQLSOCK *socket) {
215 /*************************************************************************
217 * Function: sql_finish_select_query
219 * Purpose: End the select query, such as freeing memory or result
221 *************************************************************************/
222 void sql_finish_select_query(SQLSOCK *socket) {
224 sql_free_result(socket);
228 /*************************************************************************
230 * Function: sql_affected_rows
232 * Purpose: End the select query, such as freeing memory or result
234 *************************************************************************/
235 int sql_affected_rows(SQLSOCK *socket) {
237 return mysql_affected_rows(socket->sock);
241 /*************************************************************************
243 * Function: sql_escape_string
245 * Purpose: Esacpe "'" and any other wierd charactors
247 *************************************************************************/
248 int sql_escape_string(char *to, char *from, int length) {
250 mysql_escape_string(to, from, length);