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

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 скриптом делать выборку - скрипт возвращает все нормально, без косых черт. Ощущение что это сам Астериск добавляет эти линии. Пробовал экранировать в запросе это поле кавычками но все равно добавляется... Может кто сталкивался. Спасибо.

удалить закрыть спам изменить тег редактировать

спросил 2018-11-15 02:17:23 +0400

Rockast Gravatar Rockast
57 5 5

обновил 2018-11-15 02:20:39 +0400

Comments

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

zzuz ( 2018-11-15 02:46:32 +0400 )редактировать

[reserv]

dsn=reservdb

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

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

Rockast ( 2018-11-15 11:43:52 +0400 )редактировать

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

same = n,Set(dial=${ODBC_reserv()})
same = n,ExecIF($[${EXISTS(${dial})}]?Goto(${dial})
zzuz ( 2018-11-15 12:03:48 +0400 )редактировать

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

Rockast ( 2018-11-15 12:31:10 +0400 )редактировать

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

zzuz ( 2018-11-15 15:32:33 +0400 )редактировать
1

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

meral ( 2018-11-15 16:42:52 +0400 )редактировать

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

Rockast ( 2018-11-22 13:16:12 +0400 )редактировать

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

meral ( 2018-11-23 13:18:42 +0400 )редактировать

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

meral ( 2018-11-23 13:19:30 +0400 )редактировать

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

meral ( 2018-11-23 13:22:42 +0400 )редактировать

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

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 ленту новостей

Статистика

Задан: 2018-11-15 02:17:23 +0400

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

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

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