pgadmin3/include/frm/frmStatus.h
levinsv f02ecba5b4 Add hightlight event frmStatus
1. Добавлена подсветка клиентов c окрытой транзакцией превышающей время idle_in_transaction_session_timeout.
   Цвет выбирается в настройках.
2. Добавлен фильтр показывающий только строки с подсветкой.
2025-08-19 16:25:26 +05:00

341 lines
13 KiB
C++

//////////////////////////////////////////////////////////////////////////
//
// pgAdmin III - PostgreSQL Tools
//
// Copyright (C) 2002 - 2016, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
// frmStatus.h - Status Screen
//
//////////////////////////////////////////////////////////////////////////
#ifndef __FRMSTATUS_H
#define __FRMSTATUS_H
// wxWindows headers
#include <wx/wx.h>
#include <wx/image.h>
#include <wx/listctrl.h>
#include <wx/spinctrl.h>
#include <wx/notebook.h>
// wxAUI
#include <wx/aui/aui.h>
#include <wx/msgqueue.h>
#include "dlg/dlgClasses.h"
#include "utils/factory.h"
#include "ctl/ctlAuiNotebook.h"
#include "ctl/ctlNavigatePanel.h"
#include "utils/WaitSample.h"
#include "ctl/wxTopActivity.h"
#include "frm/menuServerStatus.h"
enum
{
PANE_STATUS = 1,
PANE_LOCKS,
PANE_XACT,
PANE_LOG,
PANE_QUERYSTATE
};
// This number MUST be incremented if changing any of the default perspectives
//
#define FRMSTATUS_PERSPECTIVE_VER wxT("8275")
#ifdef __WXMAC__
#define FRMSTATUS_DEFAULT_PERSPECTIVE wxT("layout2|name=Activity;caption=Activity;state=6293500;dir=4;layer=0;row=0;pos=0;prop=100000;bestw=321;besth=244;minw=-1;minh=-1;maxw=-1;maxh=-1;floatx=462;floaty=165;floatw=595;floath=282|name=Locks;caption=Locks;state=6293500;dir=4;layer=0;row=0;pos=1;prop=100000;bestw=321;besth=244;minw=-1;minh=-1;maxw=-1;maxh=-1;floatx=-231;floaty=235;floatw=595;floath=282|name=Transactions;caption=Transactions;state=6293500;dir=4;layer=0;row=0;pos=2;prop=100000;bestw=0;besth=0;minw=-1;minh=-1;maxw=-1;maxh=-1;floatx=461;floaty=527;floatw=595;floath=282|name=Logfile;caption=Logfile;state=6293500;dir=5;layer=0;row=0;pos=0;prop=100000;bestw=0;besth=0;minw=-1;minh=-1;maxw=-1;maxh=-1;floatx=-103;floaty=351;floatw=595;floath=282|name=toolBar;caption=Tool bar;state=2124528;dir=1;layer=10;row=0;pos=0;prop=100000;bestw=808;besth=33;minw=-1;minh=-1;maxw=-1;maxh=-1;floatx=888;floaty=829;floatw=558;floath=49|dock_size(4,0,0)=583|dock_size(5,0,0)=10|dock_size(1,10,0)=35|")
#else
#ifdef __WXGTK__
#define FRMSTATUS_DEFAULT_PERSPECTIVE wxT("layout2|name=Activity;caption=Activity;state=6309884;dir=4;layer=0;row=0;pos=0;prop=100000;bestw=20;besth=20;minw=-1;minh=-1;maxw=-1;maxh=-1;floatx=-1;floaty=-1;floatw=-1;floath=-1|name=Locks;caption=Locks;state=6293500;dir=4;layer=0;row=0;pos=1;prop=100000;bestw=20;besth=20;minw=-1;minh=-1;maxw=-1;maxh=-1;floatx=-1;floaty=-1;floatw=-1;floath=-1|name=Transactions;caption=Prepared Transactions;state=6293500;dir=4;layer=0;row=0;pos=2;prop=100000;bestw=20;besth=20;minw=-1;minh=-1;maxw=-1;maxh=-1;floatx=-1;floaty=-1;floatw=-1;floath=-1|name=Querystate;caption=QueryState;state=6293502;dir=5;layer=0;row=0;pos=0;prop=100000;bestw=20;besth=20;minw=-1;minh=-1;maxw=-1;maxh=-1;floatx=-1;floaty=-1;floatw=-1;floath=-1|name=Logfile;caption=Logfile;state=6293500;dir=5;layer=0;row=0;pos=0;prop=100000;bestw=20;besth=20;minw=-1;minh=-1;maxw=-1;maxh=-1;floatx=-1;floaty=-1;floatw=-1;floath=-1|name=toolBar;caption=Tool bar;state=2108144;dir=1;layer=10;row=0;pos=0;prop=100000;bestw=690;besth=39;minw=-1;minh=-1;maxw=-1;maxh=-1;floatx=-1;floaty=-1;floatw=-1;floath=-1|dock_size(4,0,0)=800|dock_size(5,0,0)=22|dock_size(1,10,0)=41|")
#else
#define FRMSTATUS_DEFAULT_PERSPECTIVE wxT("layout2|name=Activity;caption=Activity;state=6293500;dir=4;layer=0;row=1;pos=0;prop=100000;bestw=20;besth=20;minw=-1;minh=-1;maxw=-1;maxh=-1;floatx=174;floaty=216;floatw=578;floath=282|name=Locks;caption=Locks;state=6293500;dir=4;layer=0;row=1;pos=2;prop=100000;bestw=20;besth=20;minw=-1;minh=-1;maxw=-1;maxh=-1;floatx=136;floaty=339;floatw=576;floath=283|name=Transactions;caption=Transactions;state=6293500;dir=4;layer=0;row=1;pos=3;prop=100000;bestw=20;besth=20;minw=-1;minh=-1;maxw=-1;maxh=-1;floatx=133;floaty=645;floatw=577;floath=283|name=Querystate;caption=Query State;state=6309884;dir=4;layer=0;row=1;pos=4;prop=100000;bestw=20;besth=20;minw=-1;minh=-1;maxw=-1;maxh=-1;floatx=154;floaty=255;floatw=800;floath=751|name=Logfile;caption=Logfile;state=6293500;dir=4;layer=0;row=1;pos=5;prop=100000;bestw=20;besth=20;minw=-1;minh=-1;maxw=-1;maxh=-1;floatx=150;floaty=90;floatw=400;floath=800|name=toolBar;caption=toolBar;state=2108144;dir=1;layer=10;row=0;pos=0;prop=100000;bestw=766;besth=39;minw=-1;minh=-1;maxw=-1;maxh=-1;floatx=586;floaty=525;floatw=483;floath=49|dock_size(1,10,0)=25|dock_size(4,0,1)=1115|dock_size(5,0,0)=22|")
#endif
#endif
static wxCriticalSection gs_critsect;
// Class declarations
//static wxSemaphore s_CloseLog(0, 1);
class ReadLogThread : public wxThread
{
public:
ReadLogThread(pgConn *conlog, wxWindow* p, wxMessageQueue<wxString> *queue)
{
//wxSemaphore goReadLog(0,1);
//wxSemaphore ResultOkLog(0, 1);
//s_goReadLog=goReadLog;
//s_ResultOkLog = ResultOkLog;
log_queue = queue;
theParent = p;
logfileName = wxEmptyString;
savedPartialLine=wxEmptyString;
logfileLength=0;
len=0;
conn = conlog;
//nextrun = wxDateTime(0);
}
~ReadLogThread();
void DoTerminate();
bool IsTerminate() { return m_exit; }
void SetParameters(wxString plogfileName, long plenfile, long plogfileLength, wxString psavedPartialLine) {
logfileName = plogfileName;
len = plenfile;
logfileLength = plogfileLength;
if (plogfileLength==0) inquote = false;
savedPartialLine = psavedPartialLine;
}
long GetReadByteFile(wxString &part) {
part = savedPartialLine;
return logfileLength;
}
bool isReadyRows() {
wxMutexError e = s_mutexDBLogReading.TryLock();
if (e == wxMUTEX_NO_ERROR) {
s_mutexDBLogReading.Unlock();
return true;
}
return false;
}
void BreakRead();
bool isBreak() { return m_break; }
bool GoReadRows() {
m_break = false;
wxSemaError e = s_goReadLog.Post();
if (e == wxSEMA_NO_ERROR) {
return true;
}
//wxLogError("Semafore return error");
return false;
}
virtual void* Entry();
private:
void readLogFile(wxString logfileName, long& lenfile, long& logfileLength, wxString& savedPartialLine);
void getFilename();
void sendText(wxString s) {
wxThreadEvent e(wxEVT_THREAD);
e.SetString(s);
theParent->GetEventHandler()->AddPendingEvent(e);
}
wxMutex s_mutexDBLogReading;
wxSemaphore s_goReadLog;
wxSemaphore s_ResultOkLog;
wxDateTime nextrun;
wxWindow* theParent;
bool m_exit = false;
bool m_break = false;
pgConn *conn;
wxMessageQueue<wxString>* log_queue;
//
wxString logfileName;
wxString savedPartialLine;
long logfileLength;
long len;
bool inquote = false;
};
class frmStatus : public pgFrame
{
public:
frmStatus(frmMain *form, const wxString &_title, pgConn *conn);
~frmStatus();
void Go();
bool getTextSqlbyQid(long long qid);
ReadLogThread* logThread = NULL;
private:
wxAuiManager manager;
frmMain *mainForm;
pgConn *connection, *locks_connection, *logconn;
wxString logFormat,logFindString;
bool logHasTimestamp, logFormatKnown;
int logFmtPos;
long logFinditem=-1;
wxMessageQueue<wxString> log_queue;
wxDateTime logfileTimestamp, latestTimestamp;
wxString logDirectory, logfileName;
wxString savedPartialLine;
bool showCurrent, isCurrent;
long backend_pid;
long idle_in_transaction_session_timeout=30;
int wait_event_type_col;
bool isrecovery,track_commit_timestamp, is_read_log;
bool wait_sample, wait_enable, wait_save,std,pro;
bool frm_exit = false; // need close form
bool logisread = false; // need close form
WaitSample WS;
wxTopActivity* top_small;
wxString first_tt;
bool loaded;
long logfileLength;
wxColour logcol[2];
int addodd = 0;
int currentPane;
int statusSortColumn;
wxString statusSortOrder;
int lockSortColumn;
wxString lockSortOrder;
int xactSortColumn;
wxString xactSortOrder;
wxComboBox *cbRate;
wxComboBox *cbLogfiles;
wxButton *btnRotateLog;
ctlComboBoxFix *cbDatabase;
wxTimer *refreshUITimer;
wxTimer *statusTimer, *locksTimer, *xactTimer, *logTimer, *querystateTimer;
wxTimer *delayHitLog;
int statusRate, locksRate, xactRate, logRate, querystateRate;
ctlListView *statusList;
ctlListView *lockList;
ctlListView *xactList;
ctlListView *logList;
ctlNavigatePanel* nav;
ctlListView *querystateList;
wxMenu *actionMenu;
wxMenu *statusPopupMenu;
wxMenu *lockPopupMenu;
wxMenu *xactPopupMenu;
wxMenu *querystatePopupMenu;
wxString queryplan;
wxArrayString queries;
wxArrayInt filterColumn;
wxArrayString filterValue;
bool onlyhightligth = false;
int statusColWidth[12], lockColWidth[10], xactColWidth[5], querystateColWidth[5];
popuphelp* m_Popup = NULL;
long lastlogitem = -1, lastlogitemShow=-1;
wxPoint lastmouse;
int cboToRate();
wxString rateToCboString(int rate);
wxImageList *listimages;
long getlongvalue(wxString source,wxString match_str);
void AddStatusPane();
void AddLockPane();
void AddXactPane();
void AddLogPane();
void AddQuerystatePane();
void OnHelp(wxCommandEvent &ev);
void OnContents(wxCommandEvent &ev);
void OnExit(wxCommandEvent &event);
void OnCopy(wxCommandEvent &ev);
void OnCopyQuery(wxCommandEvent &ev);
void OnToggleStatusPane(wxCommandEvent &event);
void OnToggleLockPane(wxCommandEvent &event);
void OnToggleXactPane(wxCommandEvent &event);
void OnToggleLogPane(wxCommandEvent &event);
void OnToggleQuerystatePane(wxCommandEvent &event);
void OnToggleWaitEnable(wxCommandEvent& event);
void OnEmptyAction(wxCommandEvent &event);
void OnLogContextMenu(wxCommandEvent& event);
void OnMoveMouseLog(wxMouseEvent& event);
void OnTimerHintLog(wxTimerEvent& event);
void OnToggleToolBar(wxCommandEvent &event);
void OnDefaultView(wxCommandEvent &event);
void OnHighlightStatus(wxCommandEvent &event);
void OnRefreshUITimer(wxTimerEvent &event);
void OnRefreshStatusTimer(wxTimerEvent &event);
void OnRefreshLocksTimer(wxTimerEvent &event);
void OnRefreshXactTimer(wxTimerEvent &event);
void OnRefreshLogTimer(wxTimerEvent &event);
void OnRefreshQuerystateTimer(wxTimerEvent &event);
void SetColumnImage(ctlListView *list, int col, int image);
void OnSortStatusGrid(wxListEvent &event);
void OnRightClickStatusItem(wxListEvent& event);
void OnSortLockGrid(wxListEvent &event);
void OnSortXactGrid(wxListEvent &event);
void OnRightClickStatusGrid(wxListEvent &event);
void OnRightClickLockGrid(wxListEvent &event);
void OnRightClickXactGrid(wxListEvent &event);
void OnRightClickQuerystateGrid(wxListEvent &event);
void OnRightClickLogGrid(wxListEvent& event);
void OnStatusMenu(wxCommandEvent &event);
void OnLockMenu(wxCommandEvent &event);
void OnXactMenu(wxCommandEvent &event);
void OnQuerystateMenu(wxCommandEvent &event);
void OnChgColSizeStatusGrid(wxListEvent &event);
void OnChgColSizeLockGrid(wxListEvent &event);
void OnChgColSizeXactGrid(wxListEvent &event);
void OnChgColSizeQuerystateGrid(wxListEvent &event);
void OnRateChange(wxCommandEvent &event);
void OnPaneClose(wxAuiManagerEvent &evt);
void OnPaneActivated(wxAuiManagerEvent& evt);
void OnClose(wxCloseEvent &event);
void OnRefresh(wxCommandEvent &event);
void OnCancelBtn(wxCommandEvent &event);
void OnStatusCancelBtn(wxCommandEvent &event);
void OnLocksCancelBtn(wxCommandEvent &event);
void OnTerminateBtn(wxCommandEvent &event);
void OnStatusTerminateBtn(wxCommandEvent &event);
void OnLocksTerminateBtn(wxCommandEvent &event);
void OnSelStatusItem(wxListEvent &event);
void OnSelLockItem(wxListEvent &event);
void OnSelXactItem(wxListEvent &event);
void OnSelLogItem(wxListEvent &event);
void OnSelQuerystateItem(wxListEvent &event);
void OnLoadLogfile(wxCommandEvent &event);
void OnRotateLogfile(wxCommandEvent &event);
void OnCommit(wxCommandEvent &event);
void OnRollback(wxCommandEvent &event);
void OnClearFilter(wxCommandEvent& event);
void OnSetHighlightFilter(wxCommandEvent& event);
void OnLogKeyUp(wxKeyEvent& event);
void OnAddLabelTextThread(wxThreadEvent& event);
void ActivatePane(wxString name);
void OnCmdFindStrLog(wxCommandEvent& event);
void OnChangeDatabase(wxCommandEvent &ev);
int fillLogfileCombo();
void emptyLogfileCombo();
void addLogFile(wxDateTime *dt, bool skipFirst);
void addLogFile(const wxString &filename, const wxDateTime timestamp, long len, long &read, bool skipFirst);
void addLogLine(const wxString &str, bool formatted = true, bool csv_log_format = false);
void checkConnection();
DECLARE_EVENT_TABLE()
};
class serverStatusFactory : public actionFactory
{
public:
serverStatusFactory(menuFactoryList *list, wxMenu *mnu, ctlMenuToolbar *toolbar);
wxWindow *StartDialog(frmMain *form, pgObject *obj);
bool CheckEnable(pgObject *obj);
};
#endif