mod_storage_memory/mod_storage_memory.lua
author Matthew Wild <mwild1@gmail.com>
Fri, 23 Sep 2022 22:41:15 +0100
changeset 5058 62480053c87b
parent 3365 bc745a60ce21
permissions -rw-r--r--
mod_cloud_notify_encrypted: Additional debug logging when enabling/skipping
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);