pgadmin3/frm/frmConfig.cpp
2020-07-07 22:19:12 +05:00

448 lines
12 KiB
C++

//////////////////////////////////////////////////////////////////////////
//
// pgAdmin III - PostgreSQL Tools
//
// Copyright (C) 2002 - 2016, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
// frmConfig.cpp - Configuration tool
//
//////////////////////////////////////////////////////////////////////////
#include "pgAdmin3.h"
#ifdef __WXMSW__
#include <io.h>
#include <fcntl.h>
#endif
#include <wx/imaglist.h>
#include "ctl/ctlMenuToolbar.h"
#include "frm/frmConfig.h"
#include "frm/frmHint.h"
#include "frm/frmMainConfig.h"
#include "frm/frmHbaConfig.h"
#include "frm/frmPgpassConfig.h"
#include "frm/frmMain.h"
#include "frm/frmAbout.h"
#include "utils/utffile.h"
#include "db/pgConn.h"
#include "db/pgSet.h"
#include "frm/menu.h"
#include "utils/pgfeatures.h"
#include "images/file_open.pngc"
#include "images/file_save.pngc"
#include "images/edit_undo.pngc"
#include "images/delete.pngc"
#include "images/help.pngc"
#include "images/hint2.pngc"
#include "images/checked.pngc"
#include "images/unchecked.pngc"
#include "images/query_execute.pngc"
BEGIN_EVENT_TABLE(frmConfig, pgFrame)
EVT_CLOSE( frmConfig::OnClose)
EVT_MENU(MNU_OPEN, frmConfig::OnOpen)
EVT_MENU(MNU_SAVE, frmConfig::OnSave)
EVT_MENU(MNU_SAVEAS, frmConfig::OnSaveAs)
EVT_MENU(MNU_EXECUTE, frmConfig::OnExecute)
EVT_MENU(MNU_HELP, frmConfig::OnHelp)
EVT_MENU(MNU_HINT, frmConfig::OnHint)
END_EVENT_TABLE()
wxImageList *configImageList = 0;
frmConfig::frmConfig(frmMain *parent, const wxString &title, pgConn *_conn)
: pgFrame(parent, title)
{
mainForm = parent;
conn = _conn;
SetStatusBarPane(-1);
}
frmConfig::frmConfig(const wxString &title, const wxString &configFile)
: pgFrame(NULL, title)
{
mainForm = 0;
conn = 0;
lastPath = configFile;
SetStatusBarPane(-1);
}
frmConfig::~frmConfig()
{
if (conn)
delete conn;
if (mainForm)
mainForm->RemoveFrame(this);
}
void frmConfig::InitFrame(const wxChar *frameName)
{
dlgName = frameName;
if (!configImageList)
{
configImageList = new wxImageList(16, 16, true, 2);
configImageList->Add(*unchecked_png_ico);
configImageList->Add(*checked_png_ico);
}
menuFactories = new menuFactoryList();
SetFont(settings->GetSystemFont());
toolBar = new ctlMenuToolbar(this, -1, wxDefaultPosition, wxDefaultSize, wxTB_FLAT | wxTB_NODIVIDER);
toolBar->SetToolBitmapSize(wxSize(16, 16));
fileMenu = new wxMenu();
editMenu = new wxMenu();
helpMenu = new wxMenu();
recentFileMenu = new wxMenu();
fileMenu->Append(MNU_OPEN, _("&Open...\tCtrl-O"), _("Open a query file"));
toolBar->AddTool(MNU_OPEN, wxEmptyString, *file_open_png_bmp, _("Open file"), wxITEM_NORMAL);
fileMenu->Append(MNU_SAVE, _("&Save\tCtrl-S"), _("Save current file"));
toolBar->AddTool(MNU_SAVE, wxEmptyString, *file_save_png_bmp, _("Save file"), wxITEM_NORMAL);
fileMenu->Append(MNU_SAVEAS, _("Save &as..."), _("Save file under new name"));
fileMenu->AppendSeparator();
toolBar->AddSeparator();
// File Menu
fileMenu->Append(MNU_EXECUTE, _("Reload server"), _("Reload Server to apply configuration changes."));
toolBar->AddTool(MNU_EXECUTE, wxEmptyString, *query_execute_png_bmp, _("Reload Server to apply configuration changes."), wxITEM_NORMAL);
fileMenu->AppendSeparator();
toolBar->AddSeparator();
fileMenu->Append(MNU_RECENT, _("&Recent files"), recentFileMenu);
fileMenu->Append(MNU_EXIT, _("E&xit\tCtrl-W"), _("Exit configuration tool"));
editMenu->Append(MNU_UNDO, _("&Undo\tCtrl-Z"), _("Undo last action"), wxITEM_NORMAL);
toolBar->AddTool(MNU_UNDO, wxEmptyString, *edit_undo_png_bmp, _("Undo last action"), wxITEM_NORMAL);
editMenu->AppendSeparator();
editMenu->Append(MNU_DELETE, _("&Delete\tDEL"), _("Delete current row"), wxITEM_NORMAL);
toolBar->AddTool(MNU_DELETE, wxEmptyString, *delete_png_bmp, _("Delete current row"), wxITEM_NORMAL);
toolBar->AddSeparator();
helpMenu->Append(MNU_CONTENTS, _("&Help"), _("Open the helpfile."));
helpMenu->Append(MNU_HINT, _("Hints"), _("Display helpful hints on current object."));
toolBar->AddTool(MNU_HINT, wxEmptyString, *hint2_png_bmp, _("Display helpful hints on current object."));
helpMenu->Append(MNU_HELP, _("&Configuration Help\tF1"), _("Display help on configuration options."));
helpMenu->AppendSeparator();
new bugReportFactory(menuFactories, helpMenu, 0);
aboutFactory *af = new aboutFactory(menuFactories, helpMenu, 0);
menuBar = new wxMenuBar();
menuBar->Append(fileMenu, _("&File"));
menuBar->Append(editMenu, _("&Edit"));
menuBar->Append(helpMenu, _("&Help"));
SetMenuBar(menuBar);
#ifdef __WXMAC__
wxApp::s_macAboutMenuItemId = af->GetId();
#else
(void)af;
#endif
menuFactories->RegisterMenu(this, wxCommandEventHandler(pgFrame::OnAction));
menuFactories->CheckMenu(0, menuBar, toolBar);
wxAcceleratorEntry entries[3];
entries[0].Set(wxACCEL_CTRL, (int)'O', MNU_OPEN);
entries[1].Set(wxACCEL_CTRL, (int)'S', MNU_SAVE);
entries[2].Set(wxACCEL_NORMAL, WXK_F1, MNU_HELP);
wxAcceleratorTable accel(3, entries);
SetAcceleratorTable(accel);
toolBar->AddTool(MNU_HELP, wxEmptyString, *help_png_bmp, _("Display help on configuration options."), wxITEM_NORMAL);
toolBar->Realize();
UpdateRecentFiles();
fileMenu->Enable(MNU_SAVE, false);
editMenu->Enable(MNU_UNDO, false);
toolBar->EnableTool(MNU_SAVE, false);
toolBar->EnableTool(MNU_UNDO, false);
if (conn)
{
toolBar->EnableTool(MNU_OPEN, false);
if (!conn->HasFeature(FEATURE_RELOAD_CONF))
{
fileMenu->Enable(MNU_EXECUTE, false);
toolBar->EnableTool(MNU_EXECUTE, false);
}
}
else
{
fileMenu->Enable(MNU_EXECUTE, false);
toolBar->EnableTool(MNU_EXECUTE, false);
}
SetToolBar(toolBar);
statusBar = CreateStatusBar();
}
void frmConfig::Go()
{
Show();
}
void frmConfig::DoOpen(const wxString &fn)
{
wxCommandEvent ev;
OnOpen(ev);
}
void frmConfig::OnClose(wxCloseEvent &event)
{
if (CheckChanged(event.CanVeto()) && event.CanVeto())
{
event.Veto();
return;
}
Destroy();
}
void frmConfig::OnHelp(wxCommandEvent &event)
{
DisplayHelp(GetHelpPage(), HELP_POSTGRESQL);
}
void frmConfig::OnHint(wxCommandEvent &event)
{
DisplayHint(true);
}
void frmConfig::OnBugreport(wxCommandEvent &event)
{
DisplayHelp(wxT("bugreport"), HELP_PGADMIN);
}
void frmConfig::OnExecute(wxCommandEvent &event)
{
wxMessageDialog dlg(this, _("Are you sure you want trigger the server to reload its configuration?"),
_("Reload server configuration"), wxICON_EXCLAMATION | wxYES_NO | wxNO_DEFAULT);
if (dlg.ShowModal() == wxID_YES)
{
if (conn->ExecuteVoid(wxT("SELECT pg_reload_conf()")))
{
}
}
}
void frmConfig::OnOpen(wxCommandEvent &event)
{
if (CheckChanged(true))
return;
#ifdef __WXMSW__
wxFileDialog dlg(this, _("Open configuration file"), lastDir, wxT(""),
_("Configuration files (*.conf)|*.conf|All files (*.*)|*.*"), wxFD_OPEN);
#else
wxFileDialog dlg(this, _("Open configuration file"), lastDir, wxT(""),
_("Configuration files (*.conf)|*.conf|All files (*)|*"), wxFD_OPEN);
#endif
if (dlg.ShowModal() == wxID_OK)
{
lastFilename = dlg.GetFilename();
lastDir = dlg.GetDirectory();
lastPath = dlg.GetPath();
OpenLastFile();
UpdateRecentFiles();
}
}
void frmConfig::OnSave(wxCommandEvent &event)
{
if (!fileMenu->IsEnabled(MNU_SAVE))
return;
if (conn)
{
wxMessageDialog msg(this, _("If a malformed configuration is written to the server, it might show problems when restarting or reloading.\nAre you sure the configuration is correct?"),
_("Writing configuration file to server"), wxICON_EXCLAMATION | wxYES_NO | wxNO_DEFAULT);
if (msg.ShowModal() != wxID_YES)
return;
}
WriteFile(conn);
}
void frmConfig::OnSaveAs(wxCommandEvent &event)
{
#ifdef __WXMSW__
wxFileDialog *dlg = new wxFileDialog(this, _("Save configuration file as"), lastDir, lastFilename,
_("Configuration files (*.conf)|*.conf|All files (*.*)|*.*"), wxFD_SAVE | wxFD_OVERWRITE_PROMPT);
#else
wxFileDialog *dlg = new wxFileDialog(this, _("Save configuration file as"), lastDir, lastFilename,
_("Configuration files (*.conf)|*.conf|All files (*)|*"), wxFD_SAVE | wxFD_OVERWRITE_PROMPT);
#endif
if (dlg->ShowModal() == wxID_OK)
{
lastFilename = dlg->GetFilename();
lastDir = dlg->GetDirectory();
lastPath = dlg->GetPath();
WriteFile();
if (!changed)
UpdateRecentFiles();
}
delete dlg;
}
void frmConfig::OpenLastFile()
{
wxUtfFile file(lastPath, wxFile::read, wxFONTENCODING_SYSTEM);
if (file.IsOpened())
{
wxString buffer;
file.Read(buffer);
file.Close();
DisplayFile(buffer);
statusBar->SetStatusText(wxString::Format(_(" Configuration read from %s"), lastPath.c_str()));
fileMenu->Enable(MNU_SAVE, false);
editMenu->Enable(MNU_UNDO, false);
toolBar->EnableTool(MNU_SAVE, false);
toolBar->EnableTool(MNU_UNDO, false);
}
}
bool frmConfig::CheckChanged(bool canVeto)
{
if (changed && settings->GetAskSaveConfirmation())
{
wxMessageDialog msg(this, _("The configuration is modified.\nDo you want to save changes?"),
GetTitle(),
wxYES_NO | wxNO_DEFAULT | wxICON_EXCLAMATION |
(canVeto ? wxCANCEL : 0));
switch (msg.ShowModal())
{
case wxID_YES:
WriteFile(conn);
return changed;
case wxID_CANCEL:
return true;
}
}
return false;
}
bool frmConfig::DoWriteFile(const wxChar *str, pgConn *conn)
{
bool done = false;
wxString buffer;
if (filetype != wxTextFileType_Unix)
{
buffer = wxTextBuffer::Translate(str, filetype);
str = buffer;
}
if (conn)
{
done = conn->ExecuteVoid(
wxT("SELECT pg_file_unlink('") + serverFileName + wxT(".bak');\n")
wxT("SELECT pg_file_write('") + serverFileName + wxT(".tmp', ")
+ conn->qtDbString(str) + wxT(", false);\n")
wxT("SELECT pg_file_rename('") + serverFileName + wxT(".tmp', '")
+ serverFileName + wxT("', '")
+ serverFileName + wxT(".bak');"));
if (!done)
conn->ExecuteVoid(
wxT("SELECT pg_file_unlink('") + serverFileName + wxT(".tmp')"));
}
else
{
wxUtfFile file(lastPath, wxFile::write, wxFONTENCODING_SYSTEM);
if (file.IsOpened())
{
#ifdef __WXMSW__
_setmode(file.fd(), _O_BINARY);
#endif
file.Write(str);
file.Close();
done = true;
}
}
if (done)
{
if (conn)
statusBar->SetStatusText(wxString::Format(_(" Configuration written to %s"), conn->GetHost().c_str()));
else
statusBar->SetStatusText(wxString::Format(_(" Configuration written to %s"), lastPath.c_str()));
}
return done;
}
void frmConfig::DisplayHint(bool force)
{
wxString str = GetHintString();
if (str.IsEmpty())
{
if (!force)
return;
str = _("No configuration setting detected that appears doubtful.");
}
wxMessageBox(str, _("Backend Configuration Hints"), wxICON_EXCLAMATION | wxOK);
}
frmConfig *frmConfig ::Create(const wxString &title, const wxString &configFile, tryMode mode)
{
frmConfig *frm = 0;
if (wxFile::Exists(configFile))
{
if (mode == HBAFILE || configFile.Right(11) == wxT("pg_hba.conf"))
frm = new frmHbaConfig(title, configFile);
else if (mode == MAINFILE || configFile.Right(15) == wxT("postgresql.conf"))
frm = new frmMainConfig(title, configFile);
else if (mode == PGPASSFILE || configFile.Right(11) == wxT("pgpass.conf") || configFile.Right(7) == wxT(".pgpass"))
frm = new frmPgpassConfig(title, configFile);
// unknown config file!
}
if (frm)
frm->Go();
return frm;
}