Correct virtual files placeholder files if needed
authorFelix Weilbach <felix.weilbach@nextcloud.com>
Tue, 16 Nov 2021 10:50:43 +0000 (11:50 +0100)
committerMatthieu Gallien (Rebase PR Action) <matthieu_gallien@yahoo.fr>
Wed, 17 Nov 2021 09:53:26 +0000 (09:53 +0000)
In the past not all files were converted to placeholder files when
converting an existing sync folder to a virtual files folder. Because
some files were not converted to placeholder files, the status would
be wrong on the files. This code makes sure that every file in a
virtual files folder is a placeholder file. It could be removed in the
future.

Signed-off-by: Felix Weilbach <felix.weilbach@nextcloud.com>
src/common/syncjournaldb.cpp
src/common/syncjournaldb.h
src/gui/folder.cpp
src/gui/folder.h

index 5c5195bba440483991bcddb4efd8bcfccc3cbe4f..8c41aec63df107a3c449355b4667dc7502122e4c 100644 (file)
@@ -1016,6 +1016,29 @@ qint64 SyncJournalDb::keyValueStoreGetInt(const QString &key, qint64 defaultValu
     return query->int64Value(0);
 }
 
+bool SyncJournalDb::keyValueStoreGetBool(const QString &key, bool defaultValue)
+{
+    QMutexLocker locker(&_mutex);
+    if (!checkConnect()) {
+        return defaultValue;
+    }
+
+    const auto query = _queryManager.get(PreparedSqlQueryManager::GetKeyValueStoreQuery,
+        QByteArrayLiteral("SELECT value FROM key_value_store WHERE key = ?1;"), _db);
+    if (!query) {
+        return defaultValue;
+    }
+
+    query->bindValue(1, key);
+    query->exec();
+
+    if (!query->next().hasData) {
+        return defaultValue;
+    }
+
+    return query->intValue(0);
+}
+
 QVariant SyncJournalDb::keyValueStoreGet(const QString &key, QVariant defaultValue)
 {
     QMutexLocker locker(&_mutex);
index ba4c0ede8ee75e546d0cf2a587f8c3b6e69f90b0..9a3db71256f5fe5065b87ff8a3ba6a68d53b62d3 100644 (file)
@@ -70,6 +70,7 @@ public:
 
     void keyValueStoreSet(const QString &key, QVariant value);
     qint64 keyValueStoreGetInt(const QString &key, qint64 defaultValue);
+    bool keyValueStoreGetBool(const QString &key, bool defaultValue);
     QVariant keyValueStoreGet(const QString &key, QVariant defaultValue = {});
     void keyValueStoreDelete(const QString &key);
 
index decbb927b52c276481e937e2c6b19f5b693fcc92..39e4d37a9024f6108a5521accb5aedfb905914c6 100644 (file)
@@ -866,11 +866,27 @@ void Folder::startSync(const QStringList &pathList)
 
     _engine->setIgnoreHiddenFiles(_definition.ignoreHiddenFiles);
 
+    correctPlaceholderFiles();
+
     QMetaObject::invokeMethod(_engine.data(), "startSync", Qt::QueuedConnection);
 
     emit syncStarted();
 }
 
+void Folder::correctPlaceholderFiles()
+{
+    if (_definition.virtualFilesMode == Vfs::Off) {
+        return;
+    }
+    static const auto placeholdersCorrectedKey = QStringLiteral("placeholders_corrected");
+    const auto placeholdersCorrected = _journal.keyValueStoreGetBool(placeholdersCorrectedKey, false);
+    if (!placeholdersCorrected) {
+        qCDebug(lcFolder) << "Make sure all virtual files are placeholder files";
+        switchToVirtualFiles();
+        _journal.keyValueStoreSet(placeholdersCorrectedKey, true);
+    }
+}
+
 void Folder::setSyncOptions()
 {
     SyncOptions opt;
index 3bb96b2da4875ffba7465c04f3ea6ebe994e40e8..8fd8bfbbbe2227de2adc751c8804d8472c4413bb 100644 (file)
@@ -444,6 +444,8 @@ private:
 
     void startVfs();
 
+    void correctPlaceholderFiles();
+
     AccountStatePtr _accountState;
     FolderDefinition _definition;
     QString _canonicalLocalPath; // As returned with QFileInfo:canonicalFilePath.  Always ends with "/"