X-Git-Url: https://git.enpas.org/?a=blobdiff_plain;f=core%2Fstoragemanager.lua;h=43409960347fe2baef73023092208de416052724;hb=ea446bdb442c10610dee3e19aa343475fd603b9f;hp=a5476e0a12b5f9c25ae483e42bd15469c1c8c183;hpb=531d9932a46e20fd46a895c004bc949c6eb55185;p=prosody.git diff --git a/core/storagemanager.lua b/core/storagemanager.lua index a5476e0a..43409960 100644 --- a/core/storagemanager.lua +++ b/core/storagemanager.lua @@ -1,15 +1,17 @@ -local error = error; +local error, type = error, type; local setmetatable = setmetatable; local config = require "core.configmanager"; local datamanager = require "util.datamanager"; local modulemanager = require "core.modulemanager"; +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") @@ -24,6 +26,7 @@ function default_driver_mt:set(user, data) return olddm.store(user, self.host, s local stores_available = multitable.new(); function initialize_host(host) + local host_session = hosts[host]; host_session.events.add_handler("item-added/data-driver", function (event) local item = event.item; stores_available:set(host, item.name, item); @@ -34,18 +37,22 @@ function initialize_host(host) stores_available:set(host, item.name, nil); end); end +prosody.events.add_handler("host-activated", initialize_host, 101); local function load_driver(host, driver_name) if not driver_name then return; end local driver = stores_available:get(host, driver_name); - if not driver then - if driver_name ~= "internal" then - modulemanager.load(host, "storage_"..driver_name); - else - return setmetatable({host = host}, default_driver_mt); + 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: %s", driver_name, err); end + return stores_available:get(host, driver_name); + else + return setmetatable({host = host}, default_driver_mt); end end @@ -64,8 +71,11 @@ function open(host, store, typ) 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 default driver for %s storage on %s", store, host); + end driver_name = "internal"; - log("warn", "Falling back to default driver for %s storage on %s", store, host); driver = load_driver(host, driver_name); end end