Yuriy Zhloba 9 лет назад
Родитель
Сommit
1a8a188513
2 измененных файлов с 37 добавлено и 2 удалено
  1. 15 0
      src/epgsql_pool.erl
  2. 22 2
      test/epgsql_pool_SUITE.erl

+ 15 - 0
src/epgsql_pool.erl

@@ -1,6 +1,7 @@
 -module(epgsql_pool).
 -module(epgsql_pool).
 
 
 -export([start/3, stop/1,
 -export([start/3, stop/1,
+         validate_connection_params/1,
          query/2, query/3, query/4,
          query/2, query/3, query/4,
          transaction/2
          transaction/2
         ]).
         ]).
@@ -30,6 +31,20 @@ stop(PoolName) ->
     pooler:rm_pool(epgsql_pool_utils:pool_name_to_atom(PoolName)).
     pooler:rm_pool(epgsql_pool_utils:pool_name_to_atom(PoolName)).
 
 
 
 
+-spec validate_connection_params(#epgsql_connection_params{}) -> ok | {error, term()}.
+validate_connection_params(#epgsql_connection_params{host = Host, port = Port, username = Username,
+                                                     password = Password, database = Database}) ->
+    ConnectionTimeout = epgsql_pool_settings:get(connection_timeout),
+    Res = epgsql:connect(Host, Username, Password,
+                         [{port, Port},
+                          {database, Database},
+                          {timeout, ConnectionTimeout}]),
+    case Res of
+        {ok, Sock} -> epgsql:close(Sock), ok;
+        {error, Reason} -> {error, Reason}
+    end.
+
+
 -spec query(pool_name() | pid(), epgsql:sql_query()) -> epgsql:reply().
 -spec query(pool_name() | pid(), epgsql:sql_query()) -> epgsql:reply().
 query(PoolNameOrWorker, Stmt) ->
 query(PoolNameOrWorker, Stmt) ->
     query(PoolNameOrWorker, Stmt, [], []).
     query(PoolNameOrWorker, Stmt, [], []).

+ 22 - 2
test/epgsql_pool_SUITE.erl

@@ -11,7 +11,7 @@
 
 
 -export([all/0,
 -export([all/0,
          init_per_suite/1, end_per_suite/1, init_per_testcase/2, end_per_testcase/2,
          init_per_suite/1, end_per_suite/1, init_per_testcase/2, end_per_testcase/2,
-         query_test/1, transaction_test/1, reconnect_test/1, timeout_test/1
+         query_test/1, transaction_test/1, reconnect_test/1, timeout_test/1, validate_connection_params_test/1
         ]).
         ]).
 
 
 -define(SELECT_ITEMS_QUERY, "SELECT id, category_id, title, num FROM item ORDER by id ASC").
 -define(SELECT_ITEMS_QUERY, "SELECT id, category_id, title, num FROM item ORDER by id ASC").
@@ -21,7 +21,8 @@ all() ->
     [query_test,
     [query_test,
      transaction_test,
      transaction_test,
      reconnect_test,
      reconnect_test,
-     timeout_test
+     timeout_test,
+     validate_connection_params_test
     ].
     ].
 
 
 
 
@@ -173,3 +174,22 @@ timeout_test(_Config) ->
     ct:pal("Res2:~p", [Res2]),
     ct:pal("Res2:~p", [Res2]),
     ?assertEqual({error, timeout}, Res2),
     ?assertEqual({error, timeout}, Res2),
     ok.
     ok.
+
+
+validate_connection_params_test(_Config) ->
+    Params1 = #epgsql_connection_params{host = "localhost", port = 5432, username = "test", password = "test", database = "testdb"},
+    Res1 = epgsql_pool:validate_connection_params(Params1),
+    ct:pal("Res1: ~p", [Res1]),
+    ?assertEqual(ok, Res1),
+
+    Params2 = #epgsql_connection_params{host = "localhost", port = 5432, username = "test", password = "some", database = "testdb"},
+    Res2 = epgsql_pool:validate_connection_params(Params2),
+    ct:pal("Res2: ~p", [Res2]),
+    ?assertEqual({error,invalid_password}, Res2),
+
+    Params3 = #epgsql_connection_params{host = "localhost", port = 5432, username = "test", password = "test", database = "some"},
+    Res3 = epgsql_pool:validate_connection_params(Params3),
+    ct:pal("Res3: ~p", [Res3]),
+    ?assertEqual({error,{error,fatal,<<"3D000">>,<<"database \"some\" does not exist">>, []}}, Res3),
+
+    ok.