core/storagemanager.lua
changeset 6330 a678d15e590e
parent 5776 bd0ff8ae98a8
child 6336 11510d4d3b57
equal deleted inserted replaced
6329:6b3eb1611587 6330:a678d15e590e
    78 		driver = null_storage_driver;
    78 		driver = null_storage_driver;
    79 	end
    79 	end
    80 	return driver, driver_name;
    80 	return driver, driver_name;
    81 end
    81 end
    82 
    82 
       
    83 local map_shim_mt = {
       
    84 	__index = {
       
    85 		get = function(self, username, key)
       
    86 			local ret, err = self.keyval_store:get(username);
       
    87 			if ret == nil and err then return nil, err end
       
    88 			return ret[key];
       
    89 		end;
       
    90 		set = function(self, username, key, data)
       
    91 			local current, err = self.keyval_store:get(username);
       
    92 			if current == nil then
       
    93 				if err then
       
    94 					return nil, err;
       
    95 				else
       
    96 					current = {};
       
    97 				end
       
    98 			end
       
    99 			current[key] = data;
       
   100 			return self.keyval_store:set(username, current);
       
   101 		end;
       
   102 	};
       
   103 }
       
   104 local function create_map_shim(host, store)
       
   105 	local keyval_store, err = open(host, store, "keyval");
       
   106 	if keyval_store == nil then return nil, err end
       
   107 	return setmetatable({
       
   108 		keyval_store = keyval_store;
       
   109 	}, map_shim_mt);
       
   110 end
       
   111 
    83 function open(host, store, typ)
   112 function open(host, store, typ)
    84 	local driver, driver_name = get_driver(host, store);
   113 	local driver, driver_name = get_driver(host, store);
    85 	local ret, err = driver:open(store, typ);
   114 	local ret, err = driver:open(store, typ);
    86 	if not ret then
   115 	if not ret then
    87 		if err == "unsupported-store" then
   116 		if err == "unsupported-store" then
       
   117 			if typ == "map" then -- Use shim on top of keyval store
       
   118 				log("debug", "map storage driver unavailable, using shim on top of keyval store.");
       
   119 				return create_map_shim(host, store);
       
   120 			end
    88 			log("debug", "Storage driver %s does not support store %s (%s), falling back to null driver",
   121 			log("debug", "Storage driver %s does not support store %s (%s), falling back to null driver",
    89 				driver_name, store, typ or "<nil>");
   122 				driver_name, store, typ or "<nil>");
    90 			ret = null_storage_driver;
   123 			ret = null_storage_driver;
    91 			err = nil;
   124 			err = nil;
    92 		end
   125 		end