From 0315ab6d4c2a6c3d3ec9ed2d2b316b8bc5f495df Mon Sep 17 00:00:00 2001 From: levinsv <44033647+levinsv@users.noreply.github.com> Date: Tue, 7 Jul 2020 21:44:28 +0500 Subject: [PATCH] add files for correct compile --- ex_pscan.png | Bin 0 -> 9757 bytes ex_pscan.pngc | 1264 +++++++++++++++++++++++++++++ pgAdmin3.cpp | 2047 +++++++++++++++++++++++++++++++++++++++++++++++ pgAdmin3.layout | 15 + pgAdmin3.rc | 56 ++ precomp.cpp | 18 + settings.ini | 31 + 7 files changed, 3431 insertions(+) create mode 100644 ex_pscan.png create mode 100644 ex_pscan.pngc create mode 100644 pgAdmin3.cpp create mode 100644 pgAdmin3.layout create mode 100644 pgAdmin3.rc create mode 100644 precomp.cpp create mode 100644 settings.ini diff --git a/ex_pscan.png b/ex_pscan.png new file mode 100644 index 0000000000000000000000000000000000000000..381d00d41274a5ed331efd901f2b8b1d235b5f0f GIT binary patch literal 9757 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYV2a>i1B%QlYbpRzEa{HEjtmSN`?>!lvI6;> z1s;*b3=DjSK$uZf!>a)(C|TkfQ4*Y=R#Ki=l*$m0n3-3i=jR%tP-d)Ws%K$t-4M&b zpgPOb#WAEJ?(KC$UIqr9!y7)T-`#lPso;u~w7+;P3~g8Kizxel&bW)5mE3fEOvF<-=(CI9h*zE7#HbakPCf z+CCa>AC0z;M%zcD?IUQfakPCn+CCg@AC9&UfrC$@?c>q*@o4*aw0%6IsOk()) + { + wxMemoryInputStream img_ex_pscan_pngIS(ex_pscan_png_data, sizeof(ex_pscan_png_data)); + img_ex_pscan_png->LoadFile(img_ex_pscan_pngIS, wxBITMAP_TYPE_PNG); + } + return img_ex_pscan_png; +} +#define ex_pscan_png_img ex_pscan_png_img() + +static wxBitmap *ex_pscan_png_bmp() +{ + static wxBitmap *bmp_ex_pscan_png; + if (!bmp_ex_pscan_png || !bmp_ex_pscan_png->IsOk()) + bmp_ex_pscan_png = new wxBitmap(*ex_pscan_png_img); + return bmp_ex_pscan_png; +} +#define ex_pscan_png_bmp ex_pscan_png_bmp() + +static wxIcon *ex_pscan_png_ico() +{ + static wxIcon *ico_ex_pscan_png; + if (!ico_ex_pscan_png || !ico_ex_pscan_png->IsOk()) + { + ico_ex_pscan_png = new wxIcon(); + ico_ex_pscan_png->CopyFromBitmap(*ex_pscan_png_bmp); + } + return ico_ex_pscan_png; +} +#define ex_pscan_png_ico ex_pscan_png_ico() + +#endif // EX_PSCAN_PNG_H diff --git a/pgAdmin3.cpp b/pgAdmin3.cpp new file mode 100644 index 0000000..0bac68c --- /dev/null +++ b/pgAdmin3.cpp @@ -0,0 +1,2047 @@ +////////////////////////////////////////////////////////////////////////// +// +// pgAdmin III - PostgreSQL Tools +// +// Copyright (C) 2002 - 2016, The pgAdmin Development Team +// This software is released under the PostgreSQL Licence +// +// pgAdmin3.cpp - The application +// +////////////////////////////////////////////////////////////////////////// +#include "pgAdmin3.h" + +// wxWindows headers +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// wxOGL +#include + +// Windows headers +#ifdef __WXMSW__ +#include +#endif + +// Linux headers +#ifdef __LINUX__ +#include +#endif + +#ifdef __WXGTK__ +#include +#endif + +// App headers +#include "copyright.h" +#include "version.h" +#include "utils/misc.h" +#include "utils/sysSettings.h" +#include "schema/pgServer.h" +#include "frm/frmMain.h" +#include "frm/frmConfig.h" +#include "frm/frmQuery.h" +#include "frm/frmStatus.h" +#ifdef DATABASEDESIGNER +#include "frm/frmDatabaseDesigner.h" +#endif +#include "frm/frmSplash.h" +#include "dlg/dlgSelectConnection.h" +#include "db/pgConn.h" +#include "utils/sysLogger.h" +#include "utils/registry.h" +#include "frm/frmHint.h" + +#include "ctl/xh_calb.h" +#include "ctl/xh_timespin.h" +#include "ctl/xh_sqlbox.h" +#include "ctl/xh_ctlcombo.h" +#include "ctl/xh_ctltree.h" +#include "ctl/xh_ctlchecktreeview.h" +#include "ctl/xh_ctlcolourpicker.h" + +#define DOC_DIR wxT("/docs") +#define UI_DIR wxT("/ui") +#define I18N_DIR wxT("/i18n") +#define BRANDING_DIR wxT("/branding") +#define PLUGINS_DIR wxT("/plugins.d") +#define SETTINGS_INI wxT("/settings.ini") + +// Globals +frmMain *winMain = 0; +wxThread *updateThread = 0; + +#if defined(HAVE_OPENSSL_CRYPTO) || defined(HAVE_GCRYPT) +#include "utils/sshTunnel.h" +CSSHTunnelThread *pgadminTunnelThread = 0; +#endif + +sysSettings *settings; +wxArrayInt existingLangs; +wxArrayString existingLangNames; +wxLocale *locale = 0; +pgAppearanceFactory *appearanceFactory = 0; + +wxString pgBackupExecutable; // complete filename of PostgreSQL's pg_dump, pg_dumpall and pg_restore, if available +wxString pgBackupAllExecutable; +wxString pgRestoreExecutable; + +wxString edbBackupExecutable; // complete filename of EnterpriseDB's pg_dump, pg_dumpall and pg_restore, if available +wxString edbBackupAllExecutable; +wxString edbRestoreExecutable; + +wxString gpBackupExecutable; // complete filename of Greenplum's pg_dump, pg_dumpall and pg_restore, if available +wxString gpBackupAllExecutable; +wxString gpRestoreExecutable; + +wxString loadPath; // Where the program is loaded from +wxString dataDir; // The program data directory +wxString docPath; // Where docs are stored +wxString uiPath; // Where ui data is stored +wxString i18nPath; // Where i18n data is stored +wxString brandingPath; // Where branding data is stored +wxString pluginsDir; // The plugins ini file directory +wxString settingsIni; // The settings.ini file + +wxLog *logger; + +bool dialogTestMode = false; + +#define LANG_FILE wxT("pgadmin3.lng") + +IMPLEMENT_APP(pgAdmin3) + +#ifdef __WXMSW__ +// Dynamically loaded EDB functions +PQGETOUTRESULT PQiGetOutResult; +PQPREPAREOUT PQiPrepareOut; +PQSENDQUERYPREPAREDOUT PQiSendQueryPreparedOut; +#endif + +#ifdef __WXGTK__ + +class pgRendererNative : public wxDelegateRendererNative +{ +public: + pgRendererNative() : wxDelegateRendererNative(wxRendererNative::GetDefault()) {} + + void DrawTreeItemButton(wxWindow *win, wxDC &dc, const wxRect &rect, int flags) + { + GetGeneric().DrawTreeItemButton(win, dc, rect, flags); + } +}; + +#endif +#define CTL_LB 100 +class frmDlgTest : public wxFrame +{ +public: + frmDlgTest(); +private: + void OnSelect(wxCommandEvent &ev); + wxListBox *dlgList; + DECLARE_EVENT_TABLE() +}; + + +BEGIN_EVENT_TABLE(frmDlgTest, wxFrame) + EVT_LISTBOX_DCLICK(CTL_LB, frmDlgTest::OnSelect) +END_EVENT_TABLE(); + + +frmDlgTest::frmDlgTest() : wxFrame(0, -1, wxT("pgAdmin III Translation test mode")) +{ + dlgList = new wxListBox(this, CTL_LB, wxDefaultPosition, wxDefaultSize, 0, NULL, wxLB_SORT); + + // unfortunately, the MemoryFS has no search functions implemented + // so we can't extract the names in the EMBED_XRC case + + wxDir dir(uiPath); + wxString filename; + + bool found = dir.GetFirst(&filename, wxT("*.xrc")); + while (found) + { + dlgList->Append(filename.Left(filename.Length() - 4)); + found = dir.GetNext(&filename); + } + if (!dlgList->GetCount()) + { + dlgList->Append(wxT("No xrc files in directory")); + dlgList->Append(uiPath); + dlgList->Disable(); + } +} + + +void frmDlgTest::OnSelect(wxCommandEvent &ev) +{ + wxString dlgName = dlgList->GetStringSelection(); + if (!dlgName.IsEmpty()) + { + pgDialog *dlg = new pgDialog; + dlg->SetFont(settings->GetSystemFont()); + dlg->LoadResource(this, dlgName); + dlg->SetTitle(dlgName); + dlg->Show(); + } +} + + +// The Application! +bool pgAdmin3::OnInit() +{ + // Force logging off until we're ready + wxLog *seLog = new wxLogStderr(); + wxLog::SetActiveTarget(seLog); + + // Setup the basic paths for the app installation. Required by settings! + InitAppPaths(); + + // Load the Settings +#ifdef __WXMSW__ + settings = new sysSettings(wxT("pgAdmin III")); +#else + settings = new sysSettings(wxT("pgadmin3")); +#endif + + // Setup additional helper paths etc. Requires settings! + InitXtraPaths(); + + locale = new wxLocale(); + locale->AddCatalogLookupPathPrefix(i18nPath); + + wxLanguage langId = (wxLanguage)settings->Read(wxT("LanguageId"), wxLANGUAGE_DEFAULT); + if (locale->Init(langId)) + { +#ifdef __LINUX__ + { + wxLogNull noLog; + locale->AddCatalog(wxT("fileutils")); + } +#endif + locale->AddCatalog(wxT("pgadmin3")); + } + +#ifdef DATABASEDESIGNER + //Initialize Font + hdFontAttribute::InitFont(); +#endif + + long langCount = 0; + const wxLanguageInfo *langInfo; + + wxString langfile = FileRead(i18nPath + wxT("/") LANG_FILE, 1); + + if (!langfile.IsEmpty()) + { + wxStringTokenizer tk(langfile, wxT("\n\r")); + + while (tk.HasMoreTokens()) + { + wxString line = tk.GetNextToken().Strip(wxString::both); + if (line.IsEmpty() || line.StartsWith(wxT("#"))) + continue; + + wxString englishName = line.BeforeFirst(',').Trim(true); + wxString translatedName = line.AfterFirst(',').Trim(false); + + langInfo = wxLocale::FindLanguageInfo(englishName); + if (langInfo) + { + if (langInfo->CanonicalName == wxT("en_US") || + (!langInfo->CanonicalName.IsEmpty() && + wxDir::Exists(i18nPath + wxT("/") + langInfo->CanonicalName))) + { + existingLangs.Add(langInfo->Language); + existingLangNames.Add(translatedName); + langCount++; + } + } + } + } + + static const wxCmdLineEntryDesc cmdLineDesc[] = + { +#if wxCHECK_VERSION(2, 9, 0) + // wxCmdLineEntryDesc is one of the few places in 2.9 where wxT()s have any effect...they break the build + {wxCMD_LINE_SWITCH, "v", "version", _("show the version, and quit"), wxCMD_LINE_VAL_NONE}, + {wxCMD_LINE_SWITCH, "h", "help", _("show this help message, and quit"), wxCMD_LINE_VAL_NONE, wxCMD_LINE_OPTION_HELP }, + {wxCMD_LINE_OPTION, "s", "server", _("auto-connect to specified server"), wxCMD_LINE_VAL_STRING}, + {wxCMD_LINE_SWITCH, "S", "serverstatus", _("open server status window"), wxCMD_LINE_VAL_NONE}, + {wxCMD_LINE_OPTION, "Sc", "serverstatusconnect", _("connect server status window to database"), wxCMD_LINE_VAL_STRING}, + {wxCMD_LINE_SWITCH, "q", "query", _("open query tool"), wxCMD_LINE_VAL_NONE}, + {wxCMD_LINE_OPTION, "qc", "queryconnect", _("connect query tool to database"), wxCMD_LINE_VAL_STRING}, +#ifdef DATABASEDESIGNER + {wxCMD_LINE_SWITCH, "d", "designer", _("open designer window"), wxCMD_LINE_VAL_NONE}, + {wxCMD_LINE_OPTION, "dc", "designerconnectconnect", _("connect designer window to database"), wxCMD_LINE_VAL_STRING}, +#endif + {wxCMD_LINE_OPTION, "f", "file", _("file to load into the query tool in -q or -qc mode"), wxCMD_LINE_VAL_STRING}, + {wxCMD_LINE_OPTION, "cm", NULL, _("edit main configuration file"), wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_MULTIPLE}, + {wxCMD_LINE_OPTION, "ch", NULL, _("edit HBA configuration file"), wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_MULTIPLE}, + {wxCMD_LINE_OPTION, "cp", NULL, _("edit pgpass configuration file"), wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_MULTIPLE}, + {wxCMD_LINE_OPTION, "c", NULL, _("edit configuration files in cluster directory"), wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_MULTIPLE}, + {wxCMD_LINE_SWITCH, "t", NULL, _("dialog translation test mode"), wxCMD_LINE_VAL_NONE}, +#else + {wxCMD_LINE_SWITCH, wxT("v"), wxT("version"), _("show the version, and quit"), wxCMD_LINE_VAL_NONE}, + {wxCMD_LINE_SWITCH, wxT("h"), wxT("help"), _("show the help message, and quit"), wxCMD_LINE_VAL_NONE, wxCMD_LINE_OPTION_HELP }, + {wxCMD_LINE_OPTION, wxT("s"), wxT("server"), _("auto-connect to specified server"), wxCMD_LINE_VAL_STRING}, + {wxCMD_LINE_SWITCH, wxT("S"), wxT("serverstatus"), _("open server status window"), wxCMD_LINE_VAL_NONE}, + {wxCMD_LINE_OPTION, wxT("Sc"), wxT("serverstatusconnect"), _("connect server status window to database"), wxCMD_LINE_VAL_STRING}, + {wxCMD_LINE_SWITCH, wxT("q"), wxT("query"), _("open query tool"), wxCMD_LINE_VAL_NONE}, + {wxCMD_LINE_OPTION, wxT("qc"), wxT("queryconnect"), _("connect query tool to database"), wxCMD_LINE_VAL_STRING}, +#ifdef DATABASEDESIGNER + {wxCMD_LINE_SWITCH, wxT("d"), wxT("designer"), _("open designer window"), wxCMD_LINE_VAL_NONE}, + {wxCMD_LINE_OPTION, wxT("dc"), wxT("designerconnectconnect"), _("connect designer window to database"), wxCMD_LINE_VAL_STRING}, +#endif + {wxCMD_LINE_OPTION, wxT("f"), wxT("file"), _("file to load into the query tool in -q or -qc mode"), wxCMD_LINE_VAL_STRING}, + {wxCMD_LINE_OPTION, wxT("cm"), NULL, _("edit main configuration file"), wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_MULTIPLE}, + {wxCMD_LINE_OPTION, wxT("ch"), NULL, _("edit HBA configuration file"), wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_MULTIPLE}, + {wxCMD_LINE_OPTION, wxT("cp"), NULL, _("edit pgpass configuration file"), wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_MULTIPLE}, + {wxCMD_LINE_OPTION, wxT("c"), NULL, _("edit configuration files in cluster directory"), wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_MULTIPLE}, + {wxCMD_LINE_SWITCH, wxT("t"), NULL, _("dialog translation test mode"), wxCMD_LINE_VAL_NONE}, +#endif + {wxCMD_LINE_NONE} + + }; + + frmConfig::tryMode configMode = frmConfig::NONE; + wxString configFile; + + wxCmdLineParser cmdParser(cmdLineDesc, argc, argv); + if (cmdParser.Parse() != 0) + return false; + + if ( + (cmdParser.Found(wxT("q")) && cmdParser.Found(wxT("qc"))) + || (cmdParser.Found(wxT("S")) && cmdParser.Found(wxT("Sc"))) +#ifdef DATABASEDESIGNER + || (cmdParser.Found(wxT("d")) && cmdParser.Found(wxT("dc"))) +#endif + ) + { + cmdParser.Usage(); + return false; + } + + if (cmdParser.Found(wxT("cm"), &configFile)) + configMode = frmConfig::MAINFILE; + else if (cmdParser.Found(wxT("ch"), &configFile)) + configMode = frmConfig::HBAFILE; + else if (cmdParser.Found(wxT("cp"), &configFile)) + configMode = frmConfig::PGPASSFILE; + else if (cmdParser.Found(wxT("c"), &configFile)) + configMode = frmConfig::ANYFILE; + + if (cmdParser.Found(wxT("t"))) + dialogTestMode = true; + + // Setup the image handlers and appearance factory before we do any GUI or config stuff + ::wxInitAllImageHandlers(); + + appearanceFactory = new pgAppearanceFactory(); + + if (cmdParser.Found(wxT("v"))) + { + wxPrintf(wxT("%s %s\n"), appearanceFactory->GetLongAppName().c_str(), VERSION_STR); + return false; + } + + // Setup logging + InitLogger(); + + wxString msg; + msg << wxT("# ") << appearanceFactory->GetLongAppName() << wxT(" Version ") << VERSION_STR << wxT(" Startup"); + wxLogInfo(wxT("##############################################################")); + wxLogInfo(wxT("%s"), msg.c_str()); + wxLogInfo(wxT("##############################################################")); + +#ifdef PG_SSL + wxLogInfo(wxT("Compiled with dynamically linked SSL support")); +#endif + +#ifdef __WXDEBUG__ + wxLogInfo(wxT("Running a DEBUG build.")); +#else + wxLogInfo(wxT("Running a RELEASE build.")); +#endif + + // Log the path info + wxLogInfo(wxT("i18n path : %s"), i18nPath.c_str()); + wxLogInfo(wxT("UI path : %s"), uiPath.c_str()); + wxLogInfo(wxT("Doc path : %s"), docPath.c_str()); + wxLogInfo(wxT("Branding path : %s"), brandingPath.c_str()); + wxLogInfo(wxT("Plugins path : %s"), pluginsDir.c_str()); + wxLogInfo(wxT("Settings INI : %s"), settingsIni.c_str()); + + wxLogInfo(wxT("PG pg_dump : %s"), pgBackupExecutable.c_str()); + wxLogInfo(wxT("PG pg_dumpall : %s"), pgBackupAllExecutable.c_str()); + wxLogInfo(wxT("PG pg_restore : %s"), pgRestoreExecutable.c_str()); + + wxLogInfo(wxT("EDB pg_dump : %s"), edbBackupExecutable.c_str()); + wxLogInfo(wxT("EDB pg_dumpall: %s"), edbBackupAllExecutable.c_str()); + wxLogInfo(wxT("EDB pg_restore: %s"), edbRestoreExecutable.c_str()); + + wxLogInfo(wxT("Greenplum pg_dump : %s"), gpBackupExecutable.c_str()); + wxLogInfo(wxT("Greenplum pg_dumpall: %s"), gpBackupAllExecutable.c_str()); + wxLogInfo(wxT("Greenplum pg_restore: %s"), gpRestoreExecutable.c_str()); + +#ifdef __WXGTK__ + static pgRendererNative *renderer = new pgRendererNative(); + wxRendererNative::Get(); + wxRendererNative::Set(renderer); +#endif + +#ifdef __LINUX__ + signal(SIGPIPE, SIG_IGN); +#endif + + // Show the splash screen + // NOTE: We must *always* do this as in -q and -qc modes + // the splash screen becomes the top level window and + // allows the logon dialogs to be displayed!! + frmSplash *winSplash = new frmSplash((wxFrame *)NULL); + if (!winSplash) + wxLogError(__("Couldn't create the splash screen!")); + else + { + SetTopWindow(winSplash); + winSplash->Show(); + winSplash->Update(); + wxTheApp->Yield(true); + } + + // Startup the windows sockets if required + InitNetwork(); + + wxFileSystem::AddHandler(new wxZipFSHandler); + + // Setup the XML resources + wxXmlResource::Get()->InitAllHandlers(); + wxXmlResource::Get()->AddHandler(new wxCalendarBoxXmlHandler); + wxXmlResource::Get()->AddHandler(new wxTimeSpinXmlHandler); + wxXmlResource::Get()->AddHandler(new ctlSQLBoxXmlHandler); + wxXmlResource::Get()->AddHandler(new ctlComboBoxXmlHandler); + wxXmlResource::Get()->AddHandler(new ctlTreeXmlHandler); + wxXmlResource::Get()->AddHandler(new ctlCheckTreeViewXmlHandler); + wxXmlResource::Get()->AddHandler(new ctlColourPickerXmlHandler); + + InitXml(); + + wxOGLInitialize(); + + // Set some defaults + SetAppName(appearanceFactory->GetLongAppName()); + + // Setup the help paths + InitHelp(); + wxLogInfo(wxT("PG Help : %s"), settings->GetPgHelpPath().c_str()); + wxLogInfo(wxT("EDB Help : %s"), settings->GetEdbHelpPath().c_str()); + wxLogInfo(wxT("Greenplum Help: %s"), settings->GetGpHelpPath().c_str()); + wxLogInfo(wxT("Slony Help : %s"), settings->GetSlonyHelpPath().c_str()); + +#ifndef __WXDEBUG__ + wxTheApp->Yield(true); + wxSleep(2); +#endif + +#ifdef __WXMSW__ + // Attempt to dynamically load PGgetOutResult from libpq. this + // is only present in EDB versions. + InitLibpq(); +#endif + + if (configMode) + { + if (configMode == frmConfig::ANYFILE && wxDir::Exists(configFile)) + { + wxLogInfo(wxT("Starting in ANYFILE config editor mode, in directory: %s"), configFile.c_str()); + frmConfig::Create(appearanceFactory->GetLongAppName(), configFile + wxT("/pg_hba.conf"), frmConfig::HBAFILE); + frmConfig::Create(appearanceFactory->GetLongAppName(), configFile + wxT("/postgresql.conf"), frmConfig::MAINFILE); + } + else + { + wxLogInfo(wxT("Starting in config editor mode, file: %s"), configFile.c_str()); + frmConfig::Create(appearanceFactory->GetLongAppName(), configFile, configMode); + } + if (winSplash) + { + winSplash->Close(); + delete winSplash; + winSplash = 0; + } + } + + else + { + if (dialogTestMode) + { + wxLogInfo(wxT("Starting in dialog test mode.")); + wxFrame *dtf = new frmDlgTest(); + dtf->Show(); + SetTopWindow(dtf); + } + + else if ((cmdParser.Found(wxT("S")) || cmdParser.Found(wxT("Sc"))) && !cmdParser.Found(wxT("s"))) + { + // -S specified, but not -s. Open the server status window but do *not* open the main window + pgConn *conn = NULL; + wxString connstr; + wxString applicationname = appearanceFactory->GetLongAppName() + _(" - Server Status"); + + if (cmdParser.Found(wxT("S"))) + { + wxLogInfo(wxT("Starting in server status mode (-S)."), configFile.c_str()); + + winSplash->Show(false); + dlgSelectConnection dlg(NULL, NULL); + dlg.CenterOnParent(); + + int rc = dlg.Go(conn, NULL); + if (rc != wxID_OK) + return false; + bool dummyRes; + conn = dlg.CreateConn(applicationname, dummyRes); + } + else if (cmdParser.Found(wxT("Sc"), &connstr)) + { + wxLogInfo(wxT("Starting in server status connect mode (-Sc)."), configFile.c_str()); + wxString host, database, username, rolename, tmps; + int sslmode = 0, port = 0; + wxStringTokenizer tkn(connstr, wxT(" "), wxTOKEN_STRTOK); + while (tkn.HasMoreTokens()) + { + wxString str = tkn.GetNextToken(); + if (str.StartsWith(wxT("hostaddr="), &host)) + continue; + if (str.StartsWith(wxT("host="), &host)) + continue; + if (str.StartsWith(wxT("dbname="), &database)) + continue; + if (str.StartsWith(wxT("user="), &username)) + continue; + if (str.StartsWith(wxT("role="), &rolename)) + continue; + if (str.StartsWith(wxT("port="), &tmps)) + { + port = StrToLong(tmps); + continue; + } + if (str.StartsWith(wxT("sslmode="), &tmps)) + { + if (!tmps.Cmp(wxT("require"))) + sslmode = 1; + else if (!tmps.Cmp(wxT("prefer"))) + sslmode = 2; + else if (!tmps.Cmp(wxT("allow"))) + sslmode = 3; + else if (!tmps.Cmp(wxT("disable"))) + sslmode = 4; + else if (!tmps.Cmp(wxT("verify-ca"))) + sslmode = 5; + else if (!tmps.Cmp(wxT("verify-full"))) + sslmode = 6; + else + { + wxMessageBox(_("Unknown SSL mode: ") + tmps); + return false; + } + continue; + } + wxMessageBox(_("Unknown token in connection string: ") + str); + return false; + } + winSplash->Show(false); + dlgSelectConnection dlg(NULL, NULL); + dlg.CenterOnParent(); + conn = dlg.CreateConn(host, database, username, port, rolename, sslmode, applicationname); + } + else + { + /* Can't happen.. */ + return false; + } + if (!conn) + return false; + + wxString txt = _("Server Status - ") + conn->GetName(); + frmStatus *fq = new frmStatus(NULL, txt, conn); + fq->Go(); + } + +#ifdef DATABASEDESIGNER + else if ((cmdParser.Found(wxT("d")) || cmdParser.Found(wxT("dc"))) && !cmdParser.Found(wxT("s"))) + { + // -d specified, but not -s. Open the designer window but do *not* open the main window + pgConn *conn = NULL; + wxString connstr; + wxString applicationname = _("pgAdmin - Database designer"); + + if (cmdParser.Found(wxT("d"))) + { + wxLogInfo(wxT("Starting in designer mode (-d)."), configFile.c_str()); + + winSplash->Show(false); + dlgSelectConnection dlg(NULL, NULL); + dlg.CenterOnParent(); + + int rc = dlg.Go(conn, NULL); + if (rc != wxID_OK) + return false; + bool dummyRes; + conn = dlg.CreateConn(applicationname, dummyRes); + } + else if (cmdParser.Found(wxT("dc"), &connstr)) + { + wxLogInfo(wxT("Starting in database designer connect mode (-dc)."), configFile.c_str()); + wxString host, database, username, rolename, tmps; + int sslmode = 0, port = 0; + wxStringTokenizer tkn(connstr, wxT(" "), wxTOKEN_STRTOK); + while (tkn.HasMoreTokens()) + { + wxString str = tkn.GetNextToken(); + if (str.StartsWith(wxT("hostaddr="), &host)) + continue; + if (str.StartsWith(wxT("host="), &host)) + continue; + if (str.StartsWith(wxT("dbname="), &database)) + continue; + if (str.StartsWith(wxT("user="), &username)) + continue; + if (str.StartsWith(wxT("role="), &rolename)) + continue; + if (str.StartsWith(wxT("port="), &tmps)) + { + port = StrToLong(tmps); + continue; + } + if (str.StartsWith(wxT("sslmode="), &tmps)) + { + if (!tmps.Cmp(wxT("require"))) + sslmode = 1; + else if (!tmps.Cmp(wxT("prefer"))) + sslmode = 2; + else if (!tmps.Cmp(wxT("allow"))) + sslmode = 3; + else if (!tmps.Cmp(wxT("disable"))) + sslmode = 4; + else if (!tmps.Cmp(wxT("verify-ca"))) + sslmode = 5; + else if (!tmps.Cmp(wxT("verify-full"))) + sslmode = 6; + else + { + wxMessageBox(_("Unknown SSL mode: ") + tmps); + return false; + } + continue; + } + wxMessageBox(_("Unknown token in connection string: ") + str); + return false; + } + winSplash->Show(false); + dlgSelectConnection dlg(NULL, NULL); + dlg.CenterOnParent(); + conn = dlg.CreateConn(host, database, username, port, rolename, sslmode, applicationname); + } + else + { + /* Can't happen.. */ + return false; + } + if (!conn) + return false; + + frmDatabaseDesigner *fq = new frmDatabaseDesigner(NULL, wxEmptyString, conn); + fq->Go(); + } +#endif + +#ifdef __WXMAC__ + else if (((cmdParser.Found(wxT("q")) || cmdParser.Found(wxT("qc"))) && !cmdParser.Found(wxT("s"))) || !macFileToOpen.IsEmpty()) +#else + else if ((cmdParser.Found(wxT("q")) || cmdParser.Found(wxT("qc"))) && !cmdParser.Found(wxT("s"))) +#endif + { + // -q specified, but not -s. Open a query tool but do *not* open the main window + pgConn *conn = NULL; + wxString connstr; + wxString applicationname = appearanceFactory->GetLongAppName() + wxT(" - Query Tool"); + +#ifdef __WXMAC__ + if (cmdParser.Found(wxT("q")) || !macFileToOpen.IsEmpty()) +#else + if (cmdParser.Found(wxT("q"))) +#endif + { + wxLogInfo(wxT("Starting in query tool mode (-q)."), configFile.c_str()); + + winSplash->Show(false); + dlgSelectConnection dlg(NULL, NULL); + dlg.CenterOnParent(); + + int rc = dlg.Go(conn, NULL); + if (rc != wxID_OK) + return false; + bool dummyRes; + conn = dlg.CreateConn(applicationname, dummyRes); + } + else if (cmdParser.Found(wxT("qc"), &connstr)) + { + wxLogInfo(wxT("Starting in query tool connect mode (-qc)."), configFile.c_str()); + wxString host, database, username, rolename, tmps; + int sslmode = 0, port = 0; + wxStringTokenizer tkn(connstr, wxT(" "), wxTOKEN_STRTOK); + while (tkn.HasMoreTokens()) + { + wxString str = tkn.GetNextToken(); + if (str.StartsWith(wxT("hostaddr="), &host)) + continue; + if (str.StartsWith(wxT("host="), &host)) + continue; + if (str.StartsWith(wxT("dbname="), &database)) + continue; + if (str.StartsWith(wxT("user="), &username)) + continue; + if (str.StartsWith(wxT("role="), &rolename)) + continue; + if (str.StartsWith(wxT("port="), &tmps)) + { + port = StrToLong(tmps); + continue; + } + if (str.StartsWith(wxT("sslmode="), &tmps)) + { + if (!tmps.Cmp(wxT("require"))) + sslmode = 1; + else if (!tmps.Cmp(wxT("prefer"))) + sslmode = 2; + else if (!tmps.Cmp(wxT("allow"))) + sslmode = 3; + else if (!tmps.Cmp(wxT("disable"))) + sslmode = 4; + else if (!tmps.Cmp(wxT("verify-ca"))) + sslmode = 5; + else if (!tmps.Cmp(wxT("verify-full"))) + sslmode = 6; + else + { + wxMessageBox(_("Unknown SSL mode: ") + tmps); + return false; + } + continue; + } + wxMessageBox(_("Unknown token in connection string: ") + str); + return false; + } + winSplash->Show(false); + dlgSelectConnection dlg(NULL, NULL); + dlg.CenterOnParent(); + conn = dlg.CreateConn(host, database, username, port, rolename, sslmode, applicationname); + } + else + { + /* Can't happen.. */ + return false; + } + if (!conn) + return false; + + wxString fn; +#ifdef __WXMAC__ + if (!macFileToOpen.IsEmpty()) + { + wxLogInfo(wxT("Mac file launch: %s."), macFileToOpen.c_str()); + fn = macFileToOpen; + } + else + cmdParser.Found(wxT("f"), &fn); +#else + cmdParser.Found(wxT("f"), &fn); +#endif + if (!fn.IsEmpty()) + { + wxLogInfo(wxT("Auto-loading file: %s"), fn.c_str()); + } + frmQuery *fq = new frmQuery(NULL, wxEmptyString, conn, wxEmptyString, fn); + fq->Go(); + } + else + { + // Create & show the main form + winMain = new frmMain(appearanceFactory->GetLongAppName()); + + if (!winMain) + wxLogFatalError(__("Couldn't create the main window!")); + + winMain->Show(); + SetTopWindow(winMain); + + wxString str; + if (cmdParser.Found(wxT("s"), &str)) + { + pgServer *srv = winMain->ConnectToServer(str, !cmdParser.Found(wxT("q"))); + if (srv && cmdParser.Found(wxT("q"))) + { + pgConn *conn; + wxString applicationname = appearanceFactory->GetLongAppName() + wxT(" - Query Tool"); + conn = srv->CreateConn(wxEmptyString, 0, applicationname); + if (conn) + { + wxString fn; + cmdParser.Found(wxT("f"), &fn); + if (!fn.IsEmpty()) + { + wxLogInfo(wxT("Auto-loading file: %s"), fn.c_str()); + } + frmQuery *fq = new frmQuery(winMain, wxEmptyString, conn, wxEmptyString, fn); + fq->Go(); + winMain->AddFrame(fq); + } + } + } + } + + SetExitOnFrameDelete(true); + + if (winSplash) + { + winSplash->Close(); + delete winSplash; + winSplash = 0; + } + } + + return true; +} + +// Not the Application! +int pgAdmin3::OnExit() +{ + if (updateThread) + { + updateThread->Delete(); + delete updateThread; + } + + // Delete the settings object to ensure settings are saved. + delete settings; + +#ifdef __WXMSW__ + WSACleanup(); +#endif + + wxTheClipboard->Flush(); + + return 1; +} + +// On the Mac, this function is called before Init, if the finder launches the app +// via a registered filetype. Grab the filename here, and test for it in Init. +#ifdef __WXMAC__ +void pgAdmin3::MacOpenFile(const wxString &fileName) +{ + macFileToOpen = fileName; +} +#endif + +// Setup the paths for the application itself +void pgAdmin3::InitAppPaths() +{ + i18nPath = LocatePath(I18N_DIR, false); + docPath = LocatePath(DOC_DIR, false); + uiPath = LocatePath(UI_DIR, false); + brandingPath = LocatePath(BRANDING_DIR, false); + pluginsDir = LocatePath(PLUGINS_DIR, false); + settingsIni = LocatePath(SETTINGS_INI, true); +} + +// Setup the paths for the helper apps etc. +void pgAdmin3::InitXtraPaths() +{ + ////////////////////////////////// + // Now setup the app helper paths + ////////////////////////////////// + + // Windows-only path prefixes +#ifdef __WXMSW__ + wxString programFiles = wxGetenv(wxT("ProgramFiles")); + wxString programFilesX86 = wxGetenv(wxT("ProgramFiles(x86)")); + + // If we install a 32-bit pgAdmin in a 64-bit machine, + // We will be getting the both values as "Drive:\Program Files(x86)". + // Since, all 32-bit applications return "ProgramFiles" as ProgramFiles(x86). + // In that case, we need can get the actual programFiles value, + // by reading the key "ProgramFilesDir" in location "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion". + // + if (::wxIsPlatform64Bit() && programFiles == programFilesX86) + { + // Don't want to lost the exisisting behaviour. + // + wxString tmp = programFiles; + programFiles = wxEmptyString; + + pgRegKey::PGREGWOWMODE wowMode = pgRegKey::PGREG_WOW64; + pgRegKey *pgKey = pgRegKey::OpenRegKey(HKEY_LOCAL_MACHINE, wxT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion"), pgRegKey::PGREG_READ, wowMode); + + if (!(pgKey && pgKey->QueryValue(wxT("ProgramFilesDir"), programFiles))) + { + programFiles = tmp; + } + + if(pgKey) + { + delete pgKey; + pgKey = NULL; + } + } +#endif + + // First, check and invalidate the paths if they're no good. +#ifdef __WXMSW__ + if (!isPgApp(settings->GetPostgresqlPath() + wxT("\\pg_dump.exe"))) + settings->SetPostgresqlPath(wxEmptyString); + + if (!isEdbApp(settings->GetEnterprisedbPath() + wxT("\\pg_dump.exe"))) + settings->SetEnterprisedbPath(wxEmptyString); + + if (!isGpApp(settings->GetGPDBPath() + wxT("\\pg_dump.exe"))) + settings->SetGPDBPath(wxEmptyString); +#else + if (!isPgApp(settings->GetPostgresqlPath() + wxT("/pg_dump"))) + settings->SetPostgresqlPath(wxEmptyString); + + if (!isEdbApp(settings->GetEnterprisedbPath() + wxT("/pg_dump"))) + settings->SetEnterprisedbPath(wxEmptyString); + + if (!isGpApp(settings->GetGPDBPath() + wxT("/pg_dump"))) + settings->SetGPDBPath(wxEmptyString); +#endif + + // Now, if either path is empty, start a search for helpers + // If we find apps, record the appropriate path *only* if it's + // not already set + if (settings->GetPostgresqlPath().IsEmpty() || settings->GetEnterprisedbPath().IsEmpty()) + { + wxPathList path; + + // Look in the app directory for things first + path.Add(loadPath); + +#ifdef __WXMSW__ + + // Look for a path 'hint' on Windows. This registry setting may + // be set by the Win32 PostgreSQL installer which will generally + // install pg_dump et al. in the PostgreSQL bindir rather than + // the pgAdmin directory. + wxRegKey hintKey(wxT("HKEY_LOCAL_MACHINE\\Software\\pgAdmin III")); + if (hintKey.HasValue(wxT("Helper Path"))) + { + wxString hintPath; + hintKey.QueryValue(wxT("Helper Path"), hintPath); + path.Add(hintPath); + } + +#else +#ifdef __WXMAC__ + + if (wxDir::Exists(dataDir)) + path.Add(dataDir) ; + +#endif +#endif + + path.AddEnvList(wxT("PATH")); + +#ifdef __WXMSW__ + wxFileName tmp = path.FindValidPath(wxT("pg_dump.exe")); +#else + wxFileName tmp = path.FindValidPath(wxT("pg_dump")); +#endif + + if (tmp.FileExists()) + { + if (isPgApp(tmp.GetFullPath()) && settings->GetPostgresqlPath().IsEmpty()) + settings->SetPostgresqlPath(tmp.GetPath()); + else if (isEdbApp(tmp.GetFullPath()) && settings->GetEnterprisedbPath().IsEmpty()) + settings->SetEnterprisedbPath(tmp.GetPath()); + + } + } + + if (settings->GetGPDBPath().IsEmpty()) + { + wxPathList path; + +#ifdef __WXMSW__ + + wxString GPhint = wxString(getenv( "GPHOME_CLIENTS" ), wxConvUTF8 ); + + if (GPhint.Length() > 1) + { + path.Add(GPhint + wxT("\\bin")); + path.Add(GPhint + wxT("\\lib")); + path.Add(GPhint); + } + + GPhint = wxString(getenv( "GPHOME" ), wxConvUTF8 ); + + if (GPhint.Length() > 1) + { + path.Add(GPhint + wxT("\\bin")); + path.Add(GPhint + wxT("\\lib")); + path.Add(GPhint); + } + +#endif + // Look in the app directory for things + path.Add(loadPath); + +#ifdef __WXMAC__ + + if (wxDir::Exists(dataDir)) + path.Add(dataDir) ; +#endif + path.AddEnvList(wxT("PATH")); + +#ifdef __WXMSW__ + wxFileName tmp = path.FindValidPath(wxT("pg_dump.exe")); +#else + wxFileName tmp = path.FindValidPath(wxT("pg_dump")); +#endif + + if (tmp.FileExists()) + { + if (isGpApp(tmp.GetFullPath()) && settings->GetGPDBPath().IsEmpty()) + settings->SetGPDBPath(tmp.GetPath()); + } + } + + // Now, if either path is still empty, try a less intelligent search for each + + // PostgreSQL + if (settings->GetPostgresqlPath().IsEmpty()) + { + wxPathList path; + +#ifdef __WXMSW__ + path.Add(wxT("C:\\PostgresPlus\\8.3\\bin")); + + if (!programFiles.IsEmpty()) + { + path.Add(programFiles + wxT("\\PostgreSQL\\9.5\\bin")); + path.Add(programFiles + wxT("\\PostgreSQL\\9.4\\bin")); + path.Add(programFiles + wxT("\\PostgreSQL\\9.3\\bin")); + path.Add(programFiles + wxT("\\PostgreSQL\\9.2\\bin")); + path.Add(programFiles + wxT("\\PostgreSQL\\9.1\\bin")); + path.Add(programFiles + wxT("\\PostgreSQL\\9.0\\bin")); + path.Add(programFiles + wxT("\\PostgreSQL\\8.4\\bin")); + path.Add(programFiles + wxT("\\PostgresPlus\\9.0SS\\bin")); + path.Add(programFiles + wxT("\\PostgresPlus\\8.4SS\\bin")); + } + + if (!programFilesX86.IsEmpty()) + { + path.Add(programFilesX86 + wxT("\\PostgreSQL\\9.5\\bin")); + path.Add(programFilesX86 + wxT("\\PostgreSQL\\9.4\\bin")); + path.Add(programFilesX86 + wxT("\\PostgreSQL\\9.3\\bin")); + path.Add(programFilesX86 + wxT("\\PostgreSQL\\9.2\\bin")); + path.Add(programFilesX86 + wxT("\\PostgreSQL\\9.1\\bin")); + path.Add(programFilesX86 + wxT("\\PostgreSQL\\9.0\\bin")); + path.Add(programFilesX86 + wxT("\\PostgreSQL\\8.4\\bin")); + path.Add(programFilesX86 + wxT("\\PostgresPlus\\9.0SS\\bin")); + path.Add(programFilesX86 + wxT("\\PostgresPlus\\8.4SS\\bin")); + } + + wxFileName tmp = path.FindValidPath(wxT("pg_dump.exe")); +#else + // Mac paths + path.Add(wxT("/Library/PostgreSQL/9.5/bin")); + path.Add(wxT("/Library/PostgreSQL/9.4/bin")); + path.Add(wxT("/Library/PostgreSQL/9.3/bin")); + path.Add(wxT("/Library/PostgreSQL/9.2/bin")); + path.Add(wxT("/Library/PostgreSQL/9.1/bin")); + path.Add(wxT("/Library/PostgreSQL/9.0/bin")); + path.Add(wxT("/Library/PostgreSQL/8.4/bin")); + path.Add(wxT("/Library/PostgresPlus/9.0SS/bin")); + path.Add(wxT("/Library/PostgresPlus/8.4SS/bin")); + + // Generic Unix paths + path.Add(wxT("/opt/PostgreSQL/9.5/bin")); + path.Add(wxT("/opt/PostgreSQL/9.4/bin")); + path.Add(wxT("/opt/PostgreSQL/9.3/bin")); + path.Add(wxT("/opt/PostgreSQL/9.2/bin")); + path.Add(wxT("/opt/PostgreSQL/9.1/bin")); + path.Add(wxT("/opt/PostgreSQL/9.0/bin")); + path.Add(wxT("/opt/PostgreSQL/8.4/bin")); + path.Add(wxT("/opt/PostgresPlus/9.0SS/bin")); + path.Add(wxT("/opt/PostgresPlus/8.4SS/bin")); + path.Add(wxT("/usr/local/pgsql/bin")); + path.Add(wxT("/usr/local/bin")); + path.Add(wxT("/usr/bin")); + path.Add(wxT("/opt/local/pgsql/bin")); + path.Add(wxT("/opt/local/bin")); + path.Add(wxT("/opt/bin")); + + wxFileName tmp = path.FindValidPath(wxT("pg_dump")); +#endif + + if (tmp.FileExists()) + { + if (isPgApp(tmp.GetFullPath())) + settings->SetPostgresqlPath(tmp.GetPath()); + } + } + + // EnterpriseDB + if (settings->GetEnterprisedbPath().IsEmpty()) + { + wxPathList path; + +#ifdef __WXMSW__ + if (!programFiles.IsEmpty()) + { + path.Add(programFiles + wxT("\\PostgresPlus\\9.5AS\\bin")); + path.Add(programFiles + wxT("\\PostgresPlus\\9.4AS\\bin")); + path.Add(programFiles + wxT("\\PostgresPlus\\9.3AS\\bin")); + path.Add(programFiles + wxT("\\PostgresPlus\\9.2AS\\bin")); + path.Add(programFiles + wxT("\\PostgresPlus\\9.1AS\\bin")); + path.Add(programFiles + wxT("\\PostgresPlus\\9.0AS\\bin")); + path.Add(programFiles + wxT("\\PostgresPlus\\8.4AS\\bin")); + } + + if (!programFilesX86.IsEmpty()) + { + path.Add(programFilesX86 + wxT("\\PostgresPlus\\9.5AS\\bin")); + path.Add(programFilesX86 + wxT("\\PostgresPlus\\9.4AS\\bin")); + path.Add(programFilesX86 + wxT("\\PostgresPlus\\9.3AS\\bin")); + path.Add(programFilesX86 + wxT("\\PostgresPlus\\9.2AS\\bin")); + path.Add(programFilesX86 + wxT("\\PostgresPlus\\9.1AS\\bin")); + path.Add(programFilesX86 + wxT("\\PostgresPlus\\9.0AS\\bin")); + path.Add(programFilesX86 + wxT("\\PostgresPlus\\8.4AS\\bin")); + } + + wxFileName tmp = path.FindValidPath(wxT("pg_dump.exe")); +#else + // Mac paths + path.Add(wxT("/Library/PostgresPlus/9.5AS/bin")); + path.Add(wxT("/Library/PostgresPlus/9.4AS/bin")); + path.Add(wxT("/Library/PostgresPlus/9.3AS/bin")); + path.Add(wxT("/Library/PostgresPlus/9.2AS/bin")); + path.Add(wxT("/Library/PostgresPlus/9.1AS/bin")); + path.Add(wxT("/Library/PostgresPlus/9.0AS/bin")); + path.Add(wxT("/Library/PostgresPlus/8.4AS/bin")); + + // Generic Unix paths + path.Add(wxT("/opt/PostgresPlus/9.5AS/bin")); + path.Add(wxT("/opt/PostgresPlus/9.4AS/bin")); + path.Add(wxT("/opt/PostgresPlus/9.3AS/bin")); + path.Add(wxT("/opt/PostgresPlus/9.2AS/bin")); + path.Add(wxT("/opt/PostgresPlus/9.1AS/bin")); + path.Add(wxT("/opt/PostgresPlus/9.0AS/bin")); + path.Add(wxT("/opt/PostgresPlus/8.4AS/bin")); + path.Add(wxT("/usr/local/enterpriseDB/bin")); + path.Add(wxT("/usr/local/enterprisedb/bin")); + path.Add(wxT("/usr/local/edb/bin")); + path.Add(wxT("/usr/local/bin")); + path.Add(wxT("/usr/bin")); + path.Add(wxT("/opt/local/enterpriseDB/bin")); + path.Add(wxT("/opt/local/enterprisedb/bin")); + path.Add(wxT("/opt/local/edb/bin")); + path.Add(wxT("/opt/local/bin")); + + wxFileName tmp = path.FindValidPath(wxT("pg_dump")); +#endif + + if (tmp.FileExists()) + { + if (isEdbApp(tmp.GetFullPath())) + settings->SetEnterprisedbPath(tmp.GetPath()); + } + } + + // Greenplum + if (settings->GetGPDBPath().IsEmpty()) + { + wxPathList path; + +#ifdef __WXMSW__ + // Ugly... Greenplum client releases have no predictable numbers, because the path is the server version + if (!programFiles.IsEmpty()) + { + path.Add(programFiles + wxT("\\Greenplum\\greenplum-clients-5.0\\bin")); + path.Add(programFiles + wxT("\\Greenplum\\greenplum-clients-4.4\\bin")); + path.Add(programFiles + wxT("\\Greenplum\\greenplum-clients-4.3\\bin")); + path.Add(programFiles + wxT("\\Greenplum\\greenplum-clients-4.2\\bin")); + path.Add(programFiles + wxT("\\Greenplum\\greenplum-clients-4.1\\bin")); + path.Add(programFiles + wxT("\\Greenplum\\greenplum-clients-4.0\\bin")); + path.Add(programFiles + wxT("\\Greenplum\\greenplum-clients-3.3\\bin")); + path.Add(programFiles + wxT("\\Greenplum\\greenplum-clients-3.2\\bin")); + + path.Add(programFiles + wxT("\\Greenplum\\greenplum-clients-5.0\\lib")); + path.Add(programFiles + wxT("\\Greenplum\\greenplum-clients-4.4\\lib")); + path.Add(programFiles + wxT("\\Greenplum\\greenplum-clients-4.3\\lib")); + path.Add(programFiles + wxT("\\Greenplum\\greenplum-clients-4.2\\lib")); + path.Add(programFiles + wxT("\\Greenplum\\greenplum-clients-4.1\\lib")); + path.Add(programFiles + wxT("\\Greenplum\\greenplum-clients-4.0\\lib")); + path.Add(programFiles + wxT("\\Greenplum\\greenplum-clients-3.3\\lib")); + path.Add(programFiles + wxT("\\Greenplum\\greenplum-clients-3.2\\lib")); + } + + if (!programFilesX86.IsEmpty()) + { + path.Add(programFilesX86 + wxT("\\Greenplum\\greenplum-clients-5.0\\bin")); + path.Add(programFilesX86 + wxT("\\Greenplum\\greenplum-clients-4.4\\bin")); + path.Add(programFilesX86 + wxT("\\Greenplum\\greenplum-clients-4.3\\bin")); + path.Add(programFilesX86 + wxT("\\Greenplum\\greenplum-clients-4.2\\bin")); + path.Add(programFilesX86 + wxT("\\Greenplum\\greenplum-clients-4.1\\bin")); + path.Add(programFilesX86 + wxT("\\Greenplum\\greenplum-clients-4.0\\bin")); + path.Add(programFilesX86 + wxT("\\Greenplum\\greenplum-clients-3.3\\bin")); + path.Add(programFilesX86 + wxT("\\Greenplum\\greenplum-clients-3.2\\bin")); + + path.Add(programFilesX86 + wxT("\\Greenplum\\greenplum-clients-5.0\\lib")); + path.Add(programFilesX86 + wxT("\\Greenplum\\greenplum-clients-4.4\\lib")); + path.Add(programFilesX86 + wxT("\\Greenplum\\greenplum-clients-4.3\\lib")); + path.Add(programFilesX86 + wxT("\\Greenplum\\greenplum-clients-4.2\\lib")); + path.Add(programFilesX86 + wxT("\\Greenplum\\greenplum-clients-4.1\\lib")); + path.Add(programFilesX86 + wxT("\\Greenplum\\greenplum-clients-4.0\\lib")); + path.Add(programFilesX86 + wxT("\\Greenplum\\greenplum-clients-3.3\\lib")); + path.Add(programFilesX86 + wxT("\\Greenplum\\greenplum-clients-3.2\\lib")); + } + + + wxFileName tmp = path.FindValidPath(wxT("pg_dump.exe")); +#else + // Mac paths + + // Generic Unix paths + + path.Add(wxT("/usr/local/greenplum-clients-5.0/bin")); + path.Add(wxT("/opt/local/greenplum-clients-5.0/bin")); + path.Add(wxT("/usr/local/greenplum-clients-4.4/bin")); + path.Add(wxT("/opt/local/greenplum-clients-4.4/bin")); + path.Add(wxT("/usr/local/greenplum-clients-4.3/bin")); + path.Add(wxT("/opt/local/greenplum-clients-4.3/bin")); + path.Add(wxT("/usr/local/greenplum-clients-4.2/bin")); + path.Add(wxT("/opt/local/greenplum-clients-4.2/bin")); + path.Add(wxT("/usr/local/greenplum-clients-4.1/bin")); + path.Add(wxT("/opt/local/greenplum-clients-4.1/bin")); + path.Add(wxT("/usr/local/greenplum-clients-4.0/bin")); + path.Add(wxT("/opt/local/greenplum-clients-4.0/bin")); + path.Add(wxT("/usr/local/greenplum-clients-3.3/bin")); + path.Add(wxT("/opt/local/greenplum-clients-3.3/bin")); + path.Add(wxT("/usr/local/greenplum-clients-3.2/bin")); + path.Add(wxT("/opt/local/greenplum-clients-3.2/bin")); + + path.Add(wxT("/usr/local/greenplum-clients-5.0/lib")); + path.Add(wxT("/opt/local/greenplum-clients-5.0/lib")); + path.Add(wxT("/usr/local/greenplum-clients-4.4/lib")); + path.Add(wxT("/opt/local/greenplum-clients-4.4/lib")); + path.Add(wxT("/usr/local/greenplum-clients-4.3/lib")); + path.Add(wxT("/opt/local/greenplum-clients-4.3/lib")); + path.Add(wxT("/usr/local/greenplum-clients-4.2/lib")); + path.Add(wxT("/opt/local/greenplum-clients-4.2/lib")); + path.Add(wxT("/usr/local/greenplum-clients-4.1/lib")); + path.Add(wxT("/opt/local/greenplum-clients-4.1/lib")); + path.Add(wxT("/usr/local/greenplum-clients-4.0/lib")); + path.Add(wxT("/opt/local/greenplum-clients-4.0/lib")); + path.Add(wxT("/usr/local/greenplum-clients-3.3/lib")); + path.Add(wxT("/opt/local/greenplum-clients-3.3/lib")); + path.Add(wxT("/usr/local/greenplum-clients-3.2/lib")); + path.Add(wxT("/opt/local/greenplum-clients-3.2/lib")); + + + wxFileName tmp = path.FindValidPath(wxT("pg_dump")); +#endif + + if (tmp.FileExists()) + { + if (isGpApp(tmp.GetFullPath())) + settings->SetGPDBPath(tmp.GetPath()); + } + } + + // Now setup and verify the paths for each individual helper +#if defined(__WXMSW__) + pgBackupExecutable = settings->GetPostgresqlPath() + wxT("\\pg_dump.exe"); + pgBackupAllExecutable = settings->GetPostgresqlPath() + wxT("\\pg_dumpall.exe"); + pgRestoreExecutable = settings->GetPostgresqlPath() + wxT("\\pg_restore.exe"); + + edbBackupExecutable = settings->GetEnterprisedbPath() + wxT("\\pg_dump.exe"); + edbBackupAllExecutable = settings->GetEnterprisedbPath() + wxT("\\pg_dumpall.exe"); + edbRestoreExecutable = settings->GetEnterprisedbPath() + wxT("\\pg_restore.exe"); + + gpBackupExecutable = settings->GetGPDBPath() + wxT("\\pg_dump.exe"); + gpBackupAllExecutable = settings->GetGPDBPath() + wxT("\\pg_dumpall.exe"); + gpRestoreExecutable = settings->GetGPDBPath() + wxT("\\pg_restore.exe"); +#else + pgBackupExecutable = settings->GetPostgresqlPath() + wxT("/pg_dump"); + pgBackupAllExecutable = settings->GetPostgresqlPath() + wxT("/pg_dumpall"); + pgRestoreExecutable = settings->GetPostgresqlPath() + wxT("/pg_restore"); + + edbBackupExecutable = settings->GetEnterprisedbPath() + wxT("/pg_dump"); + edbBackupAllExecutable = settings->GetEnterprisedbPath() + wxT("/pg_dumpall"); + edbRestoreExecutable = settings->GetEnterprisedbPath() + wxT("/pg_restore"); + + gpBackupExecutable = settings->GetGPDBPath() + wxT("/pg_dump"); + gpBackupAllExecutable = settings->GetGPDBPath() + wxT("/pg_dumpall"); + gpRestoreExecutable = settings->GetGPDBPath() + wxT("/pg_restore"); +#endif + + if (!isPgApp(pgBackupExecutable)) + pgBackupExecutable = wxEmptyString; + if (!isPgApp(pgBackupAllExecutable)) + pgBackupAllExecutable = wxEmptyString; + if (!isPgApp(pgRestoreExecutable)) + pgRestoreExecutable = wxEmptyString; + + if (!isEdbApp(edbBackupExecutable)) + edbBackupExecutable = wxEmptyString; + if (!isEdbApp(edbBackupAllExecutable)) + edbBackupAllExecutable = wxEmptyString; + if (!isEdbApp(edbRestoreExecutable)) + edbRestoreExecutable = wxEmptyString; + + if (!isGpApp(gpBackupExecutable)) + gpBackupExecutable = wxEmptyString; + if (!isGpApp(gpBackupAllExecutable)) + gpBackupAllExecutable = wxEmptyString; + if (!isGpApp(gpRestoreExecutable)) + gpRestoreExecutable = wxEmptyString; +} + +wxString pgAdmin3::LocatePath(const wxString &pathToFind, const bool isFile) +{ + loadPath = wxPathOnly(argv[0]); + + if (loadPath.IsEmpty()) + loadPath = wxT("."); + + loadPath = sanitizePath(loadPath); + +#if defined(__WXMSW__) + + // Search for the right paths. We check the following locations: + // + // 1) ./xxx - Running as a standalone install + // 2) ../pgAdmin/xxx - Running in a pgInstaller 8.1 installation + // (with the .exe and dlls in the main bin dir) + // 3) ../xxx or ../../xxx - Running in a development environment + + if (!isFile) + { + if (wxDir::Exists(loadPath + pathToFind)) + return sanitizePath(loadPath + pathToFind); + else if (wxDir::Exists(loadPath + wxT("/../pgAdmin III") + pathToFind)) + return sanitizePath(loadPath + wxT("/../pgAdmin III") + pathToFind); + else if (wxDir::Exists(loadPath + wxT("/..") + pathToFind)) + return sanitizePath(loadPath + wxT("/..") + pathToFind); + else if (wxDir::Exists(loadPath + wxT("/../..") + pathToFind)) + return sanitizePath(loadPath + wxT("/../..") + pathToFind); + else + return wxEmptyString; + } + else + { + if (wxFile::Exists(loadPath + pathToFind)) + return sanitizePath(loadPath + pathToFind); + else if (wxFile::Exists(loadPath + wxT("/../pgAdmin III") + pathToFind)) + return sanitizePath(loadPath + wxT("/../pgAdmin III") + pathToFind); + else if (wxFile::Exists(loadPath + wxT("/..") + pathToFind)) + return sanitizePath(loadPath + wxT("/..") + pathToFind); + else if (wxFile::Exists(loadPath + wxT("/../..") + pathToFind)) + return sanitizePath(loadPath + wxT("/../..") + pathToFind); + else + return wxEmptyString; + } + +#else + +#ifdef __WXMAC__ +#if wxCHECK_VERSION(2, 9, 5) + wxStandardPaths &stdPaths = wxStandardPaths::Get(); +#else + // When using wxStandardPaths on OSX, wx default to the unix, + // not to the mac variants. Therefore, we request wxStandardPathsCF + // directly. + wxStandardPathsCF stdPaths; +#endif + dataDir = stdPaths.GetDataDir(); + +#else // other *ixes + +// Data path (defined by configure under Unix). +#ifndef DATA_DIR +#define DATA_DIR "./" +#endif + + dataDir = wxString::FromAscii(DATA_DIR); +#endif + + // On unix systems, the search path is as follows: + // + // 1) DATADIR/xxx - DATADIR being defined by configure + // 2) ./../share/pgadmin3/xxx - The default 'make install' layout, but allowing for relocation + // 3) ./xxx - Windows-style standalone install + // 4) ./../xxx - Unix-style standalone install (with binaries in a bin directory) + + if (!isFile) + { + if (wxDir::Exists(dataDir + pathToFind)) + return sanitizePath(dataDir + pathToFind); + else if (wxDir::Exists(loadPath + wxT("/../share/pgadmin3") + pathToFind)) + return sanitizePath(loadPath + wxT("/../share/pgadmin3") + pathToFind); + else if (wxDir::Exists(loadPath + pathToFind)) + return sanitizePath(loadPath + pathToFind); + else if (wxDir::Exists(loadPath + wxT("/..") + pathToFind)) + return sanitizePath(loadPath + wxT("/..") + pathToFind); + else + return wxEmptyString; + } + else + { + if (wxFile::Exists(dataDir + pathToFind)) + return sanitizePath(dataDir + pathToFind); + else if (wxFile::Exists(loadPath + wxT("/../share/pgadmin3") + pathToFind)) + return sanitizePath(loadPath + wxT("/../share/pgadmin3") + pathToFind); + else if (wxFile::Exists(loadPath + pathToFind)) + return sanitizePath(loadPath + pathToFind); + else if (wxFile::Exists(loadPath + wxT("/..") + pathToFind)) + return sanitizePath(loadPath + wxT("/..") + pathToFind); + else + return wxEmptyString; + } + +#endif +} + +void pgAdmin3::InitHelp() +{ + // Windows-only path prefixes +#ifdef __WXMSW__ + wxString programFiles = wxGetenv(wxT("ProgramFiles")); + wxString programFilesX86 = wxGetenv(wxT("ProgramFiles(x86)")); +#endif + + // Search for external docs. As Windows and *nix etc + // are likely to be very different, we'll #ifdef them all. + wxPathList stdPaths, noPaths, pgPaths, edbPaths, gpPaths, slonyPaths; + wxString sep = wxFileName::GetPathSeparator(); + + stdPaths.Add(docPath + sep + settings->GetCanonicalLanguageName()); + stdPaths.Add(docPath + sep + wxT("en_US")); + stdPaths.Add(docPath); + +#ifdef __WXMSW__ + if (!programFiles.IsEmpty()) + { + pgPaths.Add(programFiles + wxT("\\PostgreSQL\\8.4\\doc")); + pgPaths.Add(programFiles + wxT("\\PostgreSQL\\8.4\\doc\\html")); + pgPaths.Add(programFiles + wxT("\\PostgreSQL\\8.3\\doc")); + pgPaths.Add(programFiles + wxT("\\PostgreSQL\\8.3\\doc\\html")); + pgPaths.Add(programFiles + wxT("\\PostgreSQL\\8.2\\doc")); + pgPaths.Add(programFiles + wxT("\\PostgreSQL\\8.2\\doc\\html")); + pgPaths.Add(programFiles + wxT("\\PostgreSQL\\8.1\\doc")); + pgPaths.Add(programFiles + wxT("\\PostgreSQL\\8.1\\doc\\html")); + pgPaths.Add(programFiles + wxT("\\PostgreSQL\\8.0\\doc")); + pgPaths.Add(programFiles + wxT("\\PostgreSQL\\8.0\\doc\\html")); + } + + if (!programFilesX86.IsEmpty()) + { + pgPaths.Add(programFilesX86 + wxT("\\PostgreSQL\\8.4\\doc")); + pgPaths.Add(programFilesX86 + wxT("\\PostgreSQL\\8.4\\doc\\html")); + pgPaths.Add(programFilesX86 + wxT("\\PostgreSQL\\8.3\\doc")); + pgPaths.Add(programFilesX86 + wxT("\\PostgreSQL\\8.3\\doc\\html")); + pgPaths.Add(programFilesX86 + wxT("\\PostgreSQL\\8.2\\doc")); + pgPaths.Add(programFilesX86 + wxT("\\PostgreSQL\\8.2\\doc\\html")); + pgPaths.Add(programFilesX86 + wxT("\\PostgreSQL\\8.1\\doc")); + pgPaths.Add(programFilesX86 + wxT("\\PostgreSQL\\8.1\\doc\\html")); + pgPaths.Add(programFilesX86 + wxT("\\PostgreSQL\\8.0\\doc")); + pgPaths.Add(programFilesX86 + wxT("\\PostgreSQL\\8.0\\doc\\html")); + } + + // Note that EDB docs are online from 8.3. + edbPaths.Add(wxT("C:\\EnterpriseDB\\8.2\\dbserver\\doc")); + edbPaths.Add(wxT("C:\\EnterpriseDB\\8.2\\dbserver\\doc\\html")); + edbPaths.Add(wxT("C:\\EnterpriseDB\\8.1\\dbserver\\doc")); + edbPaths.Add(wxT("C:\\EnterpriseDB\\8.1\\dbserver\\doc\\html")); + edbPaths.Add(wxT("C:\\EnterpriseDB\\8.0\\dbserver\\doc")); + edbPaths.Add(wxT("C:\\EnterpriseDB\\8.0\\dbserver\\doc\\html")); + + wxString GPhint = wxString(getenv( "GPHOME_CLIENTS" ), wxConvUTF8 ); + + if (GPhint.Length() > 1) + { + gpPaths.Add(GPhint + wxT("\\docs")); + gpPaths.Add(GPhint); + } + + GPhint = wxString(getenv( "GPHOME" ), wxConvUTF8 ); + + if (GPhint.Length() > 1) + { + gpPaths.Add(GPhint + wxT("\\docs")); + gpPaths.Add(GPhint); + } + + if (!programFiles.IsEmpty()) + { + gpPaths.Add(programFiles + wxT("\\Greenplum\\greenplum-clients-3.3\\docs")); + gpPaths.Add(programFiles + wxT("\\Greenplum\\greenplum-clients-3.2\\docs")); + gpPaths.Add(programFiles + wxT("\\Greenplum\\greenplum-clients-3.1.1.1\\docs")); + } + + if (!programFilesX86.IsEmpty()) + { + gpPaths.Add(programFilesX86 + wxT("\\Greenplum\\greenplum-clients-3.3\\docs")); + gpPaths.Add(programFilesX86 + wxT("\\Greenplum\\greenplum-clients-3.2\\docs")); + gpPaths.Add(programFilesX86 + wxT("\\Greenplum\\greenplum-clients-3.1.1.1\\docs")); + } + ; + + +#else + pgPaths.Add(wxT("/usr/local/pgsql/doc")); + pgPaths.Add(wxT("/usr/local/pgsql/doc/html")); + pgPaths.Add(wxT("/usr/local/doc/postgresql")); + pgPaths.Add(wxT("/usr/local/doc/postgresql/html")); + pgPaths.Add(wxT("/usr/doc/postgresql")); + pgPaths.Add(wxT("/usr/doc/postgresql/html")); + pgPaths.Add(wxT("/opt/local/pgsql/doc")); + pgPaths.Add(wxT("/opt/local/pgsql/doc/html")); + pgPaths.Add(wxT("/opt/local/doc/postgresql")); + pgPaths.Add(wxT("/opt/local/doc/postgresql/html")); + pgPaths.Add(wxT("/opt/doc/postgresql")); + pgPaths.Add(wxT("/opt/doc/postgresql/html")); + + edbPaths.Add(wxT("/usr/local/enterpriseDB/doc")); + edbPaths.Add(wxT("/usr/local/enterpriseDB/doc/html")); + edbPaths.Add(wxT("/usr/local/enterprisedb/doc")); + edbPaths.Add(wxT("/usr/local/enterprisedb/doc/html")); + edbPaths.Add(wxT("/usr/local/edb/doc")); + edbPaths.Add(wxT("/usr/local/edb/doc/html")); + edbPaths.Add(wxT("/opt/local/enterpriseDB/doc")); + edbPaths.Add(wxT("/opt/local/enterpriseDB/doc/html")); + edbPaths.Add(wxT("/opt/local/enterprisedb/doc")); + edbPaths.Add(wxT("/opt/local/enterprisedb/doc/html")); + edbPaths.Add(wxT("/opt/local/edb/doc")); + edbPaths.Add(wxT("/opt/local/edb/doc/html")); + + wxArrayString gpFoundDirs; + wxString pgDirname1 = wxString(wxT("/usr/local")); + wxDir gpDir1(pgDirname1); + if ( gpDir1.IsOpened() ) + { + wxString gpfilename; + bool pgcont = gpDir1.GetFirst(&gpfilename, wxT("greenplum-clients*"), wxDIR_DIRS); + while ( pgcont ) + { + gpFoundDirs.Add(wxString(pgDirname1 + wxT("/") + gpfilename)); + pgcont = gpDir1.GetNext(&gpfilename); + } + } + + wxString pgDirname2 = wxString(wxT("/opt/local")); + wxDir gpDir2(pgDirname2); + if ( gpDir2.IsOpened() ) + { + wxString gpfilename; + bool pgcont = gpDir2.GetFirst(&gpfilename, wxT("greenplum-clients*"), wxDIR_DIRS); + while ( pgcont ) + { + gpFoundDirs.Add(wxString(pgDirname2 + wxT("/") + gpfilename)); + pgcont = gpDir2.GetNext(&gpfilename); + } + } + + // make sure that the highest version number comes first + gpFoundDirs.Sort(true); + for (wxArrayString::iterator iter = gpFoundDirs.begin(); iter != gpFoundDirs.end(); ++iter) + { + wxLogMessage(*iter); + pgPaths.Add(wxString(*iter)); + pgPaths.Add(wxString(*iter) + wxT("/html")); + pgPaths.Add(wxString(*iter) + wxT("/docs")); + } + +#endif + + // Slony will be installed into one of the DBMS directories + slonyPaths.Add(pgPaths); + slonyPaths.Add(edbPaths); + slonyPaths.Add(gpPaths); + + // First look for a chm, then a zip, then an hhp file. For PostgreSQL + // and EnterpriseDB we'll then look for an index.html. No point for + // Slony as we'd most likely find the DBMS's help. + + wxString pgHelpPath = settings->GetPgHelpPath(); + wxString edbHelpPath = settings->GetEdbHelpPath(); + wxString gpHelpPath = settings->GetGpHelpPath(); + wxString slonyHelpPath = settings->GetSlonyHelpPath(); + +#if defined (__WXMSW__) || wxUSE_LIBMSPACK + pgHelpPath = GenerateHelpPath(wxT("PostgreSQL.chm"), pgHelpPath, stdPaths, pgPaths); + pgHelpPath = GenerateHelpPath(wxT("postgresql.chm"), pgHelpPath, stdPaths, pgPaths); + pgHelpPath = GenerateHelpPath(wxT("postgres.chm"), pgHelpPath, stdPaths, pgPaths); + pgHelpPath = GenerateHelpPath(wxT("pgsql.chm"), pgHelpPath, stdPaths, pgPaths); + + edbHelpPath = GenerateHelpPath(wxT("EnterpriseDB.chm"), edbHelpPath, stdPaths, edbPaths); + edbHelpPath = GenerateHelpPath(wxT("enterprisedb.chm"), edbHelpPath, stdPaths, edbPaths); + edbHelpPath = GenerateHelpPath(wxT("edb.chm"), edbHelpPath, stdPaths, edbPaths); + + gpHelpPath = GenerateHelpPath(wxT("Greenplum.chm"), gpHelpPath, stdPaths, gpPaths); + gpHelpPath = GenerateHelpPath(wxT("GPDB.chm"), gpHelpPath, stdPaths, gpPaths); + gpHelpPath = GenerateHelpPath(wxT("GPSQL.zip"), gpHelpPath, stdPaths, gpPaths); + gpHelpPath = GenerateHelpPath(wxT("GPClientToolsWin.pdf"), gpHelpPath, stdPaths, gpPaths); + gpHelpPath = GenerateHelpPath(wxT("GPClientTools.pdf"), gpHelpPath, stdPaths, gpPaths); + gpHelpPath = GenerateHelpPath(wxT("GPUserGuide.pdf"), gpHelpPath, stdPaths, gpPaths); + + slonyHelpPath = GenerateHelpPath(wxT("Slony-I.chm"), slonyHelpPath, stdPaths, slonyPaths); + slonyHelpPath = GenerateHelpPath(wxT("slony-i.chm"), slonyHelpPath, stdPaths, slonyPaths); + slonyHelpPath = GenerateHelpPath(wxT("slony1.chm"), slonyHelpPath, stdPaths, slonyPaths); + slonyHelpPath = GenerateHelpPath(wxT("slony.chm"), slonyHelpPath, stdPaths, slonyPaths); +#endif + + pgHelpPath = GenerateHelpPath(wxT("PostgreSQL.zip"), pgHelpPath, stdPaths, pgPaths); + pgHelpPath = GenerateHelpPath(wxT("postgresql.zip"), pgHelpPath, stdPaths, pgPaths); + pgHelpPath = GenerateHelpPath(wxT("postgres.zip"), pgHelpPath, stdPaths, pgPaths); + pgHelpPath = GenerateHelpPath(wxT("pgsql.zip"), pgHelpPath, stdPaths, pgPaths); + + edbHelpPath = GenerateHelpPath(wxT("EnterpriseDB.zip"), edbHelpPath, stdPaths, edbPaths); + edbHelpPath = GenerateHelpPath(wxT("enterprisedb.zip"), edbHelpPath, stdPaths, edbPaths); + edbHelpPath = GenerateHelpPath(wxT("edb.zip"), edbHelpPath, stdPaths, edbPaths); + + gpHelpPath = GenerateHelpPath(wxT("Greenplum.zip"), gpHelpPath, stdPaths, gpPaths); + gpHelpPath = GenerateHelpPath(wxT("GPSQL.zip"), gpHelpPath, stdPaths, gpPaths); + + slonyHelpPath = GenerateHelpPath(wxT("Slony-I.zip"), slonyHelpPath, stdPaths, slonyPaths); + slonyHelpPath = GenerateHelpPath(wxT("slony-i.zip"), slonyHelpPath, stdPaths, slonyPaths); + slonyHelpPath = GenerateHelpPath(wxT("slony1.zip"), slonyHelpPath, stdPaths, slonyPaths); + slonyHelpPath = GenerateHelpPath(wxT("slony.zip"), slonyHelpPath, stdPaths, slonyPaths); + + pgHelpPath = GenerateHelpPath(wxT("PostgreSQL.hhp"), pgHelpPath, stdPaths, pgPaths); + pgHelpPath = GenerateHelpPath(wxT("postgresql.hhp"), pgHelpPath, stdPaths, pgPaths); + pgHelpPath = GenerateHelpPath(wxT("postgres.hhp"), pgHelpPath, stdPaths, pgPaths); + pgHelpPath = GenerateHelpPath(wxT("pgsql.hhp"), pgHelpPath, stdPaths, pgPaths); + + edbHelpPath = GenerateHelpPath(wxT("EnterpriseDB.hhp"), edbHelpPath, stdPaths, edbPaths); + edbHelpPath = GenerateHelpPath(wxT("enterprisedb.hhp"), edbHelpPath, stdPaths, edbPaths); + edbHelpPath = GenerateHelpPath(wxT("edb.hhp"), edbHelpPath, stdPaths, edbPaths); + + gpHelpPath = GenerateHelpPath(wxT("Greenplum.hhp"), gpHelpPath, stdPaths, gpPaths); + + slonyHelpPath = GenerateHelpPath(wxT("Slony-I.hhp"), slonyHelpPath, stdPaths, slonyPaths); + slonyHelpPath = GenerateHelpPath(wxT("slony-i.hhp"), slonyHelpPath, stdPaths, slonyPaths); + slonyHelpPath = GenerateHelpPath(wxT("slony1.hhp"), slonyHelpPath, stdPaths, slonyPaths); + slonyHelpPath = GenerateHelpPath(wxT("slony.hhp"), slonyHelpPath, stdPaths, slonyPaths); + + pgHelpPath = GenerateHelpPath(wxT("index.html"), pgHelpPath, noPaths, pgPaths); + pgHelpPath = GenerateHelpPath(wxT("index.html"), pgHelpPath, noPaths, pgPaths); + pgHelpPath = GenerateHelpPath(wxT("index.html"), pgHelpPath, noPaths, pgPaths); + pgHelpPath = GenerateHelpPath(wxT("index.html"), pgHelpPath, noPaths, pgPaths); + + edbHelpPath = GenerateHelpPath(wxT("index.html"), edbHelpPath, noPaths, edbPaths); + edbHelpPath = GenerateHelpPath(wxT("index.html"), edbHelpPath, noPaths, edbPaths); + edbHelpPath = GenerateHelpPath(wxT("index.html"), edbHelpPath, noPaths, edbPaths); + + gpHelpPath = GenerateHelpPath(wxT("index.html"), gpHelpPath, noPaths, gpPaths); + gpHelpPath = GenerateHelpPath(wxT("GPUserGuide.pdf"), gpHelpPath, stdPaths, gpPaths); + + // If either path ends in index.html, remove the filename because we + // just want the path. In this case, we should also add file:/// on + // non-Windows platforms. + if (pgHelpPath.EndsWith(wxT("index.html"))) + { + pgHelpPath = pgHelpPath.Left(pgHelpPath.Length() - 10); +#ifndef __WXMSW__ + pgHelpPath = wxT("file:///") + pgHelpPath; +#endif + } + + if (edbHelpPath.EndsWith(wxT("index.html"))) + { + edbHelpPath = edbHelpPath.Left(edbHelpPath.Length() - 10); +#ifndef __WXMSW__ + edbHelpPath = wxT("file:///") + edbHelpPath; +#endif + } + + if (gpHelpPath.EndsWith(wxT("index.html"))) + { + gpHelpPath = gpHelpPath.Left(gpHelpPath.Length() - 10); +#ifndef __WXMSW__ + gpHelpPath = wxT("file:///") + gpHelpPath; +#endif + } + + // Last resorts - if we still have no help by now, use the websites! + if (pgHelpPath.IsEmpty()) + pgHelpPath = wxT("http://www.postgresql.org/docs/current/static/"); + if (edbHelpPath.IsEmpty()) + edbHelpPath = wxT("http://www.enterprisedb.com/docs/en/current/server/"); + if (gpHelpPath.IsEmpty()) + gpHelpPath = wxT("http://gpdb.docs.pivotal.io/"); + if (slonyHelpPath.IsEmpty()) + slonyHelpPath = wxT("http://www.slony.info/documentation/"); + + // OK, so set the values + if (settings->GetPgHelpPath().IsEmpty()) + settings->SetPgHelpPath(pgHelpPath); + if (settings->GetEdbHelpPath().IsEmpty()) + settings->SetEdbHelpPath(edbHelpPath); + if (settings->GetGpHelpPath().IsEmpty()) + settings->SetGpHelpPath(gpHelpPath); + if (settings->GetSlonyHelpPath().IsEmpty()) + settings->SetSlonyHelpPath(slonyHelpPath); +} + +wxString pgAdmin3::GenerateHelpPath(const wxString &file, const wxString ¤t, wxPathList stdPaths, wxPathList dbmsPaths) +{ + // If we already have a value, don't change it. + if (!current.IsEmpty()) + return current; + + if (!stdPaths.FindValidPath(file).IsEmpty()) + return stdPaths.FindValidPath(file); + + if (!dbmsPaths.FindValidPath(file).IsEmpty()) + return dbmsPaths.FindValidPath(file); + + return wxEmptyString; +} + +void pgAdmin3::InitXml() +{ +#define chkXRC(id) XRCID(#id) == id + wxASSERT_MSG( + chkXRC(wxID_OK) && + chkXRC(wxID_CANCEL) && + chkXRC(wxID_HELP) && + chkXRC(wxID_APPLY) && + chkXRC(wxID_ADD) && + chkXRC(wxID_STOP) && + chkXRC(wxID_REMOVE) && + chkXRC(wxID_REFRESH) && + chkXRC(wxID_CLOSE), + wxT("XRC ID not correctly assigned.")); + // if this assert fires, some event table uses XRCID(...) instead of wxID_... directly + +#ifdef EMBED_XRC + wxLogInfo(__("Using embedded XRC data.")); + + // resources are loaded from memory + extern void InitXmlResource(); + InitXmlResource(); + +#else + wxLogInfo(__("Using external XRC files.")); + + // for debugging, dialog resources are read from file + wxXmlResource::Get()->Load(uiPath + wxT("/*.xrc")); +#endif + +} + + +void pgAdmin3::InitLogger() +{ + sysLogger::logFile = settings->GetLogFile(); + sysLogger::logLevel = settings->GetLogLevel(); + + logger = new sysLogger(); + wxLog::SetVerbose(true); + wxLog::SetActiveTarget(logger); + wxLog::Resume(); +} + + +void pgAdmin3::InitNetwork() +{ + // Startup the windows sockets if required +#ifdef __WXMSW__ + WSADATA wsaData; + if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) + { + wxLogFatalError(__("Cannot initialise the networking subsystem!")); + } +#endif + wxSocketBase::Initialize(); + + pgConn::ExamineLibpqVersion(); +} + +#include "images/pgAdmin3-16.pngc" +#include "images/pgAdmin3-32.pngc" +#include "images/splash.pngc" + +pgAppearanceFactory::pgAppearanceFactory() +{ + is_branded = false; + + // Setup the default branding options +#ifdef __WIN32__ + splash_font_size = 8; +#else +#ifdef __WXMAC__ + splash_font_size = 11; +#else + splash_font_size = 9; +#endif +#endif + + splash_pos_x = 128; + splash_pos_y = 281; + splash_pos_offset = 15; + + large_icon = *pgAdmin3_32_png_img; + small_icon = *pgAdmin3_16_png_img; + splash_image = *splash_png_img; + + splash_text_colour = wxColour(255, 255, 255); + report_key_colour = wxColour(0, 154, 206); + + long_appname = wxT("pgAdmin III"); + short_appname = wxT("pgadmin3"); + website_url = wxT("http://www.pgadmin.org/"); + + hide_enterprisedb_help = false; + hide_greenplum_help = false; + + // Attempt to overload branding information + wxFileName brIni(brandingPath + wxT("/branding.ini")); + if (brIni.FileExists()) + { + wxString brCfg = FileRead(brIni.GetFullPath()); + + wxStringTokenizer tkz(brCfg, wxT("\r\n")); + + while(tkz.HasMoreTokens()) + { + wxString token = tkz.GetNextToken(); + + if (token.Trim() == wxEmptyString || token.StartsWith(wxT(";"))) + continue; + + if (token.Lower().StartsWith(wxT("largeicon="))) + { + large_icon = wxImage(brandingPath + wxT("/") + token.AfterFirst('=').Trim()); + if (!large_icon.IsOk()) + large_icon = *pgAdmin3_32_png_img; + else + is_branded = true; + } + else if (token.Lower().StartsWith(wxT("smallicon="))) + { + small_icon = wxImage(brandingPath + wxT("/") + token.AfterFirst('=').Trim()); + if (!small_icon.IsOk()) + small_icon = *pgAdmin3_16_png_img; + else + is_branded = true; + } + else if (token.Lower().StartsWith(wxT("splashimage="))) + { + splash_image = wxImage(brandingPath + wxT("/") + token.AfterFirst('=').Trim()); + if (!splash_image.IsOk()) + splash_image = *splash_png_img; + else + is_branded = true; + } + else if (token.Lower().StartsWith(wxT("icon="))) + { + icon = token.AfterFirst('=').Trim(); + is_branded = true; + } +#ifdef __WIN32__ + else if (token.Lower().StartsWith(wxT("splashfontsizewin="))) +#else +#ifdef __WXMAC__ + else if (token.Lower().StartsWith(wxT("splashfontsizemac="))) +#else + else if (token.Lower().StartsWith(wxT("splashfontsizegtk="))) +#endif +#endif + { + token.AfterFirst('=').Trim().ToLong(&splash_font_size); + is_branded = true; + } + else if (token.Lower().StartsWith(wxT("splashposx="))) + { + token.AfterFirst('=').Trim().ToLong(&splash_pos_x); + is_branded = true; + } + else if (token.Lower().StartsWith(wxT("splashposy="))) + { + token.AfterFirst('=').Trim().ToLong(&splash_pos_y); + is_branded = true; + } + else if (token.Lower().StartsWith(wxT("splashposoffset="))) + { + token.AfterFirst('=').Trim().ToLong(&splash_pos_offset); + is_branded = true; + } + else if (token.Lower().StartsWith(wxT("splashtextcolour="))) + { + splash_text_colour = wxColor(token.AfterFirst('=').Trim()); + is_branded = true; + } + else if (token.Lower().StartsWith(wxT("shortappname="))) + { + short_appname = token.AfterFirst('=').Trim(); + is_branded = true; + } + else if (token.Lower().StartsWith(wxT("longappname="))) + { + long_appname = token.AfterFirst('=').Trim(); + is_branded = true; + } + else if (token.Lower().StartsWith(wxT("websiteurl="))) + { + website_url = token.AfterFirst('=').Trim(); + is_branded = true; + } + else if (token.Lower().StartsWith(wxT("reportkeycolour="))) + { + report_key_colour = wxColor(token.AfterFirst('=').Trim()); + is_branded = true; + } + else if (token.Lower().StartsWith(wxT("hideenterprisedbhelp="))) + { + if (token.AfterFirst('=').Trim() == wxT("1")) + { + hide_enterprisedb_help = true; + is_branded = true; + } + } + else if (token.Lower().StartsWith(wxT("hidegreenplumhelp="))) + { + if (token.AfterFirst('=').Trim() == wxT("1")) + { + hide_greenplum_help = true; + is_branded = true; + } + } + } + } + +#ifdef __WXMSW__ + + // Set the MUI cache value for the grouped task bar title, + // otherwise we get the value from the resources which is + // definitely not what we want in branded mode! + wxRegKey *pRegKey = new wxRegKey(wxT("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\ShellNoRoam\\MUICache")); + if(!pRegKey->Exists()) + pRegKey->Create(); + +#if wxCHECK_VERSION(2, 9, 5) + wxStandardPaths &paths = wxStandardPaths::Get(); +#else + wxStandardPaths paths; +#endif + //wxString tmp; + //tmp.Printf(wxT("%s"), long_appname); + pRegKey->SetValue(paths.GetExecutablePath(), GetLongAppName()); + delete pRegKey; + + // Reset the image for the task bar group. This can only by + // set per-exe name unfortunately. If we don't find an icon, + // remove the registry value. + wxString icon_path = brandingPath + wxT("\\") + icon; + + + pRegKey = new wxRegKey(wxT("HKEY_CURRENT_USER\\Software\\Classes\\Applications\\") + wxFileName(paths.GetExecutablePath()).GetFullName()); + if(!pRegKey->Exists()) + pRegKey->Create(); + + if (wxFile::Exists(icon_path)) + { + pRegKey->SetValue(wxT("TaskbarGroupIcon"), icon_path); + } + else + { + if (pRegKey->HasValue(wxT("TaskbarGroupIcon"))) + pRegKey->DeleteValue(wxT("TaskbarGroupIcon")); + } + delete pRegKey; +#endif +} + +void pgAppearanceFactory::SetIcons(wxDialog *dlg) +{ + wxIconBundle icons; + icons.AddIcon(GetSmallIconImage()); + icons.AddIcon(GetBigIconImage()); + dlg->SetIcons(icons); +} + +void pgAppearanceFactory::SetIcons(wxTopLevelWindow *dlg) +{ + wxIconBundle icons; + icons.AddIcon(GetSmallIconImage()); + icons.AddIcon(GetBigIconImage()); + dlg->SetIcons(icons); +} + +wxIcon pgAppearanceFactory::GetSmallIconImage() +{ + wxIcon icon; + icon.CopyFromBitmap(wxBitmap(small_icon)); + return icon; +} + +wxIcon pgAppearanceFactory::GetBigIconImage() +{ + wxIcon icon; + icon.CopyFromBitmap(wxBitmap(large_icon)); + return icon; +} + +wxFont pgAppearanceFactory::GetSplashTextFont() +{ + wxFont fnt(*wxNORMAL_FONT); + fnt.SetPointSize(splash_font_size); + return fnt; +} + +//////////////////////////////////////////////////////////////////////////////// +// InitLibpq() +// +// Dynamically load EDB-specific functions from libpq + +#ifdef __WXMSW__ +void pgAdmin3::InitLibpq() +{ + HINSTANCE hinstLib; + + // Get a handle to the DLL module. + hinstLib = LoadLibrary(TEXT("libpq")); + + // If the handle is valid, try to get the function address. + if (hinstLib != NULL) + { + PQiGetOutResult = (PQGETOUTRESULT) GetProcAddress(hinstLib, "PQgetOutResult"); + PQiPrepareOut = (PQPREPAREOUT) GetProcAddress(hinstLib, "PQprepareOut"); + PQiSendQueryPreparedOut = (PQSENDQUERYPREPAREDOUT) GetProcAddress(hinstLib, "PQsendQueryPreparedOut"); + + // If the function address is valid, call the function. + if (PQiGetOutResult != NULL) + wxLogInfo(wxT("Using runtime dynamically linked EDB libpq functions.")); + else + wxLogInfo(wxT("EDB libpq functions are not available.")); + } +} +#endif + diff --git a/pgAdmin3.layout b/pgAdmin3.layout new file mode 100644 index 0000000..d0c82c7 --- /dev/null +++ b/pgAdmin3.layout @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/pgAdmin3.rc b/pgAdmin3.rc new file mode 100644 index 0000000..6a9c3eb --- /dev/null +++ b/pgAdmin3.rc @@ -0,0 +1,56 @@ +////////////////////////////////////////////////////////////////////////// +// +// pgAdmin III - PostgreSQL Tools +// +// Copyright (C) 2002 - 2016, The pgAdmin Development Team +// This software is released under the PostgreSQL Licence +// +// pgAdmin3.rc - win32 Resources +// +////////////////////////////////////////////////////////////////////////// + +#if defined(_WIN32_WCE) +#undef _WIN32_WCE +#endif + +#include +#include +#include "include/version.h" +#include "include/copyright.h" + +// Icon (Don't remove the aaa prefix - it makes it the default icon!) +aaaPGADMIN3 ICON DISCARDABLE "include/images/pgAdmin3.ico" +SQL ICON DISCARDABLE "include/images/sql.ico" + +VS_VERSION_INFO VERSIONINFO +FILEVERSION VERSION_NUM +PRODUCTVERSION VERSION_NUM +FILEFLAGSMASK VER_DEBUG|VER_PRERELEASE +FILEFLAGS VER_DEBUG|VER_PRERELEASE +FILEOS VOS__WINDOWS32 +FILETYPE VFT_APP +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + BEGIN + VALUE "FileVersion", VERSION_STR, "\0" + VALUE "File Version", VERSION_STR, "\0" + VALUE "FileDescription", "pgAdmin III - PostgreSQL Tools", "\0" + VALUE "LegalCopyright", COPYRIGHT_WIN32, "\0" + VALUE "LegalTrademarks", LICENSE, "\0" + VALUE "InternalName", "pgadmin3", "\0" + VALUE "OriginalFilename","pgadmin3.exe", "\0" + VALUE "ProductName", "pgAdmin III", "\0" + VALUE "ProductVersion", VERSION_STR, "\0" +#ifdef BUILD + VALUE "Build", BUILD, "\0" +#endif + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 0x04E4 + END +END + diff --git a/precomp.cpp b/precomp.cpp new file mode 100644 index 0000000..f110652 --- /dev/null +++ b/precomp.cpp @@ -0,0 +1,18 @@ +////////////////////////////////////////////////////////////////////////// +// +// pgAdmin III - PostgreSQL Tools +// +// Copyright (C) 2002 - 2016, The pgAdmin Development Team +// This software is released under the PostgreSQL Licence +// +// precomp.cpp - precompiled header +// +////////////////////////////////////////////////////////////////////////// + +#ifdef WIN32 +#define WIN32_LEAN_AND_MEAN +#endif + +#include + +#include "pgAdmin3.h" diff --git a/settings.ini b/settings.ini new file mode 100644 index 0000000..2c29cf0 --- /dev/null +++ b/settings.ini @@ -0,0 +1,31 @@ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; pgAdmin III - PostgreSQL Tools +; +; Copyright (C) 2002 - 2016, The pgAdmin Development Team +; This software is released under the PostgreSQL Licence +; +; settings.ini +; +; This file, if present, specifies the default configuration settings that +; pgAdmin will use if the user doesn't have a value already stored in their +; preferences file (or the registry on Windows). If a value is not present in +; this file, a hard-coded default is used. +; +; This file should be located alongside pgAdmin3.exe on Windows, and in the +; program data directory (normally called 'share') on Unix/OSX platforms. +; +; Use the familiar .ini file format, with settings paths in section names if +; required, eg. +; +; LogFile=/tmp/pgadmin3.log +; +; [Servers] +; Count=99 +; +; [Servers/1] +; Server=127.0.0.1 +; Description=Development +; Port=5432 +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;