First time here? Check out the FAQ!

Пожалуйста, войдите здесь. Часто задаваемые вопросы О нас
Задайте Ваш вопрос

Asterisk ODBC function

0

Всем привет!Вопрос к знатокам и сочувствующим. Есть такая несложная конструкция в диалплане:

exten => 123,1,DumpChan()

 same => n,Exec(${ODBC_reserv()})

func_odbc.conf:

[reserv]

dsn=reservdb

readsql=SELECT dial from dial where number='${EXTEN}}'

Таблица mysql:

id number dial

1 123 Goto(test,test123,1)

Запрос проходит, все отлично. Но Астериск получает из БД

Goto(test\,test123\,1)

Естественно с косыми чертами никакого контекста нет и мы никуда не переходим. В связи с этим вопрос - откуда эти черты берутся?И как убрать?

В БД записываю INSERT - все стандартно. Попробовал простым bash скриптом делать выборку - скрипт возвращает все нормально, без косых черт. Ощущение что это сам Астериск добавляет эти линии. Пробовал экранировать в запросе это поле кавычками но все равно добавляется... Может кто сталкивался. Спасибо.

спросил Nov 14 '18

Rockast Gravatar Rockast
57 5 5

обновил Nov 14 '18

Comments

хорошим тоном использовать в odbc запросе конструкцию SQL_ESC() .

zzuz (Nov 14 '18)edit

[reserv]

dsn=reservdb

readsql=SELECT dial from dial where number='${SQL_ESC(${EXTEN})}'

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

Rockast (Nov 15 '18)edit

тогда меняйте подход.

same = n,Set(dial=${ODBC_reserv()})
same
= n,ExecIF($[${EXISTS(${dial})}]?Goto(${dial})
zzuz (Nov 15 '18)edit

Тоже примерно так пробовал... Переменная dial в таком случае тоже имеет вид - Goto(test\,test123\,1) То есть функция ODBC уже вытягивает из БД данные в таком виде Goto(test\,test123\,1) Вне зависимости от того какой переменной их присвоить и т.д....

Rockast (Nov 15 '18)edit

Ну тогда по хардкору ${REPLACE(${dial},"\,",",")}

zzuz (Nov 15 '18)edit
1

Офигенно вы пишите. Неэкранированный запрос и сразу его в exec, ага. Шикарно, я считаю.

meral (Nov 15 '18)edit

Подскажите,как правильно сделать в таком случае? Уже не первый раз сталкиваюсь с такими "фишками" Астера... Когда какая-то функция берет данные, например из БД, по одной ей ведомой логике..

Rockast (Nov 22 '18)edit

Вам выше написали как. Правильно - спросить того дятла, который придумал "какого *я". И переписать полностью. Вы задолбаетесь баги в таком "решении" вылавливать в production.

meral (Nov 23 '18)edit

Это не "фишки астера", это способности "разработчика". Правила же не дураки придумали. БД не должно содержать куски следующего уровня(диалплан), нужно разделять.

meral (Nov 23 '18)edit

Вот представим ситуацию. У вас в БД записана команда с маааленькой ошибкой, изза чего она не выполняется. Как вы думаете, какой будет результат? Как вы это отследите? Особенно если в выражении были переменные.

meral (Nov 23 '18)edit

Будьте первым, кто ответит на этот вопрос!

Please start posting your answer anonymously - your answer will be saved within the current session and published after you log in or create a new account. Please try to give a substantial answer, for discussions, please use comments and please do remember to vote (after you log in)!
[скрыть предварительный просмотр]

Закладки и информация

Добавить закладку

подписаться на rss ленту новостей

Статистика

Задан: Nov 14 '18

Просмотрен: 339 раз

Обновлен: Nov 15 '18

Проект компании "АТС Дизайн"
Asterisk® и Digium® являются зарегистрированными торговыми марками компании Digium, Inc., США.
IP АТС Asterisk распространяется под лицензией GNU GPL.