aboutsummaryrefslogtreecommitdiffstats
path: root/util
diff options
context:
space:
mode:
authorMatthew Wild <mwild1@gmail.com>2009-06-22 14:15:33 +0100
committerMatthew Wild <mwild1@gmail.com>2009-06-22 14:15:33 +0100
commit3e796503e146666c151da1b7d9352d96e5c57120 (patch)
treed21c2993651b64855b724f0fbac8db485306ac23 /util
parent5983be0564fe2ac2adb8f2a283b9a0241e00e04e (diff)
downloadprosody-3e796503e146666c151da1b7d9352d96e5c57120.tar.gz
prosody-3e796503e146666c151da1b7d9352d96e5c57120.zip
util.datamanager: Allow multiple data storage callbacks, and allow them to modify parameters
Diffstat (limited to 'util')
-rw-r--r--util/datamanager.lua37
1 files changed, 33 insertions, 4 deletions
diff --git a/util/datamanager.lua b/util/datamanager.lua
index 41d09f06..54cf1959 100644
--- a/util/datamanager.lua
+++ b/util/datamanager.lua
@@ -50,7 +50,7 @@ local function mkdir(path)
end
local data_path = "data";
-local callback;
+local callbacks = {};
------- API -------------
@@ -58,8 +58,32 @@ function set_data_path(path)
log("debug", "Setting data path to: %s", path);
data_path = path;
end
-function set_callback(func)
- callback = func;
+
+local function callback(username, host, datastore, data)
+ for _, f in ipairs(callbacks) do
+ username, host, datastore, data = f(username, host, datastore, data);
+ if not username then break; end
+ end
+
+ return username, host, datastore, data;
+end
+function add_callback(func)
+ if not callbacks[func] then -- Would you really want to set the same callback more than once?
+ callbacks[func] = true;
+ callbacks[#callbacks+1] = func;
+ return true;
+ end
+end
+function remove_callback(func)
+ if callbacks[func] then
+ for i, f in ipairs(callbacks) do
+ if f == func then
+ callbacks[i] = nil;
+ callbacks[f] = nil;
+ return true;
+ end
+ end
+ end
end
function getpath(username, host, datastore, ext, create)
@@ -97,7 +121,12 @@ function store(username, host, datastore, data)
if not data then
data = {};
end
- if callback and callback(username, host, datastore) then return true; end
+
+ username, host, datastore, data = callback(username, host, datastore, data);
+ if not username then
+ return true; -- Don't save this data at all
+ end
+
-- save the datastore
local f, msg = io_open(getpath(username, host, datastore, nil, true), "w+");
if not f then