mod_storage_sql: Implement map:set_keys, allowing multiple keys to be set in the...
authorKim Alvefur <zash@zash.se>
Tue, 9 Feb 2016 15:56:27 +0000 (16:56 +0100)
committerKim Alvefur <zash@zash.se>
Tue, 9 Feb 2016 15:56:27 +0000 (16:56 +0100)
plugins/mod_storage_sql.lua

index 31d83f68d6994cd3f46b08b85691089fea9d3e04..5f25c5631c1213b92177e341c4c944c616c574fb 100644 (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);
-                       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;
+               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
-                       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);