From e6390b4d22c68285942731c87ab1739c0b7b0e6c Mon Sep 17 00:00:00 2001 From: Martin Kleusberg Date: Mon, 20 Mar 2017 23:06:58 +0100 Subject: [PATCH] dbhub: Automatically generate a file name to save a database under When fetching a remote database automatically generate a file name to save the database as instead of asking the user for a path and name. Also add a preferences option to set the directory for all cloned remote databases. This is obviously a trade-off: on the one hand this makes opening remote databases simpler (it's just a double click), on the other hand it takes control away from the users. The main reason for doing this, however, is to indicate to the user that the cloned databases are going to be controlled by DB4S. We have to keep track of the local databases in order to update them from the right place, push them back to the right place, etc. And because the local copies are under DB4S control we don't want the user to move, rename, or delete them. --- src/PreferencesDialog.cpp | 13 +++++++ src/PreferencesDialog.h | 1 + src/PreferencesDialog.ui | 80 +++++++++++++++++++++++++++++++++++---- src/RemoteDatabase.cpp | 25 ++++++------ src/Settings.cpp | 15 ++++++-- 5 files changed, 111 insertions(+), 23 deletions(-) diff --git a/src/PreferencesDialog.cpp b/src/PreferencesDialog.cpp index 902db928..58bec5d6 100644 --- a/src/PreferencesDialog.cpp +++ b/src/PreferencesDialog.cpp @@ -149,6 +149,7 @@ void PreferencesDialog::loadSettings() addClientCertToTable(file, cert); } } + ui->editRemoteCloneDirectory->setText(Settings::getSettingsValue("remote", "clonedirectory").toString()); // Gracefully handle the preferred Editor font not being available matchingFont = ui->comboEditorFont->findText(Settings::getSettingsValue("editor", "font").toString(), Qt::MatchExactly); @@ -258,6 +259,7 @@ void PreferencesDialog::saveSettings() QFile::remove(file); } Settings::setSettingsValue("remote", "client_certificates", new_client_certs); + Settings::setSettingsValue("remote", "clonedirectory", ui->editRemoteCloneDirectory->text()); // Warn about restarting to change language QVariant newLanguage = ui->languageComboBox->itemData(ui->languageComboBox->currentIndex()); @@ -497,3 +499,14 @@ void PreferencesDialog::addClientCertToTable(const QString& path, const QSslCert cert_serialno->setFlags(Qt::ItemIsSelectable); ui->tableClientCerts->setItem(row, 5, cert_serialno); } + +void PreferencesDialog::chooseRemoteCloneDirectory() +{ + QString s = FileDialog::getExistingDirectory( + this, + tr("Choose a directory"), + QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); + + if(!s.isEmpty()) + ui->editRemoteCloneDirectory->setText(s); +} diff --git a/src/PreferencesDialog.h b/src/PreferencesDialog.h index 65451dd5..646878db 100644 --- a/src/PreferencesDialog.h +++ b/src/PreferencesDialog.h @@ -33,6 +33,7 @@ private slots: virtual void activateRemoteTab(bool active); virtual void addClientCertificate(); virtual void removeClientCertificate(); + void chooseRemoteCloneDirectory(); private: Ui::PreferencesDialog *ui; diff --git a/src/PreferencesDialog.ui b/src/PreferencesDialog.ui index 101965ed..8c0fb1aa 100644 --- a/src/PreferencesDialog.ui +++ b/src/PreferencesDialog.ui @@ -1011,14 +1011,14 @@ Remote - + CA certificates - + QAbstractItemView::SingleSelection @@ -1062,14 +1062,14 @@ - + Your certificates - + @@ -1158,6 +1158,43 @@ + + + + Clone databases into + + + + + + + + + false + + + + 0 + 0 + + + + + 316 + 0 + + + + + + + + ... + + + + + @@ -1187,6 +1224,8 @@ locationEdit setLocationButton languageComboBox + checkUseRemotes + checkUpdates encodingComboBox foreignKeysCheckBox checkHideSchemaLinebreaks @@ -1196,6 +1235,7 @@ editDatabaseDefaultSqlText comboDataBrowserFont spinDataBrowserFontSize + spinSymbolLimit txtNull fr_null_fg fr_null_bg @@ -1217,6 +1257,13 @@ buttonAddExtension buttonRemoveExtension checkRegexDisabled + editRemoteCloneDirectory + buttonRemoteBrowseCloneDirectory + tableCaCerts + tableClientCerts + buttonClientCertAdd + buttonClientCertRemove + tabWidget @@ -1373,8 +1420,8 @@ addClientCertificate() - 563 - 257 + 578 + 315 596 @@ -1389,8 +1436,8 @@ removeClientCertificate() - 561 - 289 + 578 + 353 597 @@ -1398,6 +1445,22 @@ + + buttonRemoteBrowseCloneDirectory + clicked() + PreferencesDialog + chooseRemoteCloneDirectory() + + + 567 + 54 + + + 595 + 41 + + + saveSettings() @@ -1408,5 +1471,6 @@ activateRemoteTab(bool) addClientCertificate() removeClientCertificate() + chooseRemoteCloneDirectory() diff --git a/src/RemoteDatabase.cpp b/src/RemoteDatabase.cpp index 86eab712..72979d8a 100644 --- a/src/RemoteDatabase.cpp +++ b/src/RemoteDatabase.cpp @@ -118,19 +118,20 @@ void RemoteDatabase::gotReply(QNetworkReply* reply) { case RequestTypeDatabase: { - // It's a database file. Ask user where to store the database file. - QString saveFileAs = FileDialog::getSaveFileName(0, qApp->applicationName(), FileDialog::getSqlDatabaseFileFilter(), reply->url().fileName()); - if(!saveFileAs.isEmpty()) - { - // Save the downloaded data under the selected file name - QFile file(saveFileAs); - file.open(QIODevice::WriteOnly); - file.write(reply->readAll()); - file.close(); + // It's a database file. - // Tell the application to open this file - emit openFile(saveFileAs); - } + // Generate a unique file name to save the file under + QString saveFileAs = Settings::getSettingsValue("remote", "clonedirectory").toString() + + QString("/%2_%1.remotedb").arg(QDateTime::currentMSecsSinceEpoch()).arg(reply->url().fileName()); + + // Save the downloaded data under the generated file name + QFile file(saveFileAs); + file.open(QIODevice::WriteOnly); + file.write(reply->readAll()); + file.close(); + + // Tell the application to open this file + emit openFile(saveFileAs); } break; case RequestTypeDirectory: diff --git a/src/Settings.cpp b/src/Settings.cpp index 5b59ae90..6808a054 100644 --- a/src/Settings.cpp +++ b/src/Settings.cpp @@ -5,6 +5,7 @@ #include #include #include +#include QHash Settings::m_hCache; @@ -246,9 +247,17 @@ QVariant Settings::getSettingsDefaultValue(const QString& group, const QString& return 4; } - // Enable the File → Remote menu by default - if(group == "remote" && name == "active") - return true; + // Remote settings? + if(group == "remote") + { + // Enable the File → Remote menu by default + if(name == "active") + return true; + + // Clone directory + if(name == "clonedirectory") + return QStandardPaths::writableLocation(QStandardPaths::AppDataLocation); + } // Unknown combination of group and name? Return an invalid QVariant! return QVariant();