diff options
author | Waqas Hussain <waqas20@gmail.com> | 2009-01-13 22:37:07 +0500 |
---|---|---|
committer | Waqas Hussain <waqas20@gmail.com> | 2009-01-13 22:37:07 +0500 |
commit | a138bcd591d3fa2240b41720b426743a6c05ac9d (patch) | |
tree | a6265c22cf51b2f53367fb8d6c8df4d2f07104b0 | |
parent | 4dc4d175d135e293f48ed6a15f61b19c4dafe8d7 (diff) | |
download | prosody-a138bcd591d3fa2240b41720b426743a6c05ac9d.tar.gz prosody-a138bcd591d3fa2240b41720b426743a6c05ac9d.zip |
modulemanager: Added reload support, with callbacks for saving and restoring state
-rw-r--r-- | core/modulemanager.lua | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/core/modulemanager.lua b/core/modulemanager.lua index 52fbc65d..c1caaacc 100644 --- a/core/modulemanager.lua +++ b/core/modulemanager.lua @@ -140,8 +140,8 @@ function unload(host, name, ...) local mod = modulemap[host] and modulemap[host][name]; if not mod then return nil, "module-not-loaded"; end - if type(rawget(mod, "unload")) == "function" then - local ok, err = pcall(rawget(mod, "unload"), ...) + if type(mod.module.unload) == "function" then + local ok, err = pcall(mod.module.unload, ...) if (not ok) and err then log("warn", "Non-fatal error unloading module '%s' from '%s': %s", name, host, err); end @@ -160,6 +160,33 @@ function unload(host, name, ...) return true; end +function reload(host, name, ...) + local mod = modulemap[host] and modulemap[host][name]; + if not mod then return nil, "module-not-loaded"; end + + local saved; + if type(mod.module.save) == "function" then + local ok, err = pcall(mod.module.save) + if (not ok) and err then + log("warn", "Non-fatal error unloading module '%s' from '%s': %s", name, host, err); + else + saved = err; + end + end + + unload(host, name, ...); + if load(host, name, ...) then + mod = modulemap[host] and modulemap[host][name]; + if type(mod.module.restore) == "function" then + local ok, err = pcall(mod.module.restore, saved or {}) + if (not ok) and err then + log("warn", "Non-fatal error unloading module '%s' from '%s': %s", name, host, err); + end + end + return true; + end +end + function handle_stanza(host, origin, stanza) local name, xmlns, origin_type = stanza.name, stanza.attr.xmlns, origin.type; if name == "iq" and xmlns == "jabber:client" then |