From c96a5bee481d5036bec1b9e6da45d75c8425d2a9 Mon Sep 17 00:00:00 2001 From: Alexey Melnichuk Date: Fri, 26 Feb 2016 13:52:27 +0300 Subject: [PATCH 1/3] Fix. ODBC db backend should breaks loop only when callback returns number ~= 0 ```Lua dbh:query(sql, function(row) -- return 0 -- should not break loop -- return true -- should not break loop return 1 -- should break loop end) ``` --- .../scripts/resources/functions/database.lua | 37 +++++++++++++++++++ .../resources/functions/database/odbc.lua | 5 ++- .../resources/functions/database/odbcpool.lua | 5 ++- 3 files changed, 45 insertions(+), 2 deletions(-) diff --git a/resources/install/scripts/resources/functions/database.lua b/resources/install/scripts/resources/functions/database.lua index dd803c7350..a073e7f8b4 100644 --- a/resources/install/scripts/resources/functions/database.lua +++ b/resources/install/scripts/resources/functions/database.lua @@ -77,6 +77,38 @@ local function new_database(backend) assert(db:connected()) + do local x = 0 + db:query("select 1 as v union all select 2 as v", function(row) + x = x + 1 + return 1 + end) + assert(x == 1, ("Got %d expected %d"):format(x, 1)) + end + + do local x = 0 + db:query("select 1 as v union all select 2 as v", function(row) + x = x + 1 + return 0 + end) + assert(x == 2, ("Got %d expected %d"):format(x, 2)) + end + + do local x = 0 + db:query("select 1 as v union all select 2 as v", function(row) + x = x + 1 + return true + end) + assert(x == 2, ("Got %d expected %d"):format(x, 2)) + end + + do local x = 0 + db:query("select 1 as v union all select 2 as v", function(row) + x = x + 1 + return false + end) + assert(x == 2, ("Got %d expected %d"):format(x, 2)) + end + assert("1" == db:first_value("select 1 as v union all select 2 as v")) local t = assert(db:first_row("select '1' as v union all select '2' as v")) @@ -99,6 +131,11 @@ local function new_database(backend) db:release() assert(not db:connected()) + + -- second close + db:release() + assert(not db:connected()) + log.info('self_test Database - pass') end diff --git a/resources/install/scripts/resources/functions/database/odbc.lua b/resources/install/scripts/resources/functions/database/odbc.lua index 6c10ec936d..e88460b336 100644 --- a/resources/install/scripts/resources/functions/database/odbc.lua +++ b/resources/install/scripts/resources/functions/database/odbc.lua @@ -38,7 +38,10 @@ function OdbcDatabase:query(sql, fn) self._rows_affected = nil if fn then return self._dbh:neach(sql, function(row) - return fn(remove_null(row, odbc.NULL, "")) + local n = fn(remove_null(row, odbc.NULL, "")) + if type(n) == 'number' and n ~= 0 then + return true + end end) end local ok, err = self._dbh:exec(sql) diff --git a/resources/install/scripts/resources/functions/database/odbcpool.lua b/resources/install/scripts/resources/functions/database/odbcpool.lua index 7c8bc3c5ee..6ee1532915 100644 --- a/resources/install/scripts/resources/functions/database/odbcpool.lua +++ b/resources/install/scripts/resources/functions/database/odbcpool.lua @@ -39,7 +39,10 @@ function OdbcPoolDatabase:query(sql, fn) if fn then ok, err = cli:acquire(self._timeout, function(dbh) local ok, err = dbh:neach(sql, function(row) - return fn(remove_null(row, odbc.NULL, "")) + local n = fn(remove_null(row, odbc.NULL, "")) + if type(n) == 'number' and n ~= 0 then + return true + end end) if err and not ok then log.errf("Can not execute sql: %s\n%s", tostring(err), sql) From ebfcdc38bec723d96eb81e723c801f4c735e29c2 Mon Sep 17 00:00:00 2001 From: Alexey Melnichuk Date: Fri, 26 Feb 2016 13:57:05 +0300 Subject: [PATCH 2/3] Fix. LuaSQL db backend breaks loop only on positive numbers. --- .../install/scripts/resources/functions/database.lua | 8 ++++++++ .../scripts/resources/functions/database/luasql.lua | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/resources/install/scripts/resources/functions/database.lua b/resources/install/scripts/resources/functions/database.lua index a073e7f8b4..91bb5f5390 100644 --- a/resources/install/scripts/resources/functions/database.lua +++ b/resources/install/scripts/resources/functions/database.lua @@ -85,6 +85,14 @@ local function new_database(backend) assert(x == 1, ("Got %d expected %d"):format(x, 1)) end + do local x = 0 + db:query("select 1 as v union all select 2 as v", function(row) + x = x + 1 + return -1 + end) + assert(x == 1, ("Got %d expected %d"):format(x, 1)) + end + do local x = 0 db:query("select 1 as v union all select 2 as v", function(row) x = x + 1 diff --git a/resources/install/scripts/resources/functions/database/luasql.lua b/resources/install/scripts/resources/functions/database/luasql.lua index 00bb965609..010481d0db 100644 --- a/resources/install/scripts/resources/functions/database/luasql.lua +++ b/resources/install/scripts/resources/functions/database/luasql.lua @@ -54,7 +54,7 @@ function LuaSQLDatabase:query(sql, fn) local row, err = cur:fetch({}, "a") if not row then break end local ok, ret = pcall(fn, apply_names(row, colnames, "")) - if (not ok) or (type(ret) == 'number' and ret > 0) then + if (not ok) or (type(ret) == 'number' and ret ~= 0) then break end end From 7e1481b74712da88bc4822a99ecf0eca6df4946c Mon Sep 17 00:00:00 2001 From: Alexey Melnichuk Date: Fri, 26 Feb 2016 14:17:28 +0300 Subject: [PATCH 3/3] Fix. FreeSWITCH also breaks loop if return string value which contain number. ```Lua dbh:query(sql, function() return "1" -- breaks loop end) --- .../install/scripts/resources/functions/database.lua | 8 ++++++++ .../scripts/resources/functions/database/luasql.lua | 3 ++- .../install/scripts/resources/functions/database/odbc.lua | 4 ++-- .../scripts/resources/functions/database/odbcpool.lua | 4 ++-- 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/resources/install/scripts/resources/functions/database.lua b/resources/install/scripts/resources/functions/database.lua index 91bb5f5390..478dbdb55b 100644 --- a/resources/install/scripts/resources/functions/database.lua +++ b/resources/install/scripts/resources/functions/database.lua @@ -117,6 +117,14 @@ local function new_database(backend) assert(x == 2, ("Got %d expected %d"):format(x, 2)) end + do local x = 0 + db:query("select 1 as v union all select 2 as v", function(row) + x = x + 1 + return "1" + end) + assert(x == 1, ("Got %d expected %d"):format(x, 2)) + end + assert("1" == db:first_value("select 1 as v union all select 2 as v")) local t = assert(db:first_row("select '1' as v union all select '2' as v")) diff --git a/resources/install/scripts/resources/functions/database/luasql.lua b/resources/install/scripts/resources/functions/database/luasql.lua index 010481d0db..feedc32c2c 100644 --- a/resources/install/scripts/resources/functions/database/luasql.lua +++ b/resources/install/scripts/resources/functions/database/luasql.lua @@ -54,7 +54,8 @@ function LuaSQLDatabase:query(sql, fn) local row, err = cur:fetch({}, "a") if not row then break end local ok, ret = pcall(fn, apply_names(row, colnames, "")) - if (not ok) or (type(ret) == 'number' and ret ~= 0) then + ret = tonumber(ret) + if (not ok) or (ret and ret ~= 0) then break end end diff --git a/resources/install/scripts/resources/functions/database/odbc.lua b/resources/install/scripts/resources/functions/database/odbc.lua index e88460b336..0e1bf9fac5 100644 --- a/resources/install/scripts/resources/functions/database/odbc.lua +++ b/resources/install/scripts/resources/functions/database/odbc.lua @@ -38,8 +38,8 @@ function OdbcDatabase:query(sql, fn) self._rows_affected = nil if fn then return self._dbh:neach(sql, function(row) - local n = fn(remove_null(row, odbc.NULL, "")) - if type(n) == 'number' and n ~= 0 then + local n = tonumber((fn(remove_null(row, odbc.NULL, "")))) + if n and n ~= 0 then return true end end) diff --git a/resources/install/scripts/resources/functions/database/odbcpool.lua b/resources/install/scripts/resources/functions/database/odbcpool.lua index 6ee1532915..9f46635696 100644 --- a/resources/install/scripts/resources/functions/database/odbcpool.lua +++ b/resources/install/scripts/resources/functions/database/odbcpool.lua @@ -39,8 +39,8 @@ function OdbcPoolDatabase:query(sql, fn) if fn then ok, err = cli:acquire(self._timeout, function(dbh) local ok, err = dbh:neach(sql, function(row) - local n = fn(remove_null(row, odbc.NULL, "")) - if type(n) == 'number' and n ~= 0 then + local n = tonumber((fn(remove_null(row, odbc.NULL, "")))) + if n and n ~= 0 then return true end end)