Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/processone/ejabberd.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEvgeniy Khramtsov <ekhramtsov@process-one.net>2017-05-18 13:21:17 +0300
committerEvgeniy Khramtsov <ekhramtsov@process-one.net>2017-05-18 13:21:17 +0300
commitbcb44ccb6f87efdf82cf66c9bd1249d5cc882da3 (patch)
tree298e8b4e70bb9c04a03f5e703c54f6f44269ee88 /src/mod_last_mnesia.erl
parent736a18254462e9a9e763bc6a24ccc2c5005864d7 (diff)
Implement cache for mod_last
Diffstat (limited to 'src/mod_last_mnesia.erl')
-rw-r--r--src/mod_last_mnesia.erl32
1 files changed, 19 insertions, 13 deletions
diff --git a/src/mod_last_mnesia.erl b/src/mod_last_mnesia.erl
index ab8f47478..6d1dee7d9 100644
--- a/src/mod_last_mnesia.erl
+++ b/src/mod_last_mnesia.erl
@@ -27,7 +27,8 @@
-behaviour(mod_last).
%% API
--export([init/2, import/2, get_last/2, store_last_info/4, remove_user/2]).
+-export([init/2, import/2, get_last/2, store_last_info/4,
+ remove_user/2, use_cache/1]).
-export([need_transform/1, transform/1]).
-include("mod_last.hrl").
@@ -38,31 +39,36 @@
%%%===================================================================
init(_Host, _Opts) ->
ejabberd_mnesia:create(?MODULE, last_activity,
- [{disc_copies, [node()]},
+ [{disc_only_copies, [node()]},
{attributes, record_info(fields, last_activity)}]).
+use_cache(Host) ->
+ case mnesia:table_info(last_activity, storage_type) of
+ disc_only_copies ->
+ gen_mod:get_module_opt(
+ Host, mod_last, use_cache,
+ ejabberd_config:use_cache(Host));
+ _ ->
+ false
+ end.
+
get_last(LUser, LServer) ->
case mnesia:dirty_read(last_activity, {LUser, LServer}) of
[] ->
- not_found;
+ error;
[#last_activity{timestamp = TimeStamp,
status = Status}] ->
- {ok, TimeStamp, Status}
+ {ok, {TimeStamp, Status}}
end.
store_last_info(LUser, LServer, TimeStamp, Status) ->
- US = {LUser, LServer},
- F = fun () ->
- mnesia:write(#last_activity{us = US,
- timestamp = TimeStamp,
- status = Status})
- end,
- mnesia:transaction(F).
+ mnesia:dirty_write(#last_activity{us = {LUser, LServer},
+ timestamp = TimeStamp,
+ status = Status}).
remove_user(LUser, LServer) ->
US = {LUser, LServer},
- F = fun () -> mnesia:delete({last_activity, US}) end,
- mnesia:transaction(F).
+ mnesia:dirty_delete({last_activity, US}).
import(_LServer, #last_activity{} = LA) ->
mnesia:dirty_write(LA).