Merge 0.10->trunk
[prosody.git] / plugins / mod_storage_sql2.lua
index 249c72a75ac2fb98e9e70728c69730c899920c3c..e5357416913f6137525780eb4fe734095ea57e7c 100644 (file)
@@ -198,7 +198,9 @@ local keyval_store = {};
 keyval_store.__index = keyval_store;
 function keyval_store:get(username)
        user,store = username,self.store;
-       return select(2, engine:transaction(keyval_store_get));
+       local ok, result = engine:transaction(keyval_store_get);
+       if not ok then return ok, result; end
+       return result;
 end
 function keyval_store:set(username, data)
        user,store = username,self.store;
@@ -214,6 +216,39 @@ 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
+                       for row in engine:select("SELECT `type`, `value` FROM `prosody` WHERE `host`=? AND `user`=? AND `store`=? AND `key`=?", host, username or "", self.store, key) do
+                               return deserialize(row[1], row[2]);
+                       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 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
+                       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)
@@ -339,6 +374,7 @@ end
 
 local stores = {
        keyval = keyval_store;
+       map = map_store;
        archive = archive_store;
 };