[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