Similar steps were done in many propagation jobs.
This also updates the db entry to always have the item.destination() as
file path.
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)
_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;
} 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");
deleteLater();
return;
}
+ // TODO: Is syncfilestatustracker notified somehow?
}
// Continue with the next entry, or finish
start();
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()
{
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;
}
}
propagator()->_journal->commit("download file start2");
+
done(isConflict ? SyncFileItem::Conflict : SyncFileItem::Success);
// handle the special recall file
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;
}
// 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;
}
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;
}
// 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;
}
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;
}
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;
};
Q_ENUM(Status)
- SyncJournalFileRecord toSyncJournalFileRecordWithInode(const QString &localFileName);
+ SyncJournalFileRecord toSyncJournalFileRecordWithInode(const QString &localFileName) const;
/** Creates a basic SyncFileItem from a DB record
*