core/storagemanager: When map store isn't available, fallback to keyval store
authordaurnimator <quae@daurnimator.com>
Thu, 07 Aug 2014 12:15:15 -0400
changeset 6330 a678d15e590e
parent 6329 6b3eb1611587
child 6331 fc5113a4540e
core/storagemanager: When map store isn't available, fallback to keyval store
core/storagemanager.lua
--- a/core/storagemanager.lua	Tue Aug 05 09:55:08 2014 +0100
+++ b/core/storagemanager.lua	Thu Aug 07 12:15:15 2014 -0400
@@ -80,11 +80,44 @@
 	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 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 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;