Packages

PLM Product Lifecycle Management

Current section

Files

Jump to
bud src adm_kvs.erl
Raw

src/adm_kvs.erl

-module(adm_kvs).
-compile(export_all).
-include_lib("nitro/include/nitro.hrl").
-include_lib("kvs/include/kvs.hrl").
event(init) -> io:format("OK~n"),
[ self() ! {direct,{atom,X}} || X <- [streams,datawin,binders,boot] ],
nitro:update(disc,hd(string:tokens(os:cmd("du -hs Mnesia."++lists:concat([node()])),"\t"))),
nitro:update(ram, case os:type() of
{_,darwin} -> [L,C,R]=string:tokens(lists:filter(fun(X) ->
lists:member(X,"0123456789M") end,os:cmd("top -l 1 -s 0 | grep PhysMem")),"M"),
lists:concat([L,"/",list_to_integer(L)+list_to_integer(R),"M"]);
{_,linux} -> [T,U,_,_,B,C] = lists:sublist(string:tokens(os:cmd("free")," \n"),8,6),
lists:concat([(nitro:to_integer(U)-(nitro:to_integer(B)+nitro:to_integer(C))) div 1000,
"/",nitro:to_integer(T) div 1000,"M"]);
OS -> "Unknown OS: " ++ io_lib:format("~tp",[OS]) end),
nitro:update(date,bpe_date:date_to_string(bpe_date:today())),
nitro:update(enode,lists:concat([node()]));
event({binder,Name}) -> nitro:update(datawin,fold_(table_fold(Name,first(Name),20,[])));
event({stream,Name}) -> Feed = case element(3,kvs:table(Name)) of
true -> feed;
F -> F end,
case kvs:get(Feed,Name) of
{ok,V} -> []; %nitro:update(datawin,fold(Name,element(#container.top,V),20));
_ -> nitro:update(datawin,fold(Name,0,0)) end;
event({atom,X}) -> nitro:update(X,?MODULE:X());
event(U) -> io:format("Unknown Event: ~p~n\n",[U]).
main() -> [].
tables() -> [ element(2,T) || T <- kvs:tables() ].
containers() -> [ element(2,T) || T <- kvs:tables(), element(2,T) == 'writer' orelse element(2,T) == 'reader' ].
iterators() -> [ element(2,T) || T <- kvs:tables(), element(2,T) == 'iter' orelse element(2,T) == 'ite' ].
noniterators() -> [ element(2,T) || T <- kvs:tables(), element(2,T) == 'it' ].
binders_() -> [ X || {X,_}<- kvs:all(writer) ].
bsize(Config) -> 0.
blocks(Config) -> length(Config)+1.
opacity() -> nitro:jse("qi('datawin').style.opacity='0.3';").
setup_window(StrName) -> "setup_window("++StrName++");".
row(Name) -> Config = application:get_env(kvs,Name,[]), StrName = lists:concat([Name]),
#tr{id=Name,cells=[#td{body=#link{onclick=[opacity(),setup_window(StrName)],body=StrName,postback={stream,Name}}},
#td{body=lists:concat([blocks(Config)])},
#td{body=lists:concat([bsize(Config)+mnesia:table_info(Name,size)])}]}.
row2(Name) -> Config = application:get_env(kvs,Name,[]), StrName = lists:concat([Name]),
#tr{id=Name,cells=[#td{body=#link{body=StrName,onclick=opacity(),postback={binder,Name}}},
#td{body=lists:concat([Name])}]}.
row3(Record) ->
Name = element(1,Record),
Id = element(2,Record),
Table = kvs:table(Name),
#tr{id=Id,cells=[#td{body=#b{body=io_lib:format("~tp",[Id])}},
#td{body=nitro:jse(lists:concat([io_lib:format("~tp",[Record])]))}]}.
boot_() ->
#panel{class=wizard,id=boot, body=[#h2{body="BOOT"},
#panel{body="["++string:join([ atom_to_list(T)||T<-tables()],", ")++"]"}]}.
boot() ->
#panel{id=boot, body=[#h2{body="CORE"},
#table{body=[#thead{body=#tr{cells=[#th{body="Name"},#th{body="Size"}]}},
#tbody{body=[row2(Name)||Name<- tables()-- (iterators()++containers()) ]}]}]}.
streams() ->
#panel{id=streams, body=[#h2{body="STREAMS"},
#table{body=[#thead{body=#tr{cells=[#th{body="Name"},#th{body="Blocks"},#th{body="Size"}]}},
#tbody{body=[row(Name)||Name<- iterators() ]}]}]}.
first(Name) -> {atomic,Key} = mnesia:transaction(fun() -> mnesia:first(Name) end), Key.
table_fold(_,_,0,Acc) -> Acc;
table_fold(Name,'$end_of_table',Count,Acc) -> Acc;
table_fold(Name,First,Count,Acc) ->
Data = case kvs:get(Name,First) of
{ok,D} -> D;
_ -> [] end,
{atomic,Key} = mnesia:transaction(fun() -> mnesia:next(Name,First) end),
case Key of '$end_of_table' -> [Data|Acc];
Key -> table_fold(Name,Key,Count-1,[Data|Acc]) end.
datawin() -> fold(group,20,10).
fold_(Traverse) ->
#panel{class=wizard,id=datawin, body=[#h2{body="DATA WINDOW"},
#table{style="width:100%;",
body=[#thead{body=#tr{cells=[#th{body="No"},#th{body="Record"}]}},
#tbody{body=[row3(Record)||Record<- Traverse]},
#tfoot{body=[#th{body=#link{body="prev"}},#th{body=#link{body="next",postback={shift}}}]}
]}]}.
fold(Table,Start,Count) ->
Traverse = [],%kvs:traversal(Table,Start,Count,#iterator.prev,#kvs{mod=store_mnesia}),
fold_(Traverse).
binders() ->
#panel{class=wizard,id=binders, body=[#h2{body="BINDERS"},
#table{body=[#thead{body=#tr{cells=[#th{body="Name"},#th{body="Size"}]}},
#tbody{body=[row2(Name)||Name<- containers()]}]}]}.