From f725efa472048c323c16dbb544954a94db8b66d2 Mon Sep 17 00:00:00 2001 From: daurnimator Date: Wed, 6 Nov 2013 12:56:35 -0500 Subject: core/moduleapi: Return timer object from module:add_timer --- core/moduleapi.lua | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) (limited to 'core') diff --git a/core/moduleapi.lua b/core/moduleapi.lua index 65e00d41..a32ad245 100644 --- a/core/moduleapi.lua +++ b/core/moduleapi.lua @@ -347,11 +347,30 @@ function api:send(stanza) return core_post_stanza(hosts[self.host], stanza); end -function api:add_timer(delay, callback) - return timer.add_task(delay, function (t) - if self.loaded == false then return; end - return callback(t); - end); +local timer_methods = { } +local timer_mt = { + __index = timer_methods; +} +function timer_methods:stop( ) + timer.stop(self.id); +end +timer_methods.disarm = timer_methods.stop +function timer_methods:reschedule(delay) + timer.reschedule(self.id, delay) +end + +local function timer_callback(now, id, t) + if t.module_env.loaded == false then return; end + return t.callback(now, unpack(t, 1, t.n)); +end + +local pack = table.pack or function(...) return {n=select("#",...), ...}; end +function api:add_timer(delay, callback, ...) + local t = pack(...) + t.module_env = self; + t.callback = callback; + t.id = timer.add_task(delay, timer_callback, t); + return setmetatable(t, timer_mt); end local path_sep = package.config:sub(1,1); -- cgit v1.2.3 From 37895d0d715ca071bc1c79554935074bbec3dd1c Mon Sep 17 00:00:00 2001 From: Waqas Hussain Date: Wed, 6 Nov 2013 14:38:51 -0500 Subject: core.moduleapi: Fix some global accesses. --- core/moduleapi.lua | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'core') diff --git a/core/moduleapi.lua b/core/moduleapi.lua index a32ad245..5a24f69c 100644 --- a/core/moduleapi.lua +++ b/core/moduleapi.lua @@ -16,8 +16,10 @@ local timer = require "util.timer"; local t_insert, t_remove, t_concat = table.insert, table.remove, table.concat; local error, setmetatable, type = error, setmetatable, type; -local ipairs, pairs, select, unpack = ipairs, pairs, select, unpack; +local ipairs, pairs, select = ipairs, pairs, select; local tonumber, tostring = tonumber, tostring; +local pack = table.pack or function(...) return {n=select("#",...), ...}; end -- table.pack is only in 5.2 +local unpack = table.unpack or unpack; -- renamed in 5.2 local prosody = prosody; local hosts = prosody.hosts; @@ -364,7 +366,6 @@ local function timer_callback(now, id, t) return t.callback(now, unpack(t, 1, t.n)); end -local pack = table.pack or function(...) return {n=select("#",...), ...}; end function api:add_timer(delay, callback, ...) local t = pack(...) t.module_env = self; -- cgit v1.2.3 From ea09a4527815cec3d42583dc3f751662d861b9dd Mon Sep 17 00:00:00 2001 From: daurnimator Date: Thu, 7 Aug 2014 12:15:15 -0400 Subject: core/storagemanager: When map store isn't available, fallback to keyval store --- core/storagemanager.lua | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) (limited to 'core') diff --git a/core/storagemanager.lua b/core/storagemanager.lua index 5674ff32..d8a7b2e2 100644 --- a/core/storagemanager.lua +++ b/core/storagemanager.lua @@ -80,11 +80,44 @@ function get_driver(host, store) return driver, driver_name; end +local map_shim_mt = { + __index = { + get = function(self, username, key) + local ret, err = self.keyval_store:get(username); + if ret == nil and err then return nil, err end + return ret[key]; + end; + set = function(self, username, key, data) + local current, err = self.keyval_store:get(username); + if current == nil then + if err then + return nil, err; + else + current = {}; + end + end + current[key] = data; + return self.keyval_store:set(username, current); + end; + }; +} +local function create_map_shim(host, store) + local keyval_store, err = open(host, store, "keyval"); + if keyval_store == nil then return nil, err end + return setmetatable({ + keyval_store = keyval_store; + }, map_shim_mt); +end + function open(host, store, typ) local driver, driver_name = get_driver(host, store); local ret, err = driver:open(store, typ); if not ret then if err == "unsupported-store" then + if typ == "map" then -- Use shim on top of keyval store + log("debug", "map storage driver unavailable, using shim on top of keyval store."); + return create_map_shim(host, store); + end log("debug", "Storage driver %s does not support store %s (%s), falling back to null driver", driver_name, store, typ or ""); ret = null_storage_driver; -- cgit v1.2.3 From edd380b6cd178d2b0eb11b44c659874420393e4c Mon Sep 17 00:00:00 2001 From: Kim Alvefur Date: Fri, 8 Aug 2014 12:38:35 +0200 Subject: storagemanager: Fix map store shim if store is empty --- core/storagemanager.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'core') diff --git a/core/storagemanager.lua b/core/storagemanager.lua index d8a7b2e2..b2ad29d0 100644 --- a/core/storagemanager.lua +++ b/core/storagemanager.lua @@ -84,7 +84,7 @@ local map_shim_mt = { __index = { get = function(self, username, key) local ret, err = self.keyval_store:get(username); - if ret == nil and err then return nil, err end + if ret == nil then return nil, err end return ret[key]; end; set = function(self, username, key, data) -- cgit v1.2.3