Give a proper name to a parent path update metho in SyncJournal.

Signed-off-by: alex-z <blackslayer4@gmail.com>
pull/6211/head
alex-z 2024-01-10 18:04:01 +01:00 committed by allexzander
parent 4ce73b1705
commit 122ae9c961
5 changed files with 32 additions and 46 deletions

View File

@ -107,12 +107,8 @@ public:
GetE2EeLockedFolderQuery,
GetE2EeLockedFoldersQuery,
DeleteE2EeLockedFolderQuery,
<<<<<<< HEAD
ListAllTopLevelE2eeFoldersStatusLessThanQuery,
=======
MoveFilesInPathQuery,
>>>>>>> 6e3bb76cc (On folder move execute only one UPDATE query for all nested items.)
RelocateFolderToNewPathRecursivelyQuery,
PreparedQueryCount
};
PreparedSqlQueryManager() = default;

View File

@ -1042,7 +1042,6 @@ Result<void, QString> SyncJournalDb::setFileRecord(const SyncJournalFileRecord &
return {};
}
<<<<<<< HEAD
bool SyncJournalDb::getRootE2eFolderRecord(const QString &remoteFolderPath, SyncJournalFileRecord *rec)
{
Q_ASSERT(rec);
@ -1088,28 +1087,13 @@ bool SyncJournalDb::listAllE2eeFoldersWithEncryptionStatusLessThan(const int sta
if (!checkConnect())
return false;
const auto query = _queryManager.get(PreparedSqlQueryManager::ListAllTopLevelE2eeFoldersStatusLessThanQuery,
QByteArrayLiteral(GET_FILE_RECORD_QUERY " WHERE type == 2 AND isE2eEncrypted >= ?1 AND isE2eEncrypted < ?2 ORDER BY path||'/' ASC"),
=======
bool SyncJournalDb::updateParentForAllChildren(const QByteArray &oldParentPath, const QByteArray &newParentPath)
{
qCInfo(lcDb) << "Moving files from path" << oldParentPath << "to path" << newParentPath;
if (!checkConnect()) {
qCWarning(lcDb) << "Failed to connect database.";
return false;
}
const auto query = _queryManager.get(PreparedSqlQueryManager::MoveFilesInPathQuery,
QByteArrayLiteral("UPDATE metadata"
" SET path = REPLACE(path, ?1, ?2), phash = path_hash(REPLACE(path, ?1, ?2)), pathlen = path_length(REPLACE(path, ?1, ?2))"
" WHERE " IS_PREFIX_PATH_OF("?1", "path")),
>>>>>>> 6e3bb76cc (On folder move execute only one UPDATE query for all nested items.)
_db);
const auto query =
_queryManager.get(PreparedSqlQueryManager::ListAllTopLevelE2eeFoldersStatusLessThanQuery,
QByteArrayLiteral(GET_FILE_RECORD_QUERY " WHERE type == 2 AND isE2eEncrypted >= ?1 AND isE2eEncrypted < ?2 ORDER BY path||'/' ASC"),
_db);
if (!query) {
return false;
}
<<<<<<< HEAD
query->bindValue(1, SyncJournalFileRecord::EncryptionStatus::Encrypted);
query->bindValue(2, status);
@ -1159,21 +1143,29 @@ bool SyncJournalDb::findEncryptedAncestorForRecord(const QString &filename, Sync
pathComponents.removeLast();
}
return true;
=======
}
bool SyncJournalDb::relocateFolderToNewPathRecursively(const QByteArray &oldParentPath, const QByteArray &newParentPath)
{
qCInfo(lcDb) << "Relocating folder recursively from path" << oldParentPath << "to path" << newParentPath;
if (!checkConnect()) {
qCWarning(lcDb) << "Failed to connect database.";
return false;
}
const auto query = _queryManager.get(
PreparedSqlQueryManager::RelocateFolderToNewPathRecursivelyQuery,
QByteArrayLiteral("UPDATE metadata"
" SET path = REPLACE(path, ?1, ?2), phash = path_hash(REPLACE(path, ?1, ?2)), pathlen = path_length(REPLACE(path, ?1, ?2))"
" WHERE " IS_PREFIX_PATH_OF("?1", "path")),
_db);
if (!query) {
return false;
}
query->bindValue(1, oldParentPath);
query->bindValue(2, newParentPath);
<<<<<<< HEAD
<<<<<<< HEAD
return query->exec();
>>>>>>> 6e3bb76cc (On folder move execute only one UPDATE query for all nested items.)
=======
auto res = query->exec();
auto numRows = query->numRowsAffected();
return res;
>>>>>>> eb7234f4d (Iteration.)
=======
return query->exec();
>>>>>>> 3f2c9535f (Fix compile issues.)
}
void SyncJournalDb::keyValueStoreSet(const QString &key, QVariant value)

View File

@ -70,14 +70,13 @@ public:
[[nodiscard]] bool getFilesBelowPath(const QByteArray &path, const std::function<void(const SyncJournalFileRecord&)> &rowCallback);
[[nodiscard]] bool listFilesInPath(const QByteArray &path, const std::function<void(const SyncJournalFileRecord&)> &rowCallback);
[[nodiscard]] Result<void, QString> setFileRecord(const SyncJournalFileRecord &record);
<<<<<<< HEAD
[[nodiscard]] bool getRootE2eFolderRecord(const QString &remoteFolderPath, SyncJournalFileRecord *rec);
[[nodiscard]] bool listAllE2eeFoldersWithEncryptionStatusLessThan(const int status, const std::function<void(const SyncJournalFileRecord &)> &rowCallback);
[[nodiscard]] bool findEncryptedAncestorForRecord(const QString &filename, SyncJournalFileRecord *rec);
=======
[[nodiscard]] bool updateParentForAllChildren(const QByteArray &oldParentPath, const QByteArray &newParentPath);
>>>>>>> 6e3bb76cc (On folder move execute only one UPDATE query for all nested items.)
// use this after moving a folder and all its contents under new parent (e.g. "folderA" move to "parentFolder", such that "folderA" -> "parentFolder/folderA"
// all nested items will have their paths updated accordingly wiht a single UPDATE query
[[nodiscard]] bool relocateFolderToNewPathRecursively(const QByteArray &oldParentPath, const QByteArray &newParentPath);
void keyValueStoreSet(const QString &key, QVariant value);
[[nodiscard]] qint64 keyValueStoreGetInt(const QString &key, qint64 defaultValue);
void keyValueStoreDelete(const QString &key);

View File

@ -309,7 +309,7 @@ void PropagateRemoteMove::finalize()
}
if (_item->isDirectory()) {
if (!propagator()->_journal->updateParentForAllChildren(origin.toUtf8(), _item->_renameTarget.toUtf8())) {
if (!propagator()->_journal->relocateFolderToNewPathRecursively(origin.toUtf8(), _item->_renameTarget.toUtf8())) {
done(SyncFileItem::FatalError, tr("Failed to move folder: %1").arg(_item->_file), ErrorCategory::GenericError);
return;
}

View File

@ -495,9 +495,8 @@ private slots:
QVERIFY(makeEntry(folder2ContentsMoved.first().first, folder2ContentsMoved.first().second, initialEtag));
// move a folder under new location, all children paths must get updated with one query
QVERIFY(_db.updateParentForAllChildren(folder1Contents.first().first, folder1ContentsMoved.first().first));
QVERIFY(_db.updateParentForAllChildren(folder2Contents.first().first, folder2ContentsMoved.first().first));
QVERIFY(_db.relocateFolderToNewPathRecursively(folder1Contents.first().first, folder1ContentsMoved.first().first));
QVERIFY(_db.relocateFolderToNewPathRecursively(folder2Contents.first().first, folder2ContentsMoved.first().first));
// verify all moved records exist under new paths
for (const auto &folderItemMoved : folder1ContentsMoved) {
SyncJournalFileRecord movedRecord;