SOURCES: ejabberd-mod_logdb.patch - up for 2.0.3 - https://forge.process-on...

shadzik shadzik at pld-linux.org
Wed Apr 1 02:19:58 CEST 2009


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:o.palij at gmail.com xmpp://malik@jabber.te.ua)
++%%% Author  : Oleg Palij (mailto,xmpp:o.palij at gmail.com)
 +%%% Purpose : Frontend for log user messages to db
 +%%% Version : trunk
 +%%% Id      : $Id$
@@ -12,7 +12,6 @@
 +
 +-module(mod_logdb).
 +-author('o.palij at gmail.com').
-+-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@~s removal", [User, VHost]);
++         false ->
++           ?INFO_MSG("Message removing is disabled. Keeping messages for ~s@~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:o.palij at gmail.com xmpp://malik@jabber.te.ua)
-+%%% 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:o.palij at gmail.com xmpp://malik@jabber.te.ua)
-+%%% 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('o.palij at gmail.com').
-+-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



More information about the pld-cvs-commit mailing list