storagemanager: When map store isn't available, fallback to keyval store [backported from trunk]

vault/0.11
daurnimator 12 years ago
parent e5031598f6
commit a6da25a2a1
  1. 38
      core/storagemanager.lua

@ -99,11 +99,47 @@ local function get_driver(host, store)
return driver, driver_name;
end
local function open(host, store, typ)
local map_shim_mt = {
__index = {
get = function(self, username, key)
local ret, err = self.keyval_store:get(username);
if ret == nil and err 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 open;
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;

Loading…
Cancel
Save