pgadmin3/include/ctl/ctlSQLResult.h
lsv a8ddbc4999 Fix generate Insert SQL instruction. Copying result lines based on a template.
1. При некоторых настройках при генерации Insert инструкций, пустые строки заменялись на null.
   Этот коммит исправлет проблему.
2. Результаты запросов можно оформить произвольным образом используя шаблоны указанные в однострочных
   коментариях.
   Формат шаблона: --@gen:Имя шаблона в контестном меню результата:Тут текст шаблона - cols = @colname@,@colname2,a@\n
   Для добавлнения перевода строк в вывод можно использовать \n.
   Коментарии указывается в теле запроса (можно указать перед запросом).
   Можно указать строку из которой нужно сделать выбрать содержимое:
       @colname[-1]@ - содержимое колонки colname предыдущей строки(относительная адресация).
       @colname[0]@  - содержимое колонки colname 1 строки (или выделенного диапазона строк).
                       Адресация с начинается с 0. Это абсолютная адресация строк.
       @colname2,a@  - Указание что результат нужно будет выровнять.
                       Флаг "а" глобальный его можно указать у любой колонки.
       Флаги указываются в самом конце определения колонки после запятой. Пример: @col1[-1],a@

   Если перечень имен колонок запроса не совпадает со списком полей шаблона то шаблон не будет добавлен
   в контекстное меню Generate.
   Полученный текст копируется в буфер обмена.
   При генерации текста используются настройки "Вид кавычек" и "Что брать в кавычки".
   Шаблоны сохраняются перед выполнением SQL команды и после редактирования шаблона
   запрос нужно выполнить повторно.
2026-01-14 17:17:08 +05:00

143 lines
3.5 KiB
C++

//////////////////////////////////////////////////////////////////////////
//
// pgAdmin III - PostgreSQL Tools
//
// Copyright (C) 2002 - 2016, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
// ctlSQLResult.h - SQL Query result window
//
//////////////////////////////////////////////////////////////////////////
#ifndef CTLSQLRESULT_H
#define CTLSQLRESULT_H
// wxWindows headers
#include <wx/thread.h>
#include "db/pgSet.h"
#include "db/pgConn.h"
#include "ctlSQLGrid.h"
#include "frm/frmExport.h"
#include "frm/frmQuery.h"
#define CTLSQL_RUNNING 100 // must be greater than ExecStatusType PGRES_xxx values
class ctlSQLResult : public ctlSQLGrid
{
public:
ctlSQLResult(wxWindow *parent, pgConn *conn, wxWindowID id, const wxPoint &pos = wxDefaultPosition, const wxSize &size = wxDefaultSize);
~ctlSQLResult();
int Execute(const wxString &query, int resultToDisplay = 0, wxWindow *caller = 0, long eventId = 0, void *data = 0); // > 0: resultset to display, <=0: last result
void SetConnection(pgConn *conn);
long NumRows() const;
long InsertedCount() const;
OID InsertedOid() const;
wxColor cg;
int Abort();
bool Export();
bool ToFile();
bool ToFile(frmExport *frm);
bool CanExport()
{
return NumRows() > 0 && colNames.GetCount() > 0;
}
wxString OnGetItemText(long item, long col) const;
wxString SummaryColumn();
wxString CompareSelectCells();
wxString AutoColsPlot(int flags,frmQuery *parent);
wxString CheckSelColumnDate();
wxString CopySelColumnNameType(bool onlyname);
wxString GenerateTemplate(wxString &templ,int action);
void ClearFilter();
bool IsColText(int col);
bool hasRowNumber()
{
return !rowcountSuppressed;
}
int RunStatus();
wxString GetMessagesAndClear();
wxString GetErrorMessage();
pgError GetResultError();
void DisplayData(bool single = false);
bool GetRowCountSuppressed()
{
return rowcountSuppressed;
};
void SetMaxRows(int rows);
void ResultsFinished();
void OnGridSelect(wxGridRangeSelectEvent &event);
void OnGridColSort(wxGridEvent& event);
void OnKeyChar(wxKeyEvent& event);
void OnKeyUp(wxKeyEvent& event);
wxString SetFilter(int row,int col,bool reverse);
wxArrayString colNames;
wxArrayString colTypes;
wxArrayLong colTypClasses;
private:
pgQueryThread *thread;
pgConn *conn;
bool rowcountSuppressed;
wxTextCtrl* m_win_s;
};
class sqlResultTable : public wxGridStringTable//wxGridTableBase
{
public:
sqlResultTable();
wxString GetValue(int row, int col);
wxString GetValueFast(int row, int col);
wxString GetValueWithNull(int row, int col, bool *isnull);
wxString GetRowLabelValue( int row ) ;
int GetNumberRows();
int GetNumberCols();
bool isplan;
bool use_map; // use maplines for GetValue
int *maplines; // maplines[visible_row]=real_row
int *colorder; // array order type -1 desc , 0 no sort, 1 asc
#define MAX_COL_SORT 5
int colsortnumber[MAX_COL_SORT];
int sortColumns(); //
int setSortColumn(int col); // set order for column (cycle change value -1,0,1)
int getSortColumn(int col);
int initSort(); // allocate memory
bool IsEmptyCell(int row, int col)
{
return false;
}
wxString GetColLabelValue(int col);
void SetValue(int row, int col, const wxString &value)
{
return;
}
void SetThread(pgQueryThread *t)
{
thread = t;
}
bool DeleteRows(size_t pos = 0, size_t numRows = 1)
{
return true;
}
bool DeleteCols(size_t pos = 0, size_t numCols = 1)
{
return true;
}
private:
pgQueryThread *thread;
bool c_IndicateNull;
int c_MaxColSize;
wxString c_ThousandsSeparator, c_DecimalMark;
};
#endif