По следам прошедшей конференции AsterConf’2017 мы решили опубликовать несколько простых советов, которые оказались полезными участникам конференции.
Первый относится к использованию SQL запросов в системах, которые построены при помощи написания диалплана без применения графических оболочек вроде FreePBX. Для работы c SQL из диалплана чаще всего используют возможности модуля func_odbc. Однако часто оказывается неудобным то, что для каждого запрос а требуется редактирование отдельного файла. Ниже описание того, как этого избежать и задавать все запросы в диалплане.
В примерах конфигурационных файлов, поставляемых с asterisk есть такой пример настройки func_odbc:
1 2 3 |
[SQL] dsn=mysql1 readsql=${ARG1} |
Все бы хорошо, но данный пример только использовать чтение из БД, используя SQL зарос, заданный в диалплане. Выглядит это так:
1 |
exten => s,n,NoOp(${ODBC_SQL(SELECT somefield FROM sometable LIMIT 1)}) |
С подобными запросами проблемы не возникнут и при аналогичном вызове функции на запись, но если вы попробуете использовать более сложные запросы, выбирающие несколько полей — то парсер Asterisk буквально взбунтуется, так как будет пытаться разделить запрос на несколько переменных.
При исследовании был найден простой и относительно элегантный способ — передавать в func_odbc лишь имя переменной, содержащей SQL запрос:
1 2 3 4 |
[SQL] dsn=mysql1 readsql=${${ARG1}} writesql=${${ARG1}} |
таким образом запросы на запись и чтение будут выглядеть примерно так:
1 2 3 4 |
exten => s,n,Set(QUERY=SELECT field1,field2 FROM sometable LIMIT 1) exten => s,n,Set(ARRAY(FIELD1,FIELD2)=${ODBC_SQL(QUERY)}) exten => s,n,Set(QUERY=UPDATE sometable SET somefield='1' LIMIT 1) exten => s,n,Set(ODBC_SQL(QUERY)=ignore) |
Надеюсь данный прием пригодится широким массам