aboutsummaryrefslogtreecommitdiff
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.erl137
1 files changed, 92 insertions, 45 deletions
diff --git a/src/mod_private_sql.erl b/src/mod_private_sql.erl
index 0e9d1b61e..5e438a56a 100644
--- a/src/mod_private_sql.erl
+++ b/src/mod_private_sql.erl
@@ -1,21 +1,38 @@
%%%-------------------------------------------------------------------
-%%% @author Evgeny Khramtsov <ekhramtsov@process-one.net>
-%%% @copyright (C) 2016, Evgeny Khramtsov
-%%% @doc
-%%%
-%%% @end
+%%% File : mod_private_sql.erl
+%%% Author : Evgeny Khramtsov <ekhramtsov@process-one.net>
%%% Created : 13 Apr 2016 by Evgeny Khramtsov <ekhramtsov@process-one.net>
-%%%-------------------------------------------------------------------
--module(mod_private_sql).
+%%%
+%%%
+%%% 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_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]).
+-export([init/2, set_data/3, get_data/3, get_all_data/2, del_data/2,
+ import/3, export/1]).
--include("jlib.hrl").
+-include("xmpp.hrl").
-include("mod_private.hrl").
+-include("ejabberd_sql_pt.hrl").
+-include("logger.hrl").
%%%===================================================================
%%% API
@@ -28,43 +45,64 @@ set_data(LUser, LServer, Data) ->
lists:foreach(
fun({XMLNS, El}) ->
SData = fxml:element_to_binary(El),
- sql_queries:set_private_data(
- LServer, LUser, XMLNS, SData)
+ ?SQL_UPSERT_T(
+ "private_storage",
+ ["!username=%(LUser)s",
+ "!server_host=%(LServer)s",
+ "!namespace=%(XMLNS)s",
+ "data=%(SData)s"])
end, Data)
end,
- ejabberd_sql:sql_transaction(LServer, F).
+ case ejabberd_sql:sql_transaction(LServer, F) of
+ {atomic, ok} ->
+ ok;
+ _ ->
+ {error, db_failure}
+ end.
get_data(LUser, LServer, XMLNS) ->
- case catch sql_queries:get_private_data(LServer, LUser, XMLNS) of
+ case ejabberd_sql:sql_query(
+ LServer,
+ ?SQL("select @(data)s from private_storage"
+ " where username=%(LUser)s and %(LServer)H"
+ " and namespace=%(XMLNS)s")) of
{selected, [{SData}]} ->
- case fxml_stream:parse_element(SData) of
- Data when is_record(Data, xmlel) ->
- {ok, Data};
- _ ->
- error
- end;
+ parse_element(LUser, LServer, SData);
+ {selected, []} ->
+ error;
_ ->
- error
+ {error, db_failure}
end.
get_all_data(LUser, LServer) ->
- case catch sql_queries:get_private_data(LServer, LUser) of
+ case ejabberd_sql:sql_query(
+ LServer,
+ ?SQL("select @(namespace)s, @(data)s from private_storage"
+ " where username=%(LUser)s and %(LServer)H")) of
+ {selected, []} ->
+ error;
{selected, Res} ->
- lists:flatmap(
- fun({_, SData}) ->
- case fxml_stream:parse_element(SData) of
- #xmlel{} = El ->
- [El];
- _ ->
- []
- end
- end, Res);
+ {ok, lists:flatmap(
+ fun({_, SData}) ->
+ case parse_element(LUser, LServer, SData) of
+ {ok, El} -> [El];
+ error -> []
+ end
+ end, Res)};
_ ->
- []
+ {error, db_failure}
end.
-remove_user(LUser, LServer) ->
- sql_queries:del_user_private_storage(LServer, LUser).
+del_data(LUser, LServer) ->
+ case ejabberd_sql:sql_query(
+ LServer,
+ ?SQL("delete from private_storage"
+ " where username=%(LUser)s and %(LServer)H")) of
+ {updated, _} ->
+ ok;
+ _ ->
+ {error, db_failure}
+ end.
export(_Server) ->
[{private_storage,
@@ -72,22 +110,31 @@ export(_Server) ->
xml = Data})
when LServer == Host ->
SData = fxml:element_to_binary(Data),
- sql_queries:set_private_data_sql(LUser, XMLNS, SData);
+ [?SQL("delete from private_storage where"
+ " username=%(LUser)s and %(LServer)H and namespace=%(XMLNS)s;"),
+ ?SQL_INSERT(
+ "private_storage",
+ ["username=%(LUser)s",
+ "server_host=%(LServer)s",
+ "namespace=%(XMLNS)s",
+ "data=%(SData)s"])];
(_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.
+import(_, _, _) ->
+ ok.
%%%===================================================================
%%% Internal functions
%%%===================================================================
+parse_element(LUser, LServer, XML) ->
+ case fxml_stream:parse_element(XML) of
+ El when is_record(El, xmlel) ->
+ {ok, El};
+ _ ->
+ ?ERROR_MSG("Malformed XML element in SQL table "
+ "'private_storage' for user ~ts@~ts: ~ts",
+ [LUser, LServer, XML]),
+ error
+ end.