From b5d1ce795f798af7c98d650b14b95cda1d2e6eb0 Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Wed, 13 Apr 2016 13:04:04 +0300 Subject: Clean mod_announce.erl from DB specific code --- src/mod_announce_sql.erl | 132 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 src/mod_announce_sql.erl (limited to 'src/mod_announce_sql.erl') 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 +%%% @copyright (C) 2016, Evgeny Khramtsov +%%% @doc +%%% +%%% @end +%%% Created : 13 Apr 2016 by Evgeny Khramtsov +%%%------------------------------------------------------------------- +-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 +%%%=================================================================== -- cgit v1.2.3