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