epgsql_pool_settings.erl 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. -module(epgsql_pool_settings).
  2. -behavior(gen_server).
  3. -export([start_link/0, get_connection_params/1, set_connection_params/2, get/1, set/2]).
  4. -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).
  5. -include("epgsql_pool.hrl").
  6. -include("otp_types.hrl").
  7. -type(epgsql_pool_settings_key() ::
  8. connection_timeout | query_timeout | pooler_get_worker_timeout | max_reconnect_timeout | min_reconnect_timeout).
  9. %%% module API
  10. -spec start_link() -> gs_start_link_reply().
  11. start_link() ->
  12. gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
  13. -spec get_connection_params(epgsql_pool:pool_name()) -> #epgsql_connection_params{}.
  14. get_connection_params(PoolName) ->
  15. Key = {connection, epgsql_pool_utils:pool_name_to_atom(PoolName)},
  16. case ets:lookup(?MODULE, Key) of
  17. [] -> throw({connection_params_not_found, PoolName});
  18. [{{connection, PoolName}, ConnectionParams}] -> ConnectionParams
  19. end.
  20. -spec set_connection_params(egpsql_pool:pool_name(), #epgsql_connection_params{}) -> ok.
  21. set_connection_params(PoolName, Params) ->
  22. Key = {connection, epgsql_pool_utils:pool_name_to_atom(PoolName)},
  23. gen_server:call(?MODULE, {save, Key, Params}).
  24. -spec get(epgsql_pool_settings_key()) -> integer().
  25. get(Key) ->
  26. case ets:lookup(?MODULE, {settings, Key}) of
  27. [] -> throw({settings_not_found, Key});
  28. [{_, Value}] -> Value
  29. end.
  30. -spec set(epgsql_pool_settings_key(), integer()) -> ok.
  31. set(Key, Value) ->
  32. gen_server:call(?MODULE, {save, {settings, Key}, Value}).
  33. %%% gen_server API
  34. -spec init(gs_args()) -> gs_init_reply().
  35. init([]) ->
  36. T = ets:new(?MODULE, [protected, named_table]),
  37. ets:insert(T, {{settings, connection_timeout}, 10000}),
  38. ets:insert(T, {{settings, query_timeout}, 10000}),
  39. ets:insert(T, {{settings, pooler_get_worker_timeout}, 1000}),
  40. ets:insert(T, {{settings, max_reconnect_timeout}, 3000}),
  41. ets:insert(T, {{settings, min_reconnect_timeout}, 100}),
  42. {ok, T}.
  43. -spec handle_call(gs_request(), gs_from(), gs_reply()) -> gs_call_reply().
  44. handle_call({save, Key, Value}, _From, Table) ->
  45. ets:insert(Table, {Key, Value}),
  46. {reply, ok, Table};
  47. handle_call(Any, _From, State) ->
  48. error_logger:error_msg("unknown call ~p in ~p ~n", [Any, ?MODULE]),
  49. {noreply, State}.
  50. -spec handle_cast(gs_request(), gs_state()) -> gs_cast_reply().
  51. handle_cast(Any, State) ->
  52. error_logger:error_msg("unknown cast ~p in ~p ~n", [Any, ?MODULE]),
  53. {noreply, State}.
  54. -spec handle_info(gs_request(), gs_state()) -> gs_info_reply().
  55. handle_info(stop, State) ->
  56. {stop, normal, State};
  57. handle_info(Request, State) ->
  58. error_logger:error_msg("unknown info ~p in ~p ~n", [Request, ?MODULE]),
  59. {noreply, State}.
  60. -spec terminate(terminate_reason(), gs_state()) -> ok.
  61. terminate(_Reason, _State) ->
  62. ok.
  63. -spec code_change(term(), term(), term()) -> gs_code_change_reply().
  64. code_change(_OldVersion, State, _Extra) ->
  65. {ok, State}.