aboutsummaryrefslogtreecommitdiff
path: root/src/mod_caps_mnesia.erl
diff options
context:
space:
mode:
authorEvgeniy Khramtsov <ekhramtsov@process-one.net>2016-04-13 11:41:04 +0300
committerEvgeniy Khramtsov <ekhramtsov@process-one.net>2016-04-13 11:41:04 +0300
commitcd094bc903a01428463e355968432f0510b28f84 (patch)
tree7bef2cc8acce52dca169279c39067b53e23df1ef /src/mod_caps_mnesia.erl
parentClean 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.erl73
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.