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

Вычисление значения переменных в Asterisk

0

Здравствуйте

В func_odbc.conf есть вот такая функция (выясняем, сколько времени человек прождал в очереди перед тем, как положить трубку):

[QUEUE_WAIT]
readsql=SELECT data3 FROM queue_log WHERE callid='${ARG1}' AND (event='CONNECT' or event='ABANDON');

В диалплане есть примерно такая строка:

exten => h,1, ExecIf($[ ${CALLERID(num)} = 11111111 ]?Set(waittime=${ODBC_QUEUE_WAIT(${UNIQUEID})}))

Если верить логам, астериск ВСЕГДА вызывает функцию ODBCQUEUEWAIT, даже если не выполняется условие в ExecIf.

Кусок лога:

 == Spawn extension (from-city, 74951234567, 1) exited non-zero on 'SIP/TRUNK-00009792'
           > Found no rows [SELECT data3 from queue_log WHERE callid='1450619097.43569' AND (event='CONNECT' or event='ABANDON')]
        -- Executing [h@from-city:1] ExecIf("SIP/TRUNK-00009792", "0?Set(waittime=)") in new stack

Нагуглил, что это нормальное поведение. Существуют способы убедить астериск не вычислять значение функции или переменных заранее, до выполнения условия, и не плодить (в данном случае) ненужные запросы к mysql?

Упреждая вопросы - ${QEHOLDTIME} не предлагать, переменная устанавливается только при отвеченном вызове.

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

спросил 2015-12-20 17:54:43 +0400

beginner Gravatar beginner
63 4 4

обновил 2015-12-20 17:55:54 +0400

Comments

0?Set . 0 означает , что условие If не выполнилось.

zzuz ( 2015-12-20 18:54:38 +0400 )редактировать

его смущает что переменная все равно определена(вызван sql)

meral ( 2015-12-20 18:58:41 +0400 )редактировать

кстати, само условие у вас тоже неправильное. ибо в таком виде оно пытается сравнится как цифры и вызовит ошибку если CALLERID(num)=undefined. необходимо использовать кавычки.

meral ( 2015-12-20 18:59:58 +0400 )редактировать

2 Ответа

1

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

можно посоветовать вам использовать gotoIF или gosubif

тогда точно не будет ничего вызваться, если на строчку с выражением не будет перехода

exten => h,1,GotoIf($[ "${CALLERID(num)}" != "11111111" ]?skip)
exten => h,n,Set(waittime=${ODBC_QUEUE_WAIT(${UNIQUEID})})
exten => h,n(skip),Noop(something other)
ссылка удалить спам редактировать

ответил 2015-12-20 18:57:58 +0400

meral Gravatar meral flag of Ukraine
23347 24 20 177
http://pro-sip.net/

обновил 2015-12-21 00:12:57 +0400

Comments

Похоже, что это единственный выход. Придется либо все время базу дергать, либо действительно городить goto. Про CALLERID(num)=undefined учту, спасибо.

beginner ( 2015-12-20 19:14:18 +0400 )редактировать

а чем вам goto не угодил то?

meral ( 2015-12-20 21:25:37 +0400 )редактировать

вообще можно в сам запрос добавить ${CALLERID(num)} = '11111111' и ваша база соптимизирует такой запрос как f=t и не будет даже индекс спрашивать.

meral ( 2015-12-20 21:27:32 +0400 )редактировать

Все происходит в экстеншене h, в нем уже вызывается парочка AGI-скриптов для интеграции с 1С и отправки писем о пропущенных вызовах. Не уверен, что прыгать из h куда-то еще будет хорошей идеей. Ну либо я не знаю каких-то основополагающих вещей, из серии что можно делать смело, а что - никогда.

beginner ( 2015-12-20 23:26:23 +0400 )редактировать

вы можете прыгать на метку(менять приоритет). почитайте книжки чтоли. да вобщемто куда угодно можете прыгать. а вот скрипты вызывать не особо рекомендуется. особенно скрипты которые выполняются дольше 2 секунд.

meral ( 2015-12-21 00:11:05 +0400 )редактировать
0

Выполнение фукнции обязательно , так как Вы используете Set .

Попробуйте использовать просто SET

exten => h,1,Set(waittime=${IF($[ ${CALLERID(num)} = 11111111 ]?${ODBC_QUEUE_WAIT(${UNIQUEID})})
ссылка удалить спам редактировать

ответил 2015-12-20 18:59:14 +0400

zzuz Gravatar zzuz flag of Russian Federation
7174 2 6 75
http://line24.ru/

Comments

все равно будет выполнено) у астериска диалплан - конечный автомат. не выполнено будет только если на строчку не было перехода.

meral ( 2015-12-20 19:02:19 +0400 )редактировать

я только что проверил на 11.10. спрашивает.

meral ( 2015-12-20 19:11:32 +0400 )редактировать

Нет, при таком запросе все равно сначала подставляются переменные, а потом сравнивается их значение

beginner ( 2015-12-20 19:11:48 +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 ленту новостей

Статистика

Задан: 2015-12-20 17:54:43 +0400

Просмотрен: 1,454 раз

Обновлен: Dec 21 '15

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