diff options
Diffstat (limited to 'src/ejabberd_router_mnesia.erl')
-rw-r--r-- | src/ejabberd_router_mnesia.erl | 71 |
1 files changed, 52 insertions, 19 deletions
diff --git a/src/ejabberd_router_mnesia.erl b/src/ejabberd_router_mnesia.erl index f53541f24..d9946cef5 100644 --- a/src/ejabberd_router_mnesia.erl +++ b/src/ejabberd_router_mnesia.erl @@ -8,32 +8,32 @@ %%%------------------------------------------------------------------- -module(ejabberd_router_mnesia). -behaviour(ejabberd_router). +-behaviour(gen_server). %% API -export([init/0, register_route/4, unregister_route/2, find_routes/1, - host_of_route/1, is_my_route/1, is_my_host/1, get_all_routes/0, - handle_event/1]). + host_of_route/1, is_my_route/1, is_my_host/1, get_all_routes/0]). +%% gen_server callbacks +-export([init/1, handle_cast/2, handle_call/3, handle_info/2, + terminate/2, code_change/3]). -include("ejabberd.hrl"). -include("ejabberd_router.hrl"). -include("logger.hrl"). -include_lib("stdlib/include/ms_transform.hrl"). +-record(state, {}). + %%%=================================================================== %%% API %%%=================================================================== init() -> - update_tables(), - ejabberd_mnesia:create(?MODULE, route, - [{ram_copies, [node()]}, - {type, bag}, - {attributes, record_info(fields, route)}]), - mnesia:add_table_copy(route, node(), ram_copies), - mnesia:subscribe({table, route, simple}), - lists:foreach( - fun (Pid) -> erlang:monitor(process, Pid) end, - mnesia:dirty_select(route, - [{{route, '_', '$1', '_'}, [], ['$1']}])). + case gen_server:start_link({local, ?MODULE}, ?MODULE, [], []) of + {ok, _Pid} -> + ok; + Err -> + Err + end. register_route(Domain, ServerHost, LocalHint, undefined) -> F = fun () -> @@ -135,10 +135,35 @@ get_all_routes() -> when Domain /= ServerHost -> Domain end)). -handle_event({mnesia_table_event, - {write, #route{pid = Pid}, _ActivityId}}) -> - erlang:monitor(process, Pid); -handle_event({'DOWN', _Ref, _Type, Pid, _Info}) -> +%%%=================================================================== +%%% gen_server callbacks +%%%=================================================================== +init([]) -> + update_tables(), + ejabberd_mnesia:create(?MODULE, route, + [{ram_copies, [node()]}, + {type, bag}, + {attributes, record_info(fields, route)}]), + mnesia:add_table_copy(route, node(), ram_copies), + mnesia:subscribe({table, route, simple}), + lists:foreach( + fun (Pid) -> erlang:monitor(process, Pid) end, + mnesia:dirty_select(route, + [{{route, '_', '$1', '_'}, [], ['$1']}])), + {ok, #state{}}. + +handle_call(_Request, _From, State) -> + Reply = ok, + {reply, Reply, State}. + +handle_cast(_Msg, State) -> + {noreply, State}. + +handle_info({mnesia_table_event, + {write, #route{pid = Pid}, _ActivityId}}, State) -> + erlang:monitor(process, Pid), + {noreply, State}; +handle_info({'DOWN', _Ref, _Type, Pid, _Info}, State) -> F = fun () -> Es = mnesia:select(route, [{#route{pid = Pid, _ = '_'}, [], ['$_']}]), @@ -158,10 +183,18 @@ handle_event({'DOWN', _Ref, _Type, Pid, _Info}) -> end end, Es) end, - transaction(F); -handle_event(_Event) -> + transaction(F), + {noreply, State}; +handle_info(Info, State) -> + ?ERROR_MSG("unexpected info: ~p", [Info]), + {noreply, State}. + +terminate(_Reason, _State) -> ok. +code_change(_OldVsn, State, _Extra) -> + {ok, State}. + %%%=================================================================== %%% Internal functions %%%=================================================================== |