diff options
author | Evgeniy Khramtsov <ekhramtsov@process-one.net> | 2016-04-13 14:09:34 +0300 |
---|---|---|
committer | Evgeniy Khramtsov <ekhramtsov@process-one.net> | 2016-04-13 14:09:34 +0300 |
commit | ef70ce65ab9d27e9fb399c1762514c34bdf9f97e (patch) | |
tree | f2a0566e82eb69060521449ddaafd0a952bfdf48 /src/mod_private_mnesia.erl | |
parent | Clean mod_announce.erl from DB specific code (diff) |
Clean mod_private.erl from DB specific code
Diffstat (limited to 'src/mod_private_mnesia.erl')
-rw-r--r-- | src/mod_private_mnesia.erl | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/src/mod_private_mnesia.erl b/src/mod_private_mnesia.erl new file mode 100644 index 000000000..7a852c4f8 --- /dev/null +++ b/src/mod_private_mnesia.erl @@ -0,0 +1,97 @@ +%%%------------------------------------------------------------------- +%%% @author Evgeny Khramtsov <ekhramtsov@process-one.net> +%%% @copyright (C) 2016, Evgeny Khramtsov +%%% @doc +%%% +%%% @end +%%% Created : 13 Apr 2016 by Evgeny Khramtsov <ekhramtsov@process-one.net> +%%%------------------------------------------------------------------- +-module(mod_private_mnesia). +-behaviour(mod_private). + +%% API +-export([init/2, set_data/3, get_data/3, get_all_data/2, remove_user/2, + import/2]). + +-include("jlib.hrl"). +-include("mod_private.hrl"). +-include("logger.hrl"). + +%%%=================================================================== +%%% API +%%%=================================================================== +init(_Host, _Opts) -> + mnesia:create_table(private_storage, + [{disc_only_copies, [node()]}, + {attributes, + record_info(fields, private_storage)}]), + update_table(). + +set_data(LUser, LServer, Data) -> + F = fun () -> + lists:foreach( + fun({XmlNS, Xmlel}) -> + mnesia:write( + #private_storage{ + usns = {LUser, LServer, XmlNS}, + xml = Xmlel}) + end, Data) + end, + mnesia:transaction(F). + +get_data(LUser, LServer, XmlNS) -> + case mnesia:dirty_read(private_storage, {LUser, LServer, XmlNS}) of + [#private_storage{xml = Storage_Xmlel}] -> + {ok, Storage_Xmlel}; + _ -> + error + end. + +get_all_data(LUser, LServer) -> + lists:flatten( + mnesia:dirty_select(private_storage, + [{#private_storage{usns = {LUser, LServer, '_'}, + xml = '$1'}, + [], ['$1']}])). + +remove_user(LUser, LServer) -> + F = fun () -> + Namespaces = mnesia:select(private_storage, + [{#private_storage{usns = + {LUser, + LServer, + '$1'}, + _ = '_'}, + [], ['$$']}]), + lists:foreach(fun ([Namespace]) -> + mnesia:delete({private_storage, + {LUser, LServer, + Namespace}}) + end, + Namespaces) + end, + mnesia:transaction(F). + +import(_LServer, #private_storage{} = PS) -> + mnesia:dirty_write(PS). + +%%%=================================================================== +%%% Internal functions +%%%=================================================================== +update_table() -> + Fields = record_info(fields, private_storage), + case mnesia:table_info(private_storage, attributes) of + Fields -> + ejabberd_config:convert_table_to_binary( + private_storage, Fields, set, + fun(#private_storage{usns = {U, _, _}}) -> U end, + fun(#private_storage{usns = {U, S, NS}, xml = El} = R) -> + R#private_storage{usns = {iolist_to_binary(U), + iolist_to_binary(S), + iolist_to_binary(NS)}, + xml = fxml:to_xmlel(El)} + end); + _ -> + ?INFO_MSG("Recreating private_storage table", []), + mnesia:transform_table(private_storage, ignore, Fields) + end. |