diff options
author | Evgeniy Khramtsov <ekhramtsov@process-one.net> | 2016-04-13 11:41:04 +0300 |
---|---|---|
committer | Evgeniy Khramtsov <ekhramtsov@process-one.net> | 2016-04-13 11:41:04 +0300 |
commit | cd094bc903a01428463e355968432f0510b28f84 (patch) | |
tree | 7bef2cc8acce52dca169279c39067b53e23df1ef /src/mod_caps_mnesia.erl | |
parent | Clean mod_vcard_xupdate.erl from DB specific code (diff) |
Clean mod_caps.erl from DB specific code
Diffstat (limited to 'src/mod_caps_mnesia.erl')
-rw-r--r-- | src/mod_caps_mnesia.erl | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/src/mod_caps_mnesia.erl b/src/mod_caps_mnesia.erl new file mode 100644 index 000000000..0bf04b2c3 --- /dev/null +++ b/src/mod_caps_mnesia.erl @@ -0,0 +1,73 @@ +%%%------------------------------------------------------------------- +%%% @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_caps_mnesia). +-behaviour(mod_caps). + +%% API +-export([init/2, caps_read/2, caps_write/3]). + +-include("mod_caps.hrl"). +-include("logger.hrl"). + +%%%=================================================================== +%%% API +%%%=================================================================== +init(_Host, _Opts) -> + case catch mnesia:table_info(caps_features, storage_type) of + {'EXIT', _} -> + ok; + disc_only_copies -> + ok; + _ -> + mnesia:delete_table(caps_features) + end, + mnesia:create_table(caps_features, + [{disc_only_copies, [node()]}, + {local_content, true}, + {attributes, + record_info(fields, caps_features)}]), + update_table(), + mnesia:add_table_copy(caps_features, node(), + disc_only_copies). + +caps_read(_LServer, Node) -> + case mnesia:dirty_read({caps_features, Node}) of + [#caps_features{features = Features}] -> {ok, Features}; + _ -> error + end. + +caps_write(_LServer, Node, Features) -> + mnesia:dirty_write(#caps_features{node_pair = Node, + features = Features}). + +%%%=================================================================== +%%% Internal functions +%%%=================================================================== +update_table() -> + Fields = record_info(fields, caps_features), + case mnesia:table_info(caps_features, attributes) of + Fields -> + ejabberd_config:convert_table_to_binary( + caps_features, Fields, set, + fun(#caps_features{node_pair = {N, _}}) -> N end, + fun(#caps_features{node_pair = {N, P}, + features = Fs} = R) -> + NewFs = if is_integer(Fs) -> + Fs; + true -> + [iolist_to_binary(F) || F <- Fs] + end, + R#caps_features{node_pair = {iolist_to_binary(N), + iolist_to_binary(P)}, + features = NewFs} + end); + _ -> + ?INFO_MSG("Recreating caps_features table", []), + mnesia:transform_table(caps_features, ignore, Fields) + end. |