1 /***************************************************************************
2 * sql_mysql.c rlm_sql - FreeRADIUS SQL Module *
4 * MySQL routines for rlm_sql *
6 * Mike Machado <mike@innercite.com> *
7 ***************************************************************************/
17 /*************************************************************************
19 * Function: sql_create_socket
21 * Purpose: Establish connection to the db
23 *************************************************************************/
24 SQLSOCK *sql_create_socket(SQL_INST *inst) {
27 if ((socket = malloc(sizeof(SQLSOCK))) == NULL) {
28 radlog(L_CONS|L_ERR, "sql_create_socket: no memory");
32 mysql_init(&(socket->conn));
33 if (!(socket->sock = mysql_real_connect(&(socket->conn), inst->config->sql_server, inst->config->sql_login, inst->config->sql_password, inst->config->sql_db, 0, NULL, CLIENT_FOUND_ROWS))) {
34 radlog(L_ERR, "rlm_sql: Couldn't connect socket to MySQL server %s@%s:%s", inst->config->sql_login, inst->config->sql_server, inst->config->sql_db);
35 radlog(L_ERR, "rlm_sql: Mysql error '%s'", mysql_error(&socket->conn));
42 /*************************************************************************
46 * Purpose: Issue a query to the database
48 *************************************************************************/
49 int sql_query(SQL_INST *inst, SQLSOCK *socket, char *querystr) {
51 if (inst->config->sqltrace)
53 if (socket->sock == NULL) {
54 radlog(L_ERR, "Socket not connected");
57 return mysql_query(socket->sock, querystr);
61 /*************************************************************************
63 * Function: sql_select_query
65 * Purpose: Issue a select query to the database
67 *************************************************************************/
68 int sql_select_query(SQL_INST *inst, SQLSOCK *socket, char *querystr) {
70 if (inst->config->sqltrace)
72 if (socket->sock == NULL) {
73 radlog(L_ERR, "Socket not connected");
76 mysql_query(socket->sock, querystr);
77 if (sql_store_result(socket) && sql_num_fields(socket))
84 /*************************************************************************
86 * Function: sql_store_result
88 * Purpose: database specific store_result function. Returns a result
91 *************************************************************************/
92 int sql_store_result(SQLSOCK *socket) {
94 if (socket->sock == NULL) {
95 radlog(L_ERR, "Socket not connected");
98 if (!(socket->result = mysql_store_result(socket->sock))) {
99 radlog(L_ERR,"MYSQL Error: Cannot get result");
100 radlog(L_ERR,"MYSQL Error: %s",mysql_error(socket->sock));
108 /*************************************************************************
110 * Function: sql_num_fields
112 * Purpose: database specific num_fields function. Returns number
113 * of columns from query
115 *************************************************************************/
116 int sql_num_fields(SQLSOCK *socket) {
119 #if MYSQL_VERSION_ID >= 32224
120 if (!(num = mysql_field_count(socket->sock))) {
122 if (!(num = mysql_num_fields(socket->sock))) {
124 radlog(L_ERR,"MYSQL Error: Cannot get result");
125 radlog(L_ERR,"MYSQL error: %s",mysql_error(socket->sock));
131 /*************************************************************************
133 * Function: sql_num_rows
135 * Purpose: database specific num_rows. Returns number of rows in
138 *************************************************************************/
139 int sql_num_rows(SQLSOCK *socket) {
141 return mysql_num_rows(socket->result);
145 /*************************************************************************
147 * Function: sql_fetch_row
149 * Purpose: database specific fetch_row. Returns a SQL_ROW struct
150 * with all the data for the query
152 *************************************************************************/
153 SQL_ROW sql_fetch_row(SQLSOCK *socket) {
155 return mysql_fetch_row(socket->result);
160 /*************************************************************************
162 * Function: sql_free_result
164 * Purpose: database specific free_result. Frees memory allocated
167 *************************************************************************/
168 void sql_free_result(SQLSOCK *socket) {
170 mysql_free_result(socket->result);
175 /*************************************************************************
177 * Function: sql_error
179 * Purpose: database specific error. Returns error associated with
182 *************************************************************************/
183 char *sql_error(SQLSOCK *socket) {
185 return mysql_error(socket->sock);
189 /*************************************************************************
191 * Function: sql_close
193 * Purpose: database specific close. Closes an open database
196 *************************************************************************/
197 void sql_close(SQLSOCK *socket) {
199 mysql_close(socket->sock);
204 /*************************************************************************
206 * Function: sql_finish_query
208 * Purpose: End the query, such as freeing memory
210 *************************************************************************/
211 void sql_finish_query(SQLSOCK *socket) {
217 /*************************************************************************
219 * Function: sql_finish_select_query
221 * Purpose: End the select query, such as freeing memory or result
223 *************************************************************************/
224 void sql_finish_select_query(SQLSOCK *socket) {
226 sql_free_result(socket);
230 /*************************************************************************
232 * Function: sql_affected_rows
234 * Purpose: End the select query, such as freeing memory or result
236 *************************************************************************/
237 int sql_affected_rows(SQLSOCK *socket) {
239 return mysql_affected_rows(socket->sock);
243 /*************************************************************************
245 * Function: sql_escape_string
247 * Purpose: Esacpe "'" and any other wierd charactors
249 *************************************************************************/
250 int sql_escape_string(char *to, char *from, int length) {
252 mysql_escape_string(to, from, length);