aboutsummaryrefslogtreecommitdiff
path: root/src/mod_caps_mnesia.erl
diff options
context:
space:
mode:
authorEvgeniy Khramtsov <ekhramtsov@process-one.net>2017-04-23 16:37:58 +0300
committerEvgeniy Khramtsov <ekhramtsov@process-one.net>2017-04-23 16:37:58 +0300
commit9a93acc62af1a63e0e2b1b23cd60698cbd1f6f92 (patch)
tree0a9a4c0f773dc1f9a21dca1b1ed7ef283aaf8855 /src/mod_caps_mnesia.erl
parentUse round-robin algorithm when selecting worker from DB pool (diff)
Improve Mnesia tables creation and transformation
Diffstat (limited to 'src/mod_caps_mnesia.erl')
-rw-r--r--src/mod_caps_mnesia.erl59
1 files changed, 24 insertions, 35 deletions
diff --git a/src/mod_caps_mnesia.erl b/src/mod_caps_mnesia.erl
index 30fbf766f..7362b1cd1 100644
--- a/src/mod_caps_mnesia.erl
+++ b/src/mod_caps_mnesia.erl
@@ -28,6 +28,7 @@
%% API
-export([init/2, caps_read/2, caps_write/3, import/3]).
+-export([need_transform/1, transform/1]).
-include("mod_caps.hrl").
-include("logger.hrl").
@@ -36,20 +37,10 @@
%%% 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,
ejabberd_mnesia:create(?MODULE, caps_features,
- [{disc_only_copies, [node()]},
- {local_content, true},
- {attributes,
- record_info(fields, caps_features)}]),
- update_table().
+ [{disc_only_copies, [node()]},
+ {local_content, true},
+ {attributes, record_info(fields, caps_features)}]).
caps_read(_LServer, Node) ->
case mnesia:dirty_read({caps_features, Node}) of
@@ -68,28 +59,26 @@ import(_LServer, NodePair, Features) ->
mnesia:dirty_write(
#caps_features{node_pair = NodePair, features = Features}).
+need_transform(#caps_features{node_pair = {N, P}, features = Fs}) ->
+ case is_list(N) orelse is_list(P) orelse
+ (is_list(Fs) andalso lists:any(fun is_list/1, Fs)) of
+ true ->
+ ?INFO_MSG("Mnesia table 'caps_features' will be "
+ "converted to binary", []),
+ true;
+ false ->
+ false
+ end.
+
+transform(#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}.
+
%%%===================================================================
%%% 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.