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.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)),