%%%-------------------------------------------------------------------
%%% @doc barrel_db_sup - Dynamic supervisor for database processes
%%%
%%% Manages individual database server processes using simple_one_for_one
%%% strategy for dynamic child management.
%%% @end
%%%-------------------------------------------------------------------
-module(barrel_db_sup).
-behaviour(supervisor).
%% API
-export([start_link/0]).
-export([start_db/2, stop_db/1]).
%% Supervisor callbacks
-export([init/1]).
-define(SERVER, ?MODULE).
%%====================================================================
%% API functions
%%====================================================================
%% @doc Start the database supervisor
-spec start_link() -> {ok, pid()} | {error, term()}.
start_link() ->
supervisor:start_link({local, ?SERVER}, ?MODULE, []).
%% @doc Start a new database server
-spec start_db(binary(), map()) -> {ok, pid()} | {error, term()}.
start_db(Name, Config) ->
supervisor:start_child(?SERVER, [Name, Config]).
%% @doc Stop a database server
-spec stop_db(binary()) -> ok | {error, term()}.
stop_db(Name) ->
case whereis_db(Name) of
undefined ->
{error, not_found};
Pid ->
supervisor:terminate_child(?SERVER, Pid)
end.
%%====================================================================
%% Supervisor callbacks
%%====================================================================
%% @doc Initialize the supervisor with simple_one_for_one strategy
-spec init([]) -> {ok, {supervisor:sup_flags(), [supervisor:child_spec()]}}.
init([]) ->
SupFlags = #{
strategy => simple_one_for_one,
intensity => 5,
period => 60
},
DbServer = #{
id => barrel_db_server,
start => {barrel_db_server, start_link, []},
restart => temporary,
shutdown => 5000,
type => worker,
modules => [barrel_db_server]
},
{ok, {SupFlags, [DbServer]}}.
%%====================================================================
%% Internal functions
%%====================================================================
%% @private Find database server by name
-spec whereis_db(binary()) -> pid() | undefined.
whereis_db(Name) ->
%% Use persistent_term or registry lookup
%% For now, we use a simple approach - this will be enhanced
case persistent_term:get({barrel_db, Name}, undefined) of
undefined -> undefined;
Pid when is_pid(Pid) ->
case is_process_alive(Pid) of
true -> Pid;
false -> undefined
end
end.