Current section

Files

Jump to
reckon_db src reckon_db_store_mgr.erl
Raw

src/reckon_db_store_mgr.erl

%% @doc Store manager for reckon-db
%%
%% Coordinates store lifecycle and provides store-level operations.
%%
%% @author rgfaber
-module(reckon_db_store_mgr).
-behaviour(gen_server).
-include("reckon_db.hrl").
%% API
-export([start_link/1]).
-export([get_info/1]).
%% gen_server callbacks
-export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2]).
-record(state, {
store_id :: atom(),
config :: store_config()
}).
%%====================================================================
%% API
%%====================================================================
%% @doc Start the store manager
-spec start_link(store_config()) -> {ok, pid()} | {error, term()}.
start_link(#store_config{store_id = StoreId} = Config) ->
Name = reckon_db_naming:store_mgr_name(StoreId),
gen_server:start_link({local, Name}, ?MODULE, Config, []).
%% @doc Get store information
-spec get_info(atom()) -> {ok, map()} | {error, term()}.
get_info(StoreId) ->
Name = reckon_db_naming:store_mgr_name(StoreId),
gen_server:call(Name, get_info).
%%====================================================================
%% gen_server callbacks
%%====================================================================
%% @private
init(#store_config{store_id = StoreId} = Config) ->
logger:debug("Starting store manager for ~p", [StoreId]),
State = #state{
store_id = StoreId,
config = Config
},
{ok, State}.
%% @private
handle_call(get_info, _From, #state{store_id = StoreId, config = Config} = State) ->
Info = #{
store_id => StoreId,
mode => Config#store_config.mode,
data_dir => Config#store_config.data_dir,
ready => reckon_db_store:is_ready(StoreId)
},
{reply, {ok, Info}, State};
handle_call(_Request, _From, State) ->
{reply, {error, unknown_request}, State}.
%% @private
handle_cast(_Msg, State) ->
{noreply, State}.
%% @private
handle_info(_Info, State) ->
{noreply, State}.
%% @private
terminate(_Reason, _State) ->
ok.