По следам прошедшей конференции AsterConf’2017 мы решили опубликовать несколько простых советов, которые оказались полезными участникам конференции.
Первый относится к использованию SQL запросов в системах, которые построены при помощи написания диалплана без применения графических оболочек вроде FreePBX. Для работы c SQL из диалплана чаще всего используют возможности модуля func_odbc. Однако часто оказывается неудобным то, что для каждого запрос а требуется редактирование отдельного файла. Ниже описание того, как этого избежать и задавать все запросы в диалплане.
В примерах конфигурационных файлов, поставляемых с asterisk есть такой пример настройки func_odbc:
[SQL]
dsn=mysql1
readsql=$ARG1
Все бы хорошо, но данный пример только использовать чтение из БД, используя SQL зарос, заданный в диалплане. Выглядит это так:
exten => s,n,NoOp ($ODBC_SQL (SELECT somefield FROM sometable LIMIT 1))
С подобными запросами проблемы не возникнут и при аналогичном вызове функции на запись, но если вы попробуете использовать более сложные запросы, выбирающие несколько полей — то парсер Asterisk буквально взбунтуется, так как будет пытаться разделить запрос на несколько переменных.
При исследовании был найден простой и относительно элегантный способ — передавать в func_odbc лишь имя переменной, содержащей SQL запрос:
[SQL]
dsn=mysql1
readsql=$$ARG1
writesql=$$ARG1
таким образом запросы на запись и чтение будут выглядеть примерно так:
exten => s,n,Set (QUERY=SELECT somefield FROM sometable LIMIT 1)
exten => s,n,NoOp ($ODBC_SQL (QUERY))
exten => s,n,Set (QUERY=UPDATE sometable SET somefield=’1′ LIMIT 1)
exten => s,n,Set (ODBC_SQL (QUERY)=ignore)
Надеюсь данный прием пригодится широким массам
Оригинал: http://blog.iqtek.ru/?p=125