Comparison

plugins/mod_storage_internal.lua @ 8021:83f18982bcfd

mod_storage_internal: Add basic archive store implementation
author Kim Alvefur <zash@zash.se>
date Fri, 31 Mar 2017 17:47:06 +0200
parent 8020:342ce07836de
child 8022:05e201468f27
comparison
equal deleted inserted replaced
8020:342ce07836de 8021:83f18982bcfd
1 local datamanager = require "core.storagemanager".olddm; 1 local datamanager = require "core.storagemanager".olddm;
2 local array = require "util.array";
3 local datetime = require "util.datetime";
4 local st = require "util.stanza";
5 local now = require "util.time".now;
6 local id = require "util.id".medium;
2 7
3 local host = module.host; 8 local host = module.host;
4 9
5 local driver = {}; 10 local driver = {};
6 11
33 38
34 function keyval:users() 39 function keyval:users()
35 return datamanager.users(host, self.store, self.type); 40 return datamanager.users(host, self.store, self.type);
36 end 41 end
37 42
43 local archive = {};
44 driver.archive = { __index = archive };
45
46 function archive:append(username, key, value, when, with)
47 key = key or id();
48 when = when or now();
49 if not st.is_stanza(value) then
50 return nil, "unsupported-datatype";
51 end
52 value = st.preserialize(st.clone(value));
53 value.key = key;
54 value.when = when;
55 value.with = with;
56 value.attr.stamp = datetime.datetime(when);
57 value.attr.stamp_legacy = datetime.legacy(when);
58 local ok, err = datamanager.list_append(username, host, self.store, value);
59 if not ok then return ok, err; end
60 return key;
61 end
62
63 function archive:find(username, query)
64 local items, err = datamanager.list_load(username, host, self.store);
65 if not items then return items, err; end
66 local count = #items;
67 local i = 0;
68 if query then
69 items = array(items);
70 if query.with then
71 items:filter(function (item)
72 return item.with == query.with;
73 end);
74 end
75 if query.start then
76 items:filter(function (item)
77 return item.when >= query.start;
78 end);
79 end
80 if query["end"] then
81 items:filter(function (item)
82 return item.when <= query["end"];
83 end);
84 end
85 count = #items;
86 if query.reverse then
87 items:reverse();
88 if query.before then
89 for j = 1, count do
90 if (items[j].key or tostring(j)) == query.before then
91 i = j;
92 break;
93 end
94 end
95 end
96 elseif query.after then
97 for j = 1, count do
98 if (items[j].key or tostring(j)) == query.after then
99 i = j;
100 break;
101 end
102 end
103 end
104 if query.limit and #items - i > query.limit then
105 items[i+query.limit+1] = nil;
106 end
107 end
108 return function ()
109 i = i + 1;
110 local item = items[i];
111 if not item then return; end
112 local key = item.key or tostring(i);
113 local when = item.when or datetime.parse(item.attr.stamp);
114 local with = item.with;
115 item.key, item.when, item.with = nil, nil, nil;
116 item.attr.stamp = nil;
117 item.attr.stamp_legacy = nil;
118 item = st.deserialize(item);
119 return key, item, when, with;
120 end, count;
121 end
122
38 module:provides("storage", driver); 123 module:provides("storage", driver);