mirror of
https://github.com/bjc/prosody.git
synced 2025-04-04 05:37:39 +03:00
mod_storage_internal, datamanager: Add support for iterating over users with data in a store
This commit is contained in:
parent
7aca7b6303
commit
196022f3f5
2 changed files with 25 additions and 2 deletions
|
@ -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
|
||||
|
|
|
@ -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));
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue