plugins/mod_storage_memory.lua
author Kim Alvefur <zash@zash.se>
Sat, 02 Mar 2019 22:26:01 +0100
branch0.11
changeset 9842 40ed04014b97
parent 9836 96d9c121547b
child 9843 9007ae90aeb1
child 9885 68faa0c1a99c
permissions -rw-r--r--
mod_storage_memory: Generate ID using standard util (fixes #1326) The previous method relied on tostring(table) returning the pointer address, which might not be portable.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
9296
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     1
local serialize = require "util.serialization".serialize;
9538
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
     2
local array = require "util.array";
9296
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     3
local envload = require "util.envload".envload;
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     4
local st = require "util.stanza";
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     5
local is_stanza = st.is_stanza or function (s) return getmetatable(s) == st.stanza_mt end
9842
40ed04014b97 mod_storage_memory: Generate ID using standard util (fixes #1326)
Kim Alvefur <zash@zash.se>
parents: 9836
diff changeset
     6
local new_id = require "util.id".medium;
9296
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     7
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     8
local auto_purge_enabled = module:get_option_boolean("storage_memory_temporary", false);
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     9
local auto_purge_stores = module:get_option_set("storage_memory_temporary_stores", {});
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    10
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    11
local memory = setmetatable({}, {
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    12
	__index = function(t, k)
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    13
		local store = module:shared(k)
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    14
		t[k] = store;
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    15
		return store;
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    16
	end
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    17
});
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    18
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    19
local function NULL() return nil end
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    20
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    21
local function _purge_store(self, username)
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    22
	self.store[username or NULL] = nil;
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    23
	return true;
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    24
end
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    25
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    26
local keyval_store = {};
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    27
keyval_store.__index = keyval_store;
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    28
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    29
function keyval_store:get(username)
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    30
	return (self.store[username or NULL] or NULL)();
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    31
end
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    32
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    33
function keyval_store:set(username, data)
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    34
	if data ~= nil then
9471
bd5e4485a245 mod_storage_memory: Switch from '@' prefix to '=' for chunks, '@' is used to indicate a source file name only
Matthew Wild <mwild1@gmail.com>
parents: 9343
diff changeset
    35
		data = envload("return "..serialize(data), "=(data)", {});
9296
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    36
	end
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    37
	self.store[username or NULL] = data;
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    38
	return true;
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    39
end
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    40
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    41
keyval_store.purge = _purge_store;
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    42
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    43
local archive_store = {};
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    44
archive_store.__index = archive_store;
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    45
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    46
function archive_store:append(username, key, value, when, with)
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    47
	if is_stanza(value) then
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    48
		value = st.preserialize(value);
9471
bd5e4485a245 mod_storage_memory: Switch from '@' prefix to '=' for chunks, '@' is used to indicate a source file name only
Matthew Wild <mwild1@gmail.com>
parents: 9343
diff changeset
    49
		value = envload("return xml"..serialize(value), "=(stanza)", { xml = st.deserialize })
9296
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    50
	else
9471
bd5e4485a245 mod_storage_memory: Switch from '@' prefix to '=' for chunks, '@' is used to indicate a source file name only
Matthew Wild <mwild1@gmail.com>
parents: 9343
diff changeset
    51
		value = envload("return "..serialize(value), "=(data)", {});
9296
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    52
	end
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    53
	local a = self.store[username or NULL];
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    54
	if not a then
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    55
		a = {};
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    56
		self.store[username or NULL] = a;
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    57
	end
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    58
	local v = { key = key, when = when, with = with, value = value };
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    59
	if not key then
9842
40ed04014b97 mod_storage_memory: Generate ID using standard util (fixes #1326)
Kim Alvefur <zash@zash.se>
parents: 9836
diff changeset
    60
		key = new_id();
9296
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    61
		v.key = key;
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    62
	end
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    63
	if a[key] then
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    64
		table.remove(a, a[key]);
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    65
	end
9537
b301f7edf346 mod_storage_memory: Fix overwriting old keys
Kim Alvefur <zash@zash.se>
parents: 9536
diff changeset
    66
	local i = #a+1;
9296
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    67
	a[i] = v;
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    68
	a[key] = i;
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    69
	return key;
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    70
end
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    71
9836
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9613
diff changeset
    72
function archive_store:find(username, query)
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9613
diff changeset
    73
	local items = self.store[username or NULL];
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9613
diff changeset
    74
	if not items then
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9613
diff changeset
    75
		return function () end, 0;
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9613
diff changeset
    76
	end
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9613
diff changeset
    77
	local count = #items;
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9613
diff changeset
    78
	local i = 0;
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9613
diff changeset
    79
	if query then
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9613
diff changeset
    80
		items = array():append(items);
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9613
diff changeset
    81
		if query.key then
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9613
diff changeset
    82
			items:filter(function (item)
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9613
diff changeset
    83
				return item.key == query.key;
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9613
diff changeset
    84
			end);
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9613
diff changeset
    85
		end
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9613
diff changeset
    86
		if query.with then
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9613
diff changeset
    87
			items:filter(function (item)
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9613
diff changeset
    88
				return item.with == query.with;
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9613
diff changeset
    89
			end);
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9613
diff changeset
    90
		end
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9613
diff changeset
    91
		if query.start then
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9613
diff changeset
    92
			items:filter(function (item)
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9613
diff changeset
    93
				return item.when >= query.start;
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9613
diff changeset
    94
			end);
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9613
diff changeset
    95
		end
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9613
diff changeset
    96
		if query["end"] then
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9613
diff changeset
    97
			items:filter(function (item)
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9613
diff changeset
    98
				return item.when <= query["end"];
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9613
diff changeset
    99
			end);
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9613
diff changeset
   100
		end
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9613
diff changeset
   101
		count = #items;
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9613
diff changeset
   102
		if query.reverse then
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9613
diff changeset
   103
			items:reverse();
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9613
diff changeset
   104
			if query.before then
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9613
diff changeset
   105
				for j = 1, count do
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9613
diff changeset
   106
					if (items[j].key or tostring(j)) == query.before then
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9613
diff changeset
   107
						i = j;
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9613
diff changeset
   108
						break;
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9613
diff changeset
   109
					end
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9613
diff changeset
   110
				end
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9613
diff changeset
   111
			end
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9613
diff changeset
   112
		elseif query.after then
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9613
diff changeset
   113
			for j = 1, count do
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9613
diff changeset
   114
				if (items[j].key or tostring(j)) == query.after then
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9613
diff changeset
   115
					i = j;
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9613
diff changeset
   116
					break;
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9613
diff changeset
   117
				end
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9613
diff changeset
   118
			end
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9613
diff changeset
   119
		end
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9613
diff changeset
   120
		if query.limit and #items - i > query.limit then
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9613
diff changeset
   121
			items[i+query.limit+1] = nil;
9296
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   122
		end
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   123
	end
9836
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9613
diff changeset
   124
	return function ()
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9613
diff changeset
   125
		i = i + 1;
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9613
diff changeset
   126
		local item = items[i];
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9613
diff changeset
   127
		if not item then return; end
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9613
diff changeset
   128
		return item.key, item.value(), item.when, item.with;
96d9c121547b mod_storage_memory: Replace query function with one based on storage_internal (fixes #1322)
Kim Alvefur <zash@zash.se>
parents: 9613
diff changeset
   129
	end, count;
9296
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   130
end
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   131
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   132
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   133
function archive_store:delete(username, query)
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   134
	if not query or next(query) == nil then
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   135
		self.store[username or NULL] = nil;
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   136
		return true;
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   137
	end
9538
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   138
	local items = self.store[username or NULL];
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   139
	if not items then
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   140
		-- Store is empty
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   141
		return 0;
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   142
	end
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   143
	items = array(items);
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   144
	local count_before = #items;
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   145
	if query then
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   146
		if query.key then
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   147
			items:filter(function (item)
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   148
				return item.key ~= query.key;
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   149
			end);
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   150
		end
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   151
		if query.with then
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   152
			items:filter(function (item)
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   153
				return item.with ~= query.with;
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   154
			end);
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   155
		end
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   156
		if query.start then
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   157
			items:filter(function (item)
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   158
				return item.when < query.start;
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   159
			end);
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   160
		end
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   161
		if query["end"] then
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   162
			items:filter(function (item)
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   163
				return item.when > query["end"];
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   164
			end);
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   165
		end
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   166
		if query.truncate and #items > query.truncate then
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   167
			if query.reverse then
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   168
				-- Before: { 1, 2, 3, 4, 5, }
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   169
				-- After: { 1, 2, 3 }
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   170
				for i = #items, query.truncate + 1, -1 do
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   171
					items[i] = nil;
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   172
				end
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   173
			else
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   174
				-- Before: { 1, 2, 3, 4, 5, }
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   175
				-- After: { 3, 4, 5 }
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   176
				local offset = #items - query.truncate;
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   177
				for i = 1, #items do
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   178
					items[i] = items[i+offset];
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   179
				end
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   180
			end
9296
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   181
		end
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   182
	end
9538
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   183
	local count = count_before - #items;
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   184
	if count == 0 then
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   185
		return 0; -- No changes, skip write
9296
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   186
	end
9538
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   187
	setmetatable(items, nil);
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   188
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   189
	do -- re-index by key
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   190
		for k in pairs(items) do
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   191
			if type(k) == "string" then
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   192
				items[k] = nil;
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   193
			end
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   194
		end
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   195
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   196
		for i = 1, #items do
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   197
			items[ items[i].key ] = i;
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   198
		end
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   199
	end
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   200
c1befd1c886d mod_storage_memory: Adapt archive deletion code from mod_storage_internal
Kim Alvefur <zash@zash.se>
parents: 9537
diff changeset
   201
	return count;
9296
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   202
end
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   203
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   204
archive_store.purge = _purge_store;
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   205
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   206
local stores = {
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   207
	keyval = keyval_store;
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   208
	archive = archive_store;
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   209
}
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   210
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   211
local driver = {};
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   212
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   213
function driver:open(store, typ) -- luacheck: ignore 212/self
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   214
	local store_mt = stores[typ or "keyval"];
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   215
	if store_mt then
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   216
		return setmetatable({ store = memory[store] }, store_mt);
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   217
	end
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   218
	return nil, "unsupported-store";
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   219
end
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   220
9613
1dfcea523200 mod_storage_memory: Support the purge driver method
Kim Alvefur <zash@zash.se>
parents: 9538
diff changeset
   221
function driver:purge(user) -- luacheck: ignore 212/self
1dfcea523200 mod_storage_memory: Support the purge driver method
Kim Alvefur <zash@zash.se>
parents: 9538
diff changeset
   222
	for _, store in pairs(memory) do
1dfcea523200 mod_storage_memory: Support the purge driver method
Kim Alvefur <zash@zash.se>
parents: 9538
diff changeset
   223
		store[user] = nil;
1dfcea523200 mod_storage_memory: Support the purge driver method
Kim Alvefur <zash@zash.se>
parents: 9538
diff changeset
   224
	end
1dfcea523200 mod_storage_memory: Support the purge driver method
Kim Alvefur <zash@zash.se>
parents: 9538
diff changeset
   225
end
1dfcea523200 mod_storage_memory: Support the purge driver method
Kim Alvefur <zash@zash.se>
parents: 9538
diff changeset
   226
9296
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   227
if auto_purge_enabled then
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   228
	module:hook("resource-unbind", function (event)
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   229
		local user_bare_jid = event.session.username.."@"..event.session.host;
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   230
		if not prosody.bare_sessions[user_bare_jid] then -- User went offline
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   231
			module:log("debug", "Clearing store for offline user %s", user_bare_jid);
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   232
			local f, s, v;
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   233
			if auto_purge_stores:empty() then
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   234
				f, s, v = pairs(memory);
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   235
			else
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   236
				f, s, v = auto_purge_stores:items();
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   237
			end
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   238
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   239
			for store_name in f, s, v do
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   240
				if memory[store_name] then
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   241
					memory[store_name][event.session.username] = nil;
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   242
				end
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   243
			end
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   244
		end
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   245
	end);
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   246
end
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   247
0a751835627d mod_storage_memory: Import from prosody-modules 4c3230c22c18
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   248
module:provides("storage", driver);