mirror of
https://github.com/levinsv/pgadmin3.git
synced 2026-08-16 06:12:28 -06:00
Добавлен подсчёт времени в процентах от "Execution Time:" для триггеров при выполнении Shift+F7 в инструменте запросов. Для строки "Planning Time:" - процент от общего времени запроса равного "Planning Time:"+"Execution Time:" Для всех остальных процент времени от "Execution Time:"
262 lines
8.2 KiB
C++
262 lines
8.2 KiB
C++
//////////////////////////////////////////////////////////////////////////
|
||
//
|
||
// pgAdmin III - PostgreSQL Tools
|
||
//
|
||
// Copyright (C) 2002 - 2016, The pgAdmin Development Team
|
||
// This software is released under the PostgreSQL Licence
|
||
//
|
||
// ctlSQLGrid.h - SQL Data Display Grid
|
||
//
|
||
//////////////////////////////////////////////////////////////////////////
|
||
|
||
#ifndef CTLSQLGRID_H
|
||
#define CTLSQLGRID_H
|
||
|
||
// wxWindows headers
|
||
#include <wx/grid.h>
|
||
#include <wx/brush.h>
|
||
#include "utils/popuphelp.h"
|
||
|
||
class GroupRows;
|
||
|
||
class ctlSQLGrid : public wxGrid
|
||
{
|
||
public:
|
||
ctlSQLGrid(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size);
|
||
ctlSQLGrid();
|
||
|
||
wxString GetExportLine(int row);
|
||
wxString GetExportLine(int row, wxArrayInt cols);
|
||
wxString GetExportLine(int row, int col1, int col2);
|
||
virtual bool IsColText(int col)
|
||
{
|
||
return false;
|
||
}
|
||
int CopyTableToHtml(wxString htmlquery);
|
||
int Copy(int gensql);
|
||
virtual bool CheckRowPresent(int row)
|
||
{
|
||
return true;
|
||
};
|
||
bool IsSort()
|
||
{
|
||
return isSort;
|
||
};
|
||
void SetSort(bool flag)
|
||
{
|
||
isSort = flag;
|
||
};
|
||
|
||
wxString GetColumnName(int colNum);
|
||
wxSize GetBestSize(int row, int col);
|
||
void OnLabelDoubleClick(wxGridEvent& event);
|
||
void OnGridSelectCell(wxGridEvent& evt);
|
||
void OnLabelClick(wxGridEvent& event);
|
||
void OnCellRightClick(wxGridEvent& event);
|
||
void OnMouseEvent(wxMouseEvent& event);
|
||
void OnShowPopup(wxThreadEvent& event);
|
||
bool FullArrayCollapseRowsPlan(bool clear);
|
||
void AutoSizeColumn(int col, bool setAsMin = false, bool doLimit = true);
|
||
void AutoSizeColumns(bool setAsMin);
|
||
wxString GetRowLabelValue(int row);
|
||
void SetRowGroup(int row);
|
||
GroupRows* grp;
|
||
int generatesql; // 0 -copy, 1 - insert , 2 - in_list, 3 - where list
|
||
wxString sqlquerytext;
|
||
// Fast searh
|
||
wxString searchStr;
|
||
|
||
WX_DECLARE_STRING_HASH_MAP(int, ColKeySizeHashMap);
|
||
|
||
DECLARE_DYNAMIC_CLASS(ctlSQLGrid)
|
||
DECLARE_EVENT_TABLE()
|
||
|
||
private:
|
||
void setresizedpi();
|
||
void OnCopy(wxCommandEvent& event);
|
||
void OnMouseWheel(wxMouseEvent& event);
|
||
void OnGridColSize(wxGridSizeEvent& event);
|
||
void DrawColLabel(wxDC& dc, int col);
|
||
void DrawRowLabel(wxDC& dc, int row);
|
||
wxString GetColKeyValue(int col);
|
||
void AppendColumnHeader(wxString& str, int start, int end);
|
||
void AppendColumnHeader(wxString& str, wxArrayInt columns);
|
||
// Stores sizes of colums explicitly resized by user
|
||
ColKeySizeHashMap colSizes;
|
||
// Max size for each column
|
||
wxArrayInt colMaxSizes;
|
||
bool isSort;
|
||
// viewr
|
||
popuphelp* m_Popup = NULL;
|
||
int rcol, rrow;
|
||
wxPoint rpos;
|
||
//FunctionPGHelper fh;
|
||
};
|
||
|
||
class GroupRows
|
||
{
|
||
public:
|
||
GroupRows(ctlSQLGrid* grid) {
|
||
g = grid;
|
||
rowsGroup.Clear();
|
||
rowsGroup.Add(0, g->GetNumberRows());
|
||
end.Clear();
|
||
end.Add(-1, g->GetNumberRows());
|
||
run.Clear();
|
||
run.Add(0.0, g->GetNumberRows());
|
||
endsectionrow=-1;
|
||
endsectiontotal=0;
|
||
};
|
||
/**
|
||
* @brief Определяет строчный диапазон узла и время его выполнения
|
||
*
|
||
* @param rowgroup Начальная строка узла со знаком ->
|
||
* @param lastrowgroup Последняя строка узла
|
||
* @param actualtime Время выполнения узла
|
||
*/
|
||
void AddGroup(int rowgroup, int lastrowgroup, double actualtime) {
|
||
// default group open
|
||
rowsGroup[rowgroup] = -rowgroup;
|
||
//beg[rowgroup]=rowgroup;
|
||
//wxASSERT_MSG(lastrowgroup > end.Count(), " out of bounds");
|
||
end[rowgroup] = lastrowgroup;
|
||
run[rowgroup] = actualtime;
|
||
};
|
||
void SetTimeToRow(int row, double actualtime) {
|
||
// default group open
|
||
//beg[rowgroup]=rowgroup;
|
||
//wxASSERT_MSG(lastrowgroup > end.Count(), " out of bounds");
|
||
run[row] = actualtime;
|
||
};
|
||
/**
|
||
* @brief Скрывает или показывает узел плана
|
||
*
|
||
* @param row начальная строка узла
|
||
* @param visible
|
||
*/
|
||
void VisibleGroup(int row, bool visible) {
|
||
int endg = end[row];
|
||
int grp = IsGroupRow(row);
|
||
int gg;
|
||
int r = row + 1;
|
||
if (grp != 0) {
|
||
|
||
if (!visible) {
|
||
// hide group
|
||
rowsGroup[row] *= -1;
|
||
for (int i = r; i < (endg + 1); i++) {
|
||
g->HideRow(i);
|
||
}
|
||
wxGridCellAttr* pAttrg = new wxGridCellAttr;
|
||
pAttrg->SetBackgroundColour(wxColour(200, 191, 232)); // close group
|
||
g->SetRowAttr(row, pAttrg);
|
||
}
|
||
else
|
||
{
|
||
// show group
|
||
rowsGroup[row] *= -1;
|
||
int sizerow = g->GetDefaultRowSize();
|
||
//pAttr->SetBackgroundColour(wxColour(0,162,232));
|
||
wxGridCellAttr* pAttrg = new wxGridCellAttr;
|
||
if (g->GetCellValue(row, 0).Contains("(never executed)") ) {
|
||
// not higtligth this row
|
||
pAttrg->SetBackgroundColour(wxColour(224, 255, 224)); // green
|
||
} else
|
||
pAttrg->SetBackgroundColour(wxColour(248, 240, 130)); // yellow
|
||
g->SetRowAttr(row, pAttrg);
|
||
for (int i = r; i < (endg + 1); i++) {
|
||
gg = IsGroupRow(i);
|
||
if (gg <= 0) {
|
||
g->SetRowSize(i, sizerow);
|
||
}
|
||
else
|
||
{
|
||
g->SetRowSize(i, sizerow);
|
||
i = end[i];
|
||
}
|
||
|
||
}
|
||
|
||
}
|
||
}
|
||
};
|
||
// 0 - no group, -int - open group ,+int - close gruop
|
||
int IsGroupRow(int row) {
|
||
if (end[row] != -1) {
|
||
// is group
|
||
return rowsGroup[row];
|
||
}
|
||
else return 0;
|
||
};
|
||
void ColoriseRow(int row, const wxColour& color) {
|
||
//g->GetTable()->SetRowLabelValue(row-1,s);
|
||
wxGridCellAttr* pAttr = new wxGridCellAttr;
|
||
pAttr->SetBackgroundColour(color);
|
||
g->SetRowAttr(row, pAttr);
|
||
};
|
||
/**
|
||
* @brief Подсчёт времени всех узлов. Начиная со строки endsectionrow
|
||
* считается время планирования и выполнения триггеров.
|
||
* Эти расчёты не связаны с проценьами по узлам плана.
|
||
*
|
||
*/
|
||
void CalcTime() {
|
||
//g->GetTable()->SetRowLabelValue(row-1,s);
|
||
double sum = 0;
|
||
double total = 1;
|
||
for (int i = 0; i < run.Count(); i++) {
|
||
double t = run[i];
|
||
if (i == 0) {
|
||
total = abs(t);
|
||
g->GetTable()->SetRowLabelValue(i, "100");
|
||
}
|
||
else
|
||
{
|
||
wxString str;
|
||
if (i>=endsectionrow && endsectionrow!=-1)
|
||
{
|
||
total=endsectiontotal;
|
||
if (i==endsectionrow) total+=t; // % plan = plan time / (plan time + execute time)
|
||
}
|
||
|
||
if (total == 0 || t == 0) {
|
||
str = "";
|
||
}
|
||
else
|
||
{
|
||
t = (t / total) * 100;
|
||
str.Printf(wxT("%5.2f"), t);
|
||
}
|
||
g->GetTable()->SetRowLabelValue(i, str);
|
||
}
|
||
|
||
}
|
||
|
||
|
||
};
|
||
int endsectionrow; // start section after Planning time;
|
||
double endsectiontotal; // value Execution Time:
|
||
private:
|
||
ctlSQLGrid* g;
|
||
wxArrayInt rowsGroup, end;
|
||
wxArrayDouble run;
|
||
};
|
||
//#define TEST_wxGridCellAutoWrapStringRenderer
|
||
|
||
class CursorCellRenderer : public wxGridCellStringRenderer
|
||
{
|
||
protected:
|
||
wxSize GetBestSize(wxGrid& grid,
|
||
wxGridCellAttr& attr,
|
||
wxDC& dc,
|
||
int row, int col) wxOVERRIDE;
|
||
|
||
public:
|
||
void Draw(wxGrid& grid, wxGridCellAttr& attr, wxDC& dc,
|
||
const wxRect& rect, int row, int col, bool isSelected) wxOVERRIDE;
|
||
CursorCellRenderer(int thous_pixel_sep);
|
||
private:
|
||
int thousands_pixel_sep;
|
||
};
|
||
|
||
#endif
|