-module(toth).
-export([sys_table_view/1]).
%%% Constants
-define(sysTabETS,1).
-define(sysTabMnesia,2).
-define(sysTabBoth,3).
sys_table_view([CpId,{match,Pattern},TableType, ViewType]) ->
AllTableList =
case TableType of
?sysTabMnesia ->
lists:sort(mnesia:system_info(tables));
?sysTabBoth ->
lists:sort(rpc:call(CpId,ets,all,[]));
?sysTabETS ->
lists:sort(rpc:call(CpId,ets,all,[]) --
mnesia:system_info(tables));
_ -> %%% Happens at registration only
[ok]
end,
%% Filter the matching table names, skip unnamed tables first:
NamedTableList = lists:filter(fun (X) -> is_atom(X) end, AllTableList),
TablesShown =
case Pattern of
"" ->
NamedTableList;
_ ->
%% Filter the ones whose name begins with the Pattern:
Filter = fun(T) ->
lists:prefix(Pattern, atom_to_list(T))
end,
lists:filter(Filter, NamedTableList)
end,
Fields = [{text, [{value,"CpId: " ++ atom_to_list(CpId)}]},
{text, [{value,"TabSpec=" ++ Pattern},
{value_format, term}]},
{text, [{value,"Table type: " ++ formatTableType(TableType)},
{value_format, term}]}],
Template = [[{type, index},
{link, {?MODULE, sys_table_browse,
[{"CpId",CpId},{"TableType",TableType},
{"View", ViewType},
{"FirstKey",1}, {"KeyPattern",""}]}}],
[{type, data},
{title, "Table name"},
{display_value, {erlang, atom_to_list}}], %%% else crash
[{type,data},
{title, "No of rows"},
{display_value, term}],
[{type,data},
{title, "Memory"},
{display_value, term}]
],
TableAttr = [{rows, [[T,T|tableSize(T,TableType,CpId)] ||
T <- TablesShown]},
{template,Template}],
Page = [{header, {"Filter tables", "Selected tables"}},
{buttons, [reload, back]},
{layout, [{form, Fields},
{table, TableAttr}]}
],
Page.
%%--------------------------------------------------------------------
%% tableSize/3
%% @spec tableSize(T::atom(),TableType::integer(),CpId::atom()) ->
%% list(integer())
%% @doc Return the table size and memory size of the table.
%% @end
%%---------------------------------------------------------------------
tableSize(T, TableType, CpId) ->
case TableType of
?sysTabETS ->
[rpc:call(CpId, ets, info, [T, size]),
rpc:call(CpId, ets, info, [T, memory])];
?sysTabMnesia ->
[mnesia:table_info(T, size),mnesia:table_info(T, memory)];
_ -> %%% Registration
[0,0]
end.
formatTableType(T) ->
case T of
?sysTabETS ->
"ETS";
?sysTabMnesia ->
"mnesia";
_ -> %%% Registration !
"ETS + mnesia"
end.