URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 58339
[ Назад ]

Исходное сообщение
"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 , 18-Июл-05 16:07 
>Привет 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"
Отправлено linspb , 18-Июл-05 16:27 
>Зачем вам два запроса в одном? И какую нагрузку несет он?

Надо, правда надо.

нужно обновлять и контролировать несколько таблиц,
одним запросом не сделать.


"MySQL & RadiusD"
Отправлено linspb , 19-Июл-05 16:25 
никто не ответит?


"MySQL & RadiusD"
Отправлено Simps , 19-Июл-05 16:44 
>никто не ответит?

Отвечаю =) Убери ; в конце


"MySQL & RadiusD"
Отправлено linspb , 20-Июл-05 13:15 
>>никто не ответит?
>
>Отвечаю =) Убери ; в конце

на
...      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 , 20-Июл-05 13:36 
невозможно!
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"
Отправлено . , 08-Апр-09 10:15 
>невозможно!
>radius использует mysql_query.
>mysql_query обрабатывает по одному запросу.

Возможно. Update умеет  и несколько таблиц обновлять.

UPDATE [LOW_PRIORITY] [IGNORE] tbl_name [, tbl_name ...]
    SET col_name1=expr1 [, col_name2=expr2 ...]
    [WHERE where_definition]


"MySQL & RadiusD"
Отправлено linspb , 20-Июл-05 17:16 
что бы работало:

--- 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));
}