Confirm feature: Use selective sync in the database

This commit is contained in:
Olivier Goffart 2015-05-21 12:22:50 +02:00
parent 2c67692958
commit 10d9e53159
10 changed files with 24 additions and 68 deletions

View file

@ -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);

View file

@ -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)
{

View file

@ -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;

View file

@ -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;
}

View file

@ -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();

View file

@ -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);
}

View file

@ -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);

View file

@ -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;
};

View file

@ -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;

View file

@ -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);