mirror of
https://github.com/bjc/prosody.git
synced 2025-04-06 06:37:37 +03:00
mod_storage_sql: Implement map:set_keys, allowing multiple keys to be set in the same transaction
This commit is contained in:
parent
38cee98c50
commit
315a1fc1ca
1 changed files with 23 additions and 17 deletions
|
@ -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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue