Browse Source

Compatibility with Erlang 21

erlang:get_stacktrace() was deprecated
Сергей Прохоров 7 years ago
parent
commit
9fe6b7450a
3 changed files with 17 additions and 8 deletions
  1. 1 0
      .travis.yml
  2. 2 1
      rebar.config
  3. 14 7
      src/epgsql.erl

+ 1 - 0
.travis.yml

@@ -9,6 +9,7 @@ env:
 install: "true"
 language: erlang
 otp_release:
+  - 21.0
   - 20.0
   - 19.1
   - 18.3

+ 2 - 1
rebar.config

@@ -1,5 +1,6 @@
 {erl_opts, [{platform_define, "^[0-9]+", have_maps},
-            {platform_define, "^(1[89])|^([2-9][0-9])", 'FAST_MAPS'}]}. % Erlang >=18
+            {platform_define, "^(1[89])|^([2-9][0-9])", 'FAST_MAPS'}, % Erlang >=18
+            {platform_define, "^(R|1|20)", 'FUN_STACKTRACE'}]}. % Erlang < 21
 
 {eunit_opts, [verbose]}.
 

+ 14 - 7
src/epgsql.erl

@@ -111,6 +111,13 @@
 -type lsn() :: integer().
 -type cb_state() :: term().
 
+%% See https://github.com/erlang/rebar3/pull/1773
+-ifdef(FUN_STACKTRACE).
+-define(WITH_STACKTRACE(T, R, S), T:R -> S = erlang:get_stacktrace(),).
+-else.
+-define(WITH_STACKTRACE(T, R, S), T:R:S ->).
+-endif.
+
 %% -- behaviour callbacks --
 
 %% Handles a XLogData Message (StartLSN, EndLSN, WALRecord, CbState).
@@ -379,16 +386,16 @@ with_transaction(C, F, Opts0) ->
         end,
         R
     catch
-        Type:Reason ->
+        ?WITH_STACKTRACE(Type, Reason, Stack)
             squery(C, "ROLLBACK"),
-            handle_error(Type, Reason, proplists:get_value(reraise, Opts, true))
+            case proplists:get_value(reraise, Opts, true) of
+                true ->
+                    erlang:raise(Type, Reason, Stack);
+                false ->
+                    {rollback, Reason}
+            end
     end.
 
-handle_error(_, Reason, false) ->
-    {rollback, Reason};
-handle_error(Type, Reason, true) ->
-    erlang:raise(Type, Reason, erlang:get_stacktrace()).
-
 sync_on_error(C, Error = {error, _}) ->
     ok = sync(C),
     Error;