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

error handler callback for equery

Yuriy Zhloba 9 лет назад
Родитель
Сommit
81f3f1d874
2 измененных файлов с 36 добавлено и 3 удалено
  1. 10 1
      src/epgsql_pool.erl
  2. 26 2
      test/epgsql_pool_SUITE.erl

+ 10 - 1
src/epgsql_pool.erl

@@ -1,7 +1,7 @@
 -module(epgsql_pool).
 
 -export([start/3, stop/1,
-         equery/2, equery/3,
+         equery/2, equery/3, equery/4,
          transaction/2
         ]).
 
@@ -56,6 +56,15 @@ equery(PoolName, Stmt, Params) ->
                 end).
 
 
+-spec equery(pool_name() | pid(), epgsql:sql_query(), [epgsql:bind_param()], fun()) -> epgsql:reply().
+equery(PoolName, Stmt, Params, ErrorHandler) ->
+    Res = equery(PoolName, Stmt, Params),
+    case Res of
+        {error, Error} -> ErrorHandler(PoolName, Stmt, Params, Error);
+        _ -> Res
+    end.
+
+
 -spec transaction(pool_name(), fun()) -> epgsql:reply() | {error, term()}.
 transaction(PoolName0, Fun) ->
     PoolName = epgsql_pool_utils:pool_name_to_atom(PoolName0),

+ 26 - 2
test/epgsql_pool_SUITE.erl

@@ -4,13 +4,14 @@
 %% and database should be inited with ./testdb_schema.sql
 
 -include("epgsql_pool.hrl").
+-include_lib("epgsql/include/epgsql.hrl").
 -include_lib("common_test/include/ct.hrl").
 -include_lib("eunit/include/eunit.hrl").
 
 
 -export([all/0,
          init_per_suite/1, end_per_suite/1, init_per_testcase/2, end_per_testcase/2,
-         equery_test/1, transaction_test/1, reconnect_test/1
+         equery_test/1, transaction_test/1, reconnect_test/1, error_handler_test/1
         ]).
 
 -define(SELECT_ITEMS_QUERY, "SELECT id, category_id, title, num FROM item ORDER by id ASC").
@@ -19,7 +20,8 @@
 all() ->
     [equery_test,
      transaction_test,
-     reconnect_test
+     reconnect_test,
+     error_handler_test
     ].
 
 
@@ -151,3 +153,25 @@ reconnect_test(Config) ->
 
     ?assertNotEqual(Sock1, Sock2),
     ok.
+
+
+error_handler_test(Config) ->
+    {error, Error} = epgsql_pool:equery(my_pool, "SELECT id, title FROM some_table"),
+    ct:pal("Error:~p", [Error]),
+    ?assertMatch(#error{severity = error, message = <<"relation \"some_table\" does not exist">>}, Error),
+
+    Query2 = "SELECT some_field FROM item WHERE id = $1",
+    ErrorMessage2 = <<"column \"some_field\" does not exist">>,
+    ErrorHandler = fun(PoolName, Stmt, Params, Error2) ->
+                           ct:pal("ErrorHandler: ~p", [Error2]),
+                           ?assertEqual(my_pool, PoolName),
+                           ?assertEqual(Query2, Stmt),
+                           ?assertEqual([1], Params),
+                           ?assertMatch(#error{severity = error, message = ErrorMessage2}, Error2),
+                           {db_error, Error2#error.message}
+                   end,
+    Res = epgsql_pool:equery(my_pool, Query2, [1], ErrorHandler),
+    ct:pal("Res:~p", [Res]),
+    ?assertEqual({db_error, ErrorMessage2}, Res),
+
+    ok.