aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKim Alvefur <zash@zash.se>2012-09-21 17:23:08 +0200
committerKim Alvefur <zash@zash.se>2012-09-21 17:23:08 +0200
commit196022f3f5e88c241fdf7fafe3affd2f8912036d (patch)
tree8711a9d40798237639afc7b74ef08995e698bd5e
parent7aca7b6303f614cb9e9330bf9e2d34c63a5b818a (diff)
downloadprosody-196022f3f5e88c241fdf7fafe3affd2f8912036d.tar.gz
prosody-196022f3f5e88c241fdf7fafe3affd2f8912036d.zip
mod_storage_internal, datamanager: Add support for iterating over users with data in a store
-rw-r--r--plugins/mod_storage_internal.lua8
-rw-r--r--util/datamanager.lua19
2 files changed, 25 insertions, 2 deletions
diff --git a/plugins/mod_storage_internal.lua b/plugins/mod_storage_internal.lua
index 039202dd..972ecbee 100644
--- a/plugins/mod_storage_internal.lua
+++ b/plugins/mod_storage_internal.lua
@@ -5,8 +5,8 @@ local host = module.host;
local driver = {};
local driver_mt = { __index = driver };
-function driver:open(store)
- return setmetatable({ store = store }, driver_mt);
+function driver:open(store, typ)
+ return setmetatable({ store = store, type = typ }, driver_mt);
end
function driver:get(user)
return datamanager.load(user, host, self.store);
@@ -20,6 +20,10 @@ function driver:stores(username)
return datamanager.stores(username, host);
end
+function driver:users()
+ return datamanager.users(host, self.store, self.type);
+end
+
function driver:purge(user)
return datamanager.purge(user, host);
end
diff --git a/util/datamanager.lua b/util/datamanager.lua
index 9207f555..08d9d6af 100644
--- a/util/datamanager.lua
+++ b/util/datamanager.lua
@@ -282,6 +282,25 @@ local type_map = {
list = "list";
}
+function users(host, store, typ)
+ typ = type_map[typ or "keyval"];
+ local store_dir = format("%s/%s/%s", data_path, encode(host), encode(store));
+
+ local mode, err = lfs.attributes(store_dir, "mode");
+ if not mode then
+ return function() log("debug", err or (store_dir .. " does not exist")) end
+ end
+ local next, state = lfs.dir(store_dir);
+ return function(state)
+ for node in next, state do
+ local file, ext = node:match("^(.*)%.([dalist]+)$");
+ if file and ext == typ then
+ return decode(file);
+ end
+ end
+ end, state;
+end
+
function stores(username, host, typ)
typ = type_map[typ or "keyval"];
local store_dir = format("%s/%s/", data_path, encode(host));