From 909cdebf943ad24ce00d5d50e630994ba08a47ec Mon Sep 17 00:00:00 2001 From: Matthew Wild Date: Fri, 7 Jan 2011 04:22:28 +0000 Subject: storagemanager, mod_storage_internal: Split out default driver to mod_storage_internal, and greatly simplify storagemanager's error handling and fallback code --- core/storagemanager.lua | 52 ++++++++++++++++--------------------------------- 1 file changed, 17 insertions(+), 35 deletions(-) (limited to 'core/storagemanager.lua') diff --git a/core/storagemanager.lua b/core/storagemanager.lua index 35fef503..e44f3e2c 100644 --- a/core/storagemanager.lua +++ b/core/storagemanager.lua @@ -1,5 +1,5 @@ -local error, type = error, type; +local error, type, pairs = error, type, pairs; local setmetatable = setmetatable; local config = require "core.configmanager"; @@ -9,12 +9,14 @@ local multitable = require "util.multitable"; local hosts = hosts; local log = require "util.logger".init("storagemanager"); -local olddm = {}; -- maintain old datamanager, for backwards compatibility -for k,v in pairs(datamanager) do olddm[k] = v; end local prosody = prosody; module("storagemanager") +local olddm = {}; -- maintain old datamanager, for backwards compatibility +for k,v in pairs(datamanager) do olddm[k] = v; end +_M.olddm = olddm; + local null_storage_method = function () return false, "no data storage active"; end local null_storage_driver = setmetatable( { @@ -27,15 +29,6 @@ local null_storage_driver = setmetatable( } ); ---TODO: Move default driver to mod_auth_internal -local default_driver_mt = { name = "internal" }; -default_driver_mt.__index = default_driver_mt; -function default_driver_mt:open(store) - return setmetatable({ host = self.host, store = store }, default_driver_mt); -end -function default_driver_mt:get(user) return olddm.load(user, self.host, self.store); end -function default_driver_mt:set(user, data) return olddm.store(user, self.host, self.store, data); end - local stores_available = multitable.new(); function initialize_host(host) @@ -53,20 +46,16 @@ end prosody.events.add_handler("host-activated", initialize_host, 101); local function load_driver(host, driver_name) - if not driver_name then - return; + if driver_name == "null" then + return null_storage_provider; end local driver = stores_available:get(host, driver_name); if driver then return driver; end - if driver_name ~= "internal" then - local ok, err = modulemanager.load(host, "storage_"..driver_name); - if not ok then - log("error", "Failed to load storage driver plugin %s on %s: %s", driver_name, host, err); - end - return stores_available:get(host, driver_name); - else - return setmetatable({host = host}, default_driver_mt); + local ok, err = modulemanager.load(host, "storage_"..driver_name); + if not ok then + log("error", "Failed to load storage driver plugin %s on %s: %s", driver_name, host, err); end + return stores_available:get(host, driver_name); end function open(host, store, typ) @@ -78,22 +67,15 @@ function open(host, store, typ) elseif option_type == "table" then driver_name = storage[store]; end + if not driver_name then + driver_name = config.get(host, "core", "default_storage") or "internal"; + end local driver = load_driver(host, driver_name); if not driver then - driver_name = config.get(host, "core", "default_storage"); - driver = load_driver(host, driver_name); - if not driver then - if driver_name or (type(storage) == "string" - or type(storage) == "table" and storage[store]) then - log("warn", "Falling back to null driver for %s storage on %s", store, host); - driver_name = "null"; - driver = null_storage_driver; - else - driver_name = "internal"; - driver = load_driver(host, driver_name); - end - end + log("warn", "Falling back to null driver for %s storage on %s", store, host); + driver_name = "null"; + driver = null_storage_driver; end local ret, err = driver:open(store, typ); -- cgit v1.2.3