Mercurial > prosody-modules
comparison mod_storage_memory/mod_storage_memory.lua @ 2656:83fb61fa476e
mod_storage_memory: Serialize data functions that return the data (prevents mutation of stored data)
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Thu, 30 Mar 2017 23:40:29 +0200 |
| parents | f4353f959460 |
| children | 6c22cb7b0e66 |
comparison
equal
deleted
inserted
replaced
| 2655:f4353f959460 | 2656:83fb61fa476e |
|---|---|
| 1 local serialize = require "util.serialization".serialize; | |
| 2 local envload = require "util.envload".envload; | |
| 3 local st = require "util.stanza"; | |
| 4 local is_stanza = st.is_stanza or function (s) return getmetatable(s) == st.stanza_mt end | |
| 5 | |
| 1 local auto_purge_enabled = module:get_option_boolean("storage_memory_temporary", false); | 6 local auto_purge_enabled = module:get_option_boolean("storage_memory_temporary", false); |
| 2 local auto_purge_stores = module:get_option_set("storage_memory_temporary_stores", {}); | 7 local auto_purge_stores = module:get_option_set("storage_memory_temporary_stores", {}); |
| 3 | 8 |
| 4 local memory = setmetatable({}, { | 9 local memory = setmetatable({}, { |
| 5 __index = function(t, k) | 10 __index = function(t, k) |
| 7 t[k] = store; | 12 t[k] = store; |
| 8 return store; | 13 return store; |
| 9 end | 14 end |
| 10 }); | 15 }); |
| 11 | 16 |
| 12 local NULL = {}; | 17 local function NULL() return nil end |
| 13 | 18 |
| 14 local function _purge_store(self, username) | 19 local function _purge_store(self, username) |
| 15 self.store[username or NULL] = nil; | 20 self.store[username or NULL] = nil; |
| 16 return true; | 21 return true; |
| 17 end | 22 end |
| 18 | 23 |
| 19 local keyval_store = {}; | 24 local keyval_store = {}; |
| 20 keyval_store.__index = keyval_store; | 25 keyval_store.__index = keyval_store; |
| 21 | 26 |
| 22 function keyval_store:get(username) | 27 function keyval_store:get(username) |
| 23 return self.store[username or NULL]; | 28 return (self.store[username or NULL] or NULL)(); |
| 24 end | 29 end |
| 25 | 30 |
| 26 function keyval_store:set(username, data) | 31 function keyval_store:set(username, data) |
| 27 self.store[username or NULL] = data; | 32 self.store[username or NULL] = envload(serialize(data), "@data", {}); |
| 28 return true; | 33 return true; |
| 29 end | 34 end |
| 30 | 35 |
| 31 keyval_store.purge = _purge_store; | 36 keyval_store.purge = _purge_store; |
| 32 | 37 |
| 34 archive_store.__index = archive_store; | 39 archive_store.__index = archive_store; |
| 35 | 40 |
| 36 function archive_store:append(username, key, value, when, with) | 41 function archive_store:append(username, key, value, when, with) |
| 37 if type(when) ~= "number" then | 42 if type(when) ~= "number" then |
| 38 when, with, value = value, when, with; | 43 when, with, value = value, when, with; |
| 44 end | |
| 45 if is_stanza(value) then | |
| 46 value = st.preserialize(value); | |
| 47 value = function () | |
| 48 return st.deserialize(envload(serialize(data), "@stanza", {})); | |
| 49 end | |
| 50 else | |
| 51 value = envload(serialize(data), "@data", {}); | |
| 39 end | 52 end |
| 40 local a = self.store[username or NULL]; | 53 local a = self.store[username or NULL]; |
| 41 if not a then | 54 if not a then |
| 42 a = {}; | 55 a = {}; |
| 43 self.store[username or NULL] = a; | 56 self.store[username or NULL] = a; |
| 59 coroutine.yield(true); -- Ready | 72 coroutine.yield(true); -- Ready |
| 60 for i = start, stop, step do | 73 for i = start, stop, step do |
| 61 item = a[i]; | 74 item = a[i]; |
| 62 when, with = item.when, item.with; | 75 when, with = item.when, item.with; |
| 63 if when >= when_start and when_end >= when and (not match_with or match_with == with) then | 76 if when >= when_start and when_end >= when and (not match_with or match_with == with) then |
| 64 coroutine.yield(item.key, item.value, when, with); | 77 coroutine.yield(item.key, item.value(), when, with); |
| 65 count = count + 1; | 78 count = count + 1; |
| 66 if limit and count >= limit then return end | 79 if limit and count >= limit then return end |
| 67 end | 80 end |
| 68 end | 81 end |
| 69 end | 82 end |
