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 + -
显示快捷键?