Software / code / prosody
Comparison
core/storagemanager.lua @ 6791:e813e8cf6046
Merge 0.10->trunk
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Thu, 20 Aug 2015 13:05:22 +0200 |
| parent | 6666:42fdc8dddf04 |
| parent | 6779:6236668da30a |
| child | 6792:8b284787fe26 |
comparison
equal
deleted
inserted
replaced
| 6776:4412a2307c89 | 6791:e813e8cf6046 |
|---|---|
| 9 local hosts = hosts; | 9 local hosts = hosts; |
| 10 local log = require "util.logger".init("storagemanager"); | 10 local log = require "util.logger".init("storagemanager"); |
| 11 | 11 |
| 12 local prosody = prosody; | 12 local prosody = prosody; |
| 13 | 13 |
| 14 module("storagemanager") | 14 local _ENV = nil; |
| 15 | 15 |
| 16 local olddm = {}; -- maintain old datamanager, for backwards compatibility | 16 local olddm = {}; -- maintain old datamanager, for backwards compatibility |
| 17 for k,v in pairs(datamanager) do olddm[k] = v; end | 17 for k,v in pairs(datamanager) do olddm[k] = v; end |
| 18 _M.olddm = olddm; | |
| 19 | 18 |
| 20 local null_storage_method = function () return false, "no data storage active"; end | 19 local null_storage_method = function () return false, "no data storage active"; end |
| 21 local null_storage_driver = setmetatable( | 20 local null_storage_driver = setmetatable( |
| 22 { | 21 { |
| 23 name = "null", | 22 name = "null", |
| 29 } | 28 } |
| 30 ); | 29 ); |
| 31 | 30 |
| 32 local stores_available = multitable.new(); | 31 local stores_available = multitable.new(); |
| 33 | 32 |
| 34 function initialize_host(host) | 33 local function initialize_host(host) |
| 35 local host_session = hosts[host]; | 34 local host_session = hosts[host]; |
| 36 host_session.events.add_handler("item-added/storage-provider", function (event) | 35 host_session.events.add_handler("item-added/storage-provider", function (event) |
| 37 local item = event.item; | 36 local item = event.item; |
| 38 stores_available:set(host, item.name, item); | 37 stores_available:set(host, item.name, item); |
| 39 end); | 38 end); |
| 43 stores_available:set(host, item.name, nil); | 42 stores_available:set(host, item.name, nil); |
| 44 end); | 43 end); |
| 45 end | 44 end |
| 46 prosody.events.add_handler("host-activated", initialize_host, 101); | 45 prosody.events.add_handler("host-activated", initialize_host, 101); |
| 47 | 46 |
| 48 function load_driver(host, driver_name) | 47 local function load_driver(host, driver_name) |
| 49 if driver_name == "null" then | 48 if driver_name == "null" then |
| 50 return null_storage_driver; | 49 return null_storage_driver; |
| 51 end | 50 end |
| 52 local driver = stores_available:get(host, driver_name); | 51 local driver = stores_available:get(host, driver_name); |
| 53 if driver then return driver; end | 52 if driver then return driver; end |
| 56 log("error", "Failed to load storage driver plugin %s on %s: %s", driver_name, host, err); | 55 log("error", "Failed to load storage driver plugin %s on %s: %s", driver_name, host, err); |
| 57 end | 56 end |
| 58 return stores_available:get(host, driver_name); | 57 return stores_available:get(host, driver_name); |
| 59 end | 58 end |
| 60 | 59 |
| 61 function get_driver(host, store) | 60 local function get_driver(host, store) |
| 62 local storage = config.get(host, "storage"); | 61 local storage = config.get(host, "storage"); |
| 63 local driver_name; | 62 local driver_name; |
| 64 local option_type = type(storage); | 63 local option_type = type(storage); |
| 65 if option_type == "string" then | 64 if option_type == "string" then |
| 66 driver_name = storage; | 65 driver_name = storage; |
| 107 return setmetatable({ | 106 return setmetatable({ |
| 108 keyval_store = keyval_store; | 107 keyval_store = keyval_store; |
| 109 }, map_shim_mt); | 108 }, map_shim_mt); |
| 110 end | 109 end |
| 111 | 110 |
| 112 function open(host, store, typ) | 111 local function open(host, store, typ) |
| 113 local driver, driver_name = get_driver(host, store); | 112 local driver, driver_name = get_driver(host, store); |
| 114 local ret, err = driver:open(store, typ); | 113 local ret, err = driver:open(store, typ); |
| 115 if not ret then | 114 if not ret then |
| 116 if err == "unsupported-store" then | 115 if err == "unsupported-store" then |
| 117 if typ == "map" then -- Use shim on top of keyval store | 116 if typ == "map" then -- Use shim on top of keyval store |
| 125 end | 124 end |
| 126 end | 125 end |
| 127 return ret, err; | 126 return ret, err; |
| 128 end | 127 end |
| 129 | 128 |
| 130 function purge(user, host) | 129 local function purge(user, host) |
| 131 local storage = config.get(host, "storage"); | 130 local storage = config.get(host, "storage"); |
| 132 if type(storage) == "table" then | 131 if type(storage) == "table" then |
| 133 -- multiple storage backends in use that we need to purge | 132 -- multiple storage backends in use that we need to purge |
| 134 local purged = {}; | 133 local purged = {}; |
| 135 for store, driver in pairs(storage) do | 134 for store, driver in pairs(storage) do |
| 163 end | 162 end |
| 164 function datamanager.purge(username, host) | 163 function datamanager.purge(username, host) |
| 165 return purge(username, host); | 164 return purge(username, host); |
| 166 end | 165 end |
| 167 | 166 |
| 168 return _M; | 167 return { |
| 168 initialize_host = initialize_host; | |
| 169 load_driver = load_driver; | |
| 170 get_driver = get_driver; | |
| 171 open = open; | |
| 172 | |
| 173 olddm = olddm; | |
| 174 }; |