aboutsummaryrefslogtreecommitdiff
path: root/src/ejabberd_sql.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/ejabberd_sql.erl')
-rw-r--r--src/ejabberd_sql.erl46
1 files changed, 35 insertions, 11 deletions
diff --git a/src/ejabberd_sql.erl b/src/ejabberd_sql.erl
index 5bf371654..ebbd9a5cb 100644
--- a/src/ejabberd_sql.erl
+++ b/src/ejabberd_sql.erl
@@ -5,7 +5,7 @@
%%% Created : 8 Dec 2004 by Alexey Shchepin <alexey@process-one.net>
%%%
%%%
-%%% ejabberd, Copyright (C) 2002-2019 ProcessOne
+%%% ejabberd, Copyright (C) 2002-2020 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
@@ -227,6 +227,8 @@ escape_like_arg(S) when is_binary(S) ->
escape_like_arg($%) -> <<"\\%">>;
escape_like_arg($_) -> <<"\\_">>;
escape_like_arg($\\) -> <<"\\\\">>;
+escape_like_arg($[) -> <<"\\[">>; % For MSSQL
+escape_like_arg($]) -> <<"\\]">>;
escape_like_arg(C) when is_integer(C), C >= 0, C =< 255 -> <<C>>.
escape_like_arg_circumflex(S) when is_binary(S) ->
@@ -718,7 +720,8 @@ generic_escape() ->
boolean = fun(true) -> <<"1">>;
(false) -> <<"0">>
end,
- in_array_string = fun(X) -> <<"'", (escape(X))/binary, "'">> end
+ in_array_string = fun(X) -> <<"'", (escape(X))/binary, "'">> end,
+ like_escape = fun() -> <<"">> end
}.
pgsql_sql_query(SQLQuery) ->
@@ -736,7 +739,8 @@ pgsql_escape() ->
boolean = fun(true) -> <<"1">>;
(false) -> <<"0">>
end,
- in_array_string = fun(X) -> <<"E'", (escape(X))/binary, "'">> end
+ in_array_string = fun(X) -> <<"E'", (escape(X))/binary, "'">> end,
+ like_escape = fun() -> <<"">> end
}.
sqlite_sql_query(SQLQuery) ->
@@ -754,7 +758,8 @@ sqlite_escape() ->
boolean = fun(true) -> <<"1">>;
(false) -> <<"0">>
end,
- in_array_string = fun(X) -> <<"'", (standard_escape(X))/binary, "'">> end
+ in_array_string = fun(X) -> <<"'", (standard_escape(X))/binary, "'">> end,
+ like_escape = fun() -> <<"ESCAPE '\\'">> end
}.
standard_escape(S) ->
@@ -767,9 +772,18 @@ mssql_sql_query(SQLQuery) ->
sqlite_sql_query(SQLQuery).
pgsql_prepare(SQLQuery, State) ->
- Escape = #sql_escape{_ = fun(X) -> X end},
- N = length((SQLQuery#sql_query.args)(Escape)),
- Args = [<<$$, (integer_to_binary(I))/binary>> || I <- lists:seq(1, N)],
+ Escape = #sql_escape{_ = fun(_) -> arg end,
+ like_escape = fun() -> escape end},
+ {RArgs, _} =
+ lists:foldl(
+ fun(arg, {Acc, I}) ->
+ {[<<$$, (integer_to_binary(I))/binary>> | Acc], I + 1};
+ (escape, {Acc, I}) ->
+ {[<<"">> | Acc], I}
+ end, {[], 1}, (SQLQuery#sql_query.args)(Escape)),
+ Args = lists:reverse(RArgs),
+ %N = length((SQLQuery#sql_query.args)(Escape)),
+ %Args = [<<$$, (integer_to_binary(I))/binary>> || I <- lists:seq(1, N)],
Query = (SQLQuery#sql_query.format_query)(Args),
pgsql:prepare(State#state.db_ref, SQLQuery#sql_query.hash, Query).
@@ -779,13 +793,15 @@ pgsql_execute_escape() ->
boolean = fun(true) -> "1";
(false) -> "0"
end,
- in_array_string = fun(X) -> <<"\"", (escape(X))/binary, "\"">> end
+ in_array_string = fun(X) -> <<"\"", (escape(X))/binary, "\"">> end,
+ like_escape = fun() -> ignore end
}.
pgsql_execute_sql_query(SQLQuery, State) ->
Args = (SQLQuery#sql_query.args)(pgsql_execute_escape()),
+ Args2 = lists:filter(fun(ignore) -> false; (_) -> true end, Args),
ExecuteRes =
- pgsql:execute(State#state.db_ref, SQLQuery#sql_query.hash, Args),
+ pgsql:execute(State#state.db_ref, SQLQuery#sql_query.hash, Args2),
% {T, ExecuteRes} =
% timer:tc(pgsql, execute, [State#state.db_ref, SQLQuery#sql_query.hash, Args]),
% io:format("T ~ts ~p~n", [SQLQuery#sql_query.hash, T]),
@@ -985,12 +1001,18 @@ pgsql_execute_to_odbc(_) -> {updated, undefined}.
%% part of init/1
%% Open a database connection to MySQL
-mysql_connect(Server, Port, DB, Username, Password, ConnectTimeout, _, _) ->
+mysql_connect(Server, Port, DB, Username, Password, ConnectTimeout, Transport, _) ->
+ SSLOpts = case Transport of
+ ssl ->
+ [ssl_required];
+ _ ->
+ []
+ end,
case p1_mysql_conn:start(binary_to_list(Server), Port,
binary_to_list(Username),
binary_to_list(Password),
binary_to_list(DB),
- ConnectTimeout, fun log/3)
+ ConnectTimeout, fun log/3, SSLOpts)
of
{ok, Ref} ->
p1_mysql_conn:fetch(
@@ -1096,6 +1118,8 @@ warn_if_ssl_unsupported(tcp, _) ->
ok;
warn_if_ssl_unsupported(ssl, pgsql) ->
ok;
+warn_if_ssl_unsupported(ssl, mysql) ->
+ ok;
warn_if_ssl_unsupported(ssl, Type) ->
?WARNING_MSG("SSL connection is not supported for ~ts", [Type]).