Quantcast
Viewing all articles
Browse latest Browse all 1135

Asterisk func_odbc

Asterisk func_odbc

SQLоперации func_odbc.conf,
как функции диалплана Asterisk.
Подробное руководство. Примеры.

Основы func_odbc

Имена функций (контекстов) рекомендуется задавать в верхнем регистре, но, тем не менее, имена чувствительны к регистру.

 [TEST]

Каждый созданный контекст становиться отдельной функцией, которая и вызывается в диалплане.
Т.е., если в этом файле определен контекст [TEST], то выполнив перезагрузку модуля
module reload func_odbc.soмы увидим созданную функцию: core show function ODBC <Tab>

CLI> core show function ODBC
ODBC        ODBC_FETCH  ODBC_TEST

Для соединения с хранилищем определяется категория DSNиз конфига Asterisk: odbc.conf

 dsn=mysql1

Переменные аргументов ${ARGn}

Вызывая функцию в диалплане, оператору SQLпередаются аргументы, перечисленные через запятую:

ODBC_FUNCTION_NAME(<arg1>, <arg2> … <argN>)

Которые затем получаются оператором SQLв переменных ${ARG1},${ARG2},…${ARGn}:

 exten => _555,1,Dial(Local/${ODBC_FUNCTION_NAME(${EXTEN})}@from-internal/n,30,tr)
 readsql => SELECT src FROM cdr WHERE dst='${ARG1}' ORDER BY calldate DESC LIMIT 1;

Переменные значений ${VARn}

ODBC_FUNCTION_NAME(<arg1>, <arg2> … <argN>)=<val1>,<val2>…<valN>

Дополнительно возможно получить значения для записи в переменных ${VAR1},${VAR2},…${VARn} :

exten => h,1,Set(ODBC_FUNCTION_NAME(${UNIQUEID})=/record/${UNIQUEID}.mp3)

где, VAR1=/record/${UNIQUEID}.mp3, а ARG1=${UNIQUEID}:

writesql=UPDATE cdr SET userfield='${VAL1}' WHERE uniqueid='${ARG1}'

Полная строка ${VALUE}

И наконец, чтобы получить полную строку из диалплана, без разбора, используется переменная ${VALUE}:

 exten => _2666,1,set(ODBC_COS1()=${SQL_ESC(INSERT INTO cos1 (master,slave) VALUE (2666,3999))})

[COS1]
dsn=mysql2
writesql=${VALUE}

Чтобы экранировать данные, в которых могут использоваться одинарные кавычки « ' »
(иначе используются для выделения данных в SQLзапросе),
используется функция диалплана SQL_ESC().

Функция ODBC_FETCHобрабатывает много-строчные SQLзапросы и зависит от параметра mode=multirow:

Set(_i=${ODBC_FETCH(${ODBC_FOO(${foo})})})

general func_odbc.conf

single_db_connection

Asterisk использует отдельные соединения для каждой операции с базой данных.
Если 'single_db_connection' включена, то func_odbc будет использовать общее
подключение к базе данных по одному DSN.
Эта означает, что второй вызов func_odbc работает по тому же соединению.
Обратите внимание, что потребуются дополнительные действия в диалплане, чтобы это работало.
Вместо этого можно использовать хранимые процедуры (набор SQL-инструкций) на сервере SQL.
Эта опция по умолчанию отключена.

 [general]
 single_db_connection=no

Параметры функций func_odbc.conf

readhandle

Разделенный запятыми список DSN (из конфига res_odbc.conf.
Каждый DSNиз списка испытывается пока не удастся успешная операция 'readsql'.
Можно указать до 5-ти DSNдля каждого класса функций. По умолчанию не задано.

 readhandle=mysql1,mysql2

writehandle

Разделенный запятыми список DSN (из конфига res_odbc.conf.
Каждый DSNиз списка испытывается пока не удастся успешная операция 'writesql'.
Можно указать до 5-ти DSNдля каждого класса функций. Параметр 'dsn' синоним 'writehandle'.
По умолчанию не задано.

 writehandle=pgsql1,pgsql2

readsql,writesql

  • readsql - операция класса функций для чтения данных.
  • writesql - операция класса функцийй для записи данных.
  • insertsql - Данный параметр указан в оригинальном конфиге Asterisk, но судя по всему, не поддерживается (Asterisk 14)

prefix "ODBC"

По умолчанию все имена классов функций начинаются с «ODBC»
Задав префикс, можно изменить стандартное «ODBC» на ваш префикс. По умолчанию не задано.

 prefix=DIALER

escapecommas

Отключить экранирование запятых. По умолчанию экранируются.

Пример func_odbc escapecommas=no

synopsis

Появится в описании функции вызываемом командой 'core show function <function name>'
в разделе synopsis:

 synopsis=def codes for spb mobile calls

mode=multirow

Этот параметр может быть установлен в 'multirow', чтобы разрешить функции возвращать множество строк.
Это меняет стандартный режим работы 'func_odbc'.
Вместо того, чтобы вернуть просто строку, он возвращает ID для функции ODBC_FETCH(),
которая, в свою очередь, возвращает уже каждую строку по отдельности.
Переменная ODBC_FETCH_STATUS возвращает значение SUCCESS или FAILURE, чтобы понять были ли получены какие-либо результаты.
По завершении должна быть выполнена команда ODBCFinish, чтобы очистить любые оставшиеся результаты.
Переменная ODBCROWS возвращает число полученных строк.

rowlimit

Задает предельное число строк, которое может быть сохранено для этого запроса.
В режиме 'multirow' функция может получить большое количество строк и переполнить память до предела.
Чтобы избежать этого задается лимит.

; ODBC_SQL - Allow an SQL statement to be built entirely in the dialplan
[SQL]
dsn=mysql1
readsql=${ARG1}

; ODBC_ANTIGF - A blacklist.
[ANTIGF]
dsn=mysql1,mysql2   ; Use mysql1 as the primary handle, but fall back to mysql2
                    ; if mysql1 is down.  Supports up to 5 comma-separated
                    ; DSNs.  "dsn" may also be specified as "readhandle" and
                    ; "writehandle", if it is important to separate reads and
                    ; writes to different databases.
readsql=SELECT COUNT(*) FROM exgirlfriends WHERE callerid='${SQL_ESC(${ARG1})}'
syntax=<callerid>
synopsis=Check if a specified callerid is contained in the ex-gf database

; ODBC_PRESENCE - Retrieve and update presence
[PRESENCE]
dsn=mysql1
readsql=SELECT location FROM presence WHERE id='${SQL_ESC(${ARG1})}'
writesql=UPDATE presence SET location='${SQL_ESC(${VAL1})}' WHERE id='${SQL_ESC(${ARG1})}'

Файлы конфигурации Asterisk

Spoiler

Viewing all articles
Browse latest Browse all 1135

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>