From c088f0eb8187878ec6355b49f3350e45ec60a5f4 Mon Sep 17 00:00:00 2001 From: Claudio Cambra Date: Mon, 20 Mar 2023 14:51:54 +0100 Subject: [PATCH] Fix recursive metadata delete in NextcloudFilesDatabaseManager Signed-off-by: Claudio Cambra --- .../NextcloudFilesDatabaseManager.swift | 40 +++++++++++-------- 1 file changed, 24 insertions(+), 16 deletions(-) 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]? { -- 2.30.2