diff options
author | Mickaël Rémond <mickael.remond@process-one.net> | 2006-05-01 09:55:03 +0000 |
---|---|---|
committer | Mickaël Rémond <mickael.remond@process-one.net> | 2006-05-01 09:55:03 +0000 |
commit | c57ca8a483e1fa4df37856ce3ac41dbe1b63fc76 (patch) | |
tree | ff1c4ae107e124a92c1562b331cddca72050aea6 /src | |
parent | * doc/release_note_1.1.1.txt: Fixed typo. (diff) |
* src/ejabberd_ctl.erl: Unknown tables or tables from now unused
modules are ignored during restore. The restore can now be performed in
such case.
SVN Revision: 561
Diffstat (limited to 'src')
-rw-r--r-- | src/ejabberd_ctl.erl | 40 |
1 files changed, 38 insertions, 2 deletions
diff --git a/src/ejabberd_ctl.erl b/src/ejabberd_ctl.erl index d8905c2e7..e1bafa2c0 100644 --- a/src/ejabberd_ctl.erl +++ b/src/ejabberd_ctl.erl @@ -18,6 +18,7 @@ unregister_commands/4]). -include("ejabberd_ctl.hrl"). +-include("ejabberd.hrl"). start() -> case init:get_plain_arguments() of @@ -122,13 +123,17 @@ process(["load", Path]) -> end; process(["restore", Path]) -> - case mnesia:restore(Path, [{default_op, keep_tables}]) of + case mnesia:restore(Path, [{keep_tables,keep_tables()}, + {default_op, skip_tables}]) of {atomic, _} -> ?STATUS_SUCCESS; {error, Reason} -> io:format("Can't restore backup from ~p at node ~p: ~p~n", [filename:absname(Path), node(), Reason]), - ?STATUS_ERROR + ?STATUS_ERROR; + {aborted,{no_exists,Table}} -> + io:format("Can't restore backup from ~p at node ~p: Table ~p does not exist.~n", + [filename:absname(Path), node(), Table]) end; process(["install-fallback", Path]) -> @@ -324,3 +329,34 @@ dump_tab(F, T) -> lists:foreach( fun(Term) -> io:format(F,"~p.~n", [setelement(1, Term, T)]) end, All). +%% This function return a list of tables that should be kept from a previous +%% version backup. +%% Obsolete tables or tables created by module who are no longer used are not +%% restored and are ignored. +keep_tables() -> + lists:flatten([acl, passwd, config, local_config, disco_publish, + keep_modules_tables()]). + +%% Return the list of modules tables in use, according to the list of actually +%% loaded modules +keep_modules_tables() -> + lists:map(fun(Module) -> + module_tables(Module) + end, + gen_mod:loaded_modules(?MYNAME)). + +%% TODO: This mapping should probably be moved to a callback function in each +%% module. +%% Mapping between modules and their tables +module_tables(mod_announce) -> [motd, motd_users]; +module_tables(mod_irc) -> [irc_custom]; +module_tables(mod_last) -> [last_activity]; +module_tables(mod_muc) -> [muc_room, muc_registered]; +module_tables(mod_offline) -> [offline_msg]; +module_tables(mod_privacy) -> [privacy]; +module_tables(mod_private) -> [private_storage]; +module_tables(mod_pubsub) -> [pubsub_node]; +module_tables(mod_roster) -> [roster]; +module_tables(mod_shared_roster) -> [sr_group, sr_user]; +module_tables(mod_vcard) -> [vcard, vcard_search]; +module_tables(_Other) -> []. |