comparison mod_storage_gdbm/mod_storage_gdbm.lua @ 1629:36eb0dbea7ba

mod_storage_gdbm: Minor reorganization, more locals
author Kim Alvefur <zash@zash.se>
date Wed, 25 Mar 2015 17:37:52 +0100
parents 5e4b37b9cde1
children 0fcd63818aa1
comparison
equal deleted inserted replaced
1628:5e4b37b9cde1 1629:36eb0dbea7ba
1 -- mod_storage_gdbm 1 -- mod_storage_gdbm
2 -- Copyright (C) 2014 Kim Alvefur 2 -- Copyright (C) 2014-2015 Kim Alvefur
3 -- 3 --
4 -- This file is MIT/X11 licensed. 4 -- This file is MIT/X11 licensed.
5 -- 5 --
6 -- Depends on lgdbm: 6 -- Depends on lgdbm:
7 -- http://webserver2.tecgraf.puc-rio.br/~lhf/ftp/lua/#lgdbm 7 -- http://webserver2.tecgraf.puc-rio.br/~lhf/ftp/lua/#lgdbm
8 8
9 local gdbm = require"gdbm"; 9 local gdbm = require"gdbm";
10 local path = require"util.paths"; 10 local path = require"util.paths";
11 local lfs = require"lfs"; 11 local lfs = require"lfs";
12 local st = require"util.stanza";
12 local uuid = require"util.uuid".generate; 13 local uuid = require"util.uuid".generate;
14
13 local serialization = require"util.serialization"; 15 local serialization = require"util.serialization";
14 local st = require"util.stanza";
15 local serialize = serialization.serialize; 16 local serialize = serialization.serialize;
16 local deserialize = serialization.deserialize; 17 local deserialize = serialization.deserialize;
18
19 local g_set, g_get, g_del = gdbm.replace, gdbm.fetch, gdbm.delete;
20 local g_first, g_next = gdbm.firstkey, gdbm.nextkey;
21
22 local t_remove = table.remove;
17 23
18 local empty = {}; 24 local empty = {};
19 25
20 local function id(v) return v; end 26 local function id(v) return v; end
21 27
22 local function is_stanza(s) 28 local function is_stanza(s)
23 return getmetatable(s) == st.stanza_mt; 29 return getmetatable(s) == st.stanza_mt;
24 end 30 end
25 31
26 local function ifelse(cond, iftrue, iffalse) 32 local function t(c, a, b)
27 if cond then return iftrue; end return iffalse; 33 if c then return a; end return b;
28 end 34 end
29 35
30 local base_path = path.resolve_relative_path(prosody.paths.data, module.host); 36 local base_path = path.resolve_relative_path(prosody.paths.data, module.host);
31 lfs.mkdir(base_path); 37 lfs.mkdir(base_path);
32 38
34 40
35 local keyval = {}; 41 local keyval = {};
36 local keyval_mt = { __index = keyval, suffix = ".db" }; 42 local keyval_mt = { __index = keyval, suffix = ".db" };
37 43
38 function keyval:set(user, value) 44 function keyval:set(user, value)
39 local ok, err = gdbm.replace(self._db, user or "@", serialize(value)); 45 local ok, err = g_set(self._db, user or "@", serialize(value));
40 if not ok then return nil, err; end 46 if not ok then return nil, err; end
41 return true; 47 return true;
42 end 48 end
43 49
44 function keyval:get(user) 50 function keyval:get(user)
45 local data, err = gdbm.fetch(self._db, user or "@"); 51 local data, err = g_get(self._db, user or "@");
46 if not data then return nil, err; end 52 if not data then return nil, err; end
47 return deserialize(data); 53 return deserialize(data);
48 end 54 end
49 55
50 local archive = {}; 56 local archive = {};
79 85
80 function archive:find(username, query) 86 function archive:find(username, query)
81 query = query or empty_query; 87 query = query or empty_query;
82 local meta = self:get(username) or empty; 88 local meta = self:get(username) or empty;
83 local r = query.reverse; 89 local r = query.reverse;
84 local d = r and -1 or 1; 90 local d = t(r, -1, 1);
85 local s = meta[ifelse(r, query.before, query.after)]; 91 local s = meta[t(r, query.before, query.after)];
86 local limit = query.limit; 92 local limit = query.limit;
87 if s then 93 if s then
88 s = s + d; 94 s = s + d;
89 else 95 else
90 s = ifelse(r, #meta, 1) 96 s = t(r, #meta, 1)
91 end 97 end
92 local e = ifelse(r, 1, #meta); 98 local e = t(r, 1, #meta);
93 local c = 0; 99 local c = 0;
94 return function () 100 return function ()
95 if limit and c >= limit then return end 101 if limit and c >= limit then return end
96 local item, value; 102 local item, value;
97 for i = s, e, d do 103 for i = s, e, d do