aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/mod_storage_sql2.lua
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/mod_storage_sql2.lua')
-rw-r--r--plugins/mod_storage_sql2.lua39
1 files changed, 39 insertions, 0 deletions
diff --git a/plugins/mod_storage_sql2.lua b/plugins/mod_storage_sql2.lua
index 0531c905..c0e2e6cd 100644
--- a/plugins/mod_storage_sql2.lua
+++ b/plugins/mod_storage_sql2.lua
@@ -216,6 +216,44 @@ function keyval_store:users()
return iterator(result);
end
+local map_store = {};
+map_store.__index = map_store;
+function map_store:get(username, key)
+ local ok, result = engine:transaction(function()
+ if type(key) == "string" and key ~= "" then
+ local iter, state, first = engine:select("SELECT * FROM `prosody` WHERE `host`=? AND `user`=? AND `store`=? AND `key`=?",
+ host, username, self.store, key or "");
+ local row = iter(state, first);
+ if row then
+ return deserialize(row.type, row.value);
+ else
+ return nil;
+ end
+ else
+ error("TODO: non-string keys");
+ end
+ end);
+ if not ok then return nil, result; end
+ return result;
+end
+function map_store:set(username, key, data)
+ local ok, result = engine:transaction(function()
+ if data == nil then
+ engine:delete("DELETE FROM `prosody` WHERE `host`=? AND `user`=? AND `store`=? AND `key`=?",
+ host, username, self.store, key or "");
+ elseif type(key) == "string" and key ~= "" then
+ local t, value = assert(serialize(data));
+ engine:update("UPDATE `prosody` SET `type`=?, `value`=? WHERE `host`=? AND `user`=? AND `store`=? AND `key`=?",
+ t, value, host, username, self.store, key);
+ else
+ error("TODO: non-string keys");
+ end
+ return true;
+ end);
+ if not ok then return nil, result; end
+ return result;
+end
+
local archive_store = {}
archive_store.__index = archive_store
function archive_store:append(username, key, when, with, value)
@@ -341,6 +379,7 @@ end
local stores = {
keyval = keyval_store;
+ map = map_store;
archive = archive_store;
};