Таблица PostgreSQL:
mydb=# table phone_numbers;
pn_id | user_id | phone_number
-------+---------+--------------
1 | 2 | 5550001111
4 | 2 | 5552223333
Учитывая приведенный ниже скрипт Lua,
conn_string =
"pgsql://hostaddr=1.2.3.4" ..
" dbname=mydb" ..
" user=postgres" ..
" password=postgres" ..
" options='-c client_min_messages=NOTICE'" ..
" application_name='myapp'"
dbh = freeswitch.Dbh(conn_string)
assert(dbh:connected())
freeswitch.consoleLog("INFO", "lua script: connected to DB")
q =
"SELECT user_id, phone_number " ..
"FROM phone_numbers " ..
"WHERE phone_number = '5552223333'"
dbh:query(q, function(row)
freeswitch.consoleLog("INFO", "log from dbh:query callback")
for column_name, row_val in pairs(row) do
stream:write(string.format("%5s : %s\n", column_name, row_val))
end
end)
dbh:release()
вызов его в fs_cli
приводит к
freeswitch@server> lua test.lua
user_id : 2
phone_number : 5552223333
[INFO] switch_cpp.cpp:1443 lua script: connected to DB
[INFO] switch_cpp.cpp:1443 log from dbh:query callback
Нас другой стороны, при использовании запроса, который не возвращает никаких строк, таких как
q =
"SELECT user_id, phone_number " ..
"FROM phone_numbers " ..
"WHERE phone_number = '1234567890'"
, тогда возвращается «ошибка» и обратный вызов dbh:query()
даже не вызывается:
freeswitch@server> lua test.lua
-ERR no reply
[INFO] switch_cpp.cpp:1443 lua script: connected to DB
Помещение «ошибки» в кавычки, потому что она, кажется, не ведет себя как единое целое;по крайней мере, я пытался pcall
, но без радости.
Сопоставление результата -ERR no reply
(когда запрос приводит к нулю строк) было бы важно, чтобы вызов мог зависнутьв этом случае.
Обходной путь
Только для записи, я нашел обходной путь, настроив SQL-запрос, используя EXISTS
или COALESCE
, поскольку они всегда обеспечивают возвращаемое значение, которое может быть сопоставлено со сценарием, но я уверен, что есть лучший способ.Например:
q =
"SELECT COALESCE(" ..
"SELECT user_id, phone_number " ..
"FROM phone_numbers " ..
"WHERE phone_number = '1234567890'" ..
", '0'" ..
")"
dbh:query(q, function(row)
if row.coalesce == "0" then
freeswitch.consoleLog("INFO", "zero results")
end
end)