bool backupServerFactory::CheckEnable(pgObject *obj) { if (!obj) return false; if (!((pgServer *)obj)->GetConnected() || obj->GetMetaType() != PGM_SERVER) return false; if (obj->GetConnection()->EdbMinimumVersion(8, 0)) return !edbBackupAllExecutable.IsEmpty() && pgAppMinimumVersion(edbBackupAllExecutable, 8, 3); else if (obj->GetConnection()->GetIsGreenplum()) return !gpBackupAllExecutable.IsEmpty() && pgAppMinimumVersion(gpBackupAllExecutable, 8, 3); else return !pgBackupAllExecutable.IsEmpty() && pgAppMinimumVersion(pgBackupAllExecutable, 8, 3); }
void frmBackup::OnChangePlain(wxCommandEvent &ev) { bool isPlain = (cbFormat->GetSelection() == 2); bool isDirectory = (cbFormat->GetSelection() == 3); bool isSection = chkSectionPreData->GetValue() || chkSectionData->GetValue() || chkSectionPostData->GetValue(); chkBlobs->Enable(canBlob && !isPlain); chkOnlyData->Enable(isPlain && !chkOnlySchema->GetValue() && !isSection); if (isPlain) isPlain = !chkOnlyData->GetValue(); chkOnlySchema->Enable(isPlain && !isSection); chkSectionPreData->Enable(!chkOnlyData->GetValue() && !chkOnlySchema->GetValue()); chkSectionData->Enable(!chkOnlyData->GetValue() && !chkOnlySchema->GetValue()); chkSectionPostData->Enable(!chkOnlyData->GetValue() && !chkOnlySchema->GetValue()); chkNoOwner->Enable(isPlain); chkDropDb->Enable(isPlain); chkCreateDb->Enable(isPlain); chkDisableTrigger->Enable(chkOnlyData->GetValue()); btnFilename->Enable(!isDirectory); txtNumberOfJobs->Enable(isDirectory && pgAppMinimumVersion(backupExecutable, 9, 3)); if (!txtNumberOfJobs->IsEnabled()) txtNumberOfJobs->SetValue(wxEmptyString); wxCommandEvent nullEvent; OnChange(nullEvent); }
wxString frmBackupServer::getCmdPart1() { pgServer *server = (pgServer *)object; wxString cmd = backupExecutable; if (!server->GetName().IsEmpty()) cmd += wxT(" --host ") + server->GetName(); cmd += wxT(" --port ") + NumToStr((long)server->GetPort()) + wxT(" --username ") + commandLineCleanOption(qtIdent(server->GetUsername())); if (!cbRolename->GetValue().IsEmpty()) cmd += wxT(" --role ") + commandLineCleanOption(qtIdent(cbRolename->GetValue())); if (pgAppMinimumVersion(backupExecutable, 8, 4)) cmd += wxT(" --no-password "); return cmd; }
frmRestore::frmRestore(frmMain *_form, pgObject *obj) : ExternProcessDialog(form) { object=obj; if (object->GetMetaType() == PGM_SERVER) server = (pgServer*)object; else server=object->GetDatabase()->GetServer(); form=_form; wxWindowBase::SetFont(settings->GetSystemFont()); LoadResource(_form, wxT("frmRestore")); RestorePosition(); SetTitle(wxString::Format(_("Restore %s %s"), object->GetTranslatedTypeName().c_str(), object->GetQuotedFullIdentifier().c_str())); if (object->GetConnection()->EdbMinimumVersion(8,0)) restoreExecutable=edbRestoreExecutable; else if (object->GetConnection()->GetIsGreenplum()) restoreExecutable=gpRestoreExecutable; else restoreExecutable=pgRestoreExecutable; if (object->GetMetaType() != PGM_DATABASE) { chkOnlySchema->SetValue(object->GetMetaType() == PGM_FUNCTION || object->GetMetaType() == PGM_INDEX || object->GetMetaType() == PGM_TRIGGER); chkOnlyData->SetValue(object->GetMetaType() == PGM_TABLE || object->GetMetaType() == GP_PARTITION); if (object->GetMetaType() != PGM_SCHEMA) { chkOnlyData->Disable(); chkOnlySchema->Disable(); } if (object->GetMetaType() == PGM_FUNCTION) { chkClean->SetValue(true); chkClean->Disable(); } btnView->Disable(); } wxString val; settings->Read(wxT("frmRestore/LastFile"), &val, wxEmptyString); txtFilename->SetValue(val); // Icon SetIcon(wxIcon(restore_xpm)); txtMessages = CTRL_TEXT("txtMessages"); txtMessages->SetMaxLength(0L); btnOK->Disable(); filenameValid=false; if (!server->GetPasswordIsStored()) environment.Add(wxT("PGPASSWORD="******"PGSSLMODE=") + server->GetConnection()->GetSslModeName()); if (!pgAppMinimumVersion(restoreExecutable, 8, 4)) { chkNoTablespaces->Disable(); chkSingleXact->Disable(); txtNumberOfJobs->Disable(); } if (!pgAppMinimumVersion(restoreExecutable, 8, 2)) { chkNoDataForFailedTables->Disable(); } if (!pgAppMinimumVersion(restoreExecutable, 8, 0)) { chkExitOnError->Disable(); } wxCommandEvent ev; OnChangeName(ev); }
wxString frmRestore::getCmdPart2(int step) { wxString cmd; wxString restoreExecutable; if (object->GetConnection()->EdbMinimumVersion(8,0)) restoreExecutable=edbBackupExecutable; else if (object->GetConnection()->GetIsGreenplum()) restoreExecutable=gpBackupExecutable; else restoreExecutable=pgBackupExecutable; if (step) { cmd.Append(wxT(" --list")); } else { if (chkOnlyData->GetValue()) { cmd.Append(wxT(" --data-only")); } else { if (chkNoOwner->GetValue()) cmd.Append(wxT(" --no-owner")); if (chkNoPrivileges->GetValue()) cmd.Append(wxT(" --no-priviledges")); if (chkNoTablespaces->GetValue()) cmd.Append(wxT(" --no-tablespaces")); } if (chkOnlySchema->GetValue()) { cmd.Append(wxT(" --schema-only")); } else { if (chkDisableTrigger->GetValue()) cmd.Append(wxT(" --disable-triggers")); } if (chkCreateDb->GetValue()) cmd.Append(wxT(" --create")); if (chkClean->GetValue()) cmd.Append(wxT(" --clean")); if (chkSingleXact->GetValue()) cmd.Append(wxT(" --single-transaction")); if (chkNoDataForFailedTables->GetValue()) cmd.Append(wxT(" --no-data-for-failed-tables")); if (chkUseSetSession->GetValue()) cmd.Append(wxT(" --use-set-session-authorization")); if (chkExitOnError->GetValue()) cmd.Append(wxT(" --exit-on-error")); if (!txtNumberOfJobs->GetValue().IsEmpty()) cmd.Append(wxT(" --jobs ") + txtNumberOfJobs->GetValue()); // Process selected items wxTreeItemId root, firstLevelObject, secondLevelObject; wxTreeItemIdValue firstLevelObjectData, secondLevelObjectData; bool partialDump = false; // Get root object root = ctvObjects->GetRootItem(); if (root && object->GetMetaType() == PGM_DATABASE) { // Prepare the array wxArrayString restoreStrings; restoreStrings.Add(wxEmptyString, numberOfTOCItems); restoreTreeItemData *data; // Loop through first level objects firstLevelObject = ctvObjects->GetFirstChild(root, firstLevelObjectData); while (firstLevelObject.IsOk()) { if (ctvObjects->IsChecked(firstLevelObject)) { // Write the file data = (restoreTreeItemData*)ctvObjects->GetItemData(firstLevelObject); restoreStrings[data->GetId()] = data->GetDesc(); // Loop through second level objects secondLevelObject = ctvObjects->GetFirstChild(firstLevelObject, secondLevelObjectData); while (secondLevelObject.IsOk()) { if (ctvObjects->IsChecked(secondLevelObject)) { // Write the file data = (restoreTreeItemData*)ctvObjects->GetItemData(secondLevelObject); restoreStrings[data->GetId()] = data->GetDesc(); } else partialDump = true; secondLevelObject = ctvObjects->GetNextChild(firstLevelObject, secondLevelObjectData); } } else partialDump = true; firstLevelObject = ctvObjects->GetNextChild(root, firstLevelObjectData); } // Open a temporary file to store the TOC restoreTOCFilename = wxFileName::CreateTempFileName(wxT("restore")); wxFile tocFile; tocFile.Open(restoreTOCFilename.c_str(), wxFile::write); // Write all selected items in it for (int i=0; i<numberOfTOCItems; i++) { if (restoreStrings[i] != wxEmptyString) { if (!tocFile.Write(restoreStrings[i] + wxT("\n"))) wxLogError(_("Error writing to the temporary file ") + restoreTOCFilename); } } // If some items were not checked and if the file still contains something, we have to use the list if (partialDump && tocFile.Length() > 0) cmd.Append(wxT(" --use-list \"") + restoreTOCFilename + wxT("\"")); tocFile.Close(); } else if (object->GetMetaType() != PGM_DATABASE) { switch (object->GetMetaType()) { case PGM_FUNCTION: cmd.Append(wxT(" --function ") + commandLineCleanOption(qtIdent(object->GetFullName()))); break; case PGM_INDEX: cmd.Append(wxT(" --index ") + commandLineCleanOption(object->GetQuotedIdentifier())); break; case PGM_TABLE: cmd.Append(wxT(" --table ") + commandLineCleanOption(object->GetQuotedIdentifier())); break; case PGM_TRIGGER: cmd.Append(wxT(" --trigger ") + commandLineCleanOption(object->GetQuotedIdentifier())); break; default: break; } if (object->GetMetaType() == PGM_SCHEMA) cmd.Append(wxT(" --schema ") + commandLineCleanOption(object->GetQuotedIdentifier())); else if (pgAppMinimumVersion(restoreExecutable, 8, 2)) cmd.Append(wxT(" --schema ") + commandLineCleanOption(object->GetSchema()->GetQuotedIdentifier())); } if (settings->GetIgnoreVersion()) cmd.Append(wxT(" --ignore-version")); if (chkVerbose->GetValue()) cmd.Append(wxT(" --verbose")); } cmd.Append(wxT(" \"") + txtFilename->GetValue() + wxT("\"")); return cmd; }
frmBackup::frmBackup(frmMain *form, pgObject *obj) : ExternProcessDialog(form) { object = obj; SetFont(settings->GetSystemFont()); LoadResource(form, wxT("frmBackup")); RestorePosition(); SetTitle(object->GetTranslatedMessage(BACKUPTITLE)); if (object->GetConnection()->EdbMinimumVersion(8, 0)) backupExecutable = edbBackupExecutable; else if (object->GetConnection()->GetIsGreenplum()) backupExecutable = gpBackupExecutable; else backupExecutable = pgBackupExecutable; canBlob = (obj->GetMetaType() == PGM_DATABASE); chkBlobs->SetValue(canBlob); chkDisableDollar->Enable(obj->GetConnection()->BackendMinimumVersion(7, 5)); wxString val; settings->Read(wxT("frmBackup/LastFile"), &val, wxEmptyString); txtFilename->SetValue(val); pgServer *server = object->GetServer(); if (!server->GetPasswordIsStored()) environment.Add(wxT("PGPASSWORD="******"PGSSLMODE=") + server->GetConnection()->GetSslModeName()); if (server->GetSSLRootCert() != wxEmptyString) environment.Add(wxT("PGSSLROOTCERT=") + server->GetSSLRootCert()); if (server->GetSSLCert() != wxEmptyString) environment.Add(wxT("PGSSLCERT=") + server->GetSSLCert()); if (server->GetSSLKey() != wxEmptyString) environment.Add(wxT("PGSSLKEY=") + server->GetSSLKey()); if (server->GetSSLCrl() != wxEmptyString) environment.Add(wxT("PGSSLCRL=") + server->GetSSLCrl()); // Icon SetIcon(*backup_png_ico); // fix translation problem wxString dollarLabel = wxGetTranslation(_("$$ quoting")); dollarLabel.Replace(wxT("$$"), wxT("$")); chkDisableDollar->SetLabel(dollarLabel); chkDisableDollar->SetSize(chkDisableDollar->GetBestSize()); txtMessages = CTRL_TEXT("txtMessages"); // Note that under GTK+, SetMaxLength() function may only be used with single line text controls. // (see http://docs.wxwidgets.org/2.8/wx_wxtextctrl.html#wxtextctrlsetmaxlength) #ifndef __WXGTK__ txtMessages->SetMaxLength(0L); #endif btnOK->Disable(); long encNo = 0; wxString encStr; cbEncoding->Append(wxT("")); do { encStr = object->GetConnection()->ExecuteScalar( wxT("SELECT pg_encoding_to_char(") + NumToStr(encNo) + wxT(")")); if (pgConn::IsValidServerEncoding(encNo) && !encStr.IsEmpty()) cbEncoding->Append(encStr); encNo++; } while (!encStr.IsEmpty()); cbEncoding->SetSelection(0); wxString i18ndb = _("Database"); wxTreeItemId db = ctvObjects->AddRoot(i18ndb + wxT(" ") + object->GetDatabase()->GetName(), 1); bool checked; wxString query = wxT("SELECT nspname, relname ") wxT("FROM pg_namespace n ") wxT("LEFT JOIN pg_class c ON n.oid=c.relnamespace AND relkind='r' ") wxT("WHERE nspname NOT LIKE E'pg\\\\_%' AND nspname <> 'information_schema' "); if (!object->GetDatabase()->GetSchemaRestriction().IsEmpty()) query += wxT("AND nspname IN (") + object->GetDatabase()->GetSchemaRestriction() + wxT(")"); query += wxT("ORDER BY nspname, relname"); pgSet *objects = object->GetDatabase()->ExecuteSet(query); if (objects) { wxString currentSchema = wxT(""); wxTreeItemId currentSchemaNode; while (!objects->Eof()) { if (currentSchema != objects->GetVal(wxT("nspname"))) { currentSchema = objects->GetVal(wxT("nspname")); if (object->GetMetaType() == PGM_SCHEMA) { checked = ((pgSchema *)object)->GetIdentifier() == currentSchema; } else { if (object->GetMetaType() == PGM_TABLE || object->GetMetaType() == GP_PARTITION) { checked = ((pgTable *)object)->GetSchema()->GetIdentifier() == currentSchema || (object->GetMetaType() != PGM_TABLE && object->GetMetaType() != GP_PARTITION); } else { checked = object->GetMetaType() != PGM_TABLE && object->GetMetaType() != GP_PARTITION; } } currentSchemaNode = ctvObjects->AppendItem(db, currentSchema, checked ? 1 : 0); } if (!objects->GetVal(wxT("relname")).IsNull()) { if (object->GetMetaType() == PGM_TABLE || object->GetMetaType() == GP_PARTITION) { checked = ((pgTable *)object)->GetSchema()->GetIdentifier() == currentSchema && ((pgTable *)object)->GetIdentifier() == objects->GetVal(wxT("relname")); } else { if (object->GetMetaType() == PGM_SCHEMA) { checked = ((pgSchema *)object)->GetIdentifier() == currentSchema; } else { if (object->GetMetaType() == PGM_TABLE || object->GetMetaType() == GP_PARTITION) { checked = ((pgTable *)object)->GetSchema()->GetIdentifier() == currentSchema || (object->GetMetaType() != PGM_TABLE && object->GetMetaType() != GP_PARTITION); } else { checked = object->GetMetaType() != PGM_TABLE && object->GetMetaType() != GP_PARTITION; } } } ctvObjects->AppendItem(currentSchemaNode, objects->GetVal(wxT("relname")), checked ? 1 : 0); } objects->MoveNext(); } ctvObjects->ExpandAll(); delete objects; } if (!pgAppMinimumVersion(backupExecutable, 9, 3)) { txtNumberOfJobs->Disable(); } if (!pgAppMinimumVersion(backupExecutable, 9, 2)) { chkSectionPreData->Disable(); chkSectionData->Disable(); chkSectionPostData->Disable(); } if (!pgAppMinimumVersion(backupExecutable, 9, 1)) { chkForceQuoteForIdent->Disable(); chkNoUnloggedTableData->Disable(); } if (!pgAppMinimumVersion(backupExecutable, 8, 4)) { chkNoTablespaces->Disable(); cbRolename->Disable(); } else { // Available rolenames if (object->GetServer()->GetConnection()->BackendMinimumVersion(8, 1)) { pgSetIterator set(object->GetServer()->GetConnection(), wxT("SELECT DISTINCT rolname\n") wxT("FROM pg_roles db\n") wxT("ORDER BY rolname")); cbRolename->Append(wxEmptyString); while(set.RowsLeft()) cbRolename->Append(set.GetVal(wxT("rolname"))); cbRolename->SetValue(object->GetServer()->GetRolename()); cbRolename->Enable(true); } else cbRolename->Disable(); } if (!pgAppMinimumVersion(backupExecutable, 8, 1)) { cbEncoding->Disable(); } cbFormat->Append(_("Custom")); cbFormat->Append(_("Tar")); cbFormat->Append(_("Plain")); cbFormat->SetSelection(0); if (pgAppMinimumVersion(backupExecutable, 9, 1)) cbFormat->Append(_("Directory")); wxCommandEvent ev; OnChangePlain(ev); }
wxString frmBackup::getCmdPart2() { wxString cmd; switch (cbFormat->GetSelection()) { case 0: // compressed { cmd.Append(wxT(" --format custom")); if (chkBlobs->GetValue()) cmd.Append(wxT(" --blobs")); if (!txtCompressRatio->GetValue().IsEmpty()) cmd.Append(wxT(" --compress ") + txtCompressRatio->GetValue()); break; } case 1: // tar { cmd.Append(wxT(" --format tar")); if (chkBlobs->GetValue()) cmd.Append(wxT(" --blobs")); break; } case 2: // plain { cmd.Append(wxT(" --format plain")); if (chkOnlyData->GetValue()) { cmd.Append(wxT(" --data-only")); if (chkDisableTrigger->GetValue()) cmd.Append(wxT(" --disable-triggers")); } else { if (chkOnlySchema->GetValue()) cmd.Append(wxT(" --schema-only")); if (chkNoOwner->GetValue()) cmd.Append(wxT(" --no-owner")); if (chkCreateDb->GetValue()) cmd.Append(wxT(" --create")); if (chkDropDb->GetValue()) cmd.Append(wxT(" --clean")); } break; } case 3: // directory { cmd.Append(wxT(" --format directory")); break; } } // Section if (pgAppMinimumVersion(backupExecutable, 9, 2)) { if (chkSectionPreData->GetValue()) cmd.Append(wxT(" --section pre-data")); if (chkSectionData->GetValue()) cmd.Append(wxT(" --section data")); if (chkSectionPostData->GetValue()) cmd.Append(wxT(" --section post-data")); } if (!cbEncoding->GetValue().IsEmpty()) cmd.Append(wxT(" --encoding ") + cbEncoding->GetValue()); if (chkOid->GetValue()) cmd.Append(wxT(" --oids")); if (chkInsert->GetValue()) cmd.Append(wxT(" --inserts")); if (chkColumnInserts->GetValue()) cmd.Append(wxT(" --column-inserts")); if (chkNoPrivileges->GetValue()) cmd.Append(wxT(" --no-privileges")); if (chkNoTablespaces->GetValue()) cmd.Append(wxT(" --no-tablespaces")); if (chkUseSetSession->GetValue()) cmd.Append(wxT(" --use-set-session-authorization")); if (chkDisableDollar->GetValue()) cmd.Append(wxT(" --disable-dollar-quoting")); if (settings->GetIgnoreVersion()) cmd.Append(wxT(" --ignore-version")); if (chkVerbose->GetValue()) cmd.Append(wxT(" --verbose")); if (chkForceQuoteForIdent->GetValue()) cmd.Append(wxT(" --quote-all-identifiers")); if (chkNoUnloggedTableData->GetValue()) cmd.Append(wxT(" --no-unlogged-table-data")); cmd.Append(wxT(" --file \"") + txtFilename->GetValue() + wxT("\"")); if (!txtNumberOfJobs->GetValue().IsEmpty()) cmd.Append(wxT(" --jobs ") + txtNumberOfJobs->GetValue()); // Process selected items wxTreeItemId root, schema, table; wxTreeItemIdValue schemaData, tableData; wxString cmdSchemas, cmdTables, tmpTables; bool partialDump; bool partialSchema; root = ctvObjects->GetRootItem(); schema = ctvObjects->GetFirstChild(root, schemaData); cmdSchemas = wxT(""); cmdTables = wxT(""); partialDump = false; while (schema.IsOk()) { if (ctvObjects->IsChecked(schema)) { partialSchema = false; tmpTables = wxT(""); table = ctvObjects->GetFirstChild(schema, tableData); while (table.IsOk()) { if (ctvObjects->IsChecked(table)) { // The syntax changed in 8.2 :-( if (pgAppMinimumVersion(backupExecutable, 8, 2)) { tmpTables.Append(wxT(" --table \"") + commandLineCleanOption(qtIdent(ctvObjects->GetItemText(schema)), true) + wxT(".") + commandLineCleanOption(qtIdent(ctvObjects->GetItemText(table)), true) + wxT("\"")); } else { tmpTables.Append(wxT(" --table \"") + commandLineCleanOption(qtIdent(ctvObjects->GetItemText(table)), true) + wxT("\"")); tmpTables.Append(wxT(" --schema \"") + commandLineCleanOption(qtIdent(ctvObjects->GetItemText(schema)), true) + wxT("\"")); } } else { partialDump = true; partialSchema = true; } table = ctvObjects->GetNextChild(schema, tableData); } if (partialSchema) { cmdTables += tmpTables; } else { cmdSchemas.Append(wxT(" --schema \"") + commandLineCleanOption(qtIdent(ctvObjects->GetItemText(schema)), true) + wxT("\"")); } } else { partialDump = true; } schema = ctvObjects->GetNextChild(root, schemaData); } if (partialDump) { if (!cmdTables.IsEmpty()) cmd.Append(cmdTables); if (!cmdSchemas.IsEmpty()) cmd.Append(cmdSchemas); } cmd.Append(wxT(" ") + commandLineCleanOption(object->GetDatabase()->GetQuotedIdentifier())); return cmd; }
frmBackupGlobals::frmBackupGlobals(frmMain *form, pgObject *obj) : ExternProcessDialog(form) { object = obj; wxWindowBase::SetFont(settings->GetSystemFont()); LoadResource(form, wxT("frmBackupGlobals")); RestorePosition(); SetTitle(object->GetTranslatedMessage(BACKUPGLOBALS)); if (object->GetConnection()->EdbMinimumVersion(8, 0)) backupExecutable = edbBackupAllExecutable; else if (object->GetConnection()->GetIsGreenplum()) backupExecutable = gpBackupAllExecutable; else backupExecutable = pgBackupAllExecutable; wxString val; settings->Read(wxT("frmBackupGlobals/LastFile"), &val, wxEmptyString); txtFilename->SetValue(val); pgServer *server; if (object->GetMetaType() == PGM_SERVER) server = (pgServer *)object; else server = object->GetDatabase()->GetServer(); bool roles_supported = pgAppMinimumVersion(backupExecutable, 8, 4) && server->GetConnection()->BackendMinimumVersion(8, 1); cbRolename->Enable(roles_supported); if (roles_supported) { // Collect the available rolenames pgSetIterator set(server->GetConnection(), wxT("SELECT DISTINCT rolname\n") wxT("FROM pg_roles db\n") wxT("ORDER BY rolname")); cbRolename->Append(wxEmptyString); while(set.RowsLeft()) cbRolename->Append(set.GetVal(wxT("rolname"))); cbRolename->SetValue(server->GetRolename()); } if (!server->GetPasswordIsStored()) environment.Add(wxT("PGPASSWORD="******"PGSSLMODE=") + server->GetConnection()->GetSslModeName()); // Icon SetIcon(*backup_png_ico); txtMessages = CTRL_TEXT("txtMessages"); // Note that under GTK+, SetMaxLength() function may only be used with single line text controls. // (see http://docs.wxwidgets.org/2.8/wx_wxtextctrl.html#wxtextctrlsetmaxlength) #ifndef __WXGTK__ txtMessages->SetMaxLength(0L); #endif btnOK->Disable(); if (!pgAppMinimumVersion(backupExecutable, 9, 1)) { chkForceQuoteForIdent->Disable(); } wxCommandEvent ev; OnChange(ev); }
frmBackupServer::frmBackupServer(frmMain *form, pgObject *obj) : ExternProcessDialog(form) { object = obj; wxWindowBase::SetFont(settings->GetSystemFont()); LoadResource(form, wxT("frmBackupServer")); RestorePosition(); SetTitle(object->GetTranslatedMessage(BACKUPSERVERTITLE)); pgServer *server = (pgServer *)object; if (server->GetConnection()->EdbMinimumVersion(8, 0)) backupExecutable = edbBackupAllExecutable; else if (server->GetConnection()->GetIsGreenplum()) backupExecutable = gpBackupAllExecutable; else backupExecutable = pgBackupAllExecutable; wxString val; settings->Read(wxT("frmBackupServer/LastFile"), &val, wxEmptyString); txtFilename->SetValue(val); bool roles_supported = pgAppMinimumVersion(backupExecutable, 8, 4) && server->GetConnection()->BackendMinimumVersion(8, 1); cbRolename->Enable(roles_supported); if (roles_supported) { // Collect the available rolenames pgSetIterator set(server->GetConnection(), wxT("SELECT DISTINCT rolname\n") wxT("FROM pg_roles db\n") wxT("ORDER BY rolname")); cbRolename->Append(wxEmptyString); while(set.RowsLeft()) cbRolename->Append(set.GetVal(wxT("rolname"))); cbRolename->SetValue(server->GetRolename()); } if (!server->GetPasswordIsStored()) environment.Add(wxT("PGPASSWORD="******"PGSSLMODE=") + server->GetConnection()->GetSslModeName()); // Icon SetIcon(*backup_png_ico); txtMessages = CTRL_TEXT("txtMessages"); txtMessages->SetMaxLength(0L); btnOK->Disable(); if (!pgAppMinimumVersion(backupExecutable, 9, 1)) { chkForceQuoteForIdent->Disable(); } wxCommandEvent ev; OnChange(ev); }
frmBackup::frmBackup(frmMain *form, pgObject *obj) : ExternProcessDialog(form) { object=obj; wxWindowBase::SetFont(settings->GetSystemFont()); LoadResource(form, wxT("frmBackup")); RestorePosition(); SetTitle(wxString::Format(_("Backup %s %s"), object->GetTranslatedTypeName().c_str(), object->GetFullIdentifier().c_str())); if (object->GetConnection()->EdbMinimumVersion(8,0)) backupExecutable=edbBackupExecutable; else if (object->GetConnection()->GetIsGreenplum()) backupExecutable=gpBackupExecutable; else backupExecutable=pgBackupExecutable; canBlob = (obj->GetMetaType() == PGM_DATABASE); chkBlobs->SetValue(canBlob); chkDisableDollar->Enable(obj->GetConnection()->BackendMinimumVersion(7, 5)); wxString val; settings->Read(wxT("frmBackup/LastFile"), &val, wxEmptyString); txtFilename->SetValue(val); if (!object->GetDatabase()->GetServer()->GetPasswordIsStored()) environment.Add(wxT("PGPASSWORD="******"PGSSLMODE=") + object->GetServer()->GetConnection()->GetSslModeName()); // Icon SetIcon(wxIcon(backup_xpm)); // fix translation problem wxString dollarLabel=wxGetTranslation(_("$$ quoting")); dollarLabel.Replace(wxT("$$"), wxT("$")); chkDisableDollar->SetLabel(dollarLabel); chkDisableDollar->SetSize(chkDisableDollar->GetBestSize()); txtMessages = CTRL_TEXT("txtMessages"); txtMessages->SetMaxLength(0L); btnOK->Disable(); long encNo=0; wxString encStr; cbEncoding->Append(wxT("")); do { encStr=object->GetConnection()->ExecuteScalar( wxT("SELECT pg_encoding_to_char(") + NumToStr(encNo) + wxT(")")); if (pgConn::IsValidServerEncoding(encNo) && !encStr.IsEmpty()) cbEncoding->Append(encStr); encNo++; } while (!encStr.IsEmpty()); cbEncoding->SetSelection(0); wxString i18ndb = _("Database"); wxTreeItemId db = ctvObjects->AddRoot(i18ndb + wxT(" ") + object->GetDatabase()->GetName(), 1); bool checked; wxString query = wxT("SELECT nspname, relname ") wxT("FROM pg_namespace n ") wxT("LEFT JOIN pg_class c ON n.oid=c.relnamespace AND relkind='r' ") wxT("WHERE nspname NOT LIKE 'pg_%' AND nspname <> 'information_schema' "); if (!object->GetDatabase()->GetSchemaRestriction().IsEmpty()) query += wxT("AND nspname IN (") + object->GetDatabase()->GetSchemaRestriction() + wxT(")"); query += wxT("ORDER BY nspname, relname"); pgSet *objects = object->GetDatabase()->ExecuteSet(query); if (objects) { wxString currentSchema = wxT(""); wxTreeItemId currentSchemaNode; while (!objects->Eof()) { if (currentSchema != objects->GetVal(wxT("nspname"))) { currentSchema = objects->GetVal(wxT("nspname")); if (object->GetMetaType() == PGM_SCHEMA) { checked = ((pgSchema*)object)->GetIdentifier() == currentSchema; } else { checked = true; } currentSchemaNode = ctvObjects->AppendItem(db, currentSchema, checked? 1:0); } if (!objects->GetVal(wxT("relname")).IsNull()) { if (object->GetMetaType() == PGM_TABLE || object->GetMetaType() == GP_PARTITION) { checked = ((pgTable*)object)->GetSchema()->GetIdentifier() == currentSchema && ((pgTable*)object)->GetIdentifier() == objects->GetVal(wxT("relname")); } else { if (object->GetMetaType() == PGM_SCHEMA) { checked = ((pgSchema*)object)->GetIdentifier() == currentSchema; } else { checked = true; } } ctvObjects->AppendItem(currentSchemaNode, objects->GetVal(wxT("relname")), checked? 1:0); } objects->MoveNext(); } ctvObjects->ExpandAll(); delete objects; } if (!pgAppMinimumVersion(backupExecutable, 8, 4)) { chkNoTablespaces->Disable(); } if (!pgAppMinimumVersion(backupExecutable, 8, 1)) { cbEncoding->Disable(); } wxCommandEvent ev; OnChangePlain(ev); }