diff options
Diffstat (limited to 'src/mod_private_sql.erl')
-rw-r--r-- | src/mod_private_sql.erl | 137 |
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. |