def create_ui(self): dprint_ex(3, "Enter") self.suspend_layout() self.warning = not_running_warning_label() self.add(self.warning, False, True) self.connection_list = newTreeView(mforms.TreeDefault) self.connection_list.add_column(mforms.StringColumnType, "Id", 50, False) self.connection_list.add_column(mforms.StringColumnType, "User", 80, False) self.connection_list.add_column(mforms.StringColumnType, "Host", 120, False) self.connection_list.add_column(mforms.StringColumnType, "DB", 100, False) self.connection_list.add_column(mforms.StringColumnType, "Command", 80, False) self.connection_list.add_column(mforms.IntegerColumnType, "Time", 80, False) self.connection_list.add_column(mforms.StringColumnType, "State", 80, False) self.connection_list.add_column(mforms.StringColumnType, "Info", 300, False) self.connection_list.end_columns() self.connection_list.set_allow_sorting(True) self.connection_list.add_changed_callback( weakcb(self, "connection_selected")) #self.set_padding(8) self.add(self.connection_list, True, True) self.button_box = box = newBox(True) self.add(box, False, True) box.set_spacing(12) box.set_padding(12) refresh_button = newButton() refresh_button.set_text("Refresh") box.add_end(refresh_button, False, True) refresh_button.add_clicked_callback(weakcb(self, "refresh")) self.kill_button = newButton() self.kill_button.set_text("Kill Connection") box.add_end(self.kill_button, False, True) self.kill_button.add_clicked_callback(weakcb(self, "kill_connection")) self.killq_button = newButton() self.killq_button.set_text("Kill Query") box.add_end(self.killq_button, False, True) self.killq_button.add_clicked_callback(weakcb(self, "kill_query")) self.add(box, False, True) self.resume_layout() self.connection_selected() dprint_ex(3, "Leave")
def create_ui(self): dprint_ex(3, "Enter") self.suspend_layout() self.warning = not_running_warning_label() self.add(self.warning, False, True) self.connection_list = newTreeView(mforms.TreeDefault) self.connection_list.add_column(mforms.StringColumnType, "Id", 50, False) self.connection_list.add_column(mforms.StringColumnType, "User", 80, False) self.connection_list.add_column(mforms.StringColumnType, "Host", 120, False) self.connection_list.add_column(mforms.StringColumnType, "DB", 100, False) self.connection_list.add_column(mforms.StringColumnType, "Command", 80, False) self.connection_list.add_column(mforms.IntegerColumnType, "Time", 80, False) self.connection_list.add_column(mforms.StringColumnType, "State", 80, False) self.connection_list.add_column(mforms.StringColumnType, "Info", 300, False) self.connection_list.end_columns() self.connection_list.set_allow_sorting(True) self.connection_list.add_changed_callback(weakcb(self, "connection_selected")) #self.set_padding(8) self.add(self.connection_list, True, True) self.button_box = box = newBox(True) self.add(box, False, True) box.set_spacing(12) box.set_padding(12) refresh_button = newButton() refresh_button.set_text("Refresh") box.add_end(refresh_button, False, True) refresh_button.add_clicked_callback(weakcb(self, "refresh")) self.kill_button = newButton() self.kill_button.set_text("Kill Connection") box.add_end(self.kill_button, False, True) self.kill_button.add_clicked_callback(weakcb(self, "kill_connection")) self.killq_button = newButton() self.killq_button.set_text("Kill Query") box.add_end(self.killq_button, False, True) self.killq_button.add_clicked_callback(weakcb(self, "kill_query")) self.add(box, False, True) self.resume_layout() self.connection_selected() dprint_ex(3, "Leave")
def __init__(self, server_instance_settings): AppView.__init__(self, False, "admin", True) server_profile = ServerProfile(server_instance_settings, False) self.ctrl_be = wb_admin_control.WbAdminControl(server_profile, connect_sql=True) self.ctrl_be.init() version = self.ctrl_be.get_server_version() if type(version) is tuple: valid_versions = ((4, 0), (4, 1), (5, 0), (5, 1), (5, 2), (5, 4), (5, 5), (5, 6), (6, 0)) if version[:2] not in valid_versions: print version, "UNSUPPORTED" log_warning( _this_file, "%s: Server version %s is NOT supported\n" % (self.__class__.__name__, str(version)) ) else: log_info(_this_file, "%s: Server version %s is supported\n" % (self.__class__.__name__, str(version))) self.on_close(wb_admin_utils.weakcb(self, "handle_on_close")) # Create sections and add them to the admin page. self.configuration = wb_admin_main.WbAdminMainView(server_profile, self.ctrl_be, self.monitor) self.add(self.configuration, True, True)
def __init__(self, server_instance_settings): AppView.__init__(self, False, "admin", True) server_profile = ServerProfile(server_instance_settings, False) self.ctrl_be = wb_admin_control.WbAdminControl(server_profile, connect_sql=True) self.ctrl_be.init() version = self.ctrl_be.get_server_version() if type(version) is tuple: valid_versions = ((4, 0), (4, 1), (5, 0), (5, 1), (5, 2), (5, 4), (5, 5), (5, 6), (6, 0)) if version[:2] not in valid_versions: print version, "UNSUPPORTED" log_warning( _this_file, "%s: Server version %s is NOT supported\n" % (self.__class__.__name__, str(version))) else: log_info( _this_file, "%s: Server version %s is supported\n" % (self.__class__.__name__, str(version))) self.on_close(wb_admin_utils.weakcb(self, "handle_on_close")) # Create sections and add them to the admin page. self.configuration = wb_admin_main.WbAdminMainView( server_profile, self.ctrl_be, self.monitor) self.add(self.configuration, True, True)
def __init__(self, ctrl_be, server_profile, main_view, editor): mforms.AppView.__init__(self, False, "Administrator", "Administrator", False) self.editor = editor self.owner = main_view self.tabs = [] self.name2page = {} self.config_ui = None self.closing = False self.tabview = newTabView(True) self.ctrl_be = ctrl_be self.old_active_tab = None self.server_profile = server_profile if self.server_profile.host_os == wbaOS.darwin: self.set_back_color( Color.getSystemColor(ControlBackgroundColor).to_html()) # Setup self self.set_managed() self.set_release_on_add() self.on_close(wb_admin_utils.weakcb(self, "handle_on_close")) nc.add_observer(self.handle_server_state_changed, "GRNServerStateChanged", editor) nc.add_observer(self.updateColors, "GNColorsChanged") self.ctrl_be.add_me_for_event("server_started", self) self.ctrl_be.add_me_for_event("server_stopped", self) self.add(self.tabview, True, True) self._timeout_tm = Utilities.add_timeout(0.5, weakcb(self, "timeout")) self.tabview.add_tab_changed_callback(self.tab_changed) self.timeout() # check initial state if editor.isConnected == 1: self.ctrl_be.event_from_main("server_started") elif editor.isConnected == -1: self.ctrl_be.event_from_main("server_offline") self.ctrl_be.continue_events( ) # Process events which are queue during init log_debug("WBA init complete\n")
def __init__(self, ctrl_be, server_profile, main_view, editor): mforms.AppView.__init__(self, False, "administrator", False) self.editor = editor self.owner = main_view self.tabs = [] self.name2page = {} self.config_ui = None self.closing = False self.tabview = newTabView(True) self.ctrl_be = ctrl_be self.old_active_tab = None self.server_profile = server_profile # if we're in the Mac, we need to set the background color of the main view of the tab to white, # so that MTabSwitcher will take the cue and set the tab color to white too if self.server_profile.host_os == wbaOS.darwin: self.set_back_color("#ffffff") # Setup self self.set_managed() self.set_release_on_add() self.on_close(wb_admin_utils.weakcb(self, "handle_on_close")) nc.add_observer(self.handle_server_state_changed, "GRNServerStateChanged", editor) self.ctrl_be.add_me_for_event("server_started", self) self.ctrl_be.add_me_for_event("server_stopped", self) self.add(self.tabview, True, True) self._timeout_tm = Utilities.add_timeout(0.5, weakcb(self, "timeout")) self.tabview.add_tab_changed_callback(self.tab_changed) self.timeout() # check initial state if editor.isConnected == 1: self.ctrl_be.event_from_main("server_started") elif editor.isConnected == -1: self.ctrl_be.event_from_main("server_offline") self.ctrl_be.continue_events( ) # Process events which are queue during init log_debug("WBA init complete\n")
def __init__(self, ctrl_be, server_profile, main_view, editor): mforms.AppView.__init__(self, False, "administrator", False) self.editor = editor self.owner = main_view self.tabs = [] self.name2page = {} self.config_ui = None self.closing = False self.tabview = newTabView(True) self.ctrl_be = ctrl_be self.old_active_tab = None self.server_profile = server_profile # if we're in the Mac, we need to set the background color of the main view of the tab to white, # so that MTabSwitcher will take the cue and set the tab color to white too if self.server_profile.host_os == wbaOS.darwin: self.set_back_color("#ffffff") # Setup self self.set_managed() self.set_release_on_add() self.on_close(wb_admin_utils.weakcb(self, "handle_on_close")) nc.add_observer(self.handle_server_state_changed, "GRNServerStateChanged", editor) self.ctrl_be.add_me_for_event("server_started", self) self.ctrl_be.add_me_for_event("server_stopped", self) self.add(self.tabview, True, True) self._timeout_tm = Utilities.add_timeout(0.5, weakcb(self, "timeout")) self.tabview.add_tab_changed_callback(self.tab_changed) self.timeout() # check initial state if editor.isConnected == 1: self.ctrl_be.event_from_main("server_started") elif editor.isConnected == -1: self.ctrl_be.event_from_main("server_offline") self.ctrl_be.continue_events() # Process events which are queue during init log_debug("WBA init complete\n")
def __init__(self, ctrl_be, server_profile, main_view, editor): mforms.AppView.__init__(self, False, "administrator", False) self.editor = editor self.owner = main_view self.tabs = [] self.name2page = {} self.config_ui = None self.closing = False self.tabview = newTabView(True) self.ctrl_be = ctrl_be self.old_active_tab = None self.server_profile = server_profile self.refresh_tasks_sleep_time = 2 # if we're in the Mac, we need to set the background color of the main view of the tab to white, # so that MTabSwitcher will take the cue and set the tab color to white too if self.server_profile.host_os == wbaOS.darwin: self.set_back_color("#ffffff") # Setup self self.set_managed() self.set_release_on_add() self.on_close(wb_admin_utils.weakcb(self, "handle_on_close")) self.ctrl_be.add_me_for_event("server_started", self) self.ctrl_be.add_me_for_event("server_stopped", self) self.add(self.tabview, True, True) Utilities.add_timeout(0.5, weakcb(self, "timeout")) self.timeout_thread = threading.Thread(target = self.refresh_tasks_thread) self.timeout_thread.setDaemon(True) self.timeout_thread.start() self.tabview.add_tab_changed_callback(self.tab_changed) self.timeout() # will call self.connect_mysql() and check if mysql is running self.ctrl_be.continue_events() # Process events which are queue during init dprint_ex(1, "WBA init complete")
def run_command(self, command, on_finish=lambda: None): if self.stop_callback: self.stop.set_text("Stop") self.stop.set_enabled(True) else: self.stop.set_text("Close") self.stop.set_enabled(False) self.progress_label.set_text("Executing...") if self.progress_parser_callback: self.progress.set_indeterminate(False) self.progress.set_value(0) else: self.progress.set_indeterminate(True) self.progress.start() self._done = False self.queue = Queue() self.finished_callback = on_finish self.task = Task(self.ctrl_be, command, self.queue) self._update_tm = mforms.Utilities.add_timeout(0.5, weakcb(self, "_update")) self.task.start()
def run_command(self, command, on_finish=lambda: None): if self.stop_callback: self.stop.set_text("Stop") self.stop.set_enabled(True) else: self.stop.set_text("Close") self.stop.set_enabled(False) self.progress_label.set_text("Executing...") if self.progress_parser_callback: self.progress.set_indeterminate(False) self.progress.set_value(0) else: self.progress.set_indeterminate(True) self.progress.start() self._done = False self.queue = Queue() self.finished_callback = on_finish self.task = Task(self.ctrl_be, command, self.queue) mforms.Utilities.add_timeout(0.5, weakcb(self, "_update")) self.task.start()
def create_ui(self): dprint_ex(4, "Enter") self.suspend_layout() self.heading = make_panel_header("title_connections.png", self.instance_info.name, "Client Connections") self.add(self.heading, False, False) self.warning = not_running_warning_label() self.add(self.warning, False, True) self.connection_list = newTreeNodeView(mforms.TreeDefault | mforms.TreeFlatList | mforms.TreeAltRowColors) self.connection_list.add_column(mforms.LongIntegerColumnType, "Id", 50, False) self.connection_list.add_column(mforms.StringColumnType, "User", 80, False) self.connection_list.add_column(mforms.StringColumnType, "Host", 120, False) self.connection_list.add_column(mforms.StringColumnType, "DB", 100, False) self.connection_list.add_column(mforms.StringColumnType, "Command", 80, False) self.connection_list.add_column(mforms.LongIntegerColumnType, "Time", 60, False) self.connection_list.add_column(mforms.StringColumnType, "State", 80, False) self.info_column = self.connection_list.add_column( mforms.StringColumnType, "Info", 300, False) self.connection_list.end_columns() self.connection_list.set_allow_sorting(True) self.connection_list.add_changed_callback( weakcb(self, "connection_selected")) #self.set_padding(8) self.add(self.connection_list, True, True) self.button_box = box = newBox(True) box.set_spacing(12) refresh_button = newButton() refresh_button.set_text("Refresh") box.add_end(refresh_button, False, True) refresh_button.add_clicked_callback(weakcb(self, "refresh")) self.kill_button = newButton() self.kill_button.set_text("Kill Connection") box.add_end(self.kill_button, False, True) self.kill_button.add_clicked_callback(weakcb(self, "kill_connection")) self.killq_button = newButton() self.killq_button.set_text("Kill Query") box.add_end(self.killq_button, False, True) self.killq_button.add_clicked_callback(weakcb(self, "kill_query")) refresh_label = newLabel("Refresh Rate:") box.add(refresh_label, False, True) self._menu = mforms.newContextMenu() self._menu.add_item_with_title("Copy Info", self.copy_selected, "copy_selected") self._menu.add_item_with_title("Show in Editor", self.edit_selected, "edit_selected") self.connection_list.set_context_menu(self._menu) self.refresh_values = [0.5, 1, 2, 3, 4, 5, 10, 15, 30] self.refresh_values_size = len(self.refresh_values) self.refresh_selector = newSelector() self.refresh_selector.set_size(100, -1) for s in self.refresh_values: self.refresh_selector.add_item(str(s) + " seconds") self.refresh_selector.add_item("Don't Refresh") refresh_rate_index = grt.root.wb.options.options.get( 'Administrator:refresh_connections_rate_index', 9) self.refresh_selector.set_selected(refresh_rate_index) self.update_refresh_rate() self.refresh_selector.add_changed_callback( weakcb(self, "update_refresh_rate")) box.add(self.refresh_selector, False, True) self.hide_sleep_connections = newCheckBox() self.hide_sleep_connections.set_text('Hide sleeping connections') self.hide_sleep_connections.add_clicked_callback(self.refresh) box.add(self.hide_sleep_connections, False, True) self.add(box, False, True) self.resume_layout() self.connection_selected() dprint_ex(4, "Leave")
def create_ui(self): dprint_ex(4, "Enter") self.suspend_layout() self.heading = make_panel_header("title_connections.png", self.instance_info.name, "Client Connections") self.add(self.heading, False, False) self.warning = not_running_warning_label() self.add(self.warning, False, True) self.connection_list = newTreeNodeView(mforms.TreeDefault|mforms.TreeFlatList|mforms.TreeAltRowColors) self.connection_list.add_column(mforms.LongIntegerColumnType, "Id", 50, False) self.connection_list.add_column(mforms.StringColumnType, "User", 80, False) self.connection_list.add_column(mforms.StringColumnType, "Host", 120, False) self.connection_list.add_column(mforms.StringColumnType, "DB", 100, False) self.connection_list.add_column(mforms.StringColumnType, "Command", 80, False) self.connection_list.add_column(mforms.LongIntegerColumnType, "Time", 60, False) self.connection_list.add_column(mforms.StringColumnType, "State", 80, False) self.info_column = self.connection_list.add_column(mforms.StringColumnType, "Info", 300, False) self.connection_list.end_columns() self.connection_list.set_allow_sorting(True) self.connection_list.add_changed_callback(weakcb(self, "connection_selected")) #self.set_padding(8) self.add(self.connection_list, True, True) self.button_box = box = newBox(True) box.set_spacing(12) refresh_button = newButton() refresh_button.set_text("Refresh") box.add_end(refresh_button, False, True) refresh_button.add_clicked_callback(weakcb(self, "refresh")) self.kill_button = newButton() self.kill_button.set_text("Kill Connection") box.add_end(self.kill_button, False, True) self.kill_button.add_clicked_callback(weakcb(self, "kill_connection")) self.killq_button = newButton() self.killq_button.set_text("Kill Query") box.add_end(self.killq_button, False, True) self.killq_button.add_clicked_callback(weakcb(self, "kill_query")) refresh_label = newLabel("Refresh Rate:") box.add(refresh_label, False, True) self._menu = mforms.newContextMenu() self._menu.add_item_with_title("Copy Info", self.copy_selected, "copy_selected") self._menu.add_item_with_title("Show in Editor", self.edit_selected, "edit_selected") self.connection_list.set_context_menu(self._menu) self.refresh_values = [0.5, 1, 2, 3, 4, 5, 10, 15, 30] self.refresh_values_size = len(self.refresh_values) self.refresh_selector = newSelector() self.refresh_selector.set_size(100,-1) for s in self.refresh_values: self.refresh_selector.add_item(str(s) + " seconds") self.refresh_selector.add_item("Don't Refresh") refresh_rate_index = grt.root.wb.options.options.get('Administrator:refresh_connections_rate_index', 9) self.refresh_selector.set_selected(refresh_rate_index) self.update_refresh_rate() self.refresh_selector.add_changed_callback(weakcb(self, "update_refresh_rate")) box.add(self.refresh_selector, False, True) self.hide_sleep_connections = newCheckBox() self.hide_sleep_connections.set_text('Hide sleeping connections') self.hide_sleep_connections.add_clicked_callback(self.refresh) box.add(self.hide_sleep_connections, False, True) self.add(box, False, True) self.resume_layout() self.connection_selected() dprint_ex(4, "Leave")
def create_ui(self): dprint_ex(4, "Enter") self.suspend_layout() self.create_basic_ui("title_connections.png", "Client Connections") if self.new_processlist(): widths = grt.root.wb.state.get("wb.admin:ConnectionListColumnWidthsPS", None) else: widths = grt.root.wb.state.get("wb.admin:ConnectionListColumnWidths", None) if widths: column_widths = [int(i) for i in widths.split(",")] else: column_widths = None self.connection_box = mforms.newBox(True) self.connection_box.set_spacing(8) self.connection_list = newTreeNodeView(mforms.TreeDefault|mforms.TreeFlatList|mforms.TreeAltRowColors) self.connection_list.set_selection_mode(mforms.TreeSelectMultiple) self.connection_list.add_column_resized_callback(self.column_resized) for i, (field, type, caption, width) in enumerate(self.columns): if column_widths and i < len(column_widths): width = column_widths[i] self.connection_list.add_column(type, caption, width, False) self.connection_list.end_columns() self.connection_list.set_allow_sorting(True) self.connection_list.add_changed_callback(weakcb(self, "connection_selected")) self.connection_box.add(self.connection_list, True, True) info_table = mforms.newTable() info_table.set_row_count(2) info_table.set_column_count(5) info_table.set_row_spacing(4) info_table.set_column_spacing(20) info_table.add(self.create_labeled_info("Threads Connected:", "lbl_Threads_connected"), 0, 1, 0, 1, mforms.HFillFlag) info_table.add(self.create_labeled_info("Threads Running:", "lbl_Threads_running"), 1, 2, 0, 1, mforms.HFillFlag) info_table.add(self.create_labeled_info("Threads Created:", "lbl_Threads_created"), 2, 3, 0, 1, mforms.HFillFlag) info_table.add(self.create_labeled_info("Threads Cached:", "lbl_Threads_cached"), 3, 4, 0, 1, mforms.HFillFlag) info_table.add(self.create_labeled_info("Rejected (over limit):", "lbl_Connection_errors_max_connections"), 4, 5, 0, 1, mforms.HFillFlag) info_table.add(self.create_labeled_info("Total Connections:", "lbl_Connections"), 0, 1, 1, 2, mforms.HFillFlag) info_table.add(self.create_labeled_info("Connection Limit:", "lbl_max_connections"), 1, 2, 1, 2, mforms.HFillFlag) info_table.add(self.create_labeled_info("Aborted Clients:", "lbl_Aborted_clients"), 2, 3, 1, 2, mforms.HFillFlag) info_table.add(self.create_labeled_info("Aborted Connections:", "lbl_Aborted_connects"), 3, 4, 1, 2, mforms.HFillFlag) info_table.add(self.create_labeled_info("Errors:", "lbl_errors", "tooltip_errors"), 4, 5, 1, 2, mforms.HFillFlag) self.info_table = info_table self.add(info_table, False, True) #self.set_padding(8) self.add(self.connection_box, True, True) box = newBox(True) self.button_box = box self.add_end(box, False, True) box.set_spacing(12) refresh_button = newButton() refresh_button.set_text("Refresh") box.add_end(refresh_button, False, True) refresh_button.add_clicked_callback(weakcb(self, "refresh")) self.kill_button = newButton() self.kill_button.set_text("Kill Connection(s)") box.add_end(self.kill_button, False, True) self.kill_button.add_clicked_callback(weakcb(self, "kill_connection")) self.killq_button = newButton() self.killq_button.set_text("Kill Query(s)") box.add_end(self.killq_button, False, True) self.killq_button.add_clicked_callback(weakcb(self, "kill_query")) refresh_label = newLabel("Refresh Rate:") box.add(refresh_label, False, True) self._menu = mforms.newContextMenu() self._menu.add_will_show_callback(self.menu_will_show) self.connection_list.set_context_menu(self._menu) self.refresh_values = [0.5, 1, 2, 3, 4, 5, 10, 15, 30] self.refresh_values_size = len(self.refresh_values) self.refresh_selector = newSelector() self.refresh_selector.set_size(100,-1) for s in self.refresh_values: self.refresh_selector.add_item(str(s) + " seconds") self.refresh_selector.add_item("Don't Refresh") refresh_rate_index = grt.root.wb.options.options.get('Administrator:refresh_connections_rate_index', 9) self.refresh_selector.set_selected(refresh_rate_index) self.update_refresh_rate() self.refresh_selector.add_changed_callback(weakcb(self, "update_refresh_rate")) box.add(self.refresh_selector, False, True) self.check_box = newBox(True) self.check_box.set_spacing(12) self.hide_sleep_connections = newCheckBox() self.hide_sleep_connections.set_text('Hide sleeping connections') self.hide_sleep_connections.add_clicked_callback(self.refresh) self.hide_sleep_connections.set_tooltip('Remove connections in the Sleeping state from the connection list.') self.check_box.add(self.hide_sleep_connections, False, True) self.mdl_locks_page = None self._showing_extras = False if self.new_processlist(): self.hide_background_threads = newCheckBox() self.hide_background_threads.set_active(True) self.hide_background_threads.set_text('Hide background threads') self.hide_background_threads.set_tooltip('Remove background threads (internal server threads) from the connection list.') self.hide_background_threads.add_clicked_callback(self.refresh) self.check_box.add(self.hide_background_threads, False, True) self.truncate_info = newCheckBox() self.truncate_info.set_active(True) self.truncate_info.set_text('Don\'t load full thread info') self.truncate_info.set_tooltip('Toggle whether to load the entire query information for all connections or just the first 255 characters.\nEnabling this can have a large impact in busy servers or server executing large INSERTs.') self.truncate_info.add_clicked_callback(self.refresh) self.check_box.add(self.truncate_info, False, True) # tab with some extra info, only available if PS exists self.extra_info_tab = mforms.newTabView(mforms.TabViewSystemStandard) self.extra_info_tab.set_size(350, -1) self.extra_info_tab.add_tab_changed_callback(self.extra_tab_changed) self.connection_details_scrollarea = mforms.newScrollPanel() self.connection_details = ConnectionDetailsPanel(self) self.connection_details_scrollarea.add(self.connection_details) self.details_page = self.extra_info_tab.add_page(self.connection_details_scrollarea, "Details") self.mdl_list_box = None if self.ctrl_be.target_version.is_supported_mysql_version_at_least(5, 7, 3): self.mdl_list_box_scrollarea = mforms.newScrollPanel() self.mdl_list_box = mforms.newBox(False) self.mdl_list_box_scrollarea.add(self.mdl_list_box) self.mdl_label = mforms.newLabel('Metadata locks (MDL) protect concurrent access to\nobject metadata (not table row/data locks)') self.mdl_list_box.add(self.mdl_label, False, True) label = mforms.newLabel("\nGranted Locks (and threads waiting on them)") label.set_style(mforms.BoldStyle) self.mdl_list_box.add(label, False, True) label = mforms.newLabel("Locks this connection currently owns and\nconnections that are waiting for them.") label.set_style(mforms.SmallHelpTextStyle) self.mdl_list_box.add(label, False, True) self.mdl_list_held = mforms.newTreeNodeView(mforms.TreeAltRowColors) self.mdl_list_held.add_column(mforms.IconStringColumnType, "Object", 130, False) self.mdl_list_held.add_column(mforms.StringColumnType, "Type", 100, False) self.mdl_list_held.add_column(mforms.StringColumnType, "Duration", 100, False) self.mdl_list_held.end_columns() self.mdl_list_held.set_size(0, 100) self.mdl_list_box.add(self.mdl_list_held, True, True) label = mforms.newLabel("\nPending Locks") label.set_style(mforms.BoldStyle) self.mdl_list_box.add(label, False, True) hbox = mforms.newBox(True) hbox.set_spacing(4) self.mdl_blocked_icon = mforms.newImageBox() self.mdl_blocked_icon.set_image(mforms.App.get().get_resource_path("message_warning.png")) hbox.add(self.mdl_blocked_icon, False, True) self.mdl_waiting_label = mforms.newLabel("Locks this connection is currently waiting for.") hbox.add(self.mdl_waiting_label, True, True) self.mdl_list_box.add(hbox, False, True) self.mdl_locks_page = self.extra_info_tab.add_page(self.mdl_list_box_scrollarea, "Locks") if self.ctrl_be.target_version.is_supported_mysql_version_at_least(5, 6, 0): self.attributes_list = mforms.newTreeNodeView(mforms.TreeFlatList|mforms.TreeAltRowColors) self.attributes_list.add_column(mforms.StringColumnType, "Attribute", 150, False) self.attributes_list.add_column(mforms.StringColumnType, "Value", 200, False) self.attributes_list.end_columns() self.attributes_page = self.extra_info_tab.add_page(self.attributes_list, "Attributes") self.connection_box.add(self.extra_info_tab, False, True) self.extra_info_tab.show(False) self.show_extras = newButton() self.show_extras.set_text('Show Details') self.show_extras.add_clicked_callback(self.toggle_extras) self.check_box.add_end(self.show_extras, False, True) self.add(self.check_box, False, True) self.resume_layout() self.connection_selected() dprint_ex(4, "Leave")
def __init__(self, server_profile, ctrl_be, monitor): mforms.Box.__init__(self, True) # True - vertical layout self.tasks_side = newTaskSidebar() self.content_box = newBox(False) self.tasks_side.set_selection_color(mforms.SystemColorHighlight) self.tabs = [] self.name2page = {} self.config_ui = None self.closing = False self.tabview = newTabView(True) self.ctrl_be = ctrl_be self.old_active_tab = None self.server_profile = server_profile self.refresh_tasks_sleep_time = 2 self.ui_profile = UIProfile(server_profile) # Setup self self.set_managed() self.set_release_on_add() self.ui_profile.apply_style(self, "main") if server_profile.host_os == wbaOS.windows: side_panel = newPanel(mforms.StyledHeaderPanel) side_panel.set_title(" Task and Object Browser") side_panel.add(self.tasks_side) self.add(side_panel, False, True) self.content_panel = newPanel(mforms.StyledHeaderPanel) self.content_panel.set_title(" Task and Object Browser") self.content_panel.add(self.content_box) self.add(self.content_panel, True, True) else: vbox = newBox(False) vbox.add(self.tasks_side, True, True) self.add(vbox, False, False) vbox = newBox(False) self.content_label = newHeaderLabel("") self.ui_profile.apply_style(self.content_label, 'content-label') vbox.add(self.content_label, False, False) vbox.add(self.content_box, True, True) self.add(vbox, True, True) self.ctrl_be.add_me_for_event("server_started", self) self.ctrl_be.add_me_for_event("server_stopped", self) # Setup tasks sidebar self.fill_task_sidebar() self.tasks_side.add_on_section_command_callback(self.section_clicked) self.tasks_side.show() self.tasks_side.set_size(220, -1) # Setup content box self.content_box.add(self.tabview, True, True) # Retrieve from server the log file paths if exist status = self.ctrl_be.is_server_running(verbose=0) if status in ['stopped', 'unknown'] and not all([ self.server_profile. general_log_file_path, # only proceed to parse the config file if self.server_profile. slow_log_file_path, # any of these is missing self.server_profile.error_log_file_path, self.server_profile.log_output ]): cfg_be = wb_admin_config_file_be.WbAdminConfigFileBE( self.server_profile, self.ctrl_be) cfg_be.open_configuration_file( self.server_profile.config_file_path) options = dict( cfg_be.get_options(self.server_profile.config_file_section)) if not self.server_profile.log_output and options.has_key( 'log-output'): self.server_profile.log_ouput = options['log-output'] if not self.server_profile.general_log_file_path: path = options['general_log_file'] if options.has_key( 'general_log_file') else ( options['log'] if options.has_key('log') else '' ) # the 'log' option is deprecated but still allowed if path: self.server_profile.general_log_file_path = path.strip('"') if not self.server_profile.slow_log_file_path: path = options['slow_query_log_file'] if options.has_key( 'slow_query_log_file' ) else ( options['log-slow-queries'] if options.has_key('log-slow-queries') else '' ) # the 'log-slow-queries' option is deprecated but still allowed if path: self.server_profile.slow_log_file_path = path.strip('"') if not self.server_profile.error_log_file_path and options.has_key( 'log-error'): self.server_profile.error_log_file_path = options[ 'log-error'].strip('"') # Create content pages self.server_status_page = ServerStatusPage(server_profile, ctrl_be, self) self.config_ui = WbAdminConfigFileUI(server_profile=server_profile, ctrl_be=ctrl_be, main_view=self) self.startup = WbAdminConfigurationStartup(ctrl_be, server_profile, self) self.security = WbAdminSecurity(self.ctrl_be, server_profile, self) self.variables = WbAdminVariables(self.ctrl_be, server_profile, self) self.logs = WbAdminLogs(self.ctrl_be, server_profile, self) self.dump = WbAdminExport(server_profile, self.ctrl_be, self) self.restore = WbAdminImport(server_profile, self.ctrl_be, self) self.init_extensions(server_profile, self.ctrl_be) Utilities.add_timeout(0.5, weakcb(self, "timeout")) self.timeout_thread = threading.Thread( target=self.refresh_tasks_thread) self.timeout_thread.setDaemon(True) self.timeout_thread.start() self.tabview.add_tab_changed_callback(self.tab_changed) self.timeout( ) # will call self.connect_mysql() and check if mysql is running self.ctrl_be.continue_events( ) # Process events which are queue during init dprint_ex(1, "WBA init complete") self.tasks_side.select_entry("MANAGEMENT", "Server Status") self.server_status_page.page_activated()
def __init__(self, ctrl_be, variables, command): mforms.Box.__init__(self, False) self.set_managed() self.suspend_layout() self.command = command self.ctrl_be = ctrl_be box = newBox(True) box.set_spacing(12) self.add(box, True, True) self.tree = newTreeView(mforms.TreeDefault) self.tree.set_size(180, -1) sidebox = newBox(False) box.add(sidebox, False, True) self.searchEntry = newTextEntry(mforms.SearchEntry) sidebox.set_spacing(12) sidebox.add(self.searchEntry, False, True) sidebox.add(self.tree, True, True) self.searchEntry.add_changed_callback(self.filterOutput) self.tree.add_column(mforms.StringColumnType, "", 160, False) self.tree.end_columns() self.tree.add_changed_callback(weakcb(self, "refresh")) self.values = newTreeView(mforms.TreeDefault) box.add(self.values, True, True) self.values.add_column(mforms.StringColumnType, "Name", 200, False) self.values.add_column(mforms.StringColumnType, "Value", 120, False) self.values.add_column(mforms.StringColumnType, "Description", 1000, False) self.values.end_columns() self.values.set_allow_sorting(True) box = newBox(True) box.set_spacing(8) copy_all_button = newButton() copy_all_button.set_text('Copy Global Status and Variables to Clipboard') copy_all_button.add_clicked_callback(self.copy_status_to_clipboard) box.add(copy_all_button, False, False) copy_shown_button = newButton() copy_shown_button.set_text('Copy Shown Variables to Clipboard') copy_shown_button.add_clicked_callback(self.copy_visible_vars_to_clipboard) box.add(copy_shown_button, False, False) button = newButton() box.add_end(button, False, True) button.set_text("Refresh") box.set_padding(12) button.add_clicked_callback(weakcb(self, "refresh")) self.add(box, False, True) self.groups = {} self.descriptions = {} def analyze(tree, level, d, groupd, version, vars, existing_vars): groups = {} variables = [] for group_name, group_variables in vars.iteritems(): vars_added_to_the_group = [] groups[group_name] = vars_added_to_the_group for v in group_variables: if v.var in existing_vars: name = v.var variables.append(name) vars_added_to_the_group.append(v.var) d[name] = v.description existing_vars.remove(name) if vars_added_to_the_group: row = tree.add_row() tree.set_string(row, 0, group_name) tree.set_row_tag(row, group_name) return groups, variables row = self.tree.add_row() self.tree.set_string(row, 0, "All") row = self.tree.add_row() self.tree.set_string(row, 0, "Search Results") self.resume_layout() variables_in_server = [] result = self.ctrl_be.exec_query(self.command) if result is not None: while result.nextRow(): name = result.stringByName("Variable_name") variables_in_server.append(name) allgroups, allvars = analyze(self.tree, 0, self.descriptions, self.groups, self.ctrl_be.get_server_version(), variables, variables_in_server) if variables_in_server: allvars += variables_in_server group_name = "Other" allgroups[group_name] = variables_in_server row = self.tree.add_row() self.tree.set_string(row, 0, group_name) self.tree.set_row_tag(row, group_name) self.groups = allgroups self.known_variables = allvars
def __init__(self, server_profile, ctrl_be, monitor): mforms.Box.__init__(self, True) # True - vertical layout self.tasks_side = newTaskSidebar() self.content_box = newBox(False) self.tasks_side.set_selection_color(mforms.SystemHighlight) self.tabs = [] self.name2page = {} self.config_ui = None self.closing = False self.tabview = newTabView(True) self.ctrl_be = ctrl_be self.old_active_tab = None self.server_profile = server_profile self.refresh_tasks_sleep_time = 2 self.ui_profile = UIProfile(server_profile) # Setup self self.set_managed() self.ui_profile.apply_style(self, "main") if server_profile.host_os == wbaOS.windows: side_panel = newPanel(mforms.StyledHeaderPanel) side_panel.set_title(" Task and Object Browser") side_panel.add(self.tasks_side) self.add(side_panel, False, True) self.content_panel = newPanel(mforms.StyledHeaderPanel) self.content_panel.set_title(" Task and Object Browser") self.content_panel.add(self.content_box) self.add(self.content_panel, True, True) else: vbox = newBox(False) vbox.add(self.tasks_side, True, True) self.add(vbox, False, False) vbox = newBox(False) self.content_label = newHeaderLabel("") self.ui_profile.apply_style(self.content_label, 'content-label') vbox.add(self.content_label, False, False) vbox.add(self.content_box, True, True) self.add(vbox, True, True) self.ctrl_be.add_me_for_event("server_started", self) self.ctrl_be.add_me_for_event("server_stopped", self) # Setup tasks sidebar self.fill_task_sidebar() self.tasks_side.add_on_section_command_callback(self.section_clicked) self.tasks_side.show() self.tasks_side.set_size(220, -1) # Setup content box self.content_box.add(self.tabview, True, True) # Create content pages self.server_status_page = ServerStatusPage(server_profile, ctrl_be, self) self.config_ui = WbAdminConfigFileUI(server_profile = server_profile, ctrl_be = ctrl_be, main_view = self) self.startup = WbAdminConfigurationStartup(ctrl_be, server_profile, self) self.security = WbAdminSecurity(self.ctrl_be, server_profile, self) self.variables = WbAdminVariables(self.ctrl_be, server_profile, self) self.logs = WbAdminLogs(self.ctrl_be, server_profile, self) self.dump = WbAdminExport(server_profile, self.ctrl_be, self) Utilities.add_timeout(0.5, weakcb(self, "timeout")) self.timeout_thread = threading.Thread(target = self.refresh_tasks_thread) self.timeout_thread.setDaemon(True) self.timeout_thread.start() self.tabview.add_tab_changed_callback(self.tab_changed) self.timeout() # will call self.connect_mysql() and check if mysql is running self.ctrl_be.continue_events() # Process events which are queue during init dprint_ex(1, "WBA init complete") self.tasks_side.select_entry("MANAGEMENT", "Server Status") self.server_status_page.page_activated()
def __init__(self, ctrl_be, variables, command, type): mforms.Box.__init__(self, False) self.set_managed() self.set_release_on_add() self.user_groups = VariablesGroupContainer(type) self.user_groups.load() self.variables = variables self.suspend_layout() self.command = command self.ctrl_be = ctrl_be box = newBox(True) box.set_spacing(12) self.add(box, True, True) self.tree = newTreeNodeView(mforms.TreeFlatList) self.tree.set_selection_mode(mforms.TreeSelectMultiple) sidebox = newBox(False) box.add(sidebox, False, True) self.searchEntry = newTextEntry(mforms.SearchEntry) sidebox.set_spacing(12) sidebox.add(self.searchEntry, False, True) sidebox.add(self.tree, True, True) self.tree.set_size(210, -1) self.searchEntry.add_changed_callback(self.filterOutput) self.tree.add_column(mforms.StringColumnType, "Category", 200, False) self.tree.end_columns() self.tree.add_changed_callback(weakcb(self, "refresh")) self.cat_menu = mforms.newContextMenu() self.cat_menu.add_will_show_callback(self.cat_menu_will_show) self.cat_menu.add_item_with_title("Delete Category", self.delete_category, "delete") self.tree.set_context_menu(self.cat_menu) self.values = newTreeNodeView(mforms.TreeFlatList) self.values.set_selection_mode(mforms.TreeSelectMultiple) box.add(self.values, True, True) self.values.add_column(mforms.StringColumnType, "Name", 200, False) self.values.add_column(mforms.StringColumnType, "Value", 120, True) self.values.add_column(mforms.StringColumnType, "Description", 1000, False) self.values.end_columns() self.values.set_allow_sorting(True) self.values.set_cell_edited_callback(self.edit_variable) self.values.add_changed_callback(weakcb(self, "value_selection_changed")) self.menu = mforms.newContextMenu() self.menu.add_will_show_callback(self.menu_will_show) self.values.set_context_menu(self.menu) box = newBox(True) box.set_spacing(8) copy_all_button = newButton() copy_all_button.set_text('Copy Global Status and Variables to Clipboard') copy_all_button.add_clicked_callback(self.copy_status_to_clipboard) box.add(copy_all_button, False, False) copy_shown_button = newButton() copy_shown_button.set_text('Copy Selected to Clipboard') copy_shown_button.add_clicked_callback(self.copy_selected_to_clipboard) box.add(copy_shown_button, False, False) self.copy_selected_to_clipboard_button = copy_shown_button button = newButton() box.add_end(button, False, True) button.set_text("Refresh") box.set_padding(12) button.add_clicked_callback(weakcb(self, "refresh")) self.add(box, False, True) row = self.tree.add_node() row.set_string(0, "All") row = self.tree.add_node() row.set_string(0, "Filtered") self.resume_layout() self.variable_info = {} self.variables_in_group = {"Other":[]} self._delayed_init_tm = mforms.Utilities.add_timeout(0.1, lambda: self.delayed_init(self.variables))
def __init__(self, ctrl_be, variables, command): mforms.Box.__init__(self, False) self.set_managed() self.set_release_on_add() self.suspend_layout() self.command = command self.ctrl_be = ctrl_be box = newBox(True) box.set_spacing(12) self.add(box, True, True) self.tree = newTreeNodeView(mforms.TreeFlatList) self.tree.set_selection_mode(mforms.TreeSelectMultiple) self.tree.set_size(180, -1) sidebox = newBox(False) box.add(sidebox, False, True) self.searchEntry = newTextEntry(mforms.SearchEntry) sidebox.set_spacing(12) sidebox.add(self.searchEntry, False, True) sidebox.add(self.tree, True, True) self.searchEntry.add_changed_callback(self.filterOutput) self.tree.add_column(mforms.StringColumnType, "Category", 160, False) self.tree.end_columns() self.tree.add_changed_callback(weakcb(self, "refresh")) self.values = newTreeNodeView(mforms.TreeFlatList) self.values.set_selection_mode(mforms.TreeSelectMultiple) box.add(self.values, True, True) self.values.add_column(mforms.StringColumnType, "Name", 200, False) self.values.add_column(mforms.StringColumnType, "Value", 120, True) self.values.add_column(mforms.StringColumnType, "Description", 1000, False) self.values.end_columns() self.values.set_allow_sorting(True) self.values.set_cell_edited_callback(self.edit_variable) self.values.add_changed_callback( weakcb(self, "value_selection_changed")) box = newBox(True) box.set_spacing(8) copy_all_button = newButton() copy_all_button.set_text( 'Copy Global Status and Variables to Clipboard') copy_all_button.add_clicked_callback(self.copy_status_to_clipboard) box.add(copy_all_button, False, False) copy_shown_button = newButton() copy_shown_button.set_text('Copy Selected to Clipboard') copy_shown_button.add_clicked_callback(self.copy_selected_to_clipboard) box.add(copy_shown_button, False, False) self.copy_selected_to_clipboard_button = copy_shown_button button = newButton() box.add_end(button, False, True) button.set_text("Refresh") box.set_padding(12) button.add_clicked_callback(weakcb(self, "refresh")) self.add(box, False, True) row = self.tree.add_node() row.set_string(0, "All") row = self.tree.add_node() row.set_string(0, "Filtered") self.resume_layout() variables_in_server = [] result = self.ctrl_be.exec_query(self.command) if result is not None: while result.nextRow(): name = result.stringByName("Variable_name") variables_in_server.append(name) self.variable_info = {} self.variables_in_group = {"Other": []} existing_groups = set() for name, description, editable, groups in variables: self.variable_info[name.replace("-", "_")] = (description, editable) existing_groups = existing_groups.union(set(groups)) for group in groups: if group not in self.variables_in_group: self.variables_in_group[group] = [] self.variables_in_group[group].append(name.replace("-", "_")) if not groups: self.variables_in_group["Other"].append(name.replace("-", "_")) for group_name in sorted(existing_groups): row = self.tree.add_node() row.set_string(0, group_name) row.set_tag(group_name) if self.variables_in_group["Other"]: row = self.tree.add_node() row.set_string(0, "Other") row.set_tag("Other") self.copy_selected_to_clipboard_button.set_enabled( len(self.values.get_selection()) > 0)
def __init__(self, server_profile, ctrl_be, monitor): mforms.Box.__init__(self, True) # True - vertical layout self.tasks_side = newTaskSidebar() self.content_box = newBox(False) self.tasks_side.set_selection_color(mforms.SystemHighlight) self.tabs = [] self.name2page = {} self.config_ui = None self.closing = False self.tabview = newTabView(True) self.ctrl_be = ctrl_be self.old_active_tab = None self.server_profile = server_profile self.refresh_tasks_sleep_time = 2 self.ui_profile = UIProfile(server_profile) # Setup self self.set_managed() self.ui_profile.apply_style(self, "main") if server_profile.host_os == wbaOS.windows: side_panel = newPanel(mforms.StyledHeaderPanel) side_panel.set_title(" Task and Object Browser") side_panel.add(self.tasks_side) self.add(side_panel, False, True) self.content_panel = newPanel(mforms.StyledHeaderPanel) self.content_panel.set_title(" Task and Object Browser") self.content_panel.add(self.content_box) self.add(self.content_panel, True, True) else: vbox = newBox(False) vbox.add(self.tasks_side, True, True) self.add(vbox, False, False) vbox = newBox(False) self.content_label = newHeaderLabel("") self.ui_profile.apply_style(self.content_label, 'content-label') vbox.add(self.content_label, False, False) vbox.add(self.content_box, True, True) self.add(vbox, True, True) self.ctrl_be.add_me_for_event("server_started", self) self.ctrl_be.add_me_for_event("server_stopped", self) # Setup tasks sidebar self.fill_task_sidebar() self.tasks_side.add_on_section_command_callback(self.section_clicked) self.tasks_side.show() self.tasks_side.set_size(220, -1) # Setup content box self.content_box.add(self.tabview, True, True) # Create content pages self.server_status_page = ServerStatusPage(server_profile, ctrl_be, self) self.config_ui = WbAdminConfigFileUI(server_profile=server_profile, ctrl_be=ctrl_be, main_view=self) self.startup = WbAdminConfigurationStartup(ctrl_be, server_profile, self) self.security = WbAdminSecurity(self.ctrl_be, server_profile, self) self.variables = WbAdminVariables(self.ctrl_be, server_profile, self) self.logs = WbAdminLogs(self.ctrl_be, server_profile, self) self.dump = WbAdminExport(server_profile, self.ctrl_be, self) Utilities.add_timeout(0.5, weakcb(self, "timeout")) self.timeout_thread = threading.Thread( target=self.refresh_tasks_thread) self.timeout_thread.setDaemon(True) self.timeout_thread.start() self.tabview.add_tab_changed_callback(self.tab_changed) self.timeout( ) # will call self.connect_mysql() and check if mysql is running self.ctrl_be.continue_events( ) # Process events which are queue during init dprint_ex(1, "WBA init complete") self.tasks_side.select_entry("MANAGEMENT", "Server Status") self.server_status_page.page_activated()
def __init__(self, ctrl_be, variables, command): mforms.Box.__init__(self, False) self.set_managed() self.suspend_layout() self.command = command self.ctrl_be = ctrl_be box = newBox(True) box.set_spacing(12) self.add(box, True, True) self.tree = newTreeView(mforms.TreeDefault) self.tree.set_size(180, -1) sidebox = newBox(False) box.add(sidebox, False, True) self.searchEntry = newTextEntry(mforms.SearchEntry) sidebox.set_spacing(12) sidebox.add(self.searchEntry, False, True) sidebox.add(self.tree, True, True) self.searchEntry.add_changed_callback(self.filterOutput) self.tree.add_column(mforms.StringColumnType, "", 160, False) self.tree.end_columns() self.tree.add_changed_callback(weakcb(self, "refresh")) self.values = newTreeView(mforms.TreeDefault) box.add(self.values, True, True) self.values.add_column(mforms.StringColumnType, "Name", 200, False) self.values.add_column(mforms.StringColumnType, "Value", 120, False) self.values.add_column(mforms.StringColumnType, "Description", 1000, False) self.values.end_columns() self.values.set_allow_sorting(True) box = newBox(True) box.set_spacing(8) copy_all_button = newButton() copy_all_button.set_text("Copy Global Status and Variables to Clipboard") copy_all_button.add_clicked_callback(self.copy_status_to_clipboard) box.add(copy_all_button, False, False) copy_shown_button = newButton() copy_shown_button.set_text("Copy Shown Variables to Clipboard") copy_shown_button.add_clicked_callback(self.copy_visible_vars_to_clipboard) box.add(copy_shown_button, False, False) button = newButton() box.add_end(button, False, True) button.set_text("Refresh") box.set_padding(12) button.add_clicked_callback(weakcb(self, "refresh")) self.add(box, False, True) self.groups = {} self.descriptions = {} def analyze(tree, level, d, groupd, version, vars, existing_vars): groups = {} variables = [] for group_name, group_variables in vars.iteritems(): vars_added_to_the_group = [] groups[group_name] = vars_added_to_the_group for v in group_variables: if v.var in existing_vars: name = v.var variables.append(name) vars_added_to_the_group.append(v.var) d[name] = v.description existing_vars.remove(name) if vars_added_to_the_group: row = tree.add_row() tree.set_string(row, 0, group_name) tree.set_row_tag(row, group_name) return groups, variables row = self.tree.add_row() self.tree.set_string(row, 0, "All") row = self.tree.add_row() self.tree.set_string(row, 0, "Search Results") self.resume_layout() variables_in_server = [] result = self.ctrl_be.exec_query(self.command) if result is not None: while result.nextRow(): name = result.stringByName("Variable_name") variables_in_server.append(name) allgroups, allvars = analyze( self.tree, 0, self.descriptions, self.groups, self.ctrl_be.get_server_version(), variables, variables_in_server, ) if variables_in_server: allvars += variables_in_server group_name = "Other" allgroups[group_name] = variables_in_server row = self.tree.add_row() self.tree.set_string(row, 0, group_name) self.tree.set_row_tag(row, group_name) self.groups = allgroups self.known_variables = allvars
def create_ui(self): dprint_ex(4, "Enter") self.suspend_layout() self.warning = not_running_warning_label() self.add(self.warning, False, True) self.connection_list = newTreeNodeView(mforms.TreeDefault | mforms.TreeFlatList) self.connection_list.add_column(mforms.LongIntegerColumnType, "Id", 50, False) self.connection_list.add_column(mforms.StringColumnType, "User", 80, False) self.connection_list.add_column(mforms.StringColumnType, "Host", 120, False) self.connection_list.add_column(mforms.StringColumnType, "DB", 100, False) self.connection_list.add_column(mforms.StringColumnType, "Command", 80, False) self.connection_list.add_column(mforms.IntegerColumnType, "Time", 60, False) self.connection_list.add_column(mforms.StringColumnType, "State", 80, False) self.info_column = self.connection_list.add_column( mforms.StringColumnType, "Info", 300, False) self.connection_list.end_columns() self.connection_list.set_allow_sorting(True) self.connection_list.add_changed_callback( weakcb(self, "connection_selected")) #self.set_padding(8) self.add(self.connection_list, True, True) self.button_box = box = newBox(True) box.set_spacing(12) box.set_padding(12) refresh_button = newButton() refresh_button.set_text("Refresh") box.add_end(refresh_button, False, True) refresh_button.add_clicked_callback(weakcb(self, "refresh")) copy_button = newButton() copy_button.set_text("Copy Selected") box.add_end(copy_button, False, True) copy_button.add_clicked_callback(weakcb(self, "copy_selected")) self.kill_button = newButton() self.kill_button.set_text("Kill Connection") box.add_end(self.kill_button, False, True) self.kill_button.add_clicked_callback(weakcb(self, "kill_connection")) self.killq_button = newButton() self.killq_button.set_text("Kill Query") box.add_end(self.killq_button, False, True) self.killq_button.add_clicked_callback(weakcb(self, "kill_query")) refresh_label = newLabel("Refresh Rate:") box.add(refresh_label, False, True) self.refresh_values = [0.5, 1, 2, 3, 4, 5, 10, 15, 30] self.refresh_values_size = len(self.refresh_values) self.refresh_selector = newSelector() self.refresh_selector.set_size(100, -1) for s in self.refresh_values: self.refresh_selector.add_item(str(s) + " seconds") self.refresh_selector.add_item("Don't Refresh") self.refresh_selector.set_selected(9) box.add(self.refresh_selector, False, True) self.refresh_selector.add_changed_callback( weakcb(self, "update_refresh_rate")) self.add(box, False, True) self.resume_layout() self.connection_selected() dprint_ex(4, "Leave")