MySQL & RadiusD, linspb, 18-Июл-05, 15:56 [смотреть все]Привет All,помоги решить проблему, есть FreeBSD, MPD, Radius, Mysql. Всё работает, всем доволен. в radius в sql.conf есть accounting_update_query = "UPDATE ${acct_table1} \ SET FramedIPAddress = '%{Framed-IP-Address}', \ AcctSessionTime = '%{Acct-Session-Time}', \ AcctInputOctets = '%{Acct-Input-Octets}', \ AcctOutputOctets = '%{Acct-Output-Octets}' \ WHERE AcctSessionId = '%{Acct-Session-Id}' \ AND UserName = '%{SQL-User-Name}' \ AND NASIPAddress= '%{NAS-IP-Address}'" и работает она хорошо, НО! нужно написать 2 или 3,4 sql запросов для accounting_update_query. что то на подобе: accounting_update_query = "UPDATE ${acct_table1} \ SET FramedIPAddress = '%{Framed-IP-Address}', \ AcctSessionTime = '%{Acct-Session-Time}', \ AcctInputOctets = '%{Acct-Input-Octets}', \ AcctOutputOctets = '%{Acct-Output-Octets}' \ WHERE AcctSessionId = '%{Acct-Session-Id}' \ AND UserName = '%{SQL-User-Name}' \ AND NASIPAddress= '%{NAS-IP-Address}'; \ SELECT '1';" не выполняется, ругается на "; SELECT '1';". как сделать?
|
- MySQL & RadiusD, Simps, 16:07 , 18-Июл-05 (1)
- MySQL & RadiusD, linspb, 16:27 , 18-Июл-05 (2)
>Зачем вам два запроса в одном? И какую нагрузку несет он? Надо, правда надо. нужно обновлять и контролировать несколько таблиц, одним запросом не сделать.
- MySQL & RadiusD, linspb, 16:25 , 19-Июл-05 (3)
- MySQL & RadiusD, Simps, 16:44 , 19-Июл-05 (4)
- MySQL & RadiusD, linspb, 13:15 , 20-Июл-05 (5)
>>никто не ответит? > >Отвечаю =) Убери ; в конце на ... WHERE AcctSessionId = '%{Acct-Session-Id}' \ AND UserName = '%{SQL-User-Name}' \ AND NASIPAddress= '%{NAS-IP-Address}'; SELECT '1'" ругается: rlm_sql (sql): Couldn't update SQL accounting ALIVE record - You have an error i syntax; check the manual that corresponds to your MySQL server version for the r to use near '; SELECT '1'' at line 1 на ... WHERE AcctSessionId = '%{Acct-Session-Id}' \ AND UserName = '%{SQL-User-Name}' \ AND NASIPAddress= '%{NAS-IP-Address}' \ SELECT '1'" ругается: rlm_sql (sql): Couldn't update SQL accounting ALIVE record - You have an error i syntax; check the manual that corresponds to your MySQL server version for the r to use near 'SELECT '1'' at line 1 блин, должно же быть решение...
- MySQL & RadiusD, linspb, 13:36 , 20-Июл-05 (6)
невозможно! radius использует mysql_query. mysql_query обрабатывает по одному запросу. точка с запятой используется понимается только в консольном клиенте mysql, но он сам делит на отдельные запросы по ; и затем на сервер посылает их по одному. так что прийдется ковырять радиус sql_mysql.c static int sql_query(SQLSOCK * sqlsocket, SQL_CONFIG *config, char *querystr) { <...skip...> mysql_query(mysql_sock->sock, querystr); return sql_check_error(mysql_errno(mysql_sock->sock)); } Вопрос закрыт.
- MySQL & RadiusD, linspb, 17:16 , 20-Июл-05 (7)
что бы работало:--- src/modules/rlm_sql/drivers/rlm_sql_mysql/sql_mysql.c.orig Wed Jul 20 17:08:15 2005 +++ src/modules/rlm_sql/drivers/rlm_sql_mysql/sql_mysql.c Wed Jul 20 17:07:44 2005 @@ -145,9 +145,14 @@ * * Purpose: Issue a query to the database * + * Patched by linspb@gmail.com + * for many SQL QUERY *************************************************************************/ static int sql_query(SQLSOCK * sqlsocket, SQL_CONFIG *config, char *querystr) { + char *r; + char *str; + rlm_sql_mysql_sock *mysql_sock = sqlsocket->conn; if (config->sqltrace) @@ -156,8 +161,13 @@ radlog(L_ERR, "rlm_sql_mysql: Socket not connected"); return SQL_DOWN; } - - mysql_query(mysql_sock->sock, querystr); + + r=strdup(querystr); + while (str=strsep(&r,";")) { + radlog(L_DBG,"rlm_sql_mysql: mysql_query (%s)",str); + mysql_query(mysql_sock->sock,str); + } + return sql_check_error(mysql_errno(mysql_sock->sock)); }
|