Привет 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';".
как сделать?
>Привет 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';".
>как сделать?Зачем вам два запроса в одном? И какую нагрузку несет он?
>Зачем вам два запроса в одном? И какую нагрузку несет он?Надо, правда надо.
нужно обновлять и контролировать несколько таблиц,
одним запросом не сделать.
никто не ответит?
>никто не ответит?Отвечаю =) Убери ; в конце
>>никто не ответит?
>
>Отвечаю =) Убери ; в концена
... 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блин, должно же быть решение...
невозможно!
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));
}Вопрос закрыт.
>невозможно!
>radius использует mysql_query.
>mysql_query обрабатывает по одному запросу.Возможно. Update умеет и несколько таблиц обновлять.
UPDATE [LOW_PRIORITY] [IGNORE] tbl_name [, tbl_name ...]
SET col_name1=expr1 [, col_name2=expr2 ...]
[WHERE where_definition]
что бы работало:--- 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));
}