diff options
author | Evgeniy Khramtsov <ekhramtsov@process-one.net> | 2017-04-23 16:37:58 +0300 |
---|---|---|
committer | Evgeniy Khramtsov <ekhramtsov@process-one.net> | 2017-04-23 16:37:58 +0300 |
commit | 9a93acc62af1a63e0e2b1b23cd60698cbd1f6f92 (patch) | |
tree | 0a9a4c0f773dc1f9a21dca1b1ed7ef283aaf8855 /src/mod_caps_mnesia.erl | |
parent | Use 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.erl | 59 |
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. |