mod_storage_internal, datamanager: Add support for iterating over users with data...
authorKim Alvefur <zash@zash.se>
Fri, 21 Sep 2012 15:23:08 +0000 (17:23 +0200)
committerKim Alvefur <zash@zash.se>
Fri, 21 Sep 2012 15:23:08 +0000 (17:23 +0200)
plugins/mod_storage_internal.lua
util/datamanager.lua

index 039202dd8466983fb502d149df9bf0947beff39b..972ecbee33d1b1a71c7f5a8b582ff6bb4c99c6ec 100644 (file)
@@ -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
index 9207f555d1bf0b0133d18f88e9715ccf3613fad6..08d9d6af2e40541aeab30e97b52f92d4af0872fb 100644 (file)
@@ -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));