По следам прошедшей конференции 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

автор igorg