Задать вопрос
@goodcat32

Как вызвать сохраненную mysql-процедуру из Asterisk через func_odbc?

Хочу сделать что-то наподобие авторизации для сотрудников саппорта, чтобы перед постановкой в очередь, они вводили свой pin-код. Есть процедура в Mysql, которой из диалплана я передаю ${CULLERID(num)} и введенный оператором ${pincode}. Процедура возвращает 0 если авторизация прошла, и 1, если что-то пошло не так. В БД еще куча информации, которая потом попадает в отчеты и важно знать, когда сотрудник встал в очередь, когда вышел.

Так вот, все, что мне необходимо работает с помощью приложения диалплана MYSQL, но его поддержка прекращена, а в будущих сборках Asterisk его и вовсе не будет.

Текущее содержание func_odbc.conf

[QUEUE]
dsn=aster-odbc
mode=multirow
writesql=CALL Asterisk_SupportSessionStart(${ARG1},${ARG2})


Фрагмент externsions.conf, где вызывается процедура (это один из вариантов, я пробовал кучу других, ничего не работает).
exten => _*99*,1(begin),Read(pincode,${SOUNDPATH}/002-pin,4,10)
exten => _*99*,n,Set(pinvalid=${ODBC_QUEUE(${CULLERID(num)},${pincode})})
exten => _*99*,n,NoOp(${pinvalid})
exten => _*99*,n,GotoIf($[${pinvalid} = 0]?loginok)
exten => _*99*,n,GoTo(begin)
exten => _*99*,n(loginok),NoOp(Access granted)
exten => _*99*,n,HangUp()


Понимаю, что ошибка где-то в диалплане, мне нужно дальше обработать ответ от базы, а я его не могу получить.
exten => _*99*,n,NoOp(${pinvalid}) - ничего не присваевается.
Слышал про функцииODBC_FETCH() иODBC_FETCH_STATUS(), но не понимаю, как их можно применить, да и документации по ним нет почти. За почти 4 дня разбирательств в голове все смешалось.
  • Вопрос задан
  • 767 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
попробуйте заменить writesql на readsql
readsql=CALL Asterisk_SupportSessionStart(${ARG1},${ARG2})

ADD:
в консоли можно проверить
*CLI> odbc read ODBC_QUEUE 12221 142342 exec
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Erhaver
Если есть уверенность,что CALL Asterisk_SupportSessionStart(${ARG1},${ARG2}) точно возвращает 1 или 0, попробуйте использовать Set(__pinvalid=
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы