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
Отключить экранирование запятых. По умолчанию экранируются.
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})}'