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:
Diffstat (limited to 'src/mod_private_mnesia.erl')
-rw-r--r--src/mod_private_mnesia.erl43
1 files changed, 33 insertions, 10 deletions
diff --git a/src/mod_private_mnesia.erl b/src/mod_private_mnesia.erl
index 67417bb7f..04c1a04a1 100644
--- a/src/mod_private_mnesia.erl
+++ b/src/mod_private_mnesia.erl
@@ -27,8 +27,8 @@
-behaviour(mod_private).
%% API
--export([init/2, set_data/3, get_data/3, get_all_data/2, remove_user/2,
- import/3]).
+-export([init/2, set_data/3, get_data/3, get_all_data/2, del_data/2,
+ use_cache/1, import/3]).
-export([need_transform/1, transform/1]).
-include("xmpp.hrl").
@@ -43,6 +43,16 @@ init(_Host, _Opts) ->
[{disc_only_copies, [node()]},
{attributes, record_info(fields, private_storage)}]).
+use_cache(Host) ->
+ case mnesia:table_info(private_storage, storage_type) of
+ disc_only_copies ->
+ gen_mod:get_module_opt(
+ Host, mod_private, use_cache,
+ ejabberd_config:use_cache(Host));
+ _ ->
+ false
+ end.
+
set_data(LUser, LServer, Data) ->
F = fun () ->
lists:foreach(
@@ -53,7 +63,7 @@ set_data(LUser, LServer, Data) ->
xml = Xmlel})
end, Data)
end,
- mnesia:transaction(F).
+ transaction(F).
get_data(LUser, LServer, XmlNS) ->
case mnesia:dirty_read(private_storage, {LUser, LServer, XmlNS}) of
@@ -64,13 +74,18 @@ get_data(LUser, LServer, XmlNS) ->
end.
get_all_data(LUser, LServer) ->
- lists:flatten(
- mnesia:dirty_select(private_storage,
- [{#private_storage{usns = {LUser, LServer, '_'},
- xml = '$1'},
- [], ['$1']}])).
+ case lists:flatten(
+ mnesia:dirty_select(private_storage,
+ [{#private_storage{usns = {LUser, LServer, '_'},
+ xml = '$1'},
+ [], ['$1']}])) of
+ [] ->
+ error;
+ Res ->
+ {ok, Res}
+ end.
-remove_user(LUser, LServer) ->
+del_data(LUser, LServer) ->
F = fun () ->
Namespaces = mnesia:select(private_storage,
[{#private_storage{usns =
@@ -86,7 +101,7 @@ remove_user(LUser, LServer) ->
end,
Namespaces)
end,
- mnesia:transaction(F).
+ transaction(F).
import(LServer, <<"private_storage">>,
[LUser, XMLNS, XML, _TimeStamp]) ->
@@ -110,3 +125,11 @@ transform(#private_storage{usns = {U, S, NS}, xml = El} = R) ->
%%%===================================================================
%%% Internal functions
%%%===================================================================
+transaction(F) ->
+ case mnesia:transaction(F) of
+ {atomic, Res} ->
+ Res;
+ {aborted, Reason} ->
+ ?ERROR_MSG("Mnesia transaction failed: ~p", [Reason]),
+ {error, db_failure}
+ end.