mirror of https://github.com/bjc/prosody
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
68 lines
2.3 KiB
68 lines
2.3 KiB
|
|
local error = error;
|
|
local setmetatable = setmetatable;
|
|
|
|
local config = require "core.configmanager";
|
|
local datamanager = require "util.datamanager";
|
|
local multitable = require "util.multitable";
|
|
local modulemanager = require "core.modulemanager";
|
|
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 driver_cache = multitable.new();
|
|
local store_cache = multitable.new();
|
|
|
|
module("storagemanager")
|
|
|
|
local default_driver_mt = {};
|
|
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 function load_driver_for_host(host)
|
|
if driver_cache:get(host) then return driver_cache:get(host); end
|
|
|
|
local host_session = hosts[host];
|
|
if not host_session then error("No such host"); end
|
|
|
|
local driver_plugin = config.get(host, "core", "datastore");
|
|
if not driver_plugin then return setmetatable({ host = host }, default_driver_mt); end
|
|
|
|
local provider;
|
|
local function handler(event) provider = event.item; end
|
|
host_session.events.add_handler("item-added/data-driver", handler);
|
|
local success, err = modulemanager.load(host, driver_plugin);
|
|
host_session.events.remove_handler("item-added/data-driver", handler);
|
|
if not success then error(err); end
|
|
if not provider then error("Module didn't add a provider"); end
|
|
|
|
driver_cache:set(host, provider);
|
|
log("debug", "Data driver '%s' loaded for host '%s'", driver_plugin, host);
|
|
return provider;
|
|
end
|
|
|
|
function open(host, store, typ)
|
|
local ret = store_cache:get(host, store);
|
|
if not ret then
|
|
local driver = load_driver_for_host(host);
|
|
ret = driver:open(store, typ);
|
|
if not ret then ret = setmetatable({ host = host, store = store }, default_driver_mt); end -- default to default driver
|
|
store_cache:set(host, store, ret);
|
|
end
|
|
return ret;
|
|
end
|
|
|
|
function datamanager.load(username, host, datastore)
|
|
return open(host, datastore):get(username);
|
|
end
|
|
function datamanager.store(username, host, datastore, data)
|
|
return open(host, datastore):set(username, data);
|
|
end
|
|
|
|
return _M;
|
|
|