aboutsummaryrefslogtreecommitdiff
path: root/src/mod_announce_mnesia.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/mod_announce_mnesia.erl')
-rw-r--r--src/mod_announce_mnesia.erl129
1 files changed, 67 insertions, 62 deletions
diff --git a/src/mod_announce_mnesia.erl b/src/mod_announce_mnesia.erl
index c43eb853b..c5a2a2d9a 100644
--- a/src/mod_announce_mnesia.erl
+++ b/src/mod_announce_mnesia.erl
@@ -1,19 +1,37 @@
%%%-------------------------------------------------------------------
-%%% @author Evgeny Khramtsov <ekhramtsov@process-one.net>
-%%% @copyright (C) 2016, Evgeny Khramtsov
-%%% @doc
-%%%
-%%% @end
+%%% File : mod_announce_mnesia.erl
+%%% Author : Evgeny Khramtsov <ekhramtsov@process-one.net>
%%% Created : 13 Apr 2016 by Evgeny Khramtsov <ekhramtsov@process-one.net>
-%%%-------------------------------------------------------------------
+%%%
+%%%
+%%% ejabberd, Copyright (C) 2002-2019 ProcessOne
+%%%
+%%% This program is free software; you can redistribute it and/or
+%%% modify it under the terms of the GNU General Public License as
+%%% published by the Free Software Foundation; either version 2 of the
+%%% License, or (at your option) any later version.
+%%%
+%%% This program is distributed in the hope that it will be useful,
+%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
+%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+%%% General Public License for more details.
+%%%
+%%% You should have received a copy of the GNU General Public License along
+%%% with this program; if not, write to the Free Software Foundation, Inc.,
+%%% 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+%%%
+%%%----------------------------------------------------------------------
+
-module(mod_announce_mnesia).
+
-behaviour(mod_announce).
%% API
-export([init/2, set_motd_users/2, set_motd/2, delete_motd/1,
- get_motd/1, is_motd_user/2, set_motd_user/2, import/2]).
+ get_motd/1, is_motd_user/2, set_motd_user/2, import/3]).
+-export([need_transform/1, transform/1]).
--include("jlib.hrl").
+-include("xmpp.hrl").
-include("mod_announce.hrl").
-include("logger.hrl").
@@ -21,15 +39,14 @@
%%% API
%%%===================================================================
init(_Host, _Opts) ->
- mnesia:create_table(motd,
- [{disc_copies, [node()]},
+ ejabberd_mnesia:create(?MODULE, motd,
+ [{disc_only_copies, [node()]},
{attributes,
record_info(fields, motd)}]),
- mnesia:create_table(motd_users,
- [{disc_copies, [node()]},
+ ejabberd_mnesia:create(?MODULE, motd_users,
+ [{disc_only_copies, [node()]},
{attributes,
- record_info(fields, motd_users)}]),
- update_tables().
+ record_info(fields, motd_users)}]).
set_motd_users(_LServer, USRs) ->
F = fun() ->
@@ -38,13 +55,13 @@ set_motd_users(_LServer, USRs) ->
mnesia:write(#motd_users{us = {U, S}})
end, USRs)
end,
- mnesia:transaction(F).
+ transaction(F).
set_motd(LServer, Packet) ->
F = fun() ->
mnesia:write(#motd{server = LServer, packet = Packet})
end,
- mnesia:transaction(F).
+ transaction(F).
delete_motd(LServer) ->
F = fun() ->
@@ -59,71 +76,59 @@ delete_motd(LServer) ->
mnesia:delete({motd_users, US})
end, Users)
end,
- mnesia:transaction(F).
+ transaction(F).
get_motd(LServer) ->
case mnesia:dirty_read({motd, LServer}) of
[#motd{packet = Packet}] ->
{ok, Packet};
- _ ->
+ [] ->
error
end.
is_motd_user(LUser, LServer) ->
case mnesia:dirty_read({motd_users, {LUser, LServer}}) of
- [#motd_users{}] -> true;
- _ -> false
+ [#motd_users{}] -> {ok, true};
+ _ -> {ok, false}
end.
set_motd_user(LUser, LServer) ->
F = fun() ->
mnesia:write(#motd_users{us = {LUser, LServer}})
end,
- mnesia:transaction(F).
+ transaction(F).
+
+need_transform({motd, S, _}) when is_list(S) ->
+ ?INFO_MSG("Mnesia table 'motd' will be converted to binary", []),
+ true;
+need_transform({motd_users, {U, S}, _}) when is_list(U) orelse is_list(S) ->
+ ?INFO_MSG("Mnesia table 'motd_users' will be converted to binary", []),
+ true;
+need_transform(_) ->
+ false.
+
+transform(#motd{server = S, packet = P} = R) ->
+ NewS = iolist_to_binary(S),
+ NewP = fxml:to_xmlel(P),
+ R#motd{server = NewS, packet = NewP};
+transform(#motd_users{us = {U, S}} = R) ->
+ NewUS = {iolist_to_binary(U), iolist_to_binary(S)},
+ R#motd_users{us = NewUS}.
-import(_LServer, #motd{} = Motd) ->
- mnesia:dirty_write(Motd);
-import(_LServer, #motd_users{} = Users) ->
- mnesia:dirty_write(Users).
+import(LServer, <<"motd">>, [<<>>, XML, _TimeStamp]) ->
+ El = fxml_stream:parse_element(XML),
+ mnesia:dirty_write(#motd{server = LServer, packet = El});
+import(LServer, <<"motd">>, [LUser, <<>>, _TimeStamp]) ->
+ mnesia:dirty_write(#motd_users{us = {LUser, LServer}}).
%%%===================================================================
%%% Internal functions
%%%===================================================================
-update_tables() ->
- update_motd_table(),
- update_motd_users_table().
-
-update_motd_table() ->
- Fields = record_info(fields, motd),
- case mnesia:table_info(motd, attributes) of
- Fields ->
- ejabberd_config:convert_table_to_binary(
- motd, Fields, set,
- fun(#motd{server = S}) -> S end,
- fun(#motd{server = S, packet = P} = R) ->
- NewS = iolist_to_binary(S),
- NewP = fxml:to_xmlel(P),
- R#motd{server = NewS, packet = NewP}
- end);
- _ ->
- ?INFO_MSG("Recreating motd table", []),
- mnesia:transform_table(motd, ignore, Fields)
- end.
-
-
-update_motd_users_table() ->
- Fields = record_info(fields, motd_users),
- case mnesia:table_info(motd_users, attributes) of
- Fields ->
- ejabberd_config:convert_table_to_binary(
- motd_users, Fields, set,
- fun(#motd_users{us = {U, _}}) -> U end,
- fun(#motd_users{us = {U, S}} = R) ->
- NewUS = {iolist_to_binary(U),
- iolist_to_binary(S)},
- R#motd_users{us = NewUS}
- end);
- _ ->
- ?INFO_MSG("Recreating motd_users table", []),
- mnesia:transform_table(motd_users, ignore, Fields)
+transaction(F) ->
+ case mnesia:transaction(F) of
+ {atomic, Res} ->
+ Res;
+ {aborted, Reason} ->
+ ?ERROR_MSG("Mnesia transaction failed: ~p", [Reason]),
+ {error, db_failure}
end.