Software /
code /
prosody
Diff
core/storagemanager.lua @ 3401:2387f35db5c8
storagemanager: Initial commit.
author | Waqas Hussain <waqas20@gmail.com> |
---|---|
date | Fri, 23 Jul 2010 23:09:58 +0500 |
child | 3403:b89680015b7b |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/storagemanager.lua Fri Jul 23 23:09:58 2010 +0500 @@ -0,0 +1,68 @@ + +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 = self.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;