mod_storage_sql: Support non-string keys in map store
authorKim Alvefur <zash@zash.se>
Mon, 8 Feb 2016 19:23:12 +0000 (20:23 +0100)
committerKim Alvefur <zash@zash.se>
Mon, 8 Feb 2016 19:23:12 +0000 (20:23 +0100)
plugins/mod_storage_sql.lua

index 57d964e277b2a160411c8c5b882b5bfeb4f357dd..31d83f68d6994cd3f46b08b85691089fea9d3e04 100644 (file)
@@ -134,7 +134,10 @@ function map_store:get(username, key)
                                return deserialize(row[1], row[2]);
                        end
                else
-                       error("TODO: non-string keys");
+                       for row in engine:select("SELECT `type`, `value` FROM `prosody` WHERE `host`=? AND `user`=? AND `store`=? AND `key`=?", host, username or "", self.store, "") do
+                               local data = deserialize(row[1], row[2]);
+                               return data and data[key] or nil;
+                       end
                end
        end);
        if not ok then return nil, result; end
@@ -150,7 +153,16 @@ function map_store:set(username, key, 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");
+                       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);