diff options
author | Alexey Shchepin <alexey@process-one.net> | 2019-11-26 19:45:47 +0300 |
---|---|---|
committer | Alexey Shchepin <alexey@process-one.net> | 2019-11-26 19:45:47 +0300 |
commit | a9f3fd2179b99c1aa0609e637d502be6c8e6e34c (patch) | |
tree | e6fa21affb164ca8f1171f696adf9b66a187e6ee /src/ejabberd_sql.erl | |
parent | Fix previous commit (diff) | |
parent | Merge 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.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)), |