From 10d9e53159aaaadd9316bdfbb8dd57635059c703 Mon Sep 17 00:00:00 2001 From: Olivier Goffart Date: Thu, 21 May 2015 12:22:50 +0200 Subject: [PATCH] Confirm feature: Use selective sync in the database --- src/cmd/cmd.cpp | 33 ++++----------------------------- src/gui/folder.cpp | 11 ----------- src/gui/folder.h | 4 ---- src/gui/folderman.cpp | 8 ++++++-- src/gui/selectivesyncdialog.cpp | 11 ++++------- src/gui/socketapi.cpp | 2 +- src/libsync/syncengine.cpp | 15 +++++++-------- src/libsync/syncengine.h | 4 ---- src/libsync/syncjournaldb.cpp | 2 +- src/libsync/syncjournaldb.h | 2 +- 10 files changed, 24 insertions(+), 68 deletions(-) diff --git a/src/cmd/cmd.cpp b/src/cmd/cmd.cpp index 486cef3b2..0f83bdb73 100644 --- a/src/cmd/cmd.cpp +++ b/src/cmd/cmd.cpp @@ -251,38 +251,14 @@ void selectiveSyncFixup(OCC::SyncJournalDb *journal, const QStringList &newList) return; } - SqlQuery select("SELECT path FROM last_selective_sync", db); - QSet oldBlackListSet; - if (select.exec()) { - while(select.next()) { - oldBlackListSet.insert(select.stringValue(0)); - } - } - - + auto oldBlackListSet = journal->getSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList).toSet(); auto blackListSet = newList.toSet(); auto changes = (oldBlackListSet - blackListSet) + (blackListSet - oldBlackListSet); foreach(const auto &it, changes) { journal->avoidReadFromDbOnNextSync(it); } - SqlQuery drop("DROP TABLE last_selective_sync", db); - drop.exec(); - - if (!newList.isEmpty()) { - SqlQuery createQuery(db); - createQuery.prepare("CREATE TABLE IF NOT EXISTS last_selective_sync(path VARCHAR(4096));"); - createQuery.exec(); - - SqlQuery insertQuery(db); - insertQuery.prepare("INSERT INTO last_selective_sync VALUES (?1);"); - - foreach(const auto &s, newList) { - insertQuery.reset(); - insertQuery.bindValue(1, s); - insertQuery.exec(); - } - } + journal->setSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, newList); } @@ -467,14 +443,13 @@ restart_sync: Cmd cmd; SyncJournalDb db(options.source_dir); - selectiveSyncFixup(&db, selectiveSyncList); + if (!selectiveSyncList.empty()) + selectiveSyncFixup(&db, selectiveSyncList); SyncEngine engine(account, _csync_ctx, options.source_dir, QUrl(options.target_url).path(), folder, &db); QObject::connect(&engine, SIGNAL(finished()), &app, SLOT(quit())); QObject::connect(&engine, SIGNAL(transmissionProgress(ProgressInfo)), &cmd, SLOT(transmissionProgressSlot())); - engine.setSelectiveSyncBlackList(selectiveSyncList); - // Have to be done async, else, an error before exec() does not terminate the event loop. QMetaObject::invokeMethod(&engine, "startSync", Qt::QueuedConnection); diff --git a/src/gui/folder.cpp b/src/gui/folder.cpp index fa50a289b..8616e18ff 100644 --- a/src/gui/folder.cpp +++ b/src/gui/folder.cpp @@ -820,7 +820,6 @@ void Folder::startSync(const QStringList &pathList) connect(_engine.data(), SIGNAL(syncItemDiscovered(const SyncFileItem &)), this, SLOT(slotSyncItemDiscovered(const SyncFileItem &))); setDirtyNetworkLimits(); - _engine->setSelectiveSyncBlackList(selectiveSyncBlackList()); QMetaObject::invokeMethod(_engine.data(), "startSync", Qt::QueuedConnection); @@ -850,16 +849,6 @@ void Folder::setDirtyNetworkLimits() } } -void Folder::setSelectiveSyncBlackList(const QStringList& blackList) -{ - _selectiveSyncBlackList = blackList; - for (int i = 0; i < _selectiveSyncBlackList.count(); ++i) { - if (!_selectiveSyncBlackList.at(i).endsWith(QLatin1Char('/'))) { - _selectiveSyncBlackList[i].append(QLatin1Char('/')); - } - } -} - void Folder::slotSyncError(const QString& err) { diff --git a/src/gui/folder.h b/src/gui/folder.h index e2f47a2e1..06db2a0ab 100644 --- a/src/gui/folder.h +++ b/src/gui/folder.h @@ -131,9 +131,6 @@ public: // Used by the Socket API SyncJournalDb *journalDb() { return &_journal; } - QStringList selectiveSyncBlackList() { return _selectiveSyncBlackList; } - void setSelectiveSyncBlackList(const QStringList &blackList); - bool estimateState(QString fn, csync_ftw_type_e t, SyncFileStatus* s); RequestEtagJob *etagJob() { return _requestEtagJob; } @@ -222,7 +219,6 @@ private: SyncResult _syncResult; QScopedPointer _engine; QStringList _errors; - QStringList _selectiveSyncBlackList; bool _csyncError; bool _csyncUnavail; bool _wipeDb; diff --git a/src/gui/folderman.cpp b/src/gui/folderman.cpp index 6e3984754..ee2beb0f7 100644 --- a/src/gui/folderman.cpp +++ b/src/gui/folderman.cpp @@ -339,7 +339,6 @@ Folder* FolderMan::setupFolderFromConfigFile(const QString &file) { QString backend = settings.value(QLatin1String("backend")).toString(); QString targetPath = settings.value( QLatin1String("targetPath")).toString(); bool paused = settings.value( QLatin1String("paused"), false).toBool(); - QStringList blackList = settings.value( QLatin1String("blackList")).toStringList(); // QString connection = settings.value( QLatin1String("connection") ).toString(); QString alias = unescapeAlias( escapedAlias ); @@ -361,7 +360,6 @@ Folder* FolderMan::setupFolderFromConfigFile(const QString &file) { folder = new Folder( accountState, alias, path, targetPath, this ); folder->setConfigFile(cfgFile.absoluteFilePath()); - folder->setSelectiveSyncBlackList(blackList); qDebug() << "Adding folder to Folder Map " << folder; _folderMap[alias] = folder; if (paused) { @@ -378,6 +376,12 @@ Folder* FolderMan::setupFolderFromConfigFile(const QString &file) { _folderChangeSignalMapper->setMapping( folder, folder->alias() ); registerFolderMonitor(folder); + QStringList blackList = settings.value( QLatin1String("blackList")).toStringList(); + if (!blackList.empty()) { + //migrate settings + folder->journalDb()->setSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, blackList); + settings.remove(QLatin1String("blackList")); + } return folder; } diff --git a/src/gui/selectivesyncdialog.cpp b/src/gui/selectivesyncdialog.cpp index 429fe9804..7a659e16a 100644 --- a/src/gui/selectivesyncdialog.cpp +++ b/src/gui/selectivesyncdialog.cpp @@ -358,7 +358,8 @@ SelectiveSyncDialog::SelectiveSyncDialog(AccountPtr account, Folder* folder, QWi : QDialog(parent, f), _folder(folder) { init(account, tr("Unchecked folders will be removed from your local file system and will not be synchronized to this computer anymore")); - _treeView->setFolderInfo(_folder->remotePath(), _folder->alias(), _folder->selectiveSyncBlackList()); + _treeView->setFolderInfo(_folder->remotePath(), _folder->alias(), + _folder->journalDb()->getSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList)); // Make sure we don't get crashes if the folder is destroyed while we are still open connect(_folder, SIGNAL(destroyed(QObject*)), this, SLOT(deleteLater())); @@ -396,14 +397,10 @@ void SelectiveSyncDialog::init(const AccountPtr &account, const QString &labelTe void SelectiveSyncDialog::accept() { if (_folder) { - auto oldBlackListSet = _folder->selectiveSyncBlackList().toSet(); + auto oldBlackListSet = _folder->journalDb()->getSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList).toSet(); QStringList blackList = _treeView->createBlackList(); - _folder->setSelectiveSyncBlackList(blackList); + _folder->journalDb()->setSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, blackList); - // FIXME: Use ConfigFile - QSettings settings(_folder->configFile(), QSettings::IniFormat); - settings.beginGroup(FolderMan::escapeAlias(_folder->alias())); - settings.setValue("blackList", blackList); FolderMan *folderMan = FolderMan::instance(); if (_folder->isBusy()) { _folder->slotTerminateSync(); diff --git a/src/gui/socketapi.cpp b/src/gui/socketapi.cpp index 1a7f64101..b04116f61 100644 --- a/src/gui/socketapi.cpp +++ b/src/gui/socketapi.cpp @@ -597,7 +597,7 @@ SyncFileStatus SocketApi::fileStatus(Folder *folder, const QString& systemFileNa } // Error if it is in the selective sync blacklistr - foreach(const auto &s, folder->selectiveSyncBlackList()) { + foreach(const auto &s, folder->journalDb()->getSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList)) { if (fileNameSlash.startsWith(s)) { return SyncFileStatus(SyncFileStatus::STATUS_ERROR); } diff --git a/src/libsync/syncengine.cpp b/src/libsync/syncengine.cpp index 208c38198..1457281c6 100644 --- a/src/libsync/syncengine.cpp +++ b/src/libsync/syncengine.cpp @@ -606,7 +606,8 @@ void SyncEngine::startSync() // thereby speeding up the initial discovery significantly. _csync_ctx->db_is_empty = (fileRecordCount == 0); - bool usingSelectiveSync = (!_selectiveSyncBlackList.isEmpty()); + auto selectiveSyncBlackList = _journal->getSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList); + bool usingSelectiveSync = (!selectiveSyncBlackList.isEmpty()); qDebug() << (usingSelectiveSync ? "====Using Selective Sync" : "====NOT Using Selective Sync"); if (fileRecordCount >= 0 && fileRecordCount < 50 && !usingSelectiveSync) { qDebug() << "===== Activating recursive PROPFIND (currently" << fileRecordCount << "file records)"; @@ -636,7 +637,7 @@ void SyncEngine::startSync() DiscoveryJob *discoveryJob = new DiscoveryJob(_csync_ctx); - discoveryJob->_selectiveSyncBlackList = _selectiveSyncBlackList; + discoveryJob->_selectiveSyncBlackList = selectiveSyncBlackList; discoveryJob->moveToThread(&_thread); connect(discoveryJob, SIGNAL(finished(int)), this, SLOT(slotDiscoveryJobFinished(int))); connect(discoveryJob, SIGNAL(folderDiscovered(bool,QString)), @@ -905,6 +906,9 @@ QString SyncEngine::adjustRenamedPath(const QString& original) */ void SyncEngine::checkForPermission() { + auto selectiveSyncBlackList = _journal->getSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList); + std::sort(selectiveSyncBlackList.begin(), selectiveSyncBlackList.end()); + for (SyncFileItemVector::iterator it = _syncedItems.begin(); it != _syncedItems.end(); ++it) { if ((*it)->_direction != SyncFileItem::Up) { // Currently we only check server-side permissions @@ -913,7 +917,7 @@ void SyncEngine::checkForPermission() // Do not propagate anything in the server if it is in the selective sync blacklist const QString path = (*it)->destination() + QLatin1Char('/'); - if (std::binary_search(_selectiveSyncBlackList.constBegin(), _selectiveSyncBlackList.constEnd(), + if (std::binary_search(selectiveSyncBlackList.constBegin(), selectiveSyncBlackList.constEnd(), path)) { (*it)->_instruction = CSYNC_INSTRUCTION_IGNORE; (*it)->_status = SyncFileItem::FileIgnored; @@ -1134,11 +1138,6 @@ QByteArray SyncEngine::getPermissions(const QString& file) const return _remotePerms.value(file); } -void SyncEngine::setSelectiveSyncBlackList(const QStringList& list) -{ - _selectiveSyncBlackList = list; -} - bool SyncEngine::estimateState(QString fn, csync_ftw_type_e t, SyncFileStatus* s) { Q_UNUSED(t); diff --git a/src/libsync/syncengine.h b/src/libsync/syncengine.h index baa3ffcfd..a60781ea8 100644 --- a/src/libsync/syncengine.h +++ b/src/libsync/syncengine.h @@ -64,8 +64,6 @@ public: Utility::StopWatch &stopWatch() { return _stopWatch; } - void setSelectiveSyncBlackList(const QStringList &list); - /* Return true if we detected that another sync is needed to complete the sync */ bool isAnotherSyncNeeded() { return _anotherSyncNeeded; } @@ -200,8 +198,6 @@ private: // hash containing the permissions on the remote directory QHash _remotePerms; - QStringList _selectiveSyncBlackList; - bool _anotherSyncNeeded; }; diff --git a/src/libsync/syncjournaldb.cpp b/src/libsync/syncjournaldb.cpp index eebd3ef10..c3a45689f 100644 --- a/src/libsync/syncjournaldb.cpp +++ b/src/libsync/syncjournaldb.cpp @@ -1259,7 +1259,7 @@ void SyncJournalDb::setPollInfo(const SyncJournalDb::PollInfo& info) } } -QStringList SyncJournalDb::selectiveSyncList(SyncJournalDb::SelectiveSyncListType type) +QStringList SyncJournalDb::getSelectiveSyncList(SyncJournalDb::SelectiveSyncListType type) { QStringList result; diff --git a/src/libsync/syncjournaldb.h b/src/libsync/syncjournaldb.h index fcbc155b4..b1b2d071e 100644 --- a/src/libsync/syncjournaldb.h +++ b/src/libsync/syncjournaldb.h @@ -97,7 +97,7 @@ public: SelectiveSyncUndecidedList = 3 }; /* return the specified list from the database */ - QStringList selectiveSyncList(SelectiveSyncListType type); + QStringList getSelectiveSyncList(SelectiveSyncListType type); /* Write the selective sync list (remove all other entries of that list */ void setSelectiveSyncList(SelectiveSyncListType type, const QStringList &list);