Annotate

plugins/mod_storage_memory.lua @ 11276:7b2ee8995af9

storage tests: Add test for querying a set of IDs
author Kim Alvefur <zash@zash.se>
date Tue, 12 Jan 2021 18:03:40 +0100
parent 11274:ecbfde402364
child 11277:1256f32f21b6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9293
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1 local serialize = require "util.serialization".serialize;
9535
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
2 local array = require "util.array";
9293
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
3 local envload = require "util.envload".envload;
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
4 local st = require "util.stanza";
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
5 local is_stanza = st.is_stanza or function (s) return getmetatable(s) == st.stanza_mt end
9838
40ed04014b97 mod_storage_memory: Generate ID using standard util (fixes #1326)
Kim Alvefur <zash@zash.se>
parents: 9832
diff changeset
6 local new_id = require "util.id".medium;
9293
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
7
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
8 local auto_purge_enabled = module:get_option_boolean("storage_memory_temporary", false);
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
9 local auto_purge_stores = module:get_option_set("storage_memory_temporary_stores", {});
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
10
9887
69f810014853 mod_storage_memory: Add support for archive item limits
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
11 local archive_item_limit = module:get_option_number("storage_archive_item_limit", 1000);
69f810014853 mod_storage_memory: Add support for archive item limits
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
12
9293
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
13 local memory = setmetatable({}, {
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
14 __index = function(t, k)
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
15 local store = module:shared(k)
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
16 t[k] = store;
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
17 return store;
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
18 end
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
19 });
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
20
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
21 local function NULL() return nil end
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
22
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
23 local function _purge_store(self, username)
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
24 self.store[username or NULL] = nil;
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
25 return true;
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
26 end
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
27
9881
68faa0c1a99c mod_storage_memory: Implement :user iteration API
Kim Alvefur <zash@zash.se>
parents: 9838
diff changeset
28 local function _users(self)
68faa0c1a99c mod_storage_memory: Implement :user iteration API
Kim Alvefur <zash@zash.se>
parents: 9838
diff changeset
29 return next, self.store, nil;
68faa0c1a99c mod_storage_memory: Implement :user iteration API
Kim Alvefur <zash@zash.se>
parents: 9838
diff changeset
30 end
68faa0c1a99c mod_storage_memory: Implement :user iteration API
Kim Alvefur <zash@zash.se>
parents: 9838
diff changeset
31
9293
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
32 local keyval_store = {};
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
33 keyval_store.__index = keyval_store;
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
34
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
35 function keyval_store:get(username)
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
36 return (self.store[username or NULL] or NULL)();
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
37 end
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
38
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
39 function keyval_store:set(username, data)
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
40 if data ~= nil then
9468
bd5e4485a245 mod_storage_memory: Switch from '@' prefix to '=' for chunks, '@' is used to indicate a source file name only
Matthew Wild <mwild1@gmail.com>
parents: 9340
diff changeset
41 data = envload("return "..serialize(data), "=(data)", {});
9293
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
42 end
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
43 self.store[username or NULL] = data;
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
44 return true;
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
45 end
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
46
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
47 keyval_store.purge = _purge_store;
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
48
9881
68faa0c1a99c mod_storage_memory: Implement :user iteration API
Kim Alvefur <zash@zash.se>
parents: 9838
diff changeset
49 keyval_store.users = _users;
68faa0c1a99c mod_storage_memory: Implement :user iteration API
Kim Alvefur <zash@zash.se>
parents: 9838
diff changeset
50
9293
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
51 local archive_store = {};
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
52 archive_store.__index = archive_store;
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
53
9881
68faa0c1a99c mod_storage_memory: Implement :user iteration API
Kim Alvefur <zash@zash.se>
parents: 9838
diff changeset
54 archive_store.users = _users;
68faa0c1a99c mod_storage_memory: Implement :user iteration API
Kim Alvefur <zash@zash.se>
parents: 9838
diff changeset
55
9887
69f810014853 mod_storage_memory: Add support for archive item limits
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
56 archive_store.caps = {
69f810014853 mod_storage_memory: Add support for archive item limits
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
57 total = true;
69f810014853 mod_storage_memory: Add support for archive item limits
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
58 quota = archive_item_limit;
69f810014853 mod_storage_memory: Add support for archive item limits
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
59 truncate = true;
11274
ecbfde402364 mod_storage_memory: Support full ID range queries
Kim Alvefur <zash@zash.se>
parents: 10926
diff changeset
60 full_id_range = true;
9887
69f810014853 mod_storage_memory: Add support for archive item limits
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
61 };
69f810014853 mod_storage_memory: Add support for archive item limits
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
62
9293
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
63 function archive_store:append(username, key, value, when, with)
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
64 if is_stanza(value) then
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
65 value = st.preserialize(value);
9468
bd5e4485a245 mod_storage_memory: Switch from '@' prefix to '=' for chunks, '@' is used to indicate a source file name only
Matthew Wild <mwild1@gmail.com>
parents: 9340
diff changeset
66 value = envload("return xml"..serialize(value), "=(stanza)", { xml = st.deserialize })
9293
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
67 else
9468
bd5e4485a245 mod_storage_memory: Switch from '@' prefix to '=' for chunks, '@' is used to indicate a source file name only
Matthew Wild <mwild1@gmail.com>
parents: 9340
diff changeset
68 value = envload("return "..serialize(value), "=(data)", {});
9293
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
69 end
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
70 local a = self.store[username or NULL];
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
71 if not a then
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
72 a = {};
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
73 self.store[username or NULL] = a;
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
74 end
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
75 local v = { key = key, when = when, with = with, value = value };
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
76 if not key then
9838
40ed04014b97 mod_storage_memory: Generate ID using standard util (fixes #1326)
Kim Alvefur <zash@zash.se>
parents: 9832
diff changeset
77 key = new_id();
9293
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
78 v.key = key;
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
79 end
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
80 if a[key] then
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
81 table.remove(a, a[key]);
9887
69f810014853 mod_storage_memory: Add support for archive item limits
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
82 elseif #a >= archive_item_limit then
69f810014853 mod_storage_memory: Add support for archive item limits
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
83 return nil, "quota-limit";
9293
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
84 end
9534
b301f7edf346 mod_storage_memory: Fix overwriting old keys
Kim Alvefur <zash@zash.se>
parents: 9533
diff changeset
85 local i = #a+1;
9293
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
86 a[i] = v;
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
87 a[key] = i;
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
88 return key;
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
89 end
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
90
9832
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9609
diff changeset
91 function archive_store:find(username, query)
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9609
diff changeset
92 local items = self.store[username or NULL];
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9609
diff changeset
93 if not items then
9997
7c4631d7b6fb mod_storage_internal,memory: Only return total count if requested
Kim Alvefur <zash@zash.se>
parents: 9906
diff changeset
94 if query then
10023
f6959fe81a1d mod_storage_memory: Return correct error even if no archive data available
Kim Alvefur <zash@zash.se>
parents: 10019
diff changeset
95 if query.before or query.after then
f6959fe81a1d mod_storage_memory: Return correct error even if no archive data available
Kim Alvefur <zash@zash.se>
parents: 10019
diff changeset
96 return nil, "item-not-found";
f6959fe81a1d mod_storage_memory: Return correct error even if no archive data available
Kim Alvefur <zash@zash.se>
parents: 10019
diff changeset
97 end
9997
7c4631d7b6fb mod_storage_internal,memory: Only return total count if requested
Kim Alvefur <zash@zash.se>
parents: 9906
diff changeset
98 if query.total then
7c4631d7b6fb mod_storage_internal,memory: Only return total count if requested
Kim Alvefur <zash@zash.se>
parents: 9906
diff changeset
99 return function () end, 0;
7c4631d7b6fb mod_storage_internal,memory: Only return total count if requested
Kim Alvefur <zash@zash.se>
parents: 9906
diff changeset
100 end
7c4631d7b6fb mod_storage_internal,memory: Only return total count if requested
Kim Alvefur <zash@zash.se>
parents: 9906
diff changeset
101 end
7c4631d7b6fb mod_storage_internal,memory: Only return total count if requested
Kim Alvefur <zash@zash.se>
parents: 9906
diff changeset
102 return function () end;
9832
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9609
diff changeset
103 end
9997
7c4631d7b6fb mod_storage_internal,memory: Only return total count if requested
Kim Alvefur <zash@zash.se>
parents: 9906
diff changeset
104 local count = nil;
10926
c55bd98a54f8 mod_storage_internal, mod_storage_memory: Add support for query.before
Matthew Wild <mwild1@gmail.com>
parents: 10839
diff changeset
105 local i, last_key = 0;
9832
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9609
diff changeset
106 if query then
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9609
diff changeset
107 items = array():append(items);
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9609
diff changeset
108 if query.key then
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9609
diff changeset
109 items:filter(function (item)
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9609
diff changeset
110 return item.key == query.key;
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9609
diff changeset
111 end);
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9609
diff changeset
112 end
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9609
diff changeset
113 if query.with then
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9609
diff changeset
114 items:filter(function (item)
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9609
diff changeset
115 return item.with == query.with;
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9609
diff changeset
116 end);
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9609
diff changeset
117 end
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9609
diff changeset
118 if query.start then
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9609
diff changeset
119 items:filter(function (item)
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9609
diff changeset
120 return item.when >= query.start;
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9609
diff changeset
121 end);
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9609
diff changeset
122 end
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9609
diff changeset
123 if query["end"] then
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9609
diff changeset
124 items:filter(function (item)
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9609
diff changeset
125 return item.when <= query["end"];
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9609
diff changeset
126 end);
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9609
diff changeset
127 end
9997
7c4631d7b6fb mod_storage_internal,memory: Only return total count if requested
Kim Alvefur <zash@zash.se>
parents: 9906
diff changeset
128 if query.total then
7c4631d7b6fb mod_storage_internal,memory: Only return total count if requested
Kim Alvefur <zash@zash.se>
parents: 9906
diff changeset
129 count = #items;
7c4631d7b6fb mod_storage_internal,memory: Only return total count if requested
Kim Alvefur <zash@zash.se>
parents: 9906
diff changeset
130 end
9832
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9609
diff changeset
131 if query.reverse then
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9609
diff changeset
132 items:reverse();
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9609
diff changeset
133 if query.before then
10019
c30c81176752 mod_storage_memory: Return error if 'before' or 'after' are not found (partial fix for #1325)
Kim Alvefur <zash@zash.se>
parents: 9997
diff changeset
134 local found = false;
9997
7c4631d7b6fb mod_storage_internal,memory: Only return total count if requested
Kim Alvefur <zash@zash.se>
parents: 9906
diff changeset
135 for j = 1, #items do
9832
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9609
diff changeset
136 if (items[j].key or tostring(j)) == query.before then
10019
c30c81176752 mod_storage_memory: Return error if 'before' or 'after' are not found (partial fix for #1325)
Kim Alvefur <zash@zash.se>
parents: 9997
diff changeset
137 found = true;
9832
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9609
diff changeset
138 i = j;
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9609
diff changeset
139 break;
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9609
diff changeset
140 end
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9609
diff changeset
141 end
10019
c30c81176752 mod_storage_memory: Return error if 'before' or 'after' are not found (partial fix for #1325)
Kim Alvefur <zash@zash.se>
parents: 9997
diff changeset
142 if not found then
c30c81176752 mod_storage_memory: Return error if 'before' or 'after' are not found (partial fix for #1325)
Kim Alvefur <zash@zash.se>
parents: 9997
diff changeset
143 return nil, "item-not-found";
c30c81176752 mod_storage_memory: Return error if 'before' or 'after' are not found (partial fix for #1325)
Kim Alvefur <zash@zash.se>
parents: 9997
diff changeset
144 end
9832
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9609
diff changeset
145 end
11274
ecbfde402364 mod_storage_memory: Support full ID range queries
Kim Alvefur <zash@zash.se>
parents: 10926
diff changeset
146 last_key = query.after;
9832
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9609
diff changeset
147 elseif query.after then
10019
c30c81176752 mod_storage_memory: Return error if 'before' or 'after' are not found (partial fix for #1325)
Kim Alvefur <zash@zash.se>
parents: 9997
diff changeset
148 local found = false;
9997
7c4631d7b6fb mod_storage_internal,memory: Only return total count if requested
Kim Alvefur <zash@zash.se>
parents: 9906
diff changeset
149 for j = 1, #items do
9832
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9609
diff changeset
150 if (items[j].key or tostring(j)) == query.after then
10019
c30c81176752 mod_storage_memory: Return error if 'before' or 'after' are not found (partial fix for #1325)
Kim Alvefur <zash@zash.se>
parents: 9997
diff changeset
151 found = true;
9832
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9609
diff changeset
152 i = j;
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9609
diff changeset
153 break;
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9609
diff changeset
154 end
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9609
diff changeset
155 end
10019
c30c81176752 mod_storage_memory: Return error if 'before' or 'after' are not found (partial fix for #1325)
Kim Alvefur <zash@zash.se>
parents: 9997
diff changeset
156 if not found then
c30c81176752 mod_storage_memory: Return error if 'before' or 'after' are not found (partial fix for #1325)
Kim Alvefur <zash@zash.se>
parents: 9997
diff changeset
157 return nil, "item-not-found";
c30c81176752 mod_storage_memory: Return error if 'before' or 'after' are not found (partial fix for #1325)
Kim Alvefur <zash@zash.se>
parents: 9997
diff changeset
158 end
11274
ecbfde402364 mod_storage_memory: Support full ID range queries
Kim Alvefur <zash@zash.se>
parents: 10926
diff changeset
159 last_key = query.before;
ecbfde402364 mod_storage_memory: Support full ID range queries
Kim Alvefur <zash@zash.se>
parents: 10926
diff changeset
160 elseif query.before then
ecbfde402364 mod_storage_memory: Support full ID range queries
Kim Alvefur <zash@zash.se>
parents: 10926
diff changeset
161 last_key = query.before;
9832
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9609
diff changeset
162 end
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9609
diff changeset
163 if query.limit and #items - i > query.limit then
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9609
diff changeset
164 items[i+query.limit+1] = nil;
9293
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
165 end
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
166 end
9832
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9609
diff changeset
167 return function ()
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9609
diff changeset
168 i = i + 1;
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9609
diff changeset
169 local item = items[i];
10926
c55bd98a54f8 mod_storage_internal, mod_storage_memory: Add support for query.before
Matthew Wild <mwild1@gmail.com>
parents: 10839
diff changeset
170 if not item or (last_key and item.key == last_key) then return; end
9832
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9609
diff changeset
171 return item.key, item.value(), item.when, item.with;
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9609
diff changeset
172 end, count;
9293
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
173 end
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
174
10839
018acdaf374f mod_storage_memory: Add map store methods to archive store
Kim Alvefur <zash@zash.se>
parents: 10222
diff changeset
175 function archive_store:get(username, wanted_key)
018acdaf374f mod_storage_memory: Add map store methods to archive store
Kim Alvefur <zash@zash.se>
parents: 10222
diff changeset
176 local items = self.store[username or NULL];
018acdaf374f mod_storage_memory: Add map store methods to archive store
Kim Alvefur <zash@zash.se>
parents: 10222
diff changeset
177 if not items then return nil, "item-not-found"; end
018acdaf374f mod_storage_memory: Add map store methods to archive store
Kim Alvefur <zash@zash.se>
parents: 10222
diff changeset
178 local i = items[wanted_key];
018acdaf374f mod_storage_memory: Add map store methods to archive store
Kim Alvefur <zash@zash.se>
parents: 10222
diff changeset
179 if not i then return nil, "item-not-found"; end
018acdaf374f mod_storage_memory: Add map store methods to archive store
Kim Alvefur <zash@zash.se>
parents: 10222
diff changeset
180 local item = items[i];
018acdaf374f mod_storage_memory: Add map store methods to archive store
Kim Alvefur <zash@zash.se>
parents: 10222
diff changeset
181 return item.value(), item.when, item.with;
018acdaf374f mod_storage_memory: Add map store methods to archive store
Kim Alvefur <zash@zash.se>
parents: 10222
diff changeset
182 end
018acdaf374f mod_storage_memory: Add map store methods to archive store
Kim Alvefur <zash@zash.se>
parents: 10222
diff changeset
183
018acdaf374f mod_storage_memory: Add map store methods to archive store
Kim Alvefur <zash@zash.se>
parents: 10222
diff changeset
184 function archive_store:set(username, wanted_key, new_value, new_when, new_with)
018acdaf374f mod_storage_memory: Add map store methods to archive store
Kim Alvefur <zash@zash.se>
parents: 10222
diff changeset
185 local items = self.store[username or NULL];
018acdaf374f mod_storage_memory: Add map store methods to archive store
Kim Alvefur <zash@zash.se>
parents: 10222
diff changeset
186 if not items then return nil, "item-not-found"; end
018acdaf374f mod_storage_memory: Add map store methods to archive store
Kim Alvefur <zash@zash.se>
parents: 10222
diff changeset
187 local i = items[wanted_key];
018acdaf374f mod_storage_memory: Add map store methods to archive store
Kim Alvefur <zash@zash.se>
parents: 10222
diff changeset
188 if not i then return nil, "item-not-found"; end
018acdaf374f mod_storage_memory: Add map store methods to archive store
Kim Alvefur <zash@zash.se>
parents: 10222
diff changeset
189 local item = items[i];
018acdaf374f mod_storage_memory: Add map store methods to archive store
Kim Alvefur <zash@zash.se>
parents: 10222
diff changeset
190
018acdaf374f mod_storage_memory: Add map store methods to archive store
Kim Alvefur <zash@zash.se>
parents: 10222
diff changeset
191 if is_stanza(new_value) then
018acdaf374f mod_storage_memory: Add map store methods to archive store
Kim Alvefur <zash@zash.se>
parents: 10222
diff changeset
192 new_value = st.preserialize(new_value);
018acdaf374f mod_storage_memory: Add map store methods to archive store
Kim Alvefur <zash@zash.se>
parents: 10222
diff changeset
193 item.value = envload("return xml"..serialize(new_value), "=(stanza)", { xml = st.deserialize })
018acdaf374f mod_storage_memory: Add map store methods to archive store
Kim Alvefur <zash@zash.se>
parents: 10222
diff changeset
194 else
018acdaf374f mod_storage_memory: Add map store methods to archive store
Kim Alvefur <zash@zash.se>
parents: 10222
diff changeset
195 item.value = envload("return "..serialize(new_value), "=(data)", {});
018acdaf374f mod_storage_memory: Add map store methods to archive store
Kim Alvefur <zash@zash.se>
parents: 10222
diff changeset
196 end
018acdaf374f mod_storage_memory: Add map store methods to archive store
Kim Alvefur <zash@zash.se>
parents: 10222
diff changeset
197 if new_when then
018acdaf374f mod_storage_memory: Add map store methods to archive store
Kim Alvefur <zash@zash.se>
parents: 10222
diff changeset
198 item.when = new_when;
018acdaf374f mod_storage_memory: Add map store methods to archive store
Kim Alvefur <zash@zash.se>
parents: 10222
diff changeset
199 end
018acdaf374f mod_storage_memory: Add map store methods to archive store
Kim Alvefur <zash@zash.se>
parents: 10222
diff changeset
200 if new_with then
018acdaf374f mod_storage_memory: Add map store methods to archive store
Kim Alvefur <zash@zash.se>
parents: 10222
diff changeset
201 item.with = new_when;
018acdaf374f mod_storage_memory: Add map store methods to archive store
Kim Alvefur <zash@zash.se>
parents: 10222
diff changeset
202 end
018acdaf374f mod_storage_memory: Add map store methods to archive store
Kim Alvefur <zash@zash.se>
parents: 10222
diff changeset
203 return true;
018acdaf374f mod_storage_memory: Add map store methods to archive store
Kim Alvefur <zash@zash.se>
parents: 10222
diff changeset
204 end
018acdaf374f mod_storage_memory: Add map store methods to archive store
Kim Alvefur <zash@zash.se>
parents: 10222
diff changeset
205
9906
d0b58bdd6c86 mod_storage_memory: Fix copypaste mistake
Kim Alvefur <zash@zash.se>
parents: 9905
diff changeset
206 function archive_store:summary(username, query)
9905
6d50efaee148 mod_storage_memory: Implement archive summary API
Kim Alvefur <zash@zash.se>
parents: 9887
diff changeset
207 local iter, err = self:find(username, query)
6d50efaee148 mod_storage_memory: Implement archive summary API
Kim Alvefur <zash@zash.se>
parents: 9887
diff changeset
208 if not iter then return iter, err; end
10220
1e2b444acb72 mod_storage_*: Tweak :summary API to allow future expansion with more fields
Kim Alvefur <zash@zash.se>
parents: 10023
diff changeset
209 local counts = {};
10222
51f145094648 mod_storage_*: Also include timestmap of first message in :summary API
Kim Alvefur <zash@zash.se>
parents: 10221
diff changeset
210 local earliest = {};
10221
068692cb9e78 mod_storage_*: Include timestamp of latest message in :summary API
Kim Alvefur <zash@zash.se>
parents: 10220
diff changeset
211 local latest = {};
068692cb9e78 mod_storage_*: Include timestamp of latest message in :summary API
Kim Alvefur <zash@zash.se>
parents: 10220
diff changeset
212 for _, _, when, with in iter do
10220
1e2b444acb72 mod_storage_*: Tweak :summary API to allow future expansion with more fields
Kim Alvefur <zash@zash.se>
parents: 10023
diff changeset
213 counts[with] = (counts[with] or 0) + 1;
10222
51f145094648 mod_storage_*: Also include timestmap of first message in :summary API
Kim Alvefur <zash@zash.se>
parents: 10221
diff changeset
214 if earliest[with] == nil then
51f145094648 mod_storage_*: Also include timestmap of first message in :summary API
Kim Alvefur <zash@zash.se>
parents: 10221
diff changeset
215 earliest[with] = when;
51f145094648 mod_storage_*: Also include timestmap of first message in :summary API
Kim Alvefur <zash@zash.se>
parents: 10221
diff changeset
216 end
10221
068692cb9e78 mod_storage_*: Include timestamp of latest message in :summary API
Kim Alvefur <zash@zash.se>
parents: 10220
diff changeset
217 latest[with] = when;
9905
6d50efaee148 mod_storage_memory: Implement archive summary API
Kim Alvefur <zash@zash.se>
parents: 9887
diff changeset
218 end
10220
1e2b444acb72 mod_storage_*: Tweak :summary API to allow future expansion with more fields
Kim Alvefur <zash@zash.se>
parents: 10023
diff changeset
219 return {
1e2b444acb72 mod_storage_*: Tweak :summary API to allow future expansion with more fields
Kim Alvefur <zash@zash.se>
parents: 10023
diff changeset
220 counts = counts;
10222
51f145094648 mod_storage_*: Also include timestmap of first message in :summary API
Kim Alvefur <zash@zash.se>
parents: 10221
diff changeset
221 earliest = earliest;
10221
068692cb9e78 mod_storage_*: Include timestamp of latest message in :summary API
Kim Alvefur <zash@zash.se>
parents: 10220
diff changeset
222 latest = latest;
10220
1e2b444acb72 mod_storage_*: Tweak :summary API to allow future expansion with more fields
Kim Alvefur <zash@zash.se>
parents: 10023
diff changeset
223 };
9905
6d50efaee148 mod_storage_memory: Implement archive summary API
Kim Alvefur <zash@zash.se>
parents: 9887
diff changeset
224 end
6d50efaee148 mod_storage_memory: Implement archive summary API
Kim Alvefur <zash@zash.se>
parents: 9887
diff changeset
225
9293
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
226
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
227 function archive_store:delete(username, query)
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
228 if not query or next(query) == nil then
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
229 self.store[username or NULL] = nil;
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
230 return true;
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
231 end
9535
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
232 local items = self.store[username or NULL];
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
233 if not items then
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
234 -- Store is empty
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
235 return 0;
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
236 end
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
237 items = array(items);
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
238 local count_before = #items;
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
239 if query then
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
240 if query.key then
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
241 items:filter(function (item)
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
242 return item.key ~= query.key;
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
243 end);
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
244 end
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
245 if query.with then
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
246 items:filter(function (item)
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
247 return item.with ~= query.with;
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
248 end);
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
249 end
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
250 if query.start then
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
251 items:filter(function (item)
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
252 return item.when < query.start;
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
253 end);
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
254 end
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
255 if query["end"] then
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
256 items:filter(function (item)
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
257 return item.when > query["end"];
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
258 end);
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
259 end
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
260 if query.truncate and #items > query.truncate then
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
261 if query.reverse then
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
262 -- Before: { 1, 2, 3, 4, 5, }
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
263 -- After: { 1, 2, 3 }
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
264 for i = #items, query.truncate + 1, -1 do
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
265 items[i] = nil;
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
266 end
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
267 else
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
268 -- Before: { 1, 2, 3, 4, 5, }
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
269 -- After: { 3, 4, 5 }
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
270 local offset = #items - query.truncate;
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
271 for i = 1, #items do
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
272 items[i] = items[i+offset];
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
273 end
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
274 end
9293
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
275 end
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
276 end
9535
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
277 local count = count_before - #items;
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
278 if count == 0 then
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
279 return 0; -- No changes, skip write
9293
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
280 end
9535
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
281 setmetatable(items, nil);
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
282
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
283 do -- re-index by key
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
284 for k in pairs(items) do
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
285 if type(k) == "string" then
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
286 items[k] = nil;
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
287 end
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
288 end
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
289
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
290 for i = 1, #items do
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
291 items[ items[i].key ] = i;
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
292 end
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
293 end
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
294
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9534
diff changeset
295 return count;
9293
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
296 end
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
297
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
298 archive_store.purge = _purge_store;
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
299
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
300 local stores = {
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
301 keyval = keyval_store;
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
302 archive = archive_store;
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
303 }
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
304
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
305 local driver = {};
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
306
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
307 function driver:open(store, typ) -- luacheck: ignore 212/self
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
308 local store_mt = stores[typ or "keyval"];
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
309 if store_mt then
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
310 return setmetatable({ store = memory[store] }, store_mt);
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
311 end
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
312 return nil, "unsupported-store";
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
313 end
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
314
9609
1dfcea523200 mod_storage_memory: Support the purge driver method
Kim Alvefur <zash@zash.se>
parents: 9535
diff changeset
315 function driver:purge(user) -- luacheck: ignore 212/self
1dfcea523200 mod_storage_memory: Support the purge driver method
Kim Alvefur <zash@zash.se>
parents: 9535
diff changeset
316 for _, store in pairs(memory) do
1dfcea523200 mod_storage_memory: Support the purge driver method
Kim Alvefur <zash@zash.se>
parents: 9535
diff changeset
317 store[user] = nil;
1dfcea523200 mod_storage_memory: Support the purge driver method
Kim Alvefur <zash@zash.se>
parents: 9535
diff changeset
318 end
1dfcea523200 mod_storage_memory: Support the purge driver method
Kim Alvefur <zash@zash.se>
parents: 9535
diff changeset
319 end
1dfcea523200 mod_storage_memory: Support the purge driver method
Kim Alvefur <zash@zash.se>
parents: 9535
diff changeset
320
9293
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
321 if auto_purge_enabled then
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
322 module:hook("resource-unbind", function (event)
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
323 local user_bare_jid = event.session.username.."@"..event.session.host;
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
324 if not prosody.bare_sessions[user_bare_jid] then -- User went offline
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
325 module:log("debug", "Clearing store for offline user %s", user_bare_jid);
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
326 local f, s, v;
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
327 if auto_purge_stores:empty() then
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
328 f, s, v = pairs(memory);
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
329 else
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
330 f, s, v = auto_purge_stores:items();
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
331 end
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
332
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
333 for store_name in f, s, v do
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
334 if memory[store_name] then
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
335 memory[store_name][event.session.username] = nil;
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
336 end
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
337 end
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
338 end
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
339 end);
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
340 end
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
341
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
342 module:provides("storage", driver);