author | Kim Alvefur <zash@zash.se> |
Sun, 25 Jun 2023 20:15:44 +0200 | |
changeset 5582 | b9821e9a21a2 |
parent 3365 | bc745a60ce21 |
permissions | -rw-r--r-- |
2660
83fb61fa476e
mod_storage_memory: Serialize data functions that return the data (prevents mutation of stored data)
Kim Alvefur <zash@zash.se>
parents:
2659
diff
changeset
|
1 |
local serialize = require "util.serialization".serialize; |
83fb61fa476e
mod_storage_memory: Serialize data functions that return the data (prevents mutation of stored data)
Kim Alvefur <zash@zash.se>
parents:
2659
diff
changeset
|
2 |
local envload = require "util.envload".envload; |
83fb61fa476e
mod_storage_memory: Serialize data functions that return the data (prevents mutation of stored data)
Kim Alvefur <zash@zash.se>
parents:
2659
diff
changeset
|
3 |
local st = require "util.stanza"; |
83fb61fa476e
mod_storage_memory: Serialize data functions that return the data (prevents mutation of stored data)
Kim Alvefur <zash@zash.se>
parents:
2659
diff
changeset
|
4 |
local is_stanza = st.is_stanza or function (s) return getmetatable(s) == st.stanza_mt end |
83fb61fa476e
mod_storage_memory: Serialize data functions that return the data (prevents mutation of stored data)
Kim Alvefur <zash@zash.se>
parents:
2659
diff
changeset
|
5 |
|
2624
8b8cab2eb7fc
mod_storage_memory: Add support for clearing a user's data when they log out
Matthew Wild <mwild1@gmail.com>
parents:
2623
diff
changeset
|
6 |
local auto_purge_enabled = module:get_option_boolean("storage_memory_temporary", false); |
8b8cab2eb7fc
mod_storage_memory: Add support for clearing a user's data when they log out
Matthew Wild <mwild1@gmail.com>
parents:
2623
diff
changeset
|
7 |
local auto_purge_stores = module:get_option_set("storage_memory_temporary_stores", {}); |
1259
fa7e402fcdc1
mod_storage_memory: Simple in-memory only storage backend without persistence
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
8 |
|
fa7e402fcdc1
mod_storage_memory: Simple in-memory only storage backend without persistence
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
9 |
local memory = setmetatable({}, { |
fa7e402fcdc1
mod_storage_memory: Simple in-memory only storage backend without persistence
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
10 |
__index = function(t, k) |
fa7e402fcdc1
mod_storage_memory: Simple in-memory only storage backend without persistence
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
11 |
local store = module:shared(k) |
fa7e402fcdc1
mod_storage_memory: Simple in-memory only storage backend without persistence
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
12 |
t[k] = store; |
fa7e402fcdc1
mod_storage_memory: Simple in-memory only storage backend without persistence
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
13 |
return store; |
fa7e402fcdc1
mod_storage_memory: Simple in-memory only storage backend without persistence
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
14 |
end |
fa7e402fcdc1
mod_storage_memory: Simple in-memory only storage backend without persistence
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
15 |
}); |
fa7e402fcdc1
mod_storage_memory: Simple in-memory only storage backend without persistence
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
16 |
|
2660
83fb61fa476e
mod_storage_memory: Serialize data functions that return the data (prevents mutation of stored data)
Kim Alvefur <zash@zash.se>
parents:
2659
diff
changeset
|
17 |
local function NULL() return nil end |
2101
4454f124465a
mod_storage_memory: Support for empty username stores
Matthew Wild <mwild1@gmail.com>
parents:
1764
diff
changeset
|
18 |
|
2623
1e4bbff0a6fd
mod_storage_memory: Add :purge() method to all store types
Matthew Wild <mwild1@gmail.com>
parents:
2176
diff
changeset
|
19 |
local function _purge_store(self, username) |
1e4bbff0a6fd
mod_storage_memory: Add :purge() method to all store types
Matthew Wild <mwild1@gmail.com>
parents:
2176
diff
changeset
|
20 |
self.store[username or NULL] = nil; |
1e4bbff0a6fd
mod_storage_memory: Add :purge() method to all store types
Matthew Wild <mwild1@gmail.com>
parents:
2176
diff
changeset
|
21 |
return true; |
1e4bbff0a6fd
mod_storage_memory: Add :purge() method to all store types
Matthew Wild <mwild1@gmail.com>
parents:
2176
diff
changeset
|
22 |
end |
1e4bbff0a6fd
mod_storage_memory: Add :purge() method to all store types
Matthew Wild <mwild1@gmail.com>
parents:
2176
diff
changeset
|
23 |
|
1259
fa7e402fcdc1
mod_storage_memory: Simple in-memory only storage backend without persistence
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
24 |
local keyval_store = {}; |
fa7e402fcdc1
mod_storage_memory: Simple in-memory only storage backend without persistence
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
25 |
keyval_store.__index = keyval_store; |
fa7e402fcdc1
mod_storage_memory: Simple in-memory only storage backend without persistence
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
26 |
|
fa7e402fcdc1
mod_storage_memory: Simple in-memory only storage backend without persistence
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
27 |
function keyval_store:get(username) |
2660
83fb61fa476e
mod_storage_memory: Serialize data functions that return the data (prevents mutation of stored data)
Kim Alvefur <zash@zash.se>
parents:
2659
diff
changeset
|
28 |
return (self.store[username or NULL] or NULL)(); |
1259
fa7e402fcdc1
mod_storage_memory: Simple in-memory only storage backend without persistence
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
29 |
end |
fa7e402fcdc1
mod_storage_memory: Simple in-memory only storage backend without persistence
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
30 |
|
fa7e402fcdc1
mod_storage_memory: Simple in-memory only storage backend without persistence
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
31 |
function keyval_store:set(username, data) |
3095
8e5da12205b5
mod_storage_memory: Fix removal of data in keyvalue (thanks jonasw)
Kim Alvefur <zash@zash.se>
parents:
2807
diff
changeset
|
32 |
if data ~= nil then |
8e5da12205b5
mod_storage_memory: Fix removal of data in keyvalue (thanks jonasw)
Kim Alvefur <zash@zash.se>
parents:
2807
diff
changeset
|
33 |
data = envload("return "..serialize(data), "@data", {}); |
8e5da12205b5
mod_storage_memory: Fix removal of data in keyvalue (thanks jonasw)
Kim Alvefur <zash@zash.se>
parents:
2807
diff
changeset
|
34 |
end |
8e5da12205b5
mod_storage_memory: Fix removal of data in keyvalue (thanks jonasw)
Kim Alvefur <zash@zash.se>
parents:
2807
diff
changeset
|
35 |
self.store[username or NULL] = data; |
1259
fa7e402fcdc1
mod_storage_memory: Simple in-memory only storage backend without persistence
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
36 |
return true; |
fa7e402fcdc1
mod_storage_memory: Simple in-memory only storage backend without persistence
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
37 |
end |
fa7e402fcdc1
mod_storage_memory: Simple in-memory only storage backend without persistence
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
38 |
|
2623
1e4bbff0a6fd
mod_storage_memory: Add :purge() method to all store types
Matthew Wild <mwild1@gmail.com>
parents:
2176
diff
changeset
|
39 |
keyval_store.purge = _purge_store; |
1e4bbff0a6fd
mod_storage_memory: Add :purge() method to all store types
Matthew Wild <mwild1@gmail.com>
parents:
2176
diff
changeset
|
40 |
|
1612
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
41 |
local archive_store = {}; |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
42 |
archive_store.__index = archive_store; |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
43 |
|
1757
54c8a0cb2996
mod_storage_(archive-capable): Change order of arguments to :append to be the same as return values from :find iterator (see prosody 41725f3df3cc)
Kim Alvefur <zash@zash.se>
parents:
1612
diff
changeset
|
44 |
function archive_store:append(username, key, value, when, with) |
54c8a0cb2996
mod_storage_(archive-capable): Change order of arguments to :append to be the same as return values from :find iterator (see prosody 41725f3df3cc)
Kim Alvefur <zash@zash.se>
parents:
1612
diff
changeset
|
45 |
if type(when) ~= "number" then |
1764
e72f9eac51c8
mod_storage_(various): Order swapping in 54c8a0cb2996 was backwards
Kim Alvefur <zash@zash.se>
parents:
1757
diff
changeset
|
46 |
when, with, value = value, when, with; |
1757
54c8a0cb2996
mod_storage_(archive-capable): Change order of arguments to :append to be the same as return values from :find iterator (see prosody 41725f3df3cc)
Kim Alvefur <zash@zash.se>
parents:
1612
diff
changeset
|
47 |
end |
2660
83fb61fa476e
mod_storage_memory: Serialize data functions that return the data (prevents mutation of stored data)
Kim Alvefur <zash@zash.se>
parents:
2659
diff
changeset
|
48 |
if is_stanza(value) then |
83fb61fa476e
mod_storage_memory: Serialize data functions that return the data (prevents mutation of stored data)
Kim Alvefur <zash@zash.se>
parents:
2659
diff
changeset
|
49 |
value = st.preserialize(value); |
2806
0d5d1ff96600
mod_storage_memory: Serialize stanzas on save (was delayed until query)
Kim Alvefur <zash@zash.se>
parents:
2677
diff
changeset
|
50 |
value = envload("return xml"..serialize(value), "@stanza", { xml = st.deserialize }) |
2660
83fb61fa476e
mod_storage_memory: Serialize data functions that return the data (prevents mutation of stored data)
Kim Alvefur <zash@zash.se>
parents:
2659
diff
changeset
|
51 |
else |
2677
2e1a4740adee
mod_storage_memory: Include missing return statement (thanks jonasw)
Kim Alvefur <zash@zash.se>
parents:
2665
diff
changeset
|
52 |
value = envload("return "..serialize(value), "@data", {}); |
2660
83fb61fa476e
mod_storage_memory: Serialize data functions that return the data (prevents mutation of stored data)
Kim Alvefur <zash@zash.se>
parents:
2659
diff
changeset
|
53 |
end |
2101
4454f124465a
mod_storage_memory: Support for empty username stores
Matthew Wild <mwild1@gmail.com>
parents:
1764
diff
changeset
|
54 |
local a = self.store[username or NULL]; |
1612
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
55 |
if not a then |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
56 |
a = {}; |
2101
4454f124465a
mod_storage_memory: Support for empty username stores
Matthew Wild <mwild1@gmail.com>
parents:
1764
diff
changeset
|
57 |
self.store[username or NULL] = a; |
1612
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
58 |
end |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
59 |
local i = #a+1; |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
60 |
local v = { key = key, when = when, with = with, value = value }; |
2807
9db18f909b84
mod_storage_memory: Allow archive items to be overwritten by id
Kim Alvefur <zash@zash.se>
parents:
2806
diff
changeset
|
61 |
if not key then |
1612
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
62 |
key = tostring(a):match"%x+$"..tostring(v):match"%x+$"; |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
63 |
v.key = key; |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
64 |
end |
2807
9db18f909b84
mod_storage_memory: Allow archive items to be overwritten by id
Kim Alvefur <zash@zash.se>
parents:
2806
diff
changeset
|
65 |
if a[key] then |
9db18f909b84
mod_storage_memory: Allow archive items to be overwritten by id
Kim Alvefur <zash@zash.se>
parents:
2806
diff
changeset
|
66 |
table.remove(a, a[key]); |
9db18f909b84
mod_storage_memory: Allow archive items to be overwritten by id
Kim Alvefur <zash@zash.se>
parents:
2806
diff
changeset
|
67 |
end |
1612
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
68 |
a[i] = v; |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
69 |
a[key] = i; |
2658
9e5015555fff
mod_storage_memory: Fix to make archive:append() return the archive id as it should
Kim Alvefur <zash@zash.se>
parents:
2624
diff
changeset
|
70 |
return key; |
1612
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
71 |
end |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
72 |
|
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
73 |
local function archive_iter (a, start, stop, step, limit, when_start, when_end, match_with) |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
74 |
local item, when, with; |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
75 |
local count = 0; |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
76 |
coroutine.yield(true); -- Ready |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
77 |
for i = start, stop, step do |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
78 |
item = a[i]; |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
79 |
when, with = item.when, item.with; |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
80 |
if when >= when_start and when_end >= when and (not match_with or match_with == with) then |
2660
83fb61fa476e
mod_storage_memory: Serialize data functions that return the data (prevents mutation of stored data)
Kim Alvefur <zash@zash.se>
parents:
2659
diff
changeset
|
81 |
coroutine.yield(item.key, item.value(), when, with); |
1612
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
82 |
count = count + 1; |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
83 |
if limit and count >= limit then return end |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
84 |
end |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
85 |
end |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
86 |
end |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
87 |
|
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
88 |
function archive_store:find(username, query) |
2101
4454f124465a
mod_storage_memory: Support for empty username stores
Matthew Wild <mwild1@gmail.com>
parents:
1764
diff
changeset
|
89 |
local a = self.store[username or NULL] or {}; |
1612
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
90 |
local start, stop, step = 1, #a, 1; |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
91 |
local qstart, qend, qwith = -math.huge, math.huge; |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
92 |
local limit; |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
93 |
if query then |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
94 |
module:log("debug", "query included") |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
95 |
if query.reverse then |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
96 |
start, stop, step = stop, start, -1; |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
97 |
if query.before then |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
98 |
start = a[query.before]; |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
99 |
end |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
100 |
elseif query.after then |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
101 |
start = a[query.after]; |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
102 |
end |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
103 |
limit = query.limit; |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
104 |
qstart = query.start or qstart; |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
105 |
qend = query["end"] or qend; |
2664
796ace2c8f9d
mod_storage_memory: Inclued 'with' in search [luacheck]
Kim Alvefur <zash@zash.se>
parents:
2663
diff
changeset
|
106 |
qwith = query.with; |
1612
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
107 |
end |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
108 |
if not start then return nil, "invalid-key"; end |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
109 |
local iter = coroutine.wrap(archive_iter); |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
110 |
iter(a, start, stop, step, limit, qstart, qend, qwith); |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
111 |
return iter; |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
112 |
end |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
113 |
|
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
114 |
function archive_store:delete(username, query) |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
115 |
if not query or next(query) == nil then |
2101
4454f124465a
mod_storage_memory: Support for empty username stores
Matthew Wild <mwild1@gmail.com>
parents:
1764
diff
changeset
|
116 |
self.store[username or NULL] = nil; |
1612
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
117 |
return true; |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
118 |
end |
2101
4454f124465a
mod_storage_memory: Support for empty username stores
Matthew Wild <mwild1@gmail.com>
parents:
1764
diff
changeset
|
119 |
local old = self.store[username or NULL]; |
1612
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
120 |
if not old then return true; end |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
121 |
local qstart = query.start or -math.huge; |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
122 |
local qend = query["end"] or math.huge; |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
123 |
local qwith = query.with; |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
124 |
local new = {}; |
2101
4454f124465a
mod_storage_memory: Support for empty username stores
Matthew Wild <mwild1@gmail.com>
parents:
1764
diff
changeset
|
125 |
self.store[username or NULL] = new; |
1612
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
126 |
local t; |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
127 |
for i = 1, #old do |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
128 |
i = old[i]; |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
129 |
t = i.when; |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
130 |
if not(qstart >= t and qend <= t and (not qwith or i.with == qwith)) then |
3365
bc745a60ce21
mod_storage_memory: Fix saving of remaining items during deletion
Kim Alvefur <zash@zash.se>
parents:
3095
diff
changeset
|
131 |
self:append(username, i.key, i.value(), t, i.with); |
1612
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
132 |
end |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
133 |
end |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
134 |
if #new == 0 then |
2101
4454f124465a
mod_storage_memory: Support for empty username stores
Matthew Wild <mwild1@gmail.com>
parents:
1764
diff
changeset
|
135 |
self.store[username or NULL] = nil; |
1612
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
136 |
end |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
137 |
return true; |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
138 |
end |
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
139 |
|
2623
1e4bbff0a6fd
mod_storage_memory: Add :purge() method to all store types
Matthew Wild <mwild1@gmail.com>
parents:
2176
diff
changeset
|
140 |
archive_store.purge = _purge_store; |
1e4bbff0a6fd
mod_storage_memory: Add :purge() method to all store types
Matthew Wild <mwild1@gmail.com>
parents:
2176
diff
changeset
|
141 |
|
1259
fa7e402fcdc1
mod_storage_memory: Simple in-memory only storage backend without persistence
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
142 |
local stores = { |
fa7e402fcdc1
mod_storage_memory: Simple in-memory only storage backend without persistence
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
143 |
keyval = keyval_store; |
1612
59fdf4f12343
mod_storage_memory: Add support for archive stores
Kim Alvefur <zash@zash.se>
parents:
1611
diff
changeset
|
144 |
archive = archive_store; |
1259
fa7e402fcdc1
mod_storage_memory: Simple in-memory only storage backend without persistence
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
145 |
} |
fa7e402fcdc1
mod_storage_memory: Simple in-memory only storage backend without persistence
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
146 |
|
fa7e402fcdc1
mod_storage_memory: Simple in-memory only storage backend without persistence
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
147 |
local driver = {}; |
fa7e402fcdc1
mod_storage_memory: Simple in-memory only storage backend without persistence
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
148 |
|
2665
1d734acabd46
mod_storage_memory: Ignore unused 'self' [luacheck]
Kim Alvefur <zash@zash.se>
parents:
2664
diff
changeset
|
149 |
function driver:open(store, typ) -- luacheck: ignore 212/self |
1259
fa7e402fcdc1
mod_storage_memory: Simple in-memory only storage backend without persistence
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
150 |
local store_mt = stores[typ or "keyval"]; |
fa7e402fcdc1
mod_storage_memory: Simple in-memory only storage backend without persistence
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
151 |
if store_mt then |
fa7e402fcdc1
mod_storage_memory: Simple in-memory only storage backend without persistence
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
152 |
return setmetatable({ store = memory[store] }, store_mt); |
fa7e402fcdc1
mod_storage_memory: Simple in-memory only storage backend without persistence
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
153 |
end |
fa7e402fcdc1
mod_storage_memory: Simple in-memory only storage backend without persistence
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
154 |
return nil, "unsupported-store"; |
fa7e402fcdc1
mod_storage_memory: Simple in-memory only storage backend without persistence
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
155 |
end |
fa7e402fcdc1
mod_storage_memory: Simple in-memory only storage backend without persistence
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
156 |
|
2624
8b8cab2eb7fc
mod_storage_memory: Add support for clearing a user's data when they log out
Matthew Wild <mwild1@gmail.com>
parents:
2623
diff
changeset
|
157 |
if auto_purge_enabled then |
8b8cab2eb7fc
mod_storage_memory: Add support for clearing a user's data when they log out
Matthew Wild <mwild1@gmail.com>
parents:
2623
diff
changeset
|
158 |
module:hook("resource-unbind", function (event) |
8b8cab2eb7fc
mod_storage_memory: Add support for clearing a user's data when they log out
Matthew Wild <mwild1@gmail.com>
parents:
2623
diff
changeset
|
159 |
local user_bare_jid = event.session.username.."@"..event.session.host; |
8b8cab2eb7fc
mod_storage_memory: Add support for clearing a user's data when they log out
Matthew Wild <mwild1@gmail.com>
parents:
2623
diff
changeset
|
160 |
if not prosody.bare_sessions[user_bare_jid] then -- User went offline |
8b8cab2eb7fc
mod_storage_memory: Add support for clearing a user's data when they log out
Matthew Wild <mwild1@gmail.com>
parents:
2623
diff
changeset
|
161 |
module:log("debug", "Clearing store for offline user %s", user_bare_jid); |
8b8cab2eb7fc
mod_storage_memory: Add support for clearing a user's data when they log out
Matthew Wild <mwild1@gmail.com>
parents:
2623
diff
changeset
|
162 |
local f, s, v; |
8b8cab2eb7fc
mod_storage_memory: Add support for clearing a user's data when they log out
Matthew Wild <mwild1@gmail.com>
parents:
2623
diff
changeset
|
163 |
if auto_purge_stores:empty() then |
8b8cab2eb7fc
mod_storage_memory: Add support for clearing a user's data when they log out
Matthew Wild <mwild1@gmail.com>
parents:
2623
diff
changeset
|
164 |
f, s, v = pairs(memory); |
8b8cab2eb7fc
mod_storage_memory: Add support for clearing a user's data when they log out
Matthew Wild <mwild1@gmail.com>
parents:
2623
diff
changeset
|
165 |
else |
8b8cab2eb7fc
mod_storage_memory: Add support for clearing a user's data when they log out
Matthew Wild <mwild1@gmail.com>
parents:
2623
diff
changeset
|
166 |
f, s, v = auto_purge_stores:items(); |
8b8cab2eb7fc
mod_storage_memory: Add support for clearing a user's data when they log out
Matthew Wild <mwild1@gmail.com>
parents:
2623
diff
changeset
|
167 |
end |
8b8cab2eb7fc
mod_storage_memory: Add support for clearing a user's data when they log out
Matthew Wild <mwild1@gmail.com>
parents:
2623
diff
changeset
|
168 |
|
8b8cab2eb7fc
mod_storage_memory: Add support for clearing a user's data when they log out
Matthew Wild <mwild1@gmail.com>
parents:
2623
diff
changeset
|
169 |
for store_name in f, s, v do |
8b8cab2eb7fc
mod_storage_memory: Add support for clearing a user's data when they log out
Matthew Wild <mwild1@gmail.com>
parents:
2623
diff
changeset
|
170 |
if memory[store_name] then |
8b8cab2eb7fc
mod_storage_memory: Add support for clearing a user's data when they log out
Matthew Wild <mwild1@gmail.com>
parents:
2623
diff
changeset
|
171 |
memory[store_name][event.session.username] = nil; |
8b8cab2eb7fc
mod_storage_memory: Add support for clearing a user's data when they log out
Matthew Wild <mwild1@gmail.com>
parents:
2623
diff
changeset
|
172 |
end |
8b8cab2eb7fc
mod_storage_memory: Add support for clearing a user's data when they log out
Matthew Wild <mwild1@gmail.com>
parents:
2623
diff
changeset
|
173 |
end |
8b8cab2eb7fc
mod_storage_memory: Add support for clearing a user's data when they log out
Matthew Wild <mwild1@gmail.com>
parents:
2623
diff
changeset
|
174 |
end |
8b8cab2eb7fc
mod_storage_memory: Add support for clearing a user's data when they log out
Matthew Wild <mwild1@gmail.com>
parents:
2623
diff
changeset
|
175 |
end); |
8b8cab2eb7fc
mod_storage_memory: Add support for clearing a user's data when they log out
Matthew Wild <mwild1@gmail.com>
parents:
2623
diff
changeset
|
176 |
end |
8b8cab2eb7fc
mod_storage_memory: Add support for clearing a user's data when they log out
Matthew Wild <mwild1@gmail.com>
parents:
2623
diff
changeset
|
177 |
|
1259
fa7e402fcdc1
mod_storage_memory: Simple in-memory only storage backend without persistence
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
178 |
module:provides("storage", driver); |