mirror of
https://github.com/nextcloud/desktop.git
synced 2024-10-27 15:05:19 +03:00
Confirm feature: Use selective sync in the database
This commit is contained in:
parent
2c67692958
commit
10d9e53159
10 changed files with 24 additions and 68 deletions
|
@ -251,38 +251,14 @@ void selectiveSyncFixup(OCC::SyncJournalDb *journal, const QStringList &newList)
|
|||
return;
|
||||
}
|
||||
|
||||
SqlQuery select("SELECT path FROM last_selective_sync", db);
|
||||
QSet<QString> 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);
|
||||
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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<SyncEngine> _engine;
|
||||
QStringList _errors;
|
||||
QStringList _selectiveSyncBlackList;
|
||||
bool _csyncError;
|
||||
bool _csyncUnavail;
|
||||
bool _wipeDb;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -358,7 +358,8 @@ SelectiveSyncDialog::SelectiveSyncDialog(AccountPtr account, Folder* folder, QWi
|
|||
: QDialog(parent, f), _folder(folder)
|
||||
{
|
||||
init(account, tr("Unchecked folders will be <b>removed</b> 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();
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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<QString, QByteArray> _remotePerms;
|
||||
|
||||
QStringList _selectiveSyncBlackList;
|
||||
|
||||
bool _anotherSyncNeeded;
|
||||
};
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in a new issue