Страница 1 из 1

Запрос к внешней БД через func_odbc

Добавлено: 02 апр 2014, 17:57
murr
Asterisk 10.12.4
FreePBX 2.11

Задача - определить маршрут входящих для сотрудников и остальных. База данных с телефонами сотрудников - в 1С под MS SQL 2000.

Настроил odbcinst.ini

Код: Выделить всё

[FreeTDS]
Description = ODBC for Microsoft SQL
Driver      = /usr/lib/libtdsodbc.so.0
UsageCount  = 1
Threading   = 2
Настроил odbc.ini

Код: Выделить всё

[1cDB]
Description     = MS SQL connection to '1C DB' database
Driver          = FreeTDS
Database        = NN_3
Server          = 10.10.1.4
UserName        = sa
Password        = хххххх_admin
Trace           = No
#TDS_Version     = 7.0
Port            = 1433
Настроил func_odbc.conf

Код: Выделить всё

[CHECK_NUM]
prefix = 1C
dsn=1cDB
readsql=select count(*) from SC17120 where LEFT(LTRIM(SP17131),3)='1KZ' AND descr like '%${ARG1}'
Завел доп. направление FreePbx

Код: Выделить всё

[check-worker-numbers]
exten => s,1,NoOp(Проверка на принадлежность к сотрудникам)
exten => s,n,Set(telnum=${CALLERID(num)})
exten => s,n,Set(ret_func=${1C_CHECK_NUM(${telnum})})
exten => s,n,GotoIf($[ ${ret_func} = "1"] ]?rab:net)
exten => s,n(rab),NoOp(${telnum} - это номер сотрудника)
exten => s,n,Hangup()
;exten => s,n,Goto(ext-group,600,1)
exten => s,n(net),NoOp(${telnum} - это НЕ номер сотрудника)
exten => s,n,Hangup()
;exten => s,n,Goto(ext-group,601,1)
;exten => s,n,Hangup()
В итоге в логах (телефон клиента)

Код: Выделить всё

VERBOSE[18807] pbx.c:     -- Executing [3005@from-trunk:13] Goto("SIP/3005-0000001f", "check-worker-numbers,s,1") in new stack
VERBOSE[18807] pbx.c:     -- Goto (check-worker-numbers,s,1)
VERBOSE[18807] pbx.c:     -- Executing [s@check-worker-numbers:1] NoOp("SIP/3005-0000001f", "Проверка на принадлежность к сотрудникам") in new stack
VERBOSE[18807] pbx.c:     -- Executing [s@check-worker-numbers:2] Set("SIP/3005-0000001f", "telnum=380506583493") in new stack
ERROR[18807] func_odbc.c: Unable to execute query [select count(*) from SC17120 where LEFT(LTRIM(SP17131),3)='1KZ' AND descr like '%380506583493']
VERBOSE[18807] pbx.c:     -- Executing [s@check-worker-numbers:3] Set("SIP/3005-0000001f", "ret_func=") in new stack
WARNING[18807] ast_expr2.fl: ast_yyerror():  syntax error: syntax error, unexpected '=', expecting $end; Input:
Подключение с этим же запросом через isql проходит нормально:

Код: Выделить всё

[root@pbx asterisk]# isql -v 1cDB sa хххххх_admin
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL> select count(*) from SC17120 where LEFT(LTRIM(SP17131),3)='1KZ' AND descr like '%380506583493'
+------------+
|            |
+------------+
| 0          |
+------------+
SQLRowCount returns 1
1 rows fetched
SQL>
Почему пишет ошибку выполнения запроса? Чего не увидел?

Re: Запрос к внешней БД через func_odbc

Добавлено: 02 апр 2014, 18:05
ded
[CHECK_NUM]
prefix = 1C
exten => s,n,Set(ret_func=${1C_CHECK_NUM(${telnum})})
попробуте обойтись без префикса 1C

Код: Выделить всё

exten => s,n,Set(ret_func=${CHECK_NUM(${telnum})})

Re: Запрос к внешней БД через func_odbc

Добавлено: 02 апр 2014, 18:29
murr
Убрал префикс.

Код: Выделить всё

VERBOSE[23309] pbx.c:     -- Executing [s@check-worker-numbers:2] Set("SIP/3005-00000005", "telnum=380662054237") in new stack
ERROR[23309] pbx.c: Function CHECK_NUM not registered

Re: Запрос к внешней БД через func_odbc

Добавлено: 02 апр 2014, 18:34
Vlad1983
пустая строка в конце файла func_odbc.conf присутствует?

Re: Запрос к внешней БД через func_odbc

Добавлено: 02 апр 2014, 18:52
murr
Решилось добавлением секции в res_odbc_custom.conf

Код: Выделить всё

[1cDB]
enabled=>yes
dsn=>1cDB
pooling=>no
limit=>1
pre-connect=>yes
username=>sa
password=>xxxxxx_admin
Выходит, что астер напрямую с системным odbc не работает, т.е. нужно func_odbc -> res_odbc -> odbc.ini
Не знал..