aboutsummaryrefslogtreecommitdiffstats
path: root/core/storagemanager.lua
diff options
context:
space:
mode:
authorKim Alvefur <zash@zash.se>2014-09-11 01:17:56 +0200
committerKim Alvefur <zash@zash.se>2014-09-11 01:17:56 +0200
commitfb0e709aa2d5fb52da6fb643a3cdfd921e8cde33 (patch)
tree147e215854eea3b4657112876b5c45863c73acc8 /core/storagemanager.lua
parenta685dfb89e5c8895a767011961d2289810b72a1e (diff)
parent15303b0d3a84572090e81dc7c737b575184135b6 (diff)
downloadprosody-fb0e709aa2d5fb52da6fb643a3cdfd921e8cde33.tar.gz
prosody-fb0e709aa2d5fb52da6fb643a3cdfd921e8cde33.zip
Merge 0.10->trunk
Diffstat (limited to 'core/storagemanager.lua')
-rw-r--r--core/storagemanager.lua33
1 files changed, 33 insertions, 0 deletions
diff --git a/core/storagemanager.lua b/core/storagemanager.lua
index 5674ff32..b2ad29d0 100644
--- a/core/storagemanager.lua
+++ b/core/storagemanager.lua
@@ -80,11 +80,44 @@ function get_driver(host, store)
return driver, driver_name;
end
+local map_shim_mt = {
+ __index = {
+ get = function(self, username, key)
+ local ret, err = self.keyval_store:get(username);
+ if ret == nil then return nil, err end
+ return ret[key];
+ end;
+ set = function(self, username, key, data)
+ local current, err = self.keyval_store:get(username);
+ if current == nil then
+ if err then
+ return nil, err;
+ else
+ current = {};
+ end
+ end
+ current[key] = data;
+ return self.keyval_store:set(username, current);
+ end;
+ };
+}
+local function create_map_shim(host, store)
+ local keyval_store, err = open(host, store, "keyval");
+ if keyval_store == nil then return nil, err end
+ return setmetatable({
+ keyval_store = keyval_store;
+ }, map_shim_mt);
+end
+
function open(host, store, typ)
local driver, driver_name = get_driver(host, store);
local ret, err = driver:open(store, typ);
if not ret then
if err == "unsupported-store" then
+ if typ == "map" then -- Use shim on top of keyval store
+ log("debug", "map storage driver unavailable, using shim on top of keyval store.");
+ return create_map_shim(host, store);
+ end
log("debug", "Storage driver %s does not support store %s (%s), falling back to null driver",
driver_name, store, typ or "<nil>");
ret = null_storage_driver;