Propagator: Helper for updating db
authorChristian Kamm <mail@ckamm.de>
Mon, 21 Jan 2019 10:19:45 +0000 (11:19 +0100)
committerKevin Ottens <kevin.ottens@nextcloud.com>
Tue, 15 Dec 2020 09:58:37 +0000 (10:58 +0100)
Similar steps were done in many propagation jobs.

This also updates the db entry to always have the item.destination() as
file path.

src/libsync/owncloudpropagator.cpp
src/libsync/owncloudpropagator.h
src/libsync/propagatedownload.cpp
src/libsync/propagateremotemkdir.cpp
src/libsync/propagateremotemove.cpp
src/libsync/propagateupload.cpp
src/libsync/propagatorjobs.cpp
src/libsync/syncfileitem.cpp
src/libsync/syncfileitem.h

index e8572790c70a2d3a645d11108fdef6c75f68c308..b6813c4d85bf637c1541fe3d665e8b894150bc24 100644 (file)
@@ -724,6 +724,13 @@ QString OwncloudPropagator::adjustRenamedPath(const QString &original) const
     return OCC::adjustRenamedPath(_renamedDirectories, original);
 }
 
+bool OwncloudPropagator::updateMetadata(const SyncFileItem &item)
+{
+    QString fsPath = getFilePath(item.destination());
+    auto record = item.toSyncJournalFileRecordWithInode(fsPath);
+    return _journal->setFileRecord(record);
+}
+
 // ================================================================================
 
 PropagatorJob::PropagatorJob(OwncloudPropagator *propagator)
@@ -967,9 +974,7 @@ void PropagateDirectory::slotSubJobsFinished(SyncFileItem::Status status)
                     _item->_fileId = mkdir->_item->_fileId;
                 }
             }
-            SyncJournalFileRecord record = _item->toSyncJournalFileRecordWithInode(propagator()->_localDir + _item->_file);
-            bool ok = propagator()->_journal->setFileRecord(record);
-            if (!ok) {
+            if (!propagator()->updateMetadata(*_item)) {
                 status = _item->_status = SyncFileItem::FatalError;
                 _item->_errorString = tr("Error writing metadata to the database");
                 qCWarning(lcDirectory) << "Error writing to the database for file" << _item->_file;
@@ -1014,7 +1019,9 @@ void CleanupPollsJob::slotPollFinished()
     } else if (job->_item->_status != SyncFileItem::Success) {
         qCWarning(lcCleanupPolls) << "There was an error with file " << job->_item->_file << job->_item->_errorString;
     } else {
-        if (!_journal->setFileRecord(job->_item->toSyncJournalFileRecordWithInode(_localPath + job->_item->_file))) {
+        // want to do Propagator::updateMetadata()
+        QString filesystemPath = _localPath + job->_item->_file;
+        if (!_journal->setFileRecord(job->_item->toSyncJournalFileRecordWithInode(filesystemPath))) {
             qCWarning(lcCleanupPolls) << "database error";
             job->_item->_status = SyncFileItem::FatalError;
             job->_item->_errorString = tr("Error writing metadata to the database");
@@ -1022,6 +1029,7 @@ void CleanupPollsJob::slotPollFinished()
             deleteLater();
             return;
         }
+        // TODO: Is syncfilestatustracker notified somehow?
     }
     // Continue with the next entry, or finish
     start();
index ec2435d550bf867acd5c51a001b8b13b6ead4e12..a6b64de2daf95265f87a4b96ee2f24489188f8b6 100644 (file)
@@ -507,6 +507,13 @@ public:
     QMap<QString, QString> _renamedDirectories;
     QString adjustRenamedPath(const QString &original) const;
 
+    /** Update the database for an item.
+     *
+     * Typically after a sync operation succeeded. Updates the inode from
+     * the filesystem.
+     */
+    bool updateMetadata(const SyncFileItem &item);
+
 private slots:
 
     void abortTimeout()
index ecbc99188ae1913e145511449af24096d3518f27..97592d465b72976c02ed559a2de1bab8002f8ce2 100644 (file)
@@ -1041,7 +1041,7 @@ void PropagateDownloadFile::updateMetadata(bool isConflict)
 {
     QString fn = propagator()->getFilePath(_item->_file);
 
-    if (!propagator()->_journal->setFileRecord(_item->toSyncJournalFileRecordWithInode(fn))) {
+    if (!propagator()->updateMetadata(*_item)) {
         done(SyncFileItem::FatalError, tr("Error writing metadata to the database"));
         return;
     }
@@ -1053,6 +1053,7 @@ void PropagateDownloadFile::updateMetadata(bool isConflict)
     }
 
     propagator()->_journal->commit("download file start2");
+
     done(isConflict ? SyncFileItem::Conflict : SyncFileItem::Success);
 
     // handle the special recall file
index d1ac78aefa0c7ddc70ad3fa1c17beeef3105f199..d1a8c1cf4185443d5abcfae6595e5acb1ab05cc6 100644 (file)
@@ -279,8 +279,7 @@ void PropagateRemoteMkdir::propfindError()
 void PropagateRemoteMkdir::success()
 {
     // save the file id already so we can detect rename or remove
-    SyncJournalFileRecord record = _item->toSyncJournalFileRecordWithInode(propagator()->_localDir + _item->destination());
-    if (!propagator()->_journal->setFileRecord(record)) {
+    if (!propagator()->updateMetadata(*_item)) {
         done(SyncFileItem::FatalError, tr("Error writing metadata to the database"));
         return;
     }
index a79e59945c01747fa77b16f93ac9fd9fbcdbdea5..9373ae7c3c1c9239540f32cbb68c9d3686fe7e2f 100644 (file)
@@ -161,20 +161,18 @@ void PropagateRemoteMove::finalize()
     // to the new record. It is not a problem to skip it here.
     propagator()->_journal->deleteFileRecord(_item->_originalFile);
 
-    SyncJournalFileRecord record = _item->toSyncJournalFileRecordWithInode(propagator()->getFilePath(_item->_renameTarget));
-    record._path = _item->_renameTarget.toUtf8();
+    SyncFileItem newItem(*_item);
     if (oldRecord.isValid()) {
-        record._checksumHeader = oldRecord._checksumHeader;
-        record._type = oldRecord._type;
-        if (record._fileSize != oldRecord._fileSize) {
-            qCWarning(lcPropagateRemoteMove) << "File sizes differ on server vs sync journal: " << record._fileSize << oldRecord._fileSize;
+        newItem._checksumHeader = oldRecord._checksumHeader;
+        newItem._type = oldRecord._type;
+        if (newItem._size != oldRecord._fileSize) {
+            qCWarning(lcPropagateRemoteMove) << "File sizes differ on server vs sync journal: " << newItem._size << oldRecord._fileSize;
 
             // the server might have claimed a different size, we take the old one from the DB
-            record._fileSize = oldRecord._fileSize;
+            newItem._size = oldRecord._fileSize;
         }
     }
-
-    if (!propagator()->_journal->setFileRecord(record)) {
+    if (!propagator()->updateMetadata(newItem)) {
         done(SyncFileItem::FatalError, tr("Error writing metadata to the database"));
         return;
     }
index 5f65d27c41d6a16ab8ebf95fdbad6f458468b679..48314f6ecefcb9686f4af8583fec50583ab05d28 100644 (file)
@@ -757,10 +757,8 @@ void PropagateUploadFileCommon::finalize()
     if (quotaIt != propagator()->_folderQuota.end())
         quotaIt.value() -= _fileToUpload._size;
 
-    // Update the database entry - use the local file, not the temporary one.
-    const auto filePath = propagator()->getFilePath(_item->_file);
-    const auto fileRecord = _item->toSyncJournalFileRecordWithInode(filePath);
-    if (!propagator()->_journal->setFileRecord(fileRecord)) {
+    // Update the database entry
+    if (!propagator()->updateMetadata(*_item)) {
         done(SyncFileItem::FatalError, tr("Error writing metadata to the database"));
         return;
     }
index 4ee7381f539408968bacf5333d15a45627ca1be5..ca69d881975c2211878c61f53380acea36c10b80 100644 (file)
@@ -210,9 +210,9 @@ void PropagateLocalMkdir::startLocalMkdir()
     // Adding an entry with a dummy etag to the database still makes sense here
     // so the database is aware that this folder exists even if the sync is aborted
     // before the correct etag is stored.
-    SyncJournalFileRecord record = _item->toSyncJournalFileRecordWithInode(newDirStr);
-    record._etag = "_invalid_";
-    if (!propagator()->_journal->setFileRecord(record)) {
+    SyncFileItem newItem(*_item);
+    newItem._etag = "_invalid_";
+    if (!propagator()->updateMetadata(newItem)) {
         done(SyncFileItem::FatalError, tr("Error writing metadata to the database"));
         return;
     }
@@ -287,14 +287,12 @@ void PropagateLocalRename::start()
     const auto oldFile = _item->_file;
     _item->_file = _item->_renameTarget;
 
-    SyncJournalFileRecord record = _item->toSyncJournalFileRecordWithInode(targetFile);
-    record._path = _item->_renameTarget.toUtf8();
-    if (oldRecord.isValid()) {
-        record._checksumHeader = oldRecord._checksumHeader;
-    }
-
     if (!_item->isDirectory()) { // Directories are saved at the end
-        if (!propagator()->_journal->setFileRecord(record)) {
+        SyncFileItem newItem(*_item);
+        if (oldRecord.isValid()) {
+            newItem._checksumHeader = oldRecord._checksumHeader;
+        }
+        if (!propagator()->updateMetadata(newItem)) {
             done(SyncFileItem::FatalError, tr("Error writing metadata to the database"));
             return;
         }
index 623d61859b9e1aad59ad861a3f75938c4cc47bcc..2d993ec116e2063c6312c5c3555e8c53f99b6600 100644 (file)
@@ -24,10 +24,10 @@ namespace OCC {
 
 Q_LOGGING_CATEGORY(lcFileItem, "nextcloud.sync.fileitem", QtInfoMsg)
 
-SyncJournalFileRecord SyncFileItem::toSyncJournalFileRecordWithInode(const QString &localFileName)
+SyncJournalFileRecord SyncFileItem::toSyncJournalFileRecordWithInode(const QString &localFileName) const
 {
     SyncJournalFileRecord rec;
-    rec._path = _file.toUtf8();
+    rec._path = destination().toUtf8();
     rec._modtime = _modtime;
     rec._type = _type;
     rec._etag = _etag;
index d8f436dea7bb2f8630df3b5eec5cfe44b76d699a..48682671097031ddbd949d8dc6924478d94a9f4c 100644 (file)
@@ -88,7 +88,7 @@ public:
     };
     Q_ENUM(Status)
 
-    SyncJournalFileRecord toSyncJournalFileRecordWithInode(const QString &localFileName);
+    SyncJournalFileRecord toSyncJournalFileRecordWithInode(const QString &localFileName) const;
 
     /** Creates a basic SyncFileItem from a DB record
      *