tv_info.erl

来自「OTP是开放电信平台的简称」· ERL 代码 · 共 878 行 · 第 1/2 页

ERL
878
字号
%% ``The contents of this file are subject to the Erlang Public License,%% Version 1.1, (the "License"); you may not use this file except in%% compliance with the License. You should have received a copy of the%% Erlang Public License along with this software. If not, it can be%% retrieved via the world wide web at http://www.erlang.org/.%% %% Software distributed under the License is distributed on an "AS IS"%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See%% the License for the specific language governing rights and limitations%% under the License.%% %% The Initial Developer of the Original Code is Ericsson Utvecklings AB.%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings%% AB. All Rights Reserved.''%% %%     $Id$%%-module(tv_info).-export([info/6	]).-include("tv_int_def.hrl").-include("tv_int_msg.hrl").-define(DEFAULT_BG_COLOR, {217, 217, 217}).-record(card_field_ids, {parent_pid,			 window_id,			 window_frame,			 table_id,			 table_type,			 table_name,			 named_table,			 owner_pid,			 owner_name,			 bag_or_set,			 arity,			 attributes,			 wild_pattern,			 keypos,			 index,			 snmp,			 protection,			 size, 			 memory,			 storage_type,			 disc_copies,			 where_to_read,			 ram_copies,			 disc_only_copies,			 where_to_write,			 checkpoints,			 node			}).	       -define(WINDOW_WIDTH, 580).-define(WINDOW_HEIGHT, 430).-define(MNESIA_INFO_ITEMS, [type,			    arity,			    attributes,			    index,			    size,			    memory,			    storage_type,			    where_to_read,			    disc_copies,			    disc_only_copies,			    ram_copies,			    where_to_write,			    checkpoints			   ]).info(Master, Node, LocalNode, TabId, TabType, ErrMsgMode) ->    process_flag(trap_exit,true),    WinId = create_window(),    {CardIds, MaskLabel} = init(Master, Node, LocalNode, TabId, TabType, WinId),    put(error_msg_mode, ErrMsgMode),    gs:config(WinId, [{map, true}]),    loop(CardIds, MaskLabel, Node, LocalNode, TabId, TabType).create_window() ->    WinWidth = ?WINDOW_WIDTH,    WinHeight = ?WINDOW_HEIGHT,    Win = gs:window(win, gs:start(), [{width, WinWidth},				      {height, WinHeight},				      {bg, ?DEFAULT_BG_COLOR},				      {destroy, true},				      {configure, true},				      {keypress, true}				     ]),    MenubarId = gs:create(menubar, Win, [{bg, ?DEFAULT_BG_COLOR}					]),    Mbutt = gs:create(menubutton, MenubarId, [{bg, ?DEFAULT_BG_COLOR},					      {fg, {178, 34, 34}},  % firebrick					      {label, {text, " File "}},					      {underline, 1}					     ]),    Obutt = gs:create(menubutton, MenubarId, [{bg, ?DEFAULT_BG_COLOR},					      {fg, {178, 34, 34}},  % firebrick					      {label, {text, " Options "}},					      {underline, 1}					     ]),       % Create the actual menu!    FMenu = gs:create(menu, Mbutt, [{bg, ?DEFAULT_BG_COLOR},				   {fg, {178, 34, 34}}]),     OMenu = gs:create(menu, Obutt, [{bg, ?DEFAULT_BG_COLOR},				   {fg, {178, 34, 34}}]),     gs:create(menuitem, FMenu, [{bg, ?DEFAULT_BG_COLOR},				{fg, {178, 34, 34}},				{label, {text, " Close    Ctrl-C "}},				{data, close_menu},				{underline, 1}			       ]),    gs:create(menuitem, OMenu, [{bg, ?DEFAULT_BG_COLOR},				{fg, {178, 34, 34}},				{label, {text, " Refresh    Ctrl-R "}},				{data, update},				{underline, 1}			       ]),    Win.    init(Master, Node, LocalNode, TabId, TabType, WinId) ->    WinWidth  = ?WINDOW_WIDTH,    WinHeight = ?WINDOW_HEIGHT,    WinFrame = gs:frame(WinId, [{width, WinWidth},				{height, WinHeight},				{x, 0},				{y, 30},				{bg, ?DEFAULT_BG_COLOR},				{bw, 0}			       ]),    TableIdFlap       = create_flap(1, "Table Id", WinFrame),    BasicSettingsFlap = create_flap(2, "Basic Settings", WinFrame),    SizeFlap          = create_flap(3, "Size", WinFrame),    StorageFlap       = create_flap(4, "Storage", WinFrame),    TableIdCard       = create_card(WinFrame, TableIdFlap),    BasicSettingsCard = create_card(WinFrame, BasicSettingsFlap),    SizeCard          = create_card(WinFrame, SizeFlap),    StorageCard       = create_card(WinFrame, StorageFlap),            set_flap_label(TableIdFlap, "Table Id"),    set_flap_label(BasicSettingsFlap, "Basic Settings"),    set_flap_label(SizeFlap, "Size"),    set_flap_label(StorageFlap, "Storage"),    gs:config(TableIdCard, [raise]),    CardIds = print_cards(TabType, TableIdCard, BasicSettingsCard, SizeCard, StorageCard),    {_CardId, FirstMaskXpos} = gs:read(TableIdFlap, data),    Mask = gs:label(WinFrame, [{width, gs:read(TableIdFlap, width) - 2 * gs:read(TableIdFlap, bw) + 1},			       {height, gs:read(TableIdCard, bw)},			       {x, FirstMaskXpos},			       {y, gs:read(TableIdCard, y)},			       {bg, ?DEFAULT_BG_COLOR}			      ]),    update_info_flaps(TabType, Node, LocalNode, TabId, CardIds, Master),    {CardIds#card_field_ids{parent_pid   = Master,			    window_id    = WinId, 			    window_frame = WinFrame}, Mask}.    check_node(OldNode, LocalNode) ->    HomeNode = node(),    case net_adm:ping(OldNode) of	pong ->	    OldNode;	pang when LocalNode ->  	       %% The system has gone either distributed or undistributed.	       %% No matter which, HomeNode tells the current correct node.	    HomeNode;	pang ->	    OldNode    end.update_data_field(notext, {label, Id}) ->    gs:config(Id, [{label, {text, "" }}]);update_data_field(notext, {listbox, Id}) ->    gs:config(Id, [{items, []}]);update_data_field({Data}, {label, Id}) ->    gs:config(Id, [{label, {text, " " ++ lists:flatten(io_lib:write(Data))}}]);update_data_field({Data}, {listbox, Id}) ->    gs:config(Id, [{items, lists:map(fun(E) -> " " ++ lists:flatten(io_lib:write(E)) 				     end, Data)}]).        print_info(mnesia, Node, LocalNode, TabId, CardIds) ->    update_data_field({mnesia}, 		      CardIds#card_field_ids.table_type),    update_data_field({TabId}, 		      CardIds#card_field_ids.table_name),    update_data_field({tv_mnesia_rpc:table_info(Node, LocalNode, TabId, type)}, 		      CardIds#card_field_ids.bag_or_set),    update_data_field({tv_mnesia_rpc:table_info(Node, LocalNode, TabId, arity) - 1}, 		      CardIds#card_field_ids.arity),    AttributesList = tv_mnesia_rpc:table_info(Node, LocalNode, TabId, attributes),    update_data_field({AttributesList}, 		      CardIds#card_field_ids.attributes),    update_data_field({lists:map(fun(N) -> 					 lists:nth(N - 1, AttributesList) 				 end, 				 [2] ++ tv_mnesia_rpc:table_info(Node, 								 LocalNode, 								 TabId, 								 index)				)		      }, 		      CardIds#card_field_ids.index),    update_data_field({tv_mnesia_rpc:table_info(Node, LocalNode, TabId, size)}, 		      CardIds#card_field_ids.size),    update_data_field({tv_mnesia_rpc:table_info(Node, LocalNode, TabId, memory)}, 		      CardIds#card_field_ids.memory),    update_data_field({tv_mnesia_rpc:table_info(Node, LocalNode, TabId, storage_type)}, 		      CardIds#card_field_ids.storage_type),    update_data_field({tv_mnesia_rpc:table_info(Node, LocalNode, TabId, where_to_read)}, 		      CardIds#card_field_ids.where_to_read),    update_data_field({tv_mnesia_rpc:table_info(Node, LocalNode, TabId, disc_copies)}, 		      CardIds#card_field_ids.disc_copies),    update_data_field({tv_mnesia_rpc:table_info(Node, LocalNode, TabId, disc_only_copies)}, 		      CardIds#card_field_ids.disc_only_copies),    update_data_field({tv_mnesia_rpc:table_info(Node, LocalNode, TabId, ram_copies)}, 		      CardIds#card_field_ids.ram_copies),    update_data_field({tv_mnesia_rpc:table_info(Node, LocalNode, TabId, where_to_write)}, 		      CardIds#card_field_ids.where_to_write),    update_data_field({tv_mnesia_rpc:table_info(Node, LocalNode, TabId, checkpoints)}, 		      CardIds#card_field_ids.checkpoints),    {ok, TabId};print_info(ets, Node, LocalNode, TabId, CardIds) ->    update_data_field({ets}, 		      CardIds#card_field_ids.table_type),    update_data_field({TabId}, 		      CardIds#card_field_ids.table_id),    TabName = tv_ets_rpc:info(Node, LocalNode, TabId, name),    update_data_field({TabName}, 		      CardIds#card_field_ids.table_name),    update_data_field({tv_ets_rpc:info(Node, LocalNode, TabId, named_table)}, 		      CardIds#card_field_ids.named_table),    OwnerPid              = tv_ets_rpc:info(Node, LocalNode, TabId, owner),    OwnerNameSearchResult = lists:keysearch(registered_name, 					    1, 					    rpc:block_call(Node, 							   erlang, 							   process_info, 							   [OwnerPid])),    OwnerName             = case OwnerNameSearchResult of				false ->				    notext;				{value, {registered_name, WantedName}} ->				    {WantedName}			    end,    update_data_field({OwnerPid}, 		      CardIds#card_field_ids.owner_pid),    update_data_field(OwnerName, 		      CardIds#card_field_ids.owner_name),        update_data_field({tv_ets_rpc:info(Node, LocalNode, TabId, keypos)},  		      CardIds#card_field_ids.keypos),    update_data_field({tv_ets_rpc:info(Node, LocalNode, TabId, type)},  		      CardIds#card_field_ids.bag_or_set),    update_data_field({tv_ets_rpc:info(Node, LocalNode, TabId, protection)},  		      CardIds#card_field_ids.protection),    update_data_field({tv_ets_rpc:info(Node, LocalNode, TabId, size)}, 		      CardIds#card_field_ids.size),    update_data_field({tv_ets_rpc:info(Node, LocalNode, TabId, memory)},  		      CardIds#card_field_ids.memory),    update_data_field({tv_ets_rpc:info(Node, LocalNode, TabId, node)}, 		      CardIds#card_field_ids.node),    {ok, TabName}.    print_cards(mnesia, Card1, Card2, Card3, Card4) ->    create_card_text(1, "Table Type:", Card1),    create_card_text(2, "Table Name:", Card1),        create_card_text(1, "Table Type:", Card2),    create_card_text(2, "Number of Attributes:", Card2),%    create_card_text(3, "Attribute Names:", Card2),%    create_card_text(4, "Index Positions:", Card2),    create_card_text(1, "Number of Elements Stored:", Card3),    create_card_text(2, "Number of Words Allocated:", Card3),    create_card_text(1, "Local Storage Type:", Card4),    create_card_text(2, "Table Readable at Node:", Card4),%    create_card_text(3, "Disc Copy Nodes:", Card4),%    create_card_text(4, "Disc Copy Only Nodes:", Card4),%    create_card_text(5, "RAM Copy Nodes:", Card4),%    create_card_text(6, "Active Table Replica Nodes:", Card4),%    create_card_text(7, "Active Checkpoints:", Card4),        {AttributesId, IndexId} = create_special_fields(mnesia, size_card, Card2),        {DiscCopiesId, DiscOnlyCopiesId, RamCopiesId, WhereToWriteId, CheckpointsId} = 	create_special_fields(mnesia, storage_card, Card4),    #card_field_ids{table_name       = {label, create_card_data_field(2, Card1)},		    table_type       = {label, create_card_data_field(1, Card1)},		    bag_or_set       = {label, create_card_data_field(1, Card2)},		    arity            = {label, create_card_data_field(2, Card2)},		    attributes       = AttributesId,		    index            = IndexId,		    size             = {label, create_card_data_field(1, Card3)},		    memory           = {label, create_card_data_field(2, Card3)},		    storage_type     = {label, create_card_data_field(1, Card4)},		    where_to_read    = {label, create_card_data_field(2, Card4)},		    disc_copies      = DiscCopiesId,		    disc_only_copies = DiscOnlyCopiesId,		    ram_copies       = RamCopiesId,		    where_to_write   = WhereToWriteId,		    checkpoints      = CheckpointsId		   };print_cards(ets, Card1, Card2, Card3, Card4) ->    create_card_text(1, "Table Type:", Card1),    create_card_text(2, "Table Id:", Card1),    create_card_text(3, "Table Name:", Card1),    create_card_text(4, "Table Name Registered:", Card1),    create_card_text(5, "Process Owning the Table:", Card1),    create_card_text(6, "Name of Owning Process:", Card1),    create_card_text(1, "Index Position:", Card2),    create_card_text(2, "Table Type:", Card2),    create_card_text(3, "Protection Mode:", Card2),        create_card_text(1, "Number of Elements Stored:", Card3),    create_card_text(2, "Number of Words Allocated:", Card3),        create_card_text(1, "Table Stored at Node:", Card4),        #card_field_ids{table_id    = {label, create_card_data_field(2, Card1)},		    table_type  = {label, create_card_data_field(1, Card1)},		    table_name  = {label, create_card_data_field(3, Card1)},		    named_table = {label, create_card_data_field(4, Card1)},		    owner_pid   = {label, create_card_data_field(5, Card1)},		    owner_name  = {label, create_card_data_field(6, Card1)},		    	       			      		    keypos      = {label, create_card_data_field(1, Card2)},		    bag_or_set  = {label, create_card_data_field(2, Card2)},		    protection  = {label, create_card_data_field(3, Card2)},			       			      		    size        = {label, create_card_data_field(1, Card3)},		    memory      = {label, create_card_data_field(2, Card3)},			       			      		    node        = {label, create_card_data_field(1, Card4)}		   }.    create_special_fields(mnesia, size_card, CardId) ->    LabelWidth      = 195,    LabelHeight     = 24,    ListboxWidth    = 210,    ListboxHeight   = 160,    VerticalSpacing = 20,    LXpos           = 30,    RXpos           = 330,    Ypos            = 40 + (LabelHeight + VerticalSpacing) * 2 + 25,    gs:label(CardId, [{width, LabelWidth},		      {height, LabelHeight},		      {x, LXpos},		      {y, Ypos},		      {bg, ?DEFAULT_BG_COLOR},		      {fg, {0, 0, 0}},		      {align, center},		      {label, {text, "Attribute Names:"}}		    ]),        gs:label(CardId, [{width, LabelWidth},		      {height, LabelHeight},		      {x, RXpos},		      {y, Ypos},		      {bg, ?DEFAULT_BG_COLOR},		      {fg, {0, 0, 0}},		      {align, center},		      {label, {text, "Attributes Used as Indices:"}}		     ]),        AttributesId = gs:listbox(CardId, [{width, ListboxWidth},				       {height, ListboxHeight},				       {x, LXpos},				       {y, Ypos + LabelHeight - 3},				       {bg, {255, 255, 255}},

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?