From: Christian Kamm Date: Mon, 21 Jan 2019 10:19:45 +0000 (+0100) Subject: Propagator: Helper for updating db X-Git-Tag: archive/raspbian/3.16.7-1_deb13u1+rpi1~1^2~12^2~21^2~468^2~315 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=ca0323e1e70d33f7f17b1a1ec844e40f7e8b4f5e;p=nextcloud-desktop.git Propagator: Helper for updating db Similar steps were done in many propagation jobs. This also updates the db entry to always have the item.destination() as file path. --- diff --git a/src/libsync/owncloudpropagator.cpp b/src/libsync/owncloudpropagator.cpp index e8572790c..b6813c4d8 100644 --- a/src/libsync/owncloudpropagator.cpp +++ b/src/libsync/owncloudpropagator.cpp @@ -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(); diff --git a/src/libsync/owncloudpropagator.h b/src/libsync/owncloudpropagator.h index ec2435d55..a6b64de2d 100644 --- a/src/libsync/owncloudpropagator.h +++ b/src/libsync/owncloudpropagator.h @@ -507,6 +507,13 @@ public: QMap _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() diff --git a/src/libsync/propagatedownload.cpp b/src/libsync/propagatedownload.cpp index ecbc99188..97592d465 100644 --- a/src/libsync/propagatedownload.cpp +++ b/src/libsync/propagatedownload.cpp @@ -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 diff --git a/src/libsync/propagateremotemkdir.cpp b/src/libsync/propagateremotemkdir.cpp index d1ac78aef..d1a8c1cf4 100644 --- a/src/libsync/propagateremotemkdir.cpp +++ b/src/libsync/propagateremotemkdir.cpp @@ -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; } diff --git a/src/libsync/propagateremotemove.cpp b/src/libsync/propagateremotemove.cpp index a79e59945..9373ae7c3 100644 --- a/src/libsync/propagateremotemove.cpp +++ b/src/libsync/propagateremotemove.cpp @@ -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; } diff --git a/src/libsync/propagateupload.cpp b/src/libsync/propagateupload.cpp index 5f65d27c4..48314f6ec 100644 --- a/src/libsync/propagateupload.cpp +++ b/src/libsync/propagateupload.cpp @@ -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; } diff --git a/src/libsync/propagatorjobs.cpp b/src/libsync/propagatorjobs.cpp index 4ee7381f5..ca69d8819 100644 --- a/src/libsync/propagatorjobs.cpp +++ b/src/libsync/propagatorjobs.cpp @@ -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; } diff --git a/src/libsync/syncfileitem.cpp b/src/libsync/syncfileitem.cpp index 623d61859..2d993ec11 100644 --- a/src/libsync/syncfileitem.cpp +++ b/src/libsync/syncfileitem.cpp @@ -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; diff --git a/src/libsync/syncfileitem.h b/src/libsync/syncfileitem.h index d8f436dea..486826710 100644 --- a/src/libsync/syncfileitem.h +++ b/src/libsync/syncfileitem.h @@ -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 *