Как совпадение "-ERR no reply" в скрипте Lua, когда запрос Dbh возвращает ноль строк в FreeSWITCH? - PullRequest
1 голос
/ 25 июня 2019

Таблица 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)    

1 Ответ

0 голосов
/ 25 июня 2019

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

q = 
  "SELECT COALESCE("        ..
    "(SELECT phone_number " ..
      "FROM phone_numbers " ..
      "WHERE phone_number = '" .. ani .. "')" ..
    ", '0'" ..
  ")"

local got_results
dbh:query(q, function(row)   
  got_results = true
  -- whatever else you need to do
end)   

if not got_results then
  freeswitch.consoleLog("INFO", "zero results") 
  -- do what you need to with zero results
end
...