diff options
author | Evgeniy Khramtsov <ekhramtsov@process-one.net> | 2016-04-14 12:18:04 +0300 |
---|---|---|
committer | Evgeniy Khramtsov <ekhramtsov@process-one.net> | 2016-04-14 12:18:04 +0300 |
commit | 79d64e0d71ffa8124186f6027d5695b93b8333b7 (patch) | |
tree | 00110612d6f184680f6c72d5a53ee648af503872 /src/mod_irc_sql.erl | |
parent | Clean mod_shared_roster.erl from DB specific code (diff) |
Clean mod_irc.erl from DB specific code
Diffstat (limited to 'src/mod_irc_sql.erl')
-rw-r--r-- | src/mod_irc_sql.erl | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/src/mod_irc_sql.erl b/src/mod_irc_sql.erl new file mode 100644 index 00000000..bf6dbb48 --- /dev/null +++ b/src/mod_irc_sql.erl @@ -0,0 +1,91 @@ +%%%------------------------------------------------------------------- +%%% @author Evgeny Khramtsov <ekhramtsov@process-one.net> +%%% @copyright (C) 2016, Evgeny Khramtsov +%%% @doc +%%% +%%% @end +%%% Created : 14 Apr 2016 by Evgeny Khramtsov <ekhramtsov@process-one.net> +%%%------------------------------------------------------------------- +-module(mod_irc_sql). + +-behaviour(mod_irc). + +%% API +-export([init/2, get_data/3, set_data/4, import/1, import/2, export/1]). + +-include("jlib.hrl"). +-include("mod_irc.hrl"). + +%%%=================================================================== +%%% API +%%%=================================================================== +init(_Host, _Opts) -> + ok. + +get_data(LServer, Host, From) -> + LJID = jid:tolower(jid:remove_resource(From)), + SJID = ejabberd_odbc:escape(jid:to_string(LJID)), + SHost = ejabberd_odbc:escape(Host), + case catch ejabberd_odbc:sql_query( + LServer, + [<<"select data from irc_custom where jid='">>, + SJID, <<"' and host='">>, SHost, + <<"';">>]) of + {selected, [<<"data">>], [[SData]]} -> + mod_irc:data_to_binary(From, ejabberd_odbc:decode_term(SData)); + {'EXIT', _} -> error; + {selected, _, _} -> empty + end. + +set_data(LServer, Host, From, Data) -> + LJID = jid:tolower(jid:remove_resource(From)), + SJID = ejabberd_odbc:escape(jid:to_string(LJID)), + SHost = ejabberd_odbc:escape(Host), + SData = ejabberd_odbc:encode_term(Data), + F = fun () -> + odbc_queries:update_t(<<"irc_custom">>, + [<<"jid">>, <<"host">>, <<"data">>], + [SJID, SHost, SData], + [<<"jid='">>, SJID, <<"' and host='">>, + SHost, <<"'">>]), + ok + end, + ejabberd_odbc:sql_transaction(LServer, F). + +export(_Server) -> + [{irc_custom, + fun(Host, #irc_custom{us_host = {{U, S}, IRCHost}, + data = Data}) -> + case str:suffix(Host, IRCHost) of + true -> + SJID = ejabberd_odbc:escape( + jid:to_string( + jid:make(U, S, <<"">>))), + SIRCHost = ejabberd_odbc:escape(IRCHost), + SData = ejabberd_odbc:encode_term(Data), + [[<<"delete from irc_custom where jid='">>, SJID, + <<"' and host='">>, SIRCHost, <<"';">>], + [<<"insert into irc_custom(jid, host, " + "data) values ('">>, + SJID, <<"', '">>, SIRCHost, <<"', '">>, SData, + <<"');">>]]; + false -> + [] + end + end}]. + +import(_LServer) -> + [{<<"select jid, host, data from irc_custom;">>, + fun([SJID, IRCHost, SData]) -> + #jid{luser = U, lserver = S} = jid:from_string(SJID), + Data = ejabberd_odbc:decode_term(SData), + #irc_custom{us_host = {{U, S}, IRCHost}, + data = Data} + end}]. + +import(_, _) -> + pass. + +%%%=================================================================== +%%% Internal functions +%%%=================================================================== |