aboutsummaryrefslogtreecommitdiff
path: root/src/mod_announce_sql.erl
diff options
context:
space:
mode:
authorEvgeniy Khramtsov <ekhramtsov@process-one.net>2016-04-13 13:04:04 +0300
committerEvgeniy Khramtsov <ekhramtsov@process-one.net>2016-04-13 13:04:04 +0300
commitb5d1ce795f798af7c98d650b14b95cda1d2e6eb0 (patch)
treecdda4038d4e6dea01e64e9e25c75b76096ae2933 /src/mod_announce_sql.erl
parentClean mod_caps.erl from DB specific code (diff)
Clean mod_announce.erl from DB specific code
Diffstat (limited to 'src/mod_announce_sql.erl')
-rw-r--r--src/mod_announce_sql.erl132
1 files changed, 132 insertions, 0 deletions
diff --git a/src/mod_announce_sql.erl b/src/mod_announce_sql.erl
new file mode 100644
index 000000000..cf10ffd85
--- /dev/null
+++ b/src/mod_announce_sql.erl
@@ -0,0 +1,132 @@
+%%%-------------------------------------------------------------------
+%%% @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_announce_sql).
+-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/1,
+ import/2, export/1]).
+
+-include("jlib.hrl").
+-include("mod_announce.hrl").
+
+%%%===================================================================
+%%% API
+%%%===================================================================
+init(_Host, _Opts) ->
+ ok.
+
+set_motd_users(LServer, USRs) ->
+ F = fun() ->
+ lists:foreach(
+ fun({U, _S, _R}) ->
+ Username = ejabberd_odbc:escape(U),
+ odbc_queries:update_t(
+ <<"motd">>,
+ [<<"username">>, <<"xml">>],
+ [Username, <<"">>],
+ [<<"username='">>, Username, <<"'">>])
+ end, USRs)
+ end,
+ ejabberd_odbc:sql_transaction(LServer, F).
+
+set_motd(LServer, Packet) ->
+ XML = ejabberd_odbc:escape(fxml:element_to_binary(Packet)),
+ F = fun() ->
+ odbc_queries:update_t(
+ <<"motd">>,
+ [<<"username">>, <<"xml">>],
+ [<<"">>, XML],
+ [<<"username=''">>])
+ end,
+ ejabberd_odbc:sql_transaction(LServer, F).
+
+delete_motd(LServer) ->
+ F = fun() ->
+ ejabberd_odbc:sql_query_t([<<"delete from motd;">>])
+ end,
+ ejabberd_odbc:sql_transaction(LServer, F).
+
+get_motd(LServer) ->
+ case catch ejabberd_odbc:sql_query(
+ LServer, [<<"select xml from motd where username='';">>]) of
+ {selected, [<<"xml">>], [[XML]]} ->
+ case fxml_stream:parse_element(XML) of
+ {error, _} ->
+ error;
+ Packet ->
+ {ok, Packet}
+ end;
+ _ ->
+ error
+ end.
+
+is_motd_user(LUser, LServer) ->
+ Username = ejabberd_odbc:escape(LUser),
+ case catch ejabberd_odbc:sql_query(
+ LServer,
+ [<<"select username from motd "
+ "where username='">>, Username, <<"';">>]) of
+ {selected, [<<"username">>], [_|_]} ->
+ true;
+ _ ->
+ false
+ end.
+
+set_motd_user(LUser, LServer) ->
+ Username = ejabberd_odbc:escape(LUser),
+ F = fun() ->
+ odbc_queries:update_t(
+ <<"motd">>,
+ [<<"username">>, <<"xml">>],
+ [Username, <<"">>],
+ [<<"username='">>, Username, <<"'">>])
+ end,
+ ejabberd_odbc:sql_transaction(LServer, F).
+
+export(_Server) ->
+ [{motd,
+ fun(Host, #motd{server = LServer, packet = El})
+ when LServer == Host ->
+ [[<<"delete from motd where username='';">>],
+ [<<"insert into motd(username, xml) values ('', '">>,
+ ejabberd_odbc:escape(fxml:element_to_binary(El)),
+ <<"');">>]];
+ (_Host, _R) ->
+ []
+ end},
+ {motd_users,
+ fun(Host, #motd_users{us = {LUser, LServer}})
+ when LServer == Host, LUser /= <<"">> ->
+ Username = ejabberd_odbc:escape(LUser),
+ [[<<"delete from motd where username='">>, Username, <<"';">>],
+ [<<"insert into motd(username, xml) values ('">>,
+ Username, <<"', '');">>]];
+ (_Host, _R) ->
+ []
+ end}].
+
+import(LServer) ->
+ [{<<"select xml from motd where username='';">>,
+ fun([XML]) ->
+ El = fxml_stream:parse_element(XML),
+ #motd{server = LServer, packet = El}
+ end},
+ {<<"select username from motd where xml='';">>,
+ fun([LUser]) ->
+ #motd_users{us = {LUser, LServer}}
+ end}].
+
+import(_, _) ->
+ pass.
+
+%%%===================================================================
+%%% Internal functions
+%%%===================================================================