aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/mod_storage_sql.lua
diff options
context:
space:
mode:
authorKim Alvefur <zash@zash.se>2021-02-01 12:47:05 +0100
committerKim Alvefur <zash@zash.se>2021-02-01 12:47:05 +0100
commit0f0d32d335c2fb6bba59e5a6043412ad6d61e74a (patch)
tree87a6b088d2438f845493c1a33828eef5cd36b410 /plugins/mod_storage_sql.lua
parentf307825a01fe5911ec373445c7b4f64e64da0785 (diff)
downloadprosody-0f0d32d335c2fb6bba59e5a6043412ad6d61e74a.tar.gz
prosody-0f0d32d335c2fb6bba59e5a6043412ad6d61e74a.zip
mod_storage_sql: Implement map-like API for archives
Used by mod_http_file_share, muc moderation, etc. Tests tweaked because they failed on stanza internals that happen becasue of re-serialization. Namespaces differ since inheritance is implicit when building but explicit after parsing.
Diffstat (limited to 'plugins/mod_storage_sql.lua')
-rw-r--r--plugins/mod_storage_sql.lua47
1 files changed, 47 insertions, 0 deletions
diff --git a/plugins/mod_storage_sql.lua b/plugins/mod_storage_sql.lua
index 91b73eb4..6bd094e5 100644
--- a/plugins/mod_storage_sql.lua
+++ b/plugins/mod_storage_sql.lua
@@ -482,6 +482,53 @@ function archive_store:find(username, query)
end, total;
end
+function archive_store:get(username, key)
+ local iter, err = self:find(username, { key = key })
+ if not iter then return iter, err; end
+ for _, stanza, when, with in iter do
+ return stanza, when, with;
+ end
+ return nil, "item-not-found";
+end
+
+function archive_store:set(username, key, new_value, new_when, new_with)
+ local user,store = username,self.store;
+ local ok, result = engine:transaction(function ()
+
+ local update_query = [[
+ UPDATE "prosodyarchive"
+ SET %s
+ WHERE %s
+ ]];
+ local args = { host, user or "", store, key };
+ local setf = {};
+ local where = { "\"host\" = ?", "\"user\" = ?", "\"store\" = ?", "\"key\" = ?"};
+
+ if new_value then
+ table.insert(setf, '"type" = ?')
+ table.insert(setf, '"value" = ?')
+ local t, value = serialize(new_value);
+ table.insert(args, 1, t);
+ table.insert(args, 2, value);
+ end
+
+ if new_when then
+ table.insert(setf, 1, '"when" = ?')
+ table.insert(args, 1, new_when);
+ end
+
+ if new_with then
+ table.insert(setf, 1, '"with" = ?')
+ table.insert(args, 1, new_with);
+ end
+
+ update_query = update_query:format(t_concat(setf, ", "), t_concat(where, " AND "));
+ return engine:update(update_query, unpack(args));
+ end);
+ if not ok then return ok, result; end
+ return result:affected() == 1;
+end
+
function archive_store:summary(username, query)
query = query or {};
local user,store = username,self.store;