Skip to content

Commit

Permalink
Give a proper name to a parent path update metho in SyncJournal.
Browse files Browse the repository at this point in the history
Signed-off-by: alex-z <[email protected]>
  • Loading branch information
allexzander committed Apr 24, 2024
1 parent 4ce73b1 commit 122ae9c
Show file tree
Hide file tree
Showing 5 changed files with 32 additions and 46 deletions.
6 changes: 1 addition & 5 deletions src/common/preparedsqlquerymanager.h
Original file line number Diff line number Diff line change
Expand Up @@ -107,12 +107,8 @@ class OCSYNC_EXPORT PreparedSqlQueryManager
GetE2EeLockedFolderQuery,
GetE2EeLockedFoldersQuery,
DeleteE2EeLockedFolderQuery,
<<<<<<< HEAD
ListAllTopLevelE2eeFoldersStatusLessThanQuery,
=======
MoveFilesInPathQuery,
>>>>>>> 6e3bb76cc (On folder move execute only one UPDATE query for all nested items.)

RelocateFolderToNewPathRecursivelyQuery,
PreparedQueryCount
};
PreparedSqlQueryManager() = default;
Expand Down
56 changes: 24 additions & 32 deletions src/common/syncjournaldb.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1042,7 +1042,6 @@ Result<void, QString> SyncJournalDb::setFileRecord(const SyncJournalFileRecord &
return {};
}

<<<<<<< HEAD
bool SyncJournalDb::getRootE2eFolderRecord(const QString &remoteFolderPath, SyncJournalFileRecord *rec)
{
Q_ASSERT(rec);
Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -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)
Expand Down
9 changes: 4 additions & 5 deletions src/common/syncjournaldb.h
Original file line number Diff line number Diff line change
Expand Up @@ -70,14 +70,13 @@ class OCSYNC_EXPORT SyncJournalDb : public QObject
[[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);
Expand Down
2 changes: 1 addition & 1 deletion src/libsync/propagateremotemove.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down
5 changes: 2 additions & 3 deletions test/testsyncjournaldb.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit 122ae9c

Please sign in to comment.