|
@@ -0,0 +1,112 @@
|
|
|
|
+-module(epgsql_pool_settings).
|
|
|
|
+-behavior(gen_server).
|
|
|
|
+
|
|
|
|
+-export([start_link/0, get_connection_params/1, set_connection_params/2, get/1, set/2]).
|
|
|
|
+-export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).
|
|
|
|
+
|
|
|
|
+-include("epgsql_pool.hrl").
|
|
|
|
+-include("otp_types.hrl").
|
|
|
|
+
|
|
|
|
+-import(epgsql_pool_utils, [pool_name_to_atom/1]).
|
|
|
|
+
|
|
|
|
+-record(state, {
|
|
|
|
+ connection_params :: orddict:orddictr(),
|
|
|
|
+ settings :: orddict:orddict()
|
|
|
|
+ }).
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+%%% module API
|
|
|
|
+
|
|
|
|
+-spec start_link() -> gs_start_link_reply().
|
|
|
|
+start_link() ->
|
|
|
|
+ gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+-spec get_connection_params(pool_name()) -> #epgsql_connection_params{}. % or throw({connection_params_not_found, PoolName})
|
|
|
|
+get_connection_params(PoolName) ->
|
|
|
|
+ gen_server:call(?MODULE, {get_connection_params, pool_name_to_atom(PoolName)}).
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+-spec set_connection_params(pool_name(), #epgsql_connection_params{}) -> ok.
|
|
|
|
+set_connection_params(PoolName, Params) ->
|
|
|
|
+ gen_server:call(?MODULE, {set_connection_params, pool_name_to_atom(PoolName), Params}).
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+-spec get(atom()) -> integer(). % or throw({settings_not_found, Key})
|
|
|
|
+get(Key) ->
|
|
|
|
+ gen_server:call(?MODULE, {get, Key}).
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+-spec set(atom(), integer()) -> ok. % or throw({settings_not_found, Key})
|
|
|
|
+set(Key, Value) ->
|
|
|
|
+ gen_server:call(?MODULE, {set, Key, Value}).
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+%%% gen_server API
|
|
|
|
+
|
|
|
|
+-spec init(gs_args()) -> gs_init_reply().
|
|
|
|
+init([]) ->
|
|
|
|
+ {ok, #state{connection_params = orddict:new(),
|
|
|
|
+ settings = orddict:from_list(
|
|
|
|
+ [{query_timeout, 10000},
|
|
|
|
+ {pooler_get_worker_timeout, 1000},
|
|
|
|
+ {max_reconnect_timeout, 3000},
|
|
|
|
+ {min_reconnect_timeout, 100}
|
|
|
|
+ ])}}.
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+-spec handle_call(gs_request(), gs_from(), gs_reply()) -> gs_call_reply().
|
|
|
|
+handle_call({get_connection_params, PoolName}, _From,
|
|
|
|
+ #state{connection_params = ConnectionParams} = State) ->
|
|
|
|
+ Reply = case orddict:find(PoolName, ConnectionParams) of
|
|
|
|
+ {ok, Params} -> Params;
|
|
|
|
+ error -> throw({connection_params_not_found, PoolName})
|
|
|
|
+ end,
|
|
|
|
+ {reply, Reply, State};
|
|
|
|
+
|
|
|
|
+handle_call({set_connection_params, PoolName, Params}, _From,
|
|
|
|
+ #state{connection_params = ConnectionParams} = State) ->
|
|
|
|
+ ConnectionParams2 = orddict:store(PoolName, Params, ConnectionParams),
|
|
|
|
+ {reply, ok, State#state{connection_params = ConnectionParams2}};
|
|
|
|
+
|
|
|
|
+handle_call({get, Key}, _From,
|
|
|
|
+ #state{settings = Settings} = State) ->
|
|
|
|
+ Reply = case orddict:find(Key, Settings) of
|
|
|
|
+ {ok, Value} -> Value;
|
|
|
|
+ error -> throw({settings_not_found, Key})
|
|
|
|
+ end,
|
|
|
|
+ {reply, Reply, State};
|
|
|
|
+
|
|
|
|
+handle_call({set, Key, Value}, _From,
|
|
|
|
+ #state{settings = Settings} = State) ->
|
|
|
|
+ Settings2 = case orddict:find(Key, Settings) of
|
|
|
|
+ {ok, _} -> orddict:store(Key, Value, Settings);
|
|
|
|
+ error -> throw({settings_not_found, Key})
|
|
|
|
+ end,
|
|
|
|
+ {reply, ok, State#state{settings = Settings2}};
|
|
|
|
+
|
|
|
|
+handle_call(Any, _From, State) ->
|
|
|
|
+ error_logger:error_msg("unknown call ~p in ~p ~n", [Any, ?MODULE]),
|
|
|
|
+ {noreply, State}.
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+-spec handle_cast(gs_request(), gs_state()) -> gs_cast_reply().
|
|
|
|
+handle_cast(Any, State) ->
|
|
|
|
+ error_logger:error_msg("unknown cast ~p in ~p ~n", [Any, ?MODULE]),
|
|
|
|
+ {noreply, State}.
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+-spec handle_info(gs_request(), gs_state()) -> gs_info_reply().
|
|
|
|
+handle_info(Request, State) ->
|
|
|
|
+ error_logger:error_msg("unknown info ~p in ~p ~n", [Request, ?MODULE]),
|
|
|
|
+ {noreply, State}.
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+-spec terminate(terminate_reason(), gs_state()) -> ok.
|
|
|
|
+terminate(_Reason, _State) ->
|
|
|
|
+ ok.
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+-spec code_change(term(), term(), term()) -> gs_code_change_reply().
|
|
|
|
+code_change(_OldVersion, State, _Extra) ->
|
|
|
|
+ {ok, State}.
|