aboutsummaryrefslogtreecommitdiff
path: root/src/ejabberd_sql.erl
diff options
context:
space:
mode:
authorAlexey Shchepin <alexey@process-one.net>2019-09-09 00:15:55 +0300
committerAlexey Shchepin <alexey@process-one.net>2019-09-09 00:16:44 +0300
commit21aa344ed51c66477b7a09a134066aeea1c3b60c (patch)
tree1bd14ec86c7226a6ee57de5f0eb9c0d6f7d7ad7a /src/ejabberd_sql.erl
parentFix certificate selection for s2s (diff)
Fix BEGIN/COMMIT/ROLLBACK syntax for MSSQL (#2978)
Diffstat (limited to 'src/ejabberd_sql.erl')
-rw-r--r--src/ejabberd_sql.erl26
1 files changed, 21 insertions, 5 deletions
diff --git a/src/ejabberd_sql.erl b/src/ejabberd_sql.erl
index 92642e7b7..42254d28d 100644
--- a/src/ejabberd_sql.erl
+++ b/src/ejabberd_sql.erl
@@ -523,15 +523,15 @@ outer_transaction(F, NRestarts, _Reason) ->
[T]),
erlang:exit(implementation_faulty)
end,
- sql_query_internal([<<"begin;">>]),
+ sql_begin(),
put(?NESTING_KEY, PreviousNestingLevel + 1),
try F() of
Res ->
- sql_query_internal([<<"commit;">>]),
+ sql_commit(),
{atomic, Res}
catch
?EX_RULE(throw, {aborted, Reason}, _) when NRestarts > 0 ->
- sql_query_internal([<<"rollback;">>]),
+ sql_rollback(),
put(?NESTING_KEY, ?TOP_LEVEL_TXN),
outer_transaction(F, NRestarts - 1, Reason);
?EX_RULE(throw, {aborted, Reason}, Stack) when NRestarts =:= 0 ->
@@ -542,10 +542,10 @@ outer_transaction(F, NRestarts, _Reason) ->
"== ~p",
[?MAX_TRANSACTION_RESTARTS, Reason,
StackTrace, get(?STATE_KEY)]),
- sql_query_internal([<<"rollback;">>]),
+ sql_rollback(),
{aborted, Reason};
?EX_RULE(exit, Reason, _) ->
- sql_query_internal([<<"rollback;">>]),
+ sql_rollback(),
{aborted, Reason}
end.
@@ -772,6 +772,22 @@ sql_query_format_res(Res, _SQLQuery) ->
sql_query_to_iolist(SQLQuery) ->
generic_sql_query_format(SQLQuery).
+sql_begin() ->
+ sql_query_internal(
+ [{mssql, [<<"begin transaction;">>]},
+ {any, [<<"begin;">>]}]).
+
+sql_commit() ->
+ sql_query_internal(
+ [{mssql, [<<"commit transaction;">>]},
+ {any, [<<"commit;">>]}]).
+
+sql_rollback() ->
+ sql_query_internal(
+ [{mssql, [<<"rollback transaction;">>]},
+ {any, [<<"rollback;">>]}]).
+
+
%% Generate the OTP callback return tuple depending on the driver result.
abort_on_driver_error({error, <<"query timed out">>} = Reply, From, Timestamp) ->
reply(From, Reply, Timestamp),