The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
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));
    }




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру