Fix recursive metadata delete in NextcloudFilesDatabaseManager
authorClaudio Cambra <claudio.cambra@nextcloud.com>
Mon, 20 Mar 2023 13:51:54 +0000 (14:51 +0100)
committerClaudio Cambra <claudio.cambra@nextcloud.com>
Fri, 12 May 2023 08:02:37 +0000 (16:02 +0800)
Signed-off-by: Claudio Cambra <claudio.cambra@nextcloud.com>
shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/Database/NextcloudFilesDatabaseManager.swift

index 977ece03175efd300d32b7ca389d2ec844c7ff9f..4dc6c6398d56a2f7fece9bbe18078a417ee9bc54 100644 (file)
@@ -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]? {