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_shared_roster_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_shared_roster_mnesia.erl')
-rw-r--r-- | src/mod_shared_roster_mnesia.erl | 68 |
1 files changed, 24 insertions, 44 deletions
diff --git a/src/mod_shared_roster_mnesia.erl b/src/mod_shared_roster_mnesia.erl index 1e301279..adfbac68 100644 --- a/src/mod_shared_roster_mnesia.erl +++ b/src/mod_shared_roster_mnesia.erl @@ -32,6 +32,7 @@ get_user_groups/2, get_group_explicit_users/2, get_user_displayed_groups/3, is_user_in_group/3, add_user_to_group/3, remove_user_from_group/3, import/3]). +-export([need_transform/1, transform/1]). -include("mod_roster.hrl"). -include("mod_shared_roster.hrl"). @@ -43,13 +44,12 @@ %%%=================================================================== init(_Host, _Opts) -> ejabberd_mnesia:create(?MODULE, sr_group, - [{disc_copies, [node()]}, - {attributes, record_info(fields, sr_group)}]), + [{disc_copies, [node()]}, + {attributes, record_info(fields, sr_group)}]), ejabberd_mnesia:create(?MODULE, sr_user, - [{disc_copies, [node()]}, {type, bag}, - {attributes, record_info(fields, sr_user)}, - {index, [group_host]}]), - update_tables(). + [{disc_copies, [node()]}, {type, bag}, + {attributes, record_info(fields, sr_user)}, + {index, [group_host]}]). list_groups(Host) -> mnesia:dirty_select(sr_group, @@ -144,44 +144,24 @@ import(LServer, <<"sr_user">>, [SJID, Group, _TimeStamp]) -> User = #sr_user{us = {U, S}, group_host = {Group, LServer}}, mnesia:dirty_write(User). +need_transform(#sr_group{group_host = {G, H}}) + when is_list(G) orelse is_list(H) -> + ?INFO_MSG("Mnesia table 'sr_group' will be converted to binary", []), + true; +need_transform(#sr_user{us = {U, S}, group_host = {G, H}}) + when is_list(U) orelse is_list(S) orelse is_list(G) orelse is_list(H) -> + ?INFO_MSG("Mnesia table 'sr_user' will be converted to binary", []), + true; +need_transform(_) -> + false. + +transform(#sr_group{group_host = {G, H}, opts = Opts} = R) -> + R#sr_group{group_host = {iolist_to_binary(G), iolist_to_binary(H)}, + opts = mod_shared_roster:opts_to_binary(Opts)}; +transform(#sr_user{us = {U, S}, group_host = {G, H}} = R) -> + R#sr_user{us = {iolist_to_binary(U), iolist_to_binary(S)}, + group_host = {iolist_to_binary(G), iolist_to_binary(H)}}. + %%%=================================================================== %%% Internal functions %%%=================================================================== -update_tables() -> - update_sr_group_table(), - update_sr_user_table(). - -update_sr_group_table() -> - Fields = record_info(fields, sr_group), - case mnesia:table_info(sr_group, attributes) of - Fields -> - ejabberd_config:convert_table_to_binary( - sr_group, Fields, set, - fun(#sr_group{group_host = {G, _}}) -> G end, - fun(#sr_group{group_host = {G, H}, - opts = Opts} = R) -> - R#sr_group{group_host = {iolist_to_binary(G), - iolist_to_binary(H)}, - opts = mod_shared_roster:opts_to_binary(Opts)} - end); - _ -> - ?INFO_MSG("Recreating sr_group table", []), - mnesia:transform_table(sr_group, ignore, Fields) - end. - -update_sr_user_table() -> - Fields = record_info(fields, sr_user), - case mnesia:table_info(sr_user, attributes) of - Fields -> - ejabberd_config:convert_table_to_binary( - sr_user, Fields, bag, - fun(#sr_user{us = {U, _}}) -> U end, - fun(#sr_user{us = {U, S}, group_host = {G, H}} = R) -> - R#sr_user{us = {iolist_to_binary(U), iolist_to_binary(S)}, - group_host = {iolist_to_binary(G), - iolist_to_binary(H)}} - end); - _ -> - ?INFO_MSG("Recreating sr_user table", []), - mnesia:transform_table(sr_user, ignore, Fields) - end. |