From: Claudio Cambra Date: Mon, 20 Mar 2023 13:51:54 +0000 (+0100) Subject: Fix recursive metadata delete in NextcloudFilesDatabaseManager X-Git-Tag: archive/raspbian/3.16.7-1_deb13u1+rpi1~1^2~12^2~10^2~55^2~23 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=c088f0eb8187878ec6355b49f3350e45ec60a5f4;p=nextcloud-desktop.git Fix recursive metadata delete in NextcloudFilesDatabaseManager Signed-off-by: Claudio Cambra --- diff --git a/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/Database/NextcloudFilesDatabaseManager.swift b/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/Database/NextcloudFilesDatabaseManager.swift index 977ece031..4dc6c6398 100644 --- a/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/Database/NextcloudFilesDatabaseManager.swift +++ b/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/Database/NextcloudFilesDatabaseManager.swift @@ -260,7 +260,7 @@ class NextcloudFilesDatabaseManager : NSObject { } } - func deleteItemMetadata(ocId: String) { + @discardableResult func deleteItemMetadata(ocId: String) -> Bool { let database = ncDatabase() do { @@ -270,8 +270,11 @@ class NextcloudFilesDatabaseManager : NSObject { Logger.ncFilesDatabase.debug("Deleting item metadata. \(ocId, privacy: .public)") database.delete(results) } + + return true } catch let error { Logger.ncFilesDatabase.error("Could not delete item metadata with ocId: \(ocId, privacy: .public), received error: \(error.localizedDescription, privacy: .public)") + return false } } @@ -373,31 +376,36 @@ class NextcloudFilesDatabaseManager : NSObject { return nil } - var deletedMetadatas: [NextcloudItemMetadataTable] = [] - + let directoryMetadataCopy = NextcloudItemMetadataTable(value: directoryMetadata) let directoryUrlPath = directoryMetadata.serverUrl + "/" + directoryMetadata.fileName - let results = database.objects(NextcloudItemMetadataTable.self).filter("account == %@ AND serverUrl BEGINSWITH %@", directoryMetadata.account, directoryUrlPath) + let directoryAccount = directoryMetadata.account + let directoryEtag = directoryMetadata.etag - for result in results { - deleteItemMetadata(ocId: result.ocId) - deleteLocalFileMetadata(ocId: result.ocId) + Logger.ncFilesDatabase.debug("Deleting root directory metadata in recursive delete. ocID: \(directoryMetadata.ocId, privacy: .public), etag: \(directoryEtag, privacy: .public), serverUrl: \(directoryUrlPath, privacy: OSLogPrivacy.auto(mask: .hash))") - deletedMetadatas.append(NextcloudItemMetadataTable(value: result)) + guard deleteItemMetadata(ocId: directoryMetadata.ocId) else { + Logger.ncFilesDatabase.debug("Failure to delete root directory metadata in recursive delete. ocID: \(directoryMetadata.ocId, privacy: .public), etag: \(directoryEtag, privacy: .public), serverUrl: \(directoryUrlPath, privacy: OSLogPrivacy.auto(mask: .hash))") + return nil } - do { - try database.write { - Logger.ncFilesDatabase.debug("Deleting root directory metadata in recursive delete. ocID: \(directoryMetadata.ocId, privacy: .public), etag: \(directoryMetadata.etag, privacy: .public), serverUrl: \(directoryUrlPath)") + var deletedMetadatas: [NextcloudItemMetadataTable] = [directoryMetadata] - database.delete(results) + let results = database.objects(NextcloudItemMetadataTable.self).filter("account == %@ AND serverUrl BEGINSWITH %@", directoryAccount, directoryUrlPath) - return deletedMetadatas + for result in results { + let successfulItemMetadataDelete = deleteItemMetadata(ocId: result.ocId) + if (successfulItemMetadataDelete) { + deletedMetadatas.append(NextcloudItemMetadataTable(value: result)) + } + + if localFileMetadataFromOcId(result.ocId) != nil { + deleteLocalFileMetadata(ocId: result.ocId) } - } catch let error { - Logger.ncFilesDatabase.error("Could not delete root directory metadata in recursive delete. ocID: \(directoryMetadata.ocId, privacy: .public), etag: \(directoryMetadata.etag, privacy: .public), serverUrl: \(directoryUrlPath), received error: \(error.localizedDescription, privacy: .public)") } - return nil + Logger.ncFilesDatabase.debug("Completed deletions in directory recursive delete. ocID: \(directoryMetadata.ocId, privacy: .public), etag: \(directoryEtag, privacy: .public), serverUrl: \(directoryUrlPath, privacy: OSLogPrivacy.auto(mask: .hash))") + + return deletedMetadatas } func renameDirectoryAndPropagateToChildren(ocId: String, newServerUrl: String, newFileName: String) -> [NextcloudItemMetadataTable]? {