Software /
code /
prosody
Comparison
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 |
comparison
equal
deleted
inserted
replaced
3400:502a634f0578 | 3401:2387f35db5c8 |
---|---|
1 | |
2 local error = error; | |
3 local setmetatable = setmetatable; | |
4 | |
5 local config = require "core.configmanager"; | |
6 local datamanager = require "util.datamanager"; | |
7 local multitable = require "util.multitable"; | |
8 local modulemanager = require "core.modulemanager"; | |
9 local hosts = hosts; | |
10 local log = require "util.logger".init("storagemanager"); | |
11 | |
12 local olddm = {}; -- maintain old datamanager, for backwards compatibility | |
13 for k,v in pairs(datamanager) do olddm[k] = v; end | |
14 | |
15 local driver_cache = multitable.new(); | |
16 local store_cache = multitable.new(); | |
17 | |
18 module("storagemanager") | |
19 | |
20 local default_driver_mt = {}; | |
21 default_driver_mt.__index = default_driver_mt; | |
22 function default_driver_mt:open(store) | |
23 return setmetatable({ host = self.host, store = self.store }, default_driver_mt); | |
24 end | |
25 function default_driver_mt:get(user) return olddm.load(user, self.host, self.store); end | |
26 function default_driver_mt:set(user, data) return olddm.store(user, self.host, self.store, data); end | |
27 | |
28 local function load_driver_for_host(host) | |
29 if driver_cache:get(host) then return driver_cache:get(host); end | |
30 | |
31 local host_session = hosts[host]; | |
32 if not host_session then error("No such host"); end | |
33 | |
34 local driver_plugin = config.get(host, "core", "datastore"); | |
35 if not driver_plugin then return setmetatable({ host = host }, default_driver_mt); end | |
36 | |
37 local provider; | |
38 local function handler(event) provider = event.item; end | |
39 host_session.events.add_handler("item-added/data-driver", handler); | |
40 local success, err = modulemanager.load(host, driver_plugin); | |
41 host_session.events.remove_handler("item-added/data-driver", handler); | |
42 if not success then error(err); end | |
43 if not provider then error("Module didn't add a provider"); end | |
44 | |
45 driver_cache:set(host, provider); | |
46 log("debug", "Data driver '%s' loaded for host '%s'", driver_plugin, host); | |
47 return provider; | |
48 end | |
49 | |
50 function open(host, store, typ) | |
51 local ret = store_cache:get(host, store); | |
52 if not ret then | |
53 local driver = load_driver_for_host(host); | |
54 ret = driver:open(store, typ); | |
55 if not ret then ret = setmetatable({ host = host, store = store }, default_driver_mt); end -- default to default driver | |
56 store_cache:set(host, store, ret); | |
57 end | |
58 return ret; | |
59 end | |
60 | |
61 function datamanager.load(username, host, datastore) | |
62 return open(host, datastore):get(username); | |
63 end | |
64 function datamanager.store(username, host, datastore, data) | |
65 return open(host, datastore):set(username, data); | |
66 end | |
67 | |
68 return _M; |