summaryrefslogtreecommitdiff
path: root/src/mod_private_sql.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/mod_private_sql.erl')
-rw-r--r--src/mod_private_sql.erl97
1 files changed, 97 insertions, 0 deletions
diff --git a/src/mod_private_sql.erl b/src/mod_private_sql.erl
new file mode 100644
index 00000000..1b77c48b
--- /dev/null
+++ b/src/mod_private_sql.erl
@@ -0,0 +1,97 @@
+%%%-------------------------------------------------------------------
+%%% @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_private_sql).
+
+-behaviour(mod_private).
+
+%% API
+-export([init/2, set_data/3, get_data/3, get_all_data/2, remove_user/2,
+ import/1, import/2, export/1]).
+
+-include("jlib.hrl").
+-include("mod_private.hrl").
+
+%%%===================================================================
+%%% API
+%%%===================================================================
+init(_Host, _Opts) ->
+ ok.
+
+set_data(LUser, LServer, Data) ->
+ F = fun() ->
+ lists:foreach(
+ fun({XMLNS, El}) ->
+ SData = fxml:element_to_binary(El),
+ odbc_queries:set_private_data(
+ LServer, LUser, XMLNS, SData)
+ end, Data)
+ end,
+ ejabberd_odbc:sql_transaction(LServer, F).
+
+get_data(LUser, LServer, XMLNS) ->
+ case catch odbc_queries:get_private_data(LServer, LUser, XMLNS) of
+ {selected, [{SData}]} ->
+ case fxml_stream:parse_element(SData) of
+ Data when is_record(Data, xmlel) ->
+ {ok, Data};
+ _ ->
+ error
+ end;
+ _ ->
+ error
+ end.
+
+get_all_data(LUser, LServer) ->
+ case catch odbc_queries:get_private_data(LServer, LUser) of
+ {selected, Res} ->
+ lists:flatmap(
+ fun({_, SData}) ->
+ case fxml_stream:parse_element(SData) of
+ #xmlel{} = El ->
+ [El];
+ _ ->
+ []
+ end
+ end, Res);
+ _ ->
+ []
+ end.
+
+remove_user(LUser, LServer) ->
+ odbc_queries:del_user_private_storage(LServer, LUser).
+
+export(_Server) ->
+ [{private_storage,
+ fun(Host, #private_storage{usns = {LUser, LServer, XMLNS},
+ xml = Data})
+ when LServer == Host ->
+ Username = ejabberd_odbc:escape(LUser),
+ LXMLNS = ejabberd_odbc:escape(XMLNS),
+ SData =
+ ejabberd_odbc:escape(fxml:element_to_binary(Data)),
+ odbc_queries:set_private_data_sql(Username, LXMLNS,
+ SData);
+ (_Host, _R) ->
+ []
+ end}].
+
+import(LServer) ->
+ [{<<"select username, namespace, data from private_storage;">>,
+ fun([LUser, XMLNS, XML]) ->
+ El = #xmlel{} = fxml_stream:parse_element(XML),
+ #private_storage{usns = {LUser, LServer, XMLNS},
+ xml = El}
+ end}].
+
+import(_, _) ->
+ pass.
+
+%%%===================================================================
+%%% Internal functions
+%%%===================================================================