Software /
code /
prosody-modules
Changeset
6098:ad3c709a1b16
mod_storage_memory: Cleanup old community version and add note to Readme for prosody integration.
author | Menel <menel@snikket.de> |
---|---|
date | Fri, 20 Dec 2024 12:50:14 +0100 |
parents | 6097:ecb677f89d7e |
children | 6099:3a023f1d6c08 |
files | mod_storage_memory/README.md mod_storage_memory/mod_storage_memory.lua |
diffstat | 2 files changed, 7 insertions(+), 178 deletions(-) [+] |
line wrap: on
line diff
--- a/mod_storage_memory/README.md Fri Dec 20 12:38:04 2024 +0100 +++ b/mod_storage_memory/README.md Fri Dec 20 12:50:14 2024 +0100 @@ -6,6 +6,13 @@ summary: 'Simple memory-only storage module' ... + +::: {.alert .alert-warning} +This module has been merged into +[prosodys storage backend as "memory"][doc:storage] and is therefore obsolete. +You will be redirected shortly. +::: + Introduction ============
--- a/mod_storage_memory/mod_storage_memory.lua Fri Dec 20 12:38:04 2024 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,178 +0,0 @@ -local serialize = require "util.serialization".serialize; -local envload = require "util.envload".envload; -local st = require "util.stanza"; -local is_stanza = st.is_stanza or function (s) return getmetatable(s) == st.stanza_mt end - -local auto_purge_enabled = module:get_option_boolean("storage_memory_temporary", false); -local auto_purge_stores = module:get_option_set("storage_memory_temporary_stores", {}); - -local memory = setmetatable({}, { - __index = function(t, k) - local store = module:shared(k) - t[k] = store; - return store; - end -}); - -local function NULL() return nil end - -local function _purge_store(self, username) - self.store[username or NULL] = nil; - return true; -end - -local keyval_store = {}; -keyval_store.__index = keyval_store; - -function keyval_store:get(username) - return (self.store[username or NULL] or NULL)(); -end - -function keyval_store:set(username, data) - if data ~= nil then - data = envload("return "..serialize(data), "@data", {}); - end - self.store[username or NULL] = data; - return true; -end - -keyval_store.purge = _purge_store; - -local archive_store = {}; -archive_store.__index = archive_store; - -function archive_store:append(username, key, value, when, with) - if type(when) ~= "number" then - when, with, value = value, when, with; - end - if is_stanza(value) then - value = st.preserialize(value); - value = envload("return xml"..serialize(value), "@stanza", { xml = st.deserialize }) - else - value = envload("return "..serialize(value), "@data", {}); - end - local a = self.store[username or NULL]; - if not a then - a = {}; - self.store[username or NULL] = a; - end - local i = #a+1; - local v = { key = key, when = when, with = with, value = value }; - if not key then - key = tostring(a):match"%x+$"..tostring(v):match"%x+$"; - v.key = key; - end - if a[key] then - table.remove(a, a[key]); - end - a[i] = v; - a[key] = i; - return key; -end - -local function archive_iter (a, start, stop, step, limit, when_start, when_end, match_with) - local item, when, with; - local count = 0; - coroutine.yield(true); -- Ready - for i = start, stop, step do - item = a[i]; - when, with = item.when, item.with; - if when >= when_start and when_end >= when and (not match_with or match_with == with) then - coroutine.yield(item.key, item.value(), when, with); - count = count + 1; - if limit and count >= limit then return end - end - end -end - -function archive_store:find(username, query) - local a = self.store[username or NULL] or {}; - local start, stop, step = 1, #a, 1; - local qstart, qend, qwith = -math.huge, math.huge; - local limit; - if query then - module:log("debug", "query included") - if query.reverse then - start, stop, step = stop, start, -1; - if query.before then - start = a[query.before]; - end - elseif query.after then - start = a[query.after]; - end - limit = query.limit; - qstart = query.start or qstart; - qend = query["end"] or qend; - qwith = query.with; - end - if not start then return nil, "invalid-key"; end - local iter = coroutine.wrap(archive_iter); - iter(a, start, stop, step, limit, qstart, qend, qwith); - return iter; -end - -function archive_store:delete(username, query) - if not query or next(query) == nil then - self.store[username or NULL] = nil; - return true; - end - local old = self.store[username or NULL]; - if not old then return true; end - local qstart = query.start or -math.huge; - local qend = query["end"] or math.huge; - local qwith = query.with; - local new = {}; - self.store[username or NULL] = new; - local t; - for i = 1, #old do - i = old[i]; - t = i.when; - if not(qstart >= t and qend <= t and (not qwith or i.with == qwith)) then - self:append(username, i.key, i.value(), t, i.with); - end - end - if #new == 0 then - self.store[username or NULL] = nil; - end - return true; -end - -archive_store.purge = _purge_store; - -local stores = { - keyval = keyval_store; - archive = archive_store; -} - -local driver = {}; - -function driver:open(store, typ) -- luacheck: ignore 212/self - local store_mt = stores[typ or "keyval"]; - if store_mt then - return setmetatable({ store = memory[store] }, store_mt); - end - return nil, "unsupported-store"; -end - -if auto_purge_enabled then - module:hook("resource-unbind", function (event) - local user_bare_jid = event.session.username.."@"..event.session.host; - if not prosody.bare_sessions[user_bare_jid] then -- User went offline - module:log("debug", "Clearing store for offline user %s", user_bare_jid); - local f, s, v; - if auto_purge_stores:empty() then - f, s, v = pairs(memory); - else - f, s, v = auto_purge_stores:items(); - end - - for store_name in f, s, v do - if memory[store_name] then - memory[store_name][event.session.username] = nil; - end - end - end - end); -end - -module:provides("storage", driver);