Mercurial > prosody-modules
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 |
