Просмотр исходного кода

Merge pull request #163 from seriyps/otp-21-compat

Compatibility with Erlang 21
Sergey Prokhorov 7 лет назад
Родитель
Сommit
d42ae2ee48
3 измененных файлов с 20 добавлено и 11 удалено
  1. 4 3
      .travis.yml
  2. 2 1
      rebar.config
  3. 14 7
      src/epgsql.erl

+ 4 - 3
.travis.yml

@@ -9,10 +9,11 @@ env:
 install: "true"
 language: erlang
 otp_release:
-  - 20.0
-  - 19.1
+  - 21.0
+  - 20.3
+  - 19.3
   - 18.3
-  - 17.4
+  - 17.5
   - R16B03-1
 script:
   - make elvis

+ 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;