mod_storage_sql: Implement map:set_keys, allowing multiple keys to be set in the same transaction

This commit is contained in:
Kim Alvefur 2016-02-09 16:56:27 +01:00
parent 38cee98c50
commit 315a1fc1ca

View file

@ -127,6 +127,7 @@ end
local map_store = {};
map_store.__index = map_store;
map_store.remove = {};
function map_store:get(username, key)
local ok, result = engine:transaction(function()
if type(key) == "string" and key ~= "" then
@ -144,25 +145,30 @@ function map_store:get(username, key)
return result;
end
function map_store:set(username, key, data)
return self:set_keys(username, { [key] = data or self.remove });
end
function map_store:set_keys(username, keydatas)
local ok, result = engine:transaction(function()
if type(key) == "string" and key ~= "" then
engine:delete("DELETE FROM `prosody` WHERE `host`=? AND `user`=? AND `store`=? AND `key`=?",
host, username or "", self.store, key);
if data ~= nil then
local t, value = assert(serialize(data));
engine:insert("INSERT INTO `prosody` (`host`,`user`,`store`,`key`,`type`,`value`) VALUES (?,?,?,?,?,?)", host, username or "", self.store, key, t, value);
for key, data in pairs(keydatas) do
if type(key) == "string" and key ~= "" then
engine:delete("DELETE FROM `prosody` WHERE `host`=? AND `user`=? AND `store`=? AND `key`=?",
host, username or "", self.store, key);
if data ~= self.remove then
local t, value = assert(serialize(data));
engine:insert("INSERT INTO `prosody` (`host`,`user`,`store`,`key`,`type`,`value`) VALUES (?,?,?,?,?,?)", host, username or "", self.store, key, t, value);
end
else
local extradata = {};
for row in engine:select("SELECT `type`, `value` FROM `prosody` WHERE `host`=? AND `user`=? AND `store`=? AND `key`=?", host, username or "", self.store, "") do
extradata = deserialize(row[1], row[2]);
break;
end
engine:delete("DELETE FROM `prosody` WHERE `host`=? AND `user`=? AND `store`=? AND `key`=?",
host, username or "", self.store, "");
extradata[key] = data;
local t, value = assert(serialize(extradata));
engine:insert("INSERT INTO `prosody` (`host`,`user`,`store`,`key`,`type`,`value`) VALUES (?,?,?,?,?,?)", host, username or "", self.store, "", t, value);
end
else
local extradata = {};
for row in engine:select("SELECT `type`, `value` FROM `prosody` WHERE `host`=? AND `user`=? AND `store`=? AND `key`=?", host, username or "", self.store, "") do
extradata = deserialize(row[1], row[2]);
break;
end
engine:delete("DELETE FROM `prosody` WHERE `host`=? AND `user`=? AND `store`=? AND `key`=?",
host, username or "", self.store, "");
extradata[key] = data;
local t, value = assert(serialize(extradata));
engine:insert("INSERT INTO `prosody` (`host`,`user`,`store`,`key`,`type`,`value`) VALUES (?,?,?,?,?,?)", host, username or "", self.store, "", t, value);
end
return true;
end);