aboutsummaryrefslogtreecommitdiff
path: root/src/ejabberd_sql.erl
diff options
context:
space:
mode:
authorAlexey Shchepin <alexey@process-one.net>2019-11-26 19:45:47 +0300
committerAlexey Shchepin <alexey@process-one.net>2019-11-26 19:45:47 +0300
commita9f3fd2179b99c1aa0609e637d502be6c8e6e34c (patch)
treee6fa21affb164ca8f1171f696adf9b66a187e6ee /src/ejabberd_sql.erl
parentFix previous commit (diff)
parentMerge branch 'pg_prepared_statements' of https://github.com/sabudaye/ejabberd... (diff)
Merge branch 'sabudaye-pg_prepared_statements'
Diffstat (limited to 'src/ejabberd_sql.erl')
-rw-r--r--src/ejabberd_sql.erl41
1 files changed, 34 insertions, 7 deletions
diff --git a/src/ejabberd_sql.erl b/src/ejabberd_sql.erl
index 1f3d27421..c1d9383a0 100644
--- a/src/ejabberd_sql.erl
+++ b/src/ejabberd_sql.erl
@@ -583,14 +583,23 @@ sql_query_internal(#sql_query{} = Query) ->
Key = {?PREPARE_KEY, Query#sql_query.hash},
case get(Key) of
undefined ->
- case pgsql_prepare(Query, State) of
- {ok, _, _, _} ->
- put(Key, prepared);
- {error, Error} ->
- ?ERROR_MSG("PREPARE failed for SQL query "
+ Host = State#state.host,
+ PreparedStatements =
+ ejabberd_option:sql_prepared_statements(Host),
+ case PreparedStatements of
+ false ->
+ put(Key, ignore);
+ true ->
+ case pgsql_prepare(Query, State) of
+ {ok, _, _, _} ->
+ put(Key, prepared);
+ {error, Error} ->
+ ?ERROR_MSG(
+ "PREPARE failed for SQL query "
"at ~p: ~p",
[Query#sql_query.loc, Error]),
- put(Key, ignore)
+ put(Key, ignore)
+ end
end;
_ ->
ok
@@ -599,7 +608,7 @@ sql_query_internal(#sql_query{} = Query) ->
prepared ->
pgsql_execute_sql_query(Query, State);
_ ->
- generic_sql_query(Query)
+ pgsql_sql_query(Query)
end;
mysql ->
generic_sql_query(Query);
@@ -695,6 +704,24 @@ generic_escape() ->
in_array_string = fun(X) -> <<"'", (escape(X))/binary, "'">> end
}.
+pgsql_sql_query(SQLQuery) ->
+ sql_query_format_res(
+ sql_query_internal(pgsql_sql_query_format(SQLQuery)),
+ SQLQuery).
+
+pgsql_sql_query_format(SQLQuery) ->
+ Args = (SQLQuery#sql_query.args)(pgsql_escape()),
+ (SQLQuery#sql_query.format_query)(Args).
+
+pgsql_escape() ->
+ #sql_escape{string = fun(X) -> <<"E'", (escape(X))/binary, "'">> end,
+ integer = fun(X) -> misc:i2l(X) end,
+ boolean = fun(true) -> <<"1">>;
+ (false) -> <<"0">>
+ end,
+ in_array_string = fun(X) -> <<"E'", (escape(X))/binary, "'">> end
+ }.
+
sqlite_sql_query(SQLQuery) ->
sql_query_format_res(
sql_query_internal(sqlite_sql_query_format(SQLQuery)),