Merge pull request #1149 from moteus/cache_class
Add Log and Cache classes
This commit is contained in:
@@ -24,15 +24,22 @@
|
|||||||
-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
-- POSSIBILITY OF SUCH DAMAGE.
|
-- POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
local cache = require"resources.functions.cache"
|
||||||
|
local log = require"resources.functions.log"["xml_handler"]
|
||||||
|
|
||||||
--get the cache
|
--get the cache
|
||||||
if (trim(api:execute("module_exists", "mod_memcache")) == "true") then
|
XML_STRING, err = cache.get("dialplan:" .. call_context)
|
||||||
XML_STRING = trim(api:execute("memcache", "get dialplan:" .. call_context));
|
|
||||||
else
|
if debug['cache'] then
|
||||||
XML_STRING = "-ERR NOT FOUND";
|
if XML_STRING then
|
||||||
|
log.notice("dialplan:"..call_context.." source: memcache");
|
||||||
|
elseif err ~= 'NOT FOUND' then
|
||||||
|
log.notice("error get element form cache: " .. err);
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
--set the cache
|
--set the cache
|
||||||
if (XML_STRING == "-ERR NOT FOUND") then
|
if not XML_STRING then
|
||||||
|
|
||||||
--connect to the database
|
--connect to the database
|
||||||
require "resources.functions.database_handle";
|
require "resources.functions.database_handle";
|
||||||
@@ -99,7 +106,7 @@
|
|||||||
sql = sql .. "ELSE 100 END, ";
|
sql = sql .. "ELSE 100 END, ";
|
||||||
sql = sql .. "s.dialplan_detail_order asc ";
|
sql = sql .. "s.dialplan_detail_order asc ";
|
||||||
if (debug["sql"]) then
|
if (debug["sql"]) then
|
||||||
freeswitch.consoleLog("notice", "[xml_handler] SQL: " .. sql .. "\n");
|
log.notice("SQL: " .. sql);
|
||||||
end
|
end
|
||||||
x = 0;
|
x = 0;
|
||||||
dbh:query(sql, function(row)
|
dbh:query(sql, function(row)
|
||||||
@@ -287,8 +294,9 @@
|
|||||||
XML_STRING = table.concat(xml, "\n");
|
XML_STRING = table.concat(xml, "\n");
|
||||||
|
|
||||||
--set the cache
|
--set the cache
|
||||||
tmp = XML_STRING:gsub("\\", "\\\\");
|
if cache.support() then
|
||||||
result = trim(api:execute("memcache", "set dialplan:" .. call_context .. " '"..tmp:gsub("'", "'").."' "..expire["dialplan"]));
|
cache.set("dialplan:" .. call_context, XML_STRING, expire["dialplan"])
|
||||||
|
end
|
||||||
|
|
||||||
--send the xml to the console
|
--send the xml to the console
|
||||||
if (debug["xml_string"]) then
|
if (debug["xml_string"]) then
|
||||||
@@ -299,17 +307,10 @@
|
|||||||
|
|
||||||
--send to the console
|
--send to the console
|
||||||
if (debug["cache"]) then
|
if (debug["cache"]) then
|
||||||
freeswitch.consoleLog("notice", "[xml_handler] dialplan:"..call_context.." source: database\n");
|
log.notice("dialplan:"..call_context.." source: database");
|
||||||
end
|
end
|
||||||
|
|
||||||
--close the database connection
|
--close the database connection
|
||||||
dbh:release();
|
dbh:release();
|
||||||
else
|
|
||||||
--replace the ' back to a single quote
|
|
||||||
XML_STRING = XML_STRING:gsub("'", "'");
|
|
||||||
|
|
||||||
--send to the console
|
|
||||||
if (debug["cache"]) then
|
|
||||||
freeswitch.consoleLog("notice", "[xml_handler] dialplan:"..call_context.." source: memcache\n");
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,68 @@
|
|||||||
|
-- @usage cache = require "resources.functions.cache"
|
||||||
|
-- value = cache.get(key)
|
||||||
|
-- if not value then
|
||||||
|
-- ...
|
||||||
|
-- cache.set(key, value, expire)
|
||||||
|
-- end
|
||||||
|
--
|
||||||
|
|
||||||
|
require "resources.functions.trim";
|
||||||
|
|
||||||
|
local api = api or freeswitch.API();
|
||||||
|
|
||||||
|
local Cache = {}
|
||||||
|
|
||||||
|
local function check_error(result)
|
||||||
|
result = trim(result or '')
|
||||||
|
|
||||||
|
if result and result:sub(1, 4) == '-ERR' then
|
||||||
|
return nil, trim(result:sub(5))
|
||||||
|
end
|
||||||
|
|
||||||
|
if result == 'INVALID COMMAND!' and not Cache.support() then
|
||||||
|
return nil, 'INVALID COMMAND'
|
||||||
|
end
|
||||||
|
|
||||||
|
return result
|
||||||
|
end
|
||||||
|
|
||||||
|
function Cache.support()
|
||||||
|
-- assume it is not unloadable
|
||||||
|
if Cache._support then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
Cache._support = (trim(api:execute('module_exists', 'mod_memcache')) == 'true')
|
||||||
|
return Cache._support
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Get element from cache
|
||||||
|
--
|
||||||
|
-- @tparam key string
|
||||||
|
-- @return[1] string value
|
||||||
|
-- @return[2] nil
|
||||||
|
-- @return[2] error string `e.g. 'NOT FOUND'
|
||||||
|
-- @note error string does not contain `-ERR` prefix
|
||||||
|
function Cache.get(key)
|
||||||
|
local result, err = check_error(api:execute('memcache', 'get ' .. key))
|
||||||
|
if not result then return nil, err end
|
||||||
|
return (result:gsub("'", "'"))
|
||||||
|
end
|
||||||
|
|
||||||
|
function Cache.set(key, value, expire)
|
||||||
|
value = value:gsub("'", "'"):gsub("\\", "\\\\")
|
||||||
|
expire = expire and tostring(expire) or ""
|
||||||
|
return check_error(api:execute("memcache", "set " .. key .. " '" .. value .. "' " .. expire))
|
||||||
|
end
|
||||||
|
|
||||||
|
function Cache.del(key)
|
||||||
|
local result, err = check_error(api:execute("memcache", "set " .. key .. " '" .. value .. "' " .. expire))
|
||||||
|
if not result then
|
||||||
|
if err == 'NOT FOUND' then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
return nil, err
|
||||||
|
end
|
||||||
|
return result == '+OK'
|
||||||
|
end
|
||||||
|
|
||||||
|
return Cache
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
-- @usage local log = require"resources.functions.log"["xml_handler"]
|
||||||
|
-- log.notice("hello world")
|
||||||
|
-- log.noticef("%s %s", "hello", "world")
|
||||||
|
-- -- log if debug.SQL or debug.xml_handler.SQL then
|
||||||
|
-- log.tracef("SQL", "SQL is %s", sql)
|
||||||
|
|
||||||
|
local function log(name, level, msg)
|
||||||
|
freeswitch.consoleLog(level, "[" .. name .. "] " .. msg .. "\n")
|
||||||
|
end
|
||||||
|
|
||||||
|
local function logf(name, level, ...)
|
||||||
|
return log(name, level, string.format(...))
|
||||||
|
end
|
||||||
|
|
||||||
|
local function trace(type, name, ...)
|
||||||
|
local t = debug[name]
|
||||||
|
if t and t[type] ~= nil then
|
||||||
|
if t[type] then
|
||||||
|
return log(name, ...)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if debug[type] then
|
||||||
|
log(name, ...)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function tracef(type, name, level, ...)
|
||||||
|
local t = debug[name]
|
||||||
|
if t and t[type] ~= nil then
|
||||||
|
if t[type] then
|
||||||
|
return logf(name, ...)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if debug[type] then
|
||||||
|
logf(name, ...)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local LEVELS = {
|
||||||
|
'error',
|
||||||
|
'warning',
|
||||||
|
'notice',
|
||||||
|
'info',
|
||||||
|
}
|
||||||
|
|
||||||
|
local TRACE_LEVEL = 'notice'
|
||||||
|
|
||||||
|
local function make_log(name)
|
||||||
|
local logger = {}
|
||||||
|
for i = 1, #LEVELS do
|
||||||
|
logger[ LEVELS[i] ] = function(...) return log(name, LEVELS[i], ...) end;
|
||||||
|
logger[ LEVELS[i] .. "f" ] = function(...) return logf(name, LEVELS[i], ...) end;
|
||||||
|
end
|
||||||
|
|
||||||
|
logger.trace = function(type, ...)
|
||||||
|
trace(type, name, TRACE_LEVEL, ...)
|
||||||
|
end
|
||||||
|
|
||||||
|
logger.tracef = function(type, ...)
|
||||||
|
tracef(type, name, TRACE_LEVEL, ...)
|
||||||
|
end
|
||||||
|
|
||||||
|
return logger
|
||||||
|
end
|
||||||
|
|
||||||
|
return setmetatable({}, {__index = function(self, name)
|
||||||
|
local logger = make_log(name)
|
||||||
|
self[name] = logger
|
||||||
|
return logger
|
||||||
|
end})
|
||||||
Reference in New Issue
Block a user