mod_storage_memory/mod_storage_memory.lua
author Matthew Wild <mwild1@gmail.com>
Sat, 14 Jan 2023 14:31:37 +0000
changeset 5153 fa56ed2bacab
parent 3365 bc745a60ce21
permissions -rw-r--r--
mod_unified_push: Add support for multiple token backends, including stoage Now that we have ACLs by default, it is no longer necessary to be completely stateless. On 0.12, using storage has benefits over JWT, because it does not expose client JIDs to the push apps/services. In trunk, PASETO is stateless and does not expose client JIDs.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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);