[Pkg-owncloud-commits] [owncloud-client] 277/470: SelectiveSync: Verify if the list could be read from journal.
Sandro Knauß
hefee-guest at moszumanska.debian.org
Thu May 12 16:25:13 UTC 2016
This is an automated email from the git hooks/post-receive script.
hefee-guest pushed a commit to branch master
in repository owncloud-client.
commit 7b1f02fcda7bdcb22853ed0d5974c2f2c5f21125
Author: Klaas Freitag <freitag at owncloud.com>
Date: Wed Apr 6 15:01:28 2016 +0200
SelectiveSync: Verify if the list could be read from journal.
If there is a read error from the database while trying to get
the list from database, make sure to not behave badly because
the list is empty.
---
src/cmd/cmd.cpp | 18 +++++++++++-------
src/gui/accountsettings.cpp | 3 ++-
src/gui/folder.cpp | 29 ++++++++++++++++-------------
src/gui/folderstatusmodel.cpp | 29 ++++++++++++++++++++++-------
src/gui/selectivesyncdialog.cpp | 23 ++++++++++++++++-------
src/gui/selectivesyncdialog.h | 1 +
src/libsync/syncengine.cpp | 27 ++++++++++++++++++++-------
src/libsync/syncjournaldb.cpp | 7 ++++++-
src/libsync/syncjournaldb.h | 2 +-
9 files changed, 95 insertions(+), 44 deletions(-)
diff --git a/src/cmd/cmd.cpp b/src/cmd/cmd.cpp
index 62c95c2..79c02c2 100644
--- a/src/cmd/cmd.cpp
+++ b/src/cmd/cmd.cpp
@@ -258,14 +258,18 @@ void selectiveSyncFixup(OCC::SyncJournalDb *journal, const QStringList &newList)
return;
}
- 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);
- }
+ bool ok;
+
+ auto oldBlackListSet = journal->getSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, &ok).toSet();
+ if( ok ) {
+ auto blackListSet = newList.toSet();
+ auto changes = (oldBlackListSet - blackListSet) + (blackListSet - oldBlackListSet);
+ foreach(const auto &it, changes) {
+ journal->avoidReadFromDbOnNextSync(it);
+ }
- journal->setSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, newList);
+ journal->setSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, newList);
+ }
}
diff --git a/src/gui/accountsettings.cpp b/src/gui/accountsettings.cpp
index e1b5469..fe44fdc 100644
--- a/src/gui/accountsettings.cpp
+++ b/src/gui/accountsettings.cpp
@@ -606,7 +606,8 @@ void AccountSettings::refreshSelectiveSyncStatus()
continue;
}
- auto undecidedList = folder->journalDb()->getSelectiveSyncList(SyncJournalDb::SelectiveSyncUndecidedList);
+ bool ok;
+ auto undecidedList = folder->journalDb()->getSelectiveSyncList(SyncJournalDb::SelectiveSyncUndecidedList, &ok);
QString p;
foreach(const auto &it, undecidedList) {
// FIXME: add the folder alias in a hoover hint.
diff --git a/src/gui/folder.cpp b/src/gui/folder.cpp
index c00b95d..6709afc 100644
--- a/src/gui/folder.cpp
+++ b/src/gui/folder.cpp
@@ -917,26 +917,29 @@ void Folder::slotNewBigFolderDiscovered(const QString &newF)
auto journal = journalDb();
// Add the entry to the blacklist if it is neither in the blacklist or whitelist already
- auto blacklist = journal->getSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList);
- auto whitelist = journal->getSelectiveSyncList(SyncJournalDb::SelectiveSyncWhiteList);
- if (!blacklist.contains(newFolder) && !whitelist.contains(newFolder)) {
+ bool ok1, ok2;
+ auto blacklist = journal->getSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, &ok1);
+ auto whitelist = journal->getSelectiveSyncList(SyncJournalDb::SelectiveSyncWhiteList, &ok2);
+ if (ok1 && ok2 && !blacklist.contains(newFolder) && !whitelist.contains(newFolder)) {
blacklist.append(newFolder);
journal->setSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, blacklist);
}
// And add the entry to the undecided list and signal the UI
- auto undecidedList = journal->getSelectiveSyncList(SyncJournalDb::SelectiveSyncUndecidedList);
- if (!undecidedList.contains(newFolder)) {
- undecidedList.append(newFolder);
- journal->setSelectiveSyncList(SyncJournalDb::SelectiveSyncUndecidedList, undecidedList);
- emit newBigFolderDiscovered(newFolder);
- }
- QString message = tr("A new folder larger than %1 MB has been added: %2.\n"
- "Please go in the settings to select it if you wish to download it.")
+ auto undecidedList = journal->getSelectiveSyncList(SyncJournalDb::SelectiveSyncUndecidedList, &ok1);
+ if( ok1 ) {
+ if (!undecidedList.contains(newFolder)) {
+ undecidedList.append(newFolder);
+ journal->setSelectiveSyncList(SyncJournalDb::SelectiveSyncUndecidedList, undecidedList);
+ emit newBigFolderDiscovered(newFolder);
+ }
+ QString message = tr("A new folder larger than %1 MB has been added: %2.\n"
+ "Please go in the settings to select it if you wish to download it.")
.arg(ConfigFile().newBigFolderSizeLimit().second).arg(newF);
- auto logger = Logger::instance();
- logger->postOptionalGuiLog(Theme::instance()->appNameGUI(), message);
+ auto logger = Logger::instance();
+ logger->postOptionalGuiLog(Theme::instance()->appNameGUI(), message);
+ }
}
diff --git a/src/gui/folderstatusmodel.cpp b/src/gui/folderstatusmodel.cpp
index f482b17..7fb8d9d 100644
--- a/src/gui/folderstatusmodel.cpp
+++ b/src/gui/folderstatusmodel.cpp
@@ -562,10 +562,18 @@ void FolderStatusModel::slotUpdateDirectories(const QStringList &list)
pathToRemove += '/';
QStringList selectiveSyncBlackList;
+ bool ok1 = true;
+ bool ok2 = true;
if (parentInfo->_checked == Qt::PartiallyChecked) {
- selectiveSyncBlackList = parentInfo->_folder->journalDb()->getSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList);
+ selectiveSyncBlackList = parentInfo->_folder->journalDb()->getSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, &ok1);
}
- auto selectiveSyncUndecidedList = parentInfo->_folder->journalDb()->getSelectiveSyncList(SyncJournalDb::SelectiveSyncUndecidedList);
+ auto selectiveSyncUndecidedList = parentInfo->_folder->journalDb()->getSelectiveSyncList(SyncJournalDb::SelectiveSyncUndecidedList, &ok2);
+
+ if( !(ok1 && ok2) ) {
+ qDebug() << Q_FUNC_INFO << "Could not retrieve selective sync info from journal";
+ return;
+ }
+
QVarLengthArray<int, 10> undecidedIndexes;
QVector<SubFolderInfo> newSubs;
@@ -727,7 +735,12 @@ void FolderStatusModel::slotApplySelectiveSync()
}
auto folder = _folders.at(i)._folder;
- auto oldBlackList = folder->journalDb()->getSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList);
+ bool ok;
+ auto oldBlackList = folder->journalDb()->getSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, &ok);
+ if( !ok ) {
+ qDebug() << Q_FUNC_INFO << "Could not read selective sync list from db.";
+ return;
+ }
QStringList blackList = createBlackList(&_folders[i], oldBlackList);
folder->journalDb()->setSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, blackList);
@@ -737,12 +750,14 @@ void FolderStatusModel::slotApplySelectiveSync()
// The folders that were undecided or blacklisted and that are now checked should go on the white list.
// The user confirmed them already just now.
QStringList toAddToWhiteList = ((oldBlackListSet + folder->journalDb()->getSelectiveSyncList(
- SyncJournalDb::SelectiveSyncUndecidedList).toSet()) - blackListSet).toList();
+ SyncJournalDb::SelectiveSyncUndecidedList, &ok).toSet()) - blackListSet).toList();
if (!toAddToWhiteList.isEmpty()) {
- auto whiteList = folder->journalDb()->getSelectiveSyncList(SyncJournalDb::SelectiveSyncWhiteList);
- whiteList += toAddToWhiteList;
- folder->journalDb()->setSelectiveSyncList(SyncJournalDb::SelectiveSyncWhiteList, whiteList);
+ auto whiteList = folder->journalDb()->getSelectiveSyncList(SyncJournalDb::SelectiveSyncWhiteList, &ok);
+ if (ok) {
+ whiteList += toAddToWhiteList;
+ folder->journalDb()->setSelectiveSyncList(SyncJournalDb::SelectiveSyncWhiteList, whiteList);
+ }
}
// clear the undecided list
folder->journalDb()->setSelectiveSyncList(SyncJournalDb::SelectiveSyncUndecidedList, QStringList());
diff --git a/src/gui/selectivesyncdialog.cpp b/src/gui/selectivesyncdialog.cpp
index 6246174..abc9818 100644
--- a/src/gui/selectivesyncdialog.cpp
+++ b/src/gui/selectivesyncdialog.cpp
@@ -391,12 +391,17 @@ qint64 SelectiveSyncTreeView::estimatedSize(QTreeWidgetItem* root)
SelectiveSyncDialog::SelectiveSyncDialog(AccountPtr account, Folder* folder, QWidget* parent, Qt::WindowFlags f)
- : QDialog(parent, f), _folder(folder)
+ : QDialog(parent, f), _folder(folder),
+ _okButton(0) // defined in init()
{
+ bool ok;
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->journalDb()->getSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList));
-
+ QStringList selectiveSyncList = _folder->journalDb()->getSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, &ok);
+ if( ok ) {
+ _treeView->setFolderInfo(_folder->remotePath(), _folder->alias(),selectiveSyncList);
+ } else {
+ _okButton->setEnabled(false);
+ }
// 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()));
}
@@ -422,9 +427,9 @@ void SelectiveSyncDialog::init(const AccountPtr &account, const QString &labelTe
layout->addWidget(label);
layout->addWidget(_treeView);
QDialogButtonBox *buttonBox = new QDialogButtonBox(Qt::Horizontal);
+ _okButton = buttonBox->addButton(QDialogButtonBox::Ok);
+ connect(_okButton, SIGNAL(clicked()), this, SLOT(accept()));
QPushButton *button;
- button = buttonBox->addButton(QDialogButtonBox::Ok);
- connect(button, SIGNAL(clicked()), this, SLOT(accept()));
button = buttonBox->addButton(QDialogButtonBox::Cancel);
connect(button, SIGNAL(clicked()), this, SLOT(reject()));
layout->addWidget(buttonBox);
@@ -433,7 +438,11 @@ void SelectiveSyncDialog::init(const AccountPtr &account, const QString &labelTe
void SelectiveSyncDialog::accept()
{
if (_folder) {
- auto oldBlackListSet = _folder->journalDb()->getSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList).toSet();
+ bool ok;
+ auto oldBlackListSet = _folder->journalDb()->getSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, &ok).toSet();
+ if( ! ok ) {
+ return;
+ }
QStringList blackList = _treeView->createBlackList();
_folder->journalDb()->setSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, blackList);
diff --git a/src/gui/selectivesyncdialog.h b/src/gui/selectivesyncdialog.h
index fd5a5e2..aebe426 100644
--- a/src/gui/selectivesyncdialog.h
+++ b/src/gui/selectivesyncdialog.h
@@ -90,6 +90,7 @@ private:
SelectiveSyncTreeView *_treeView;
Folder *_folder;
+ QPushButton *_okButton;
};
}
diff --git a/src/libsync/syncengine.cpp b/src/libsync/syncengine.cpp
index 10bc23d..46943ee 100644
--- a/src/libsync/syncengine.cpp
+++ b/src/libsync/syncengine.cpp
@@ -733,10 +733,14 @@ void SyncEngine::startSync()
// thereby speeding up the initial discovery significantly.
_csync_ctx->db_is_empty = (fileRecordCount == 0);
- auto selectiveSyncBlackList = _journal->getSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList);
- bool usingSelectiveSync = (!selectiveSyncBlackList.isEmpty());
- qDebug() << (usingSelectiveSync ? "====Using Selective Sync" : "====NOT Using Selective Sync");
-
+ bool ok;
+ auto selectiveSyncBlackList = _journal->getSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, &ok);
+ if (ok) {
+ bool usingSelectiveSync = (!selectiveSyncBlackList.isEmpty());
+ qDebug() << Q_FUNC_INFO << (usingSelectiveSync ? "====Using Selective Sync" : "====NOT Using Selective Sync");
+ } else {
+ qDebug() << Q_FUNC_INFO << "Could not retrieve selective sync list from DB";
+ }
csync_set_userdata(_csync_ctx, this);
// Set up checksumming hook
@@ -762,7 +766,13 @@ void SyncEngine::startSync()
DiscoveryJob *discoveryJob = new DiscoveryJob(_csync_ctx);
discoveryJob->_selectiveSyncBlackList = selectiveSyncBlackList;
discoveryJob->_selectiveSyncWhiteList =
- _journal->getSelectiveSyncList(SyncJournalDb::SelectiveSyncWhiteList);
+ _journal->getSelectiveSyncList(SyncJournalDb::SelectiveSyncWhiteList, &ok);
+ if (!ok) {
+ delete discoveryJob;
+ qDebug() << Q_FUNC_INFO << "Unable to read selective sync list, aborting.";
+ return;
+ }
+
discoveryJob->_newBigFolderSizeLimit = _newBigFolderSizeLimit;
discoveryJob->moveToThread(&_thread);
connect(discoveryJob, SIGNAL(finished(int)), this, SLOT(slotDiscoveryJobFinished(int)));
@@ -1042,7 +1052,8 @@ QString SyncEngine::adjustRenamedPath(const QString& original)
*/
void SyncEngine::checkForPermission()
{
- auto selectiveSyncBlackList = _journal->getSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList);
+ bool selectiveListOk;
+ auto selectiveSyncBlackList = _journal->getSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, &selectiveListOk);
std::sort(selectiveSyncBlackList.begin(), selectiveSyncBlackList.end());
for (SyncFileItemVector::iterator it = _syncedItems.begin(); it != _syncedItems.end(); ++it) {
@@ -1053,7 +1064,9 @@ 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 reading the selective sync list from db failed, lets ignore all rather than nothing.
+ if (!selectiveListOk || std::binary_search(selectiveSyncBlackList.constBegin(), selectiveSyncBlackList.constEnd(),
path)) {
(*it)->_instruction = CSYNC_INSTRUCTION_IGNORE;
(*it)->_status = SyncFileItem::FileIgnored;
diff --git a/src/libsync/syncjournaldb.cpp b/src/libsync/syncjournaldb.cpp
index 50506f9..26cfa6d 100644
--- a/src/libsync/syncjournaldb.cpp
+++ b/src/libsync/syncjournaldb.cpp
@@ -1393,12 +1393,14 @@ void SyncJournalDb::setPollInfo(const SyncJournalDb::PollInfo& info)
}
}
-QStringList SyncJournalDb::getSelectiveSyncList(SyncJournalDb::SelectiveSyncListType type)
+QStringList SyncJournalDb::getSelectiveSyncList(SyncJournalDb::SelectiveSyncListType type, bool *ok )
{
QStringList result;
+ Q_ASSERT(ok);
QMutexLocker locker(&_mutex);
if( !checkConnect() ) {
+ *ok = false;
return result;
}
@@ -1406,6 +1408,7 @@ QStringList SyncJournalDb::getSelectiveSyncList(SyncJournalDb::SelectiveSyncList
_getSelectiveSyncListQuery->bindValue(1, int(type));
if (!_getSelectiveSyncListQuery->exec()) {
qWarning() << "SQL query failed: "<< _getSelectiveSyncListQuery->error();
+ *ok = false;
return result;
}
while( _getSelectiveSyncListQuery->next() ) {
@@ -1415,6 +1418,8 @@ QStringList SyncJournalDb::getSelectiveSyncList(SyncJournalDb::SelectiveSyncList
}
result.append(entry);
}
+ *ok = true;
+
return result;
}
diff --git a/src/libsync/syncjournaldb.h b/src/libsync/syncjournaldb.h
index a56e41b..29cc2a9 100644
--- a/src/libsync/syncjournaldb.h
+++ b/src/libsync/syncjournaldb.h
@@ -113,7 +113,7 @@ public:
SelectiveSyncUndecidedList = 3
};
/* return the specified list from the database */
- QStringList getSelectiveSyncList(SelectiveSyncListType type);
+ QStringList getSelectiveSyncList(SelectiveSyncListType type, bool *ok);
/* Write the selective sync list (remove all other entries of that list */
void setSelectiveSyncList(SelectiveSyncListType type, const QStringList &list);
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-owncloud/owncloud-client.git
More information about the Pkg-owncloud-commits
mailing list