Author: shadzik Date: Wed Apr 1 00:19:58 2009 GMT Module: SOURCES Tag: HEAD ---- Log message: - up for 2.0.3 - https://forge.process-one.net/browse/ejabberd-modules/jorge/trunk/mod_logdb
---- Files affected: SOURCES: ejabberd-mod_logdb.patch (1.1 -> 1.2) ---- Diffs: ================================================================ Index: SOURCES/ejabberd-mod_logdb.patch diff -u SOURCES/ejabberd-mod_logdb.patch:1.1 SOURCES/ejabberd-mod_logdb.patch:1.2 --- SOURCES/ejabberd-mod_logdb.patch:1.1 Fri Jan 25 20:23:58 2008 +++ SOURCES/ejabberd-mod_logdb.patch Wed Apr 1 02:19:52 2009 @@ -1,9 +1,9 @@ ---- src/mod_logdb.erl.orig Tue Dec 11 14:23:19 2007 -+++ src/mod_logdb.erl Thu Sep 20 15:26:21 2007 -@@ -0,0 +1,1656 @@ +--- mod_logdb.erl.orig 2009-02-05 19:21:29.000000000 +0200 ++++ mod_logdb.erl 2009-02-05 19:19:51.000000000 +0200 +@@ -0,0 +1,2094 @@ +%%%---------------------------------------------------------------------- +%%% File : mod_logdb.erl -+%%% Author : Oleg Palij (mailto:[email protected] xmpp://[email protected]) ++%%% Author : Oleg Palij (mailto,xmpp:[email protected]) +%%% Purpose : Frontend for log user messages to db +%%% Version : trunk +%%% Id : $Id$ @@ -12,7 +12,6 @@ + +-module(mod_logdb). +-author('[email protected]'). -+-vsn('$Revision$'). + +-behaviour(gen_server). +-behaviour(gen_mod). @@ -24,7 +23,7 @@ +% gen_server +-export([code_change/3,handle_call/3,handle_cast/2,handle_info/2,init/1,terminate/2]). +% hooks -+-export([send_packet/3, receive_packet/4, offline_packet/3]). ++-export([send_packet/3, receive_packet/4, offline_packet/3, remove_user/2]). +-export([get_local_identity/5, + get_local_features/5, + get_local_items/5, @@ -52,18 +51,31 @@ + list_to_string/1, string_to_list/1, + get_module_settings/1, set_module_settings/2, + purge_old_records/2]). ++% webadmin hooks ++-export([webadmin_menu/3, ++ webadmin_user/4, ++ webadmin_page/3, ++ user_parse_query/5]). ++% webadmin queries ++-export([vhost_messages_stats/3, ++ vhost_messages_stats_at/4, ++ user_messages_stats/4, ++ user_messages_stats_at/5]). + +-include("mod_logdb.hrl"). +-include("ejabberd.hrl"). ++-include("mod_roster.hrl"). +-include("jlib.hrl"). +-include("ejabberd_ctl.hrl"). +-include("adhoc.hrl"). ++-include("web/ejabberd_web_admin.hrl"). ++-include("web/ejabberd_http.hrl"). + +-define(PROCNAME, ejabberd_mod_logdb). +% gen_server call timeout -+-define(CALL_TIMEOUT, 60000). ++-define(CALL_TIMEOUT, 10000). + -+-record(state, {vhost, dbmod, backendPid, monref, purgeRef, pollRef, dbopts, dbs, dolog_default, ignore_jids, groupchat, purge_older_days, poll_users_settings}). ++-record(state, {vhost, dbmod, backendPid, monref, purgeRef, pollRef, dbopts, dbs, dolog_default, ignore_jids, groupchat, purge_older_days, poll_users_settings, drop_messages_on_user_removal}). + +ets_settings_table(VHost) -> list_to_atom("ets_logdb_settings_" ++ VHost). + @@ -87,7 +99,9 @@ +% supervisor starts gen_server +start_link(VHost, Opts) -> + Proc = gen_mod:get_module_proc(VHost, ?PROCNAME), -+ gen_server:start_link({local, Proc}, ?MODULE, [VHost, Opts], []). ++ {ok, Pid} = gen_server:start_link({local, Proc}, ?MODULE, [VHost, Opts], []), ++ Pid ! start, ++ {ok, Pid}. + +init([VHost, Opts]) -> + process_flag(trap_exit, true), @@ -103,15 +117,13 @@ + + DBMod = list_to_atom(atom_to_list(?MODULE) ++ "_" ++ atom_to_list(DBName)), + -+ % actually all work begin on receiving start signal -+ timer:send_after(1000, start), -+ + {ok, #state{vhost=VHost, + dbmod=DBMod, + dbopts=DBOpts, + % dbs used for convert messages from one backend to other + dbs=DBs, + dolog_default=gen_mod:get_opt(dolog_default, Opts, true), ++ drop_messages_on_user_removal=gen_mod:get_opt(drop_messages_on_user_removal, Opts, true), + ignore_jids=gen_mod:get_opt(ignore_jids, Opts, []), + groupchat=gen_mod:get_opt(groupchat, Opts, none), + purge_older_days=gen_mod:get_opt(purge_older_days, Opts, never), @@ -122,6 +134,7 @@ + + %ets:delete(ets_settings_table(VHost)), + ++ ejabberd_hooks:delete(remove_user, VHost, ?MODULE, remove_user, 90), + ejabberd_hooks:delete(user_send_packet, VHost, ?MODULE, send_packet, 90), + ejabberd_hooks:delete(user_receive_packet, VHost, ?MODULE, receive_packet, 90), + ejabberd_hooks:delete(offline_message_hook, VHost, ?MODULE, offline_packet, 10), @@ -136,6 +149,11 @@ + ejabberd_hooks:delete(disco_local_features, VHost, ?MODULE, get_local_features, 110), + ejabberd_hooks:delete(disco_local_items, VHost, ?MODULE, get_local_items, 110), + ++ ejabberd_hooks:delete(webadmin_menu_host, VHost, ?MODULE, webadmin_menu, 70), ++ ejabberd_hooks:delete(webadmin_user, VHost, ?MODULE, webadmin_user, 50), ++ ejabberd_hooks:delete(webadmin_page_host, VHost, ?MODULE, webadmin_page, 50), ++ ejabberd_hooks:delete(webadmin_user_parse_query, VHost, ?MODULE, user_parse_query, 50), ++ + ?MYDEBUG("Removed hooks for ~p", [VHost]), + + ejabberd_ctl:unregister_commands(VHost, [{"rebuild_stats", "rebuild mod_logdb module stats for vhost"}], ?MODULE, rebuild_stats), @@ -251,6 +269,7 @@ + NewState = State#state{dolog_default=Settings#state.dolog_default, + ignore_jids=Settings#state.ignore_jids, + groupchat=Settings#state.groupchat, ++ drop_messages_on_user_removal=Settings#state.drop_messages_on_user_removal, + purge_older_days=PurgeDays, + poll_users_settings=PollSec, + purgeRef=PurgeRef, @@ -279,9 +298,17 @@ + ok + end, + {noreply, State}; ++handle_cast({remove_user, User}, #state{dbmod=DBMod, vhost=VHost}=State) -> ++ case State#state.drop_messages_on_user_removal of ++ true -> ++ DBMod:drop_user(User, VHost), ++ ?INFO_MSG("Launched ~...@~s removal", [User, VHost]); ++ false -> ++ ?INFO_MSG("Message removing is disabled. Keeping messages for ~...@~s", [User, VHost]) ++ end, ++ {noreply, State}; +% ejabberdctl rebuild_stats/3 +handle_cast({rebuild_stats}, #state{dbmod=DBMod, vhost=VHost}=State) -> -+ % TODO: maybe spawn? + DBMod:rebuild_stats(VHost), + {noreply, State}; +handle_cast({copy_messages, Backend}, State) -> @@ -321,11 +348,15 @@ +% from timer:send_after (in init) +handle_info(start, #state{dbmod=DBMod, vhost=VHost}=State) -> + case DBMod:start(VHost, State#state.dbopts) of -+ {error, _Reason} -> ++ {error,{already_started,_}} -> ++ ?MYDEBUG("backend module already started - trying to stop it", []), ++ DBMod:stop(VHost), ++ {stop, already_started, State}; ++ {error, Reason} -> + timer:sleep(30000), ++ ?ERROR_MSG("Failed to start: ~p", [Reason]), + {stop, db_connection_failed, State}; + {ok, SPid} -> -+ + ?INFO_MSG("~p connection established", [DBMod]), + + MonRef = erlang:monitor(process, SPid), @@ -337,6 +368,7 @@ + TrefPurge = set_purge_timer(State#state.purge_older_days), + TrefPoll = set_poll_timer(State#state.poll_users_settings), + ++ ejabberd_hooks:add(remove_user, VHost, ?MODULE, remove_user, 90), + ejabberd_hooks:add(user_send_packet, VHost, ?MODULE, send_packet, 90), + ejabberd_hooks:add(user_receive_packet, VHost, ?MODULE, receive_packet, 90), + ejabberd_hooks:add(offline_message_hook, VHost, ?MODULE, offline_packet, 10), @@ -352,6 +384,11 @@ + %ejabberd_hooks:add(adhoc_sm_items, VHost, ?MODULE, adhoc_sm_items, 110), + %ejabberd_hooks:add(adhoc_sm_commands, VHost, ?MODULE, adhoc_sm_commands, 110), + ++ ejabberd_hooks:add(webadmin_menu_host, VHost, ?MODULE, webadmin_menu, 70), ++ ejabberd_hooks:add(webadmin_user, VHost, ?MODULE, webadmin_user, 50), ++ ejabberd_hooks:add(webadmin_page_host, VHost, ?MODULE, webadmin_page, 50), ++ ejabberd_hooks:add(webadmin_user_parse_query, VHost, ?MODULE, user_parse_query, 50), ++ + ?MYDEBUG("Added hooks for ~p", [VHost]), + + ejabberd_ctl:register_commands( @@ -398,9 +435,11 @@ +terminate(db_connection_failed, _State) -> + ok; +terminate(db_connection_dropped, State) -> ++ ?MYDEBUG("Got terminate with db_connection_dropped", []), + cleanup(State), + ok; -+terminate(_Reason, #state{monref=undefined} = State) -> ++terminate(Reason, #state{monref=undefined} = State) -> ++ ?MYDEBUG("Got terminate with undefined monref.~nReason: ~p", [Reason]), + cleanup(State), + ok; +terminate(Reason, #state{dbmod=DBMod, vhost=VHost, monref=MonRef, backendPid=Pid} = State) -> @@ -439,6 +478,12 @@ + Proc = gen_mod:get_module_proc(VHost, ?PROCNAME), + gen_server:cast(Proc, {addlog, from, Owner, Peer, P}). + ++remove_user(User, Server) -> ++ LUser = jlib:nodeprep(User), ++ LServer = jlib:nameprep(Server), ++ Proc = gen_mod:get_module_proc(LServer, ?PROCNAME), ++ gen_server:cast(Proc, {remove_user, LUser}). ++ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ejabberdctl @@ -565,7 +610,7 @@ +purge_old_records(VHost, Days) -> + Proc = gen_mod:get_module_proc(VHost, ?PROCNAME), + -+ Dates = gen_server:call(Proc, {get_dates, {VHost}}), ++ Dates = ?MODULE:get_dates(VHost), + DateNow = calendar:datetime_to_gregorian_seconds({date(), {0,0,1}}), + DateDiff = list_to_integer(Days)*24*60*60, + ?MYDEBUG("Purging tables older than ~s days", [Days]), @@ -690,9 +735,9 @@ + end. + +user_messages_parse_query(User, VHost, Query) -> -+ Dates = get_dates(VHost), + case lists:keysearch("delete", 1, Query) of + {value, _} -> ++ Dates = get_dates(VHost), + PDates = lists:filter( + fun(Date) -> + ID = jlib:encode_base64(binary_to_list(term_to_binary(User++Date))), @@ -717,9 +762,9 @@ + end. + +vhost_messages_parse_query(VHost, Query) -> -+ Dates = get_dates(VHost), + case lists:keysearch("delete", 1, Query) of + {value, _} -> ++ Dates = get_dates(VHost), + PDates = lists:filter( + fun(Date) -> + ID = jlib:encode_base64(binary_to_list(term_to_binary(VHost++Date))), @@ -1357,6 +1402,7 @@ + ignore_jids=IgnoreJids, + groupchat=GroupChat, + purge_older_days=PurgeDaysT, ++ drop_messages_on_user_removal=MRemoval, + poll_users_settings=PollTime} = mod_logdb:get_module_settings(Host), + + Backends = lists:map(fun({Backend, _Opts}) -> @@ -1402,6 +1448,15 @@ + ?LISTLINE(translate:translate(Lang, "Log Messages"), "true"), + ?LISTLINE(translate:translate(Lang, "Do Not Log Messages"), "false") + ]}, ++ % drop_messages_on_user_removal ++ {xmlelement, "field", [{"type", "list-single"}, ++ {"label", ++ translate:translate(Lang, "Drop messages on user removal")}, ++ {"var", "drop_messages_on_user_removal"}], ++ [?DEFVAL(atom_to_list(MRemoval)), ++ ?LISTLINE(translate:translate(Lang, "Drop"), "true"), ++ ?LISTLINE(translate:translate(Lang, "Do not drop"), "false") ++ ]}, + % groupchat + {xmlelement, "field", [{"type", "list-single"}, + {"label", @@ -1530,6 +1585,12 @@ + _ -> + throw(bad_request) + end, ++ MRemoval = case lists:keysearch("drop_messages_on_user_removal", 1, XData) of ++ {value, {_, [Str5]}} when Str5 == "true"; Str5 == "false" -> ++ list_to_bool(Str5); ++ _ -> ++ throw(bad_request) ++ end, + GroupChat = case lists:keysearch("groupchat", 1, XData) of + {value, {_, [Str2]}} when Str2 == "none"; + Str2 == "all"; @@ -1574,6 +1635,7 @@ + groupchat=GroupChat, + ignore_jids=Ignore, + purge_older_days=Purge, ++ drop_messages_on_user_removal=MRemoval, + poll_users_settings=Poll}. + +set_form(From, _Host, ["mod_logdb"], _Lang, XData) -> @@ -1657,182 +1719,539 @@ + end, lists:seq(1, N, M)) + end + end. ---- src/mod_logdb.hrl.orig Tue Dec 11 14:23:19 2007 -+++ src/mod_logdb.hrl Tue Aug 7 16:50:32 2007 -@@ -0,0 +1,29 @@ -+%%%---------------------------------------------------------------------- -+%%% File : mod_logdb.hrl -+%%% Author : Oleg Palij (mailto:[email protected] xmpp://[email protected]) -+%%% Purpose : -+%%% Version : trunk -+%%% Id : $Id$ -+%%% Url : http://www.dp.uz.gov.ua/o.palij/mod_logdb/ -+%%%---------------------------------------------------------------------- -+ -+-define(logdb_debug, true). -+ -+-ifdef(logdb_debug). -+-define(MYDEBUG(Format, Args), io:format("D(~p:~p:~p) : "++Format++"~n", -+ [calendar:local_time(),?MODULE,?LINE]++Args)). -+-else. -+-define(MYDEBUG(_F,_A),[]). -+-endif. -+ -+-record(msg, {timestamp, -+ owner_name, -+ peer_name, peer_server, peer_resource, -+ direction, -+ type, subject, -+ body}). -+ -+-record(user_settings, {owner_name, -+ dolog_default, -+ dolog_list=[], -+ donotlog_list=[]}). ---- src/mod_logdb_mnesia.erl.orig Tue Dec 11 14:23:19 2007 -+++ src/mod_logdb_mnesia.erl Wed Aug 22 22:58:11 2007 -@@ -0,0 +1,513 @@ -+%%%---------------------------------------------------------------------- -+%%% File : mod_logdb_mnesia.erl -+%%% Author : Oleg Palij (mailto:[email protected] xmpp://[email protected]) -+%%% Purpose : mnesia backend for mod_logdb -+%%% Version : trunk -+%%% Id : $Id$ -+%%% Url : http://www.dp.uz.gov.ua/o.palij/mod_logdb/ -+%%%---------------------------------------------------------------------- -+ -+-module(mod_logdb_mnesia). -+-author('[email protected]'). -+-vsn('$Revision$'). -+ -+-include("mod_logdb.hrl"). -+-include("ejabberd.hrl"). -+-include("jlib.hrl"). -+ -+-behaviour(gen_logdb). -+-behaviour(gen_server). -+ -+% gen_server -+-export([code_change/3,handle_call/3,handle_cast/2,handle_info/2,init/1,terminate/2]). -+% gen_mod -+-export([start/2, stop/1]). -+% gen_logdb -+-export([log_message/2, -+ rebuild_stats/1, -+ rebuild_stats_at/2, -+ delete_messages_by_user_at/3, delete_all_messages_by_user_at/3, delete_messages_at/2, -+ get_vhost_stats/1, get_vhost_stats_at/2, get_user_stats/2, get_user_messages_at/3, -+ get_dates/1, -+ get_users_settings/1, get_user_settings/2, set_user_settings/3]). -+ -+-define(PROCNAME, mod_logdb_mnesia). -+-define(CALL_TIMEOUT, 240000). -+ -+-record(state, {vhost}). -+ -+-record(stats, {user, at, count}). -+ -+prefix() -> -+ "logdb_". -+ -+suffix(VHost) -> -+ "_" ++ VHost. -+ -+stats_table(VHost) -> -+ list_to_atom(prefix() ++ "stats" ++ suffix(VHost)). -+ -+table_name(VHost, Date) -> -+ list_to_atom(prefix() ++ "messages_" ++ Date ++ suffix(VHost)). -+ -+settings_table(VHost) -> -+ list_to_atom(prefix() ++ "settings" ++ suffix(VHost)). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% -+% gen_mod callbacks ++% webadmin hooks +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -+start(VHost, Opts) -> -+ Proc = gen_mod:get_module_proc(VHost, ?PROCNAME), -+ gen_server:start({local, Proc}, ?MODULE, [VHost, Opts], []). ++webadmin_menu(Acc, _Host, Lang) -> ++ [{"messages", ?T("Users Messages")} | Acc]. + -+stop(VHost) -> -+ Proc = gen_mod:get_module_proc(VHost, ?PROCNAME), -+ gen_server:call(Proc, {stop}, ?CALL_TIMEOUT). ++webadmin_user(Acc, User, Server, Lang) -> ++ Sett = get_user_settings(User, Server), ++ Log = ++ case Sett#user_settings.dolog_default of ++ false -> ++ ?INPUTT("submit", "dolog", "Log Messages"); ++ true -> ++ ?INPUTT("submit", "donotlog", "Do Not Log Messages"); ++ _ -> [] ++ end, ++ Acc ++ [?XE("h3", [?ACT("messages/", "Messages"), ?C(" "), Log])]. ++ ++webadmin_page(_, Host, ++ #request{path = ["messages"], ++ q = Query, ++ lang = Lang}) when is_list(Host) -> ++ Res = vhost_messages_stats(Host, Query, Lang), ++ {stop, Res}; ++webadmin_page(_, Host, ++ #request{path = ["messages", Date], ++ q = Query, ++ lang = Lang}) when is_list(Host) -> ++ Res = vhost_messages_stats_at(Host, Query, Lang, Date), ++ {stop, Res}; ++webadmin_page(_, Host, ++ #request{path = ["user", U, "messages"], ++ q = Query, ++ lang = Lang}) -> ++ Res = user_messages_stats(U, Host, Query, Lang), ++ {stop, Res}; ++webadmin_page(_, Host, ++ #request{path = ["user", U, "messages", Date], ++ q = Query, ++ lang = Lang}) -> ++ Res = mod_logdb:user_messages_stats_at(U, Host, Query, Lang, Date), ++ {stop, Res}; ++webadmin_page(Acc, _, _) -> Acc. ++ ++user_parse_query(_, "dolog", User, Server, _Query) -> ++ Sett = get_user_settings(User, Server), ++ % TODO: check returned value ++ set_user_settings(User, Server, Sett#user_settings{dolog_default=true}), ++ {stop, ok}; ++user_parse_query(_, "donotlog", User, Server, _Query) -> ++ Sett = get_user_settings(User, Server), ++ % TODO: check returned value ++ set_user_settings(User, Server, Sett#user_settings{dolog_default=false}), ++ {stop, ok}; ++user_parse_query(Acc, _Action, _User, _Server, _Query) -> ++ Acc. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% -+% gen_server callbacks ++% webadmin funcs +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -+init([VHost, _Opts]) -> -+ case mnesia:system_info(is_running) of -+ yes -> -+ ok = create_stats_table(VHost), -+ ok = create_settings_table(VHost), -+ {ok, #state{vhost=VHost}}; -+ no -> -+ ?ERROR_MSG("Mnesia not running", []), -+ {stop, db_connection_failed}; -+ Status -> -+ ?ERROR_MSG("Mnesia status: ~p", [Status]), -+ {stop, db_connection_failed} ++vhost_messages_stats(Server, Query, Lang) -> ++ Res = case catch vhost_messages_parse_query(Server, Query) of ++ {'EXIT', Reason} -> ++ ?ERROR_MSG("~p", [Reason]), ++ error; ++ VResult -> VResult ++ end, ++ {Time, Value} = timer:tc(mod_logdb, get_vhost_stats, [Server]), ++ ?INFO_MSG("get_vhost_stats(~p) elapsed ~p sec", [Server, Time/1000000]), ++ %case get_vhost_stats(Server) of ++ case Value of ++ {'EXIT', CReason} -> ++ ?ERROR_MSG("Failed to get_vhost_stats: ~p", [CReason]), ++ [?XC("h1", ?T("Error occupied while fetching list"))]; ++ {error, GReason} -> ++ ?ERROR_MSG("Failed to get_vhost_stats: ~p", [GReason]), ++ [?XC("h1", ?T("Error occupied while fetching list"))]; ++ {ok, []} -> ++ [?XC("h1", ?T("No logged messages for ") ++ Server)]; ++ {ok, Dates} -> ++ Fun = fun({Date, Count}) -> ++ ID = jlib:encode_base64(binary_to_list(term_to_binary(Server++Date))), ++ ?XE("tr", ++ [?XE("td", [?INPUT("checkbox", "selected", ID)]), ++ ?XE("td", [?AC(Date, Date)]), ++ ?XC("td", integer_to_list(Count)) ++ ]) ++ end, ++ [?XC("h1", ?T("Logged messages for ") ++ Server)] ++ ++ case Res of ++ ok -> [?CT("Submitted"), ?P]; ++ error -> [?CT("Bad format"), ?P]; ++ nothing -> [] ++ end ++ ++ [?XAE("form", [{"action", ""}, {"method", "post"}], ++ [?XE("table", ++ [?XE("thead", ++ [?XE("tr", ++ [?X("td"), ++ ?XCT("td", "Date"), ++ ?XCT("td", "Count") ++ ])]), ++ ?XE("tbody", ++ lists:map(Fun, Dates) ++ )]), ++ ?BR, ++ ?INPUTT("submit", "delete", "Delete Selected") ++ ])] + end. + -+handle_call({log_message, Msg}, _From, #state{vhost=VHost}=State) -> -+ {reply, log_message_int(VHost, Msg), State}; -+handle_call({rebuild_stats}, _From, #state{vhost=VHost}=State) -> -+ {atomic, ok} = delete_nonexistent_stats(VHost), -+ Reply = -+ lists:foreach(fun(Date) -> -+ rebuild_stats_at_int(VHost, Date) -+ end, get_dates_int(VHost)), -+ {reply, Reply, State}; -+handle_call({rebuild_stats_at, Date}, _From, #state{vhost=VHost}=State) -> -+ Reply = rebuild_stats_at_int(VHost, Date), -+ {reply, Reply, State}; -+handle_call({delete_messages_by_user_at, Msgs, Date}, _From, #state{vhost=VHost}=State) -> -+ Table = table_name(VHost, Date), -+ Fun = fun() -> -+ lists:foreach( -+ fun(Msg) -> -+ mnesia:write_lock_table(stats_table(VHost)), -+ mnesia:write_lock_table(Table), -+ mnesia:delete_object(Table, Msg, write) -+ end, Msgs) ++vhost_messages_stats_at(Server, Query, Lang, Date) -> ++ {Time, Value} = timer:tc(mod_logdb, get_vhost_stats_at, [Server, Date]), ++ ?INFO_MSG("get_vhost_stats_at(~p,~p) elapsed ~p sec", [Server, Date, Time/1000000]), ++ %case get_vhost_stats_at(Server, Date) of ++ case Value of ++ {'EXIT', CReason} -> ++ ?ERROR_MSG("Failed to get_vhost_stats_at: ~p", [CReason]), ++ [?XC("h1", ?T("Error occupied while fetching list"))]; ++ {error, GReason} -> ++ ?ERROR_MSG("Failed to get_vhost_stats_at: ~p", [GReason]), ++ [?XC("h1", ?T("Error occupied while fetching list"))]; ++ {ok, []} -> ++ [?XC("h1", ?T("No logged messages for ") ++ Server ++ ?T(" at ") ++ Date)]; ++ {ok, Users} -> ++ Res = case catch vhost_messages_at_parse_query(Server, Date, Users, Query) of ++ {'EXIT', Reason} -> ++ ?ERROR_MSG("~p", [Reason]), ++ error; ++ VResult -> VResult ++ end, ++ Fun = fun({User, Count}) -> ++ ID = jlib:encode_base64(binary_to_list(term_to_binary(User++Server))), ++ ?XE("tr", ++ [?XE("td", [?INPUT("checkbox", "selected", ID)]), ++ ?XE("td", [?AC("../user/"++User++"/messages/"++Date, User)]), ++ ?XC("td", integer_to_list(Count)) ++ ]) ++ end, ++ [?XC("h1", ?T("Logged messages for ") ++ Server ++ ?T(" at ") ++ Date)] ++ ++ case Res of ++ ok -> [?CT("Submitted"), ?P]; ++ error -> [?CT("Bad format"), ?P]; ++ nothing -> [] ++ end ++ ++ [?XAE("form", [{"action", ""}, {"method", "post"}], ++ [?XE("table", ++ [?XE("thead", ++ [?XE("tr", ++ [?X("td"), ++ ?XCT("td", "User"), ++ ?XCT("td", "Count") ++ ])]), ++ ?XE("tbody", ++ lists:map(Fun, Users) ++ )]), ++ ?BR, ++ ?INPUTT("submit", "delete", "Delete Selected") ++ ])] ++ end. ++ ++user_messages_stats(User, Server, Query, Lang) -> ++ Jid = jlib:jid_to_string({User, Server, ""}), ++ ++ Res = case catch user_messages_parse_query(User, Server, Query) of ++ {'EXIT', Reason} -> ++ ?ERROR_MSG("~p", [Reason]), ++ error; ++ VResult -> VResult + end, -+ DRez = case mnesia:transaction(Fun) of -+ {aborted, Reason} -> -+ ?ERROR_MSG("Failed to delete_messages_by_user_at at ~p for ~p: ~p", [Date, VHost, Reason]), -+ error; <<Diff was trimmed, longer than 597 lines>> ---- CVS-web: http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/SOURCES/ejabberd-mod_logdb.patch?r1=1.1&r2=1.2&f=u _______________________________________________ pld-cvs-commit mailing list [email protected] http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit
