Current section

Files

Jump to
xprof_gui src xprof_gui_favourites.erl
Raw

src/xprof_gui_favourites.erl

-module(xprof_gui_favourites).
-behaviour(gen_server).
-export([start_link/0]).
%% gen_server callbacks
-export([init/1,
handle_call/3,
handle_cast/2,
handle_info/2,
terminate/2,
code_change/3]).
-export([get_all/0, remove/1, add/1, reload/0]).
-record(state, {queries}).
start_link() ->
gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
get_all() ->
Queries = gen_server:call(?MODULE, get_all),
get_xprof_queries(Queries).
remove(XprofQuery) when is_binary(XprofQuery)->
remove(binary:bin_to_list(XprofQuery));
remove(XprofQuery) ->
Queries = gen_server:call(?MODULE, {remove, XprofQuery}),
get_xprof_queries(Queries).
add(XprofQuery) when is_binary(XprofQuery)->
add(binary:bin_to_list(XprofQuery));
add(XprofQuery) ->
Queries = gen_server:call(?MODULE, {add, XprofQuery}),
get_xprof_queries(Queries).
reload() ->
gen_server:call(?MODULE, reload).
init([]) ->
{Status, Queries} = xprof_gui_favourites_config:load_queries(),
{Status, #state{queries = lists:usort(Queries)}}.
handle_call(reload, _From, State) ->
{Status, Queries} = xprof_gui_favourites_config:load_queries(),
{reply, Status, State#state{queries = lists:usort(Queries)}};
handle_call({remove, XprofQuery}, _From, State = #state{queries = Queries}) ->
UpdatedQueries = lists:filter(fun (Q) -> filter_query(Q, XprofQuery) end, Queries),
xprof_gui_favourites_config:save_queries(UpdatedQueries),
{reply, UpdatedQueries, State#state{queries = UpdatedQueries}};
handle_call({add, XprofQuery}, _From, State = #state{queries = Queries}) ->
NewQuery = {query, [{xprof_query, XprofQuery}]},
UpdatedQueries = lists:umerge([NewQuery], Queries),
xprof_gui_favourites_config:save_queries(UpdatedQueries),
{reply, UpdatedQueries, State#state{queries = UpdatedQueries}};
handle_call(get_all, _From, State = #state{queries = Queries}) ->
{reply, Queries, State};
handle_call(_Request, _From, State) ->
{reply, ignored, State}.
handle_cast(_Msg, State) ->
{noreply, State}.
handle_info(_Info, State) ->
{noreply, State}.
terminate(_Reason, _State) ->
ok.
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
get_xprof_queries(Queries) ->
XprofQueries = lists:map(fun xprof_query/1, Queries),
lists:map(fun binary:list_to_bin/1, XprofQueries).
xprof_query({query, Config}) ->
proplists:get_value(xprof_query, Config).
filter_query(Query, XprofQuery) ->
case xprof_query(Query) of
XprofQuery -> false;
_ -> true
end.