From 98afd95e5927a41350658f36ff3a0c97ac991575 Mon Sep 17 00:00:00 2001 From: Claudio Cambra Date: Thu, 2 Feb 2023 20:12:03 +0100 Subject: [PATCH] Fix Realm crashes when trying to delete certain objects Signed-off-by: Claudio Cambra --- .../NextcloudFilesDatabaseManager.swift | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/NextcloudFilesDatabaseManager.swift b/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/NextcloudFilesDatabaseManager.swift index cfdd65a60..892119b81 100644 --- a/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/NextcloudFilesDatabaseManager.swift +++ b/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/NextcloudFilesDatabaseManager.swift @@ -109,7 +109,7 @@ class NextcloudFilesDatabaseManager : NSObject { } private func processItemMetadatasToDelete(databaseToWriteTo: Realm, - existingMetadatas: [NextcloudItemMetadataTable], + existingMetadatas: Results, updatedMetadatas: [NextcloudItemMetadataTable]) { assert(databaseToWriteTo.isInWriteTransaction) @@ -125,12 +125,14 @@ class NextcloudFilesDatabaseManager : NSObject { etag: %@ """ , metadataToDelete.ocId, metadataToDelete.fileName, metadataToDelete.etag) - databaseToWriteTo.delete(metadataToDelete) + + // Can't pass copies, we need the originals from the database + databaseToWriteTo.delete(ncDatabase().objects(NextcloudItemMetadataTable.self).filter("ocId == %@", metadataToDelete.ocId)) } } private func processItemMetadatasToUpdate(databaseToWriteTo: Realm, - existingMetadatas: [NextcloudItemMetadataTable], + existingMetadatas: Results, updatedMetadatas: [NextcloudItemMetadataTable]) { assert(databaseToWriteTo.isInWriteTransaction) @@ -170,12 +172,12 @@ class NextcloudFilesDatabaseManager : NSObject { do { try database.write { - let existingMetadatas = itemMetadatas(account: account, serverUrl: serverUrl, status: .normal) + let existingMetadatas = ncDatabase().objects(NextcloudItemMetadataTable.self).filter("account == %@ AND serverUrl == %@ AND status == %@", account, serverUrl, NextcloudItemMetadataTable.Status.normal.rawValue) + processItemMetadatasToDelete(databaseToWriteTo: database, existingMetadatas: existingMetadatas, updatedMetadatas: updatedMetadatas) - processItemMetadatasToUpdate(databaseToWriteTo: database, existingMetadatas: existingMetadatas, updatedMetadatas: updatedMetadatas) @@ -212,7 +214,7 @@ class NextcloudFilesDatabaseManager : NSObject { } private func processDirectoryMetadatasToDelete(databaseToWriteTo: Realm, - existingDirectoryMetadatas: [NextcloudDirectoryMetadataTable], + existingDirectoryMetadatas: Results, updatedDirectoryMetadatas: [NextcloudDirectoryMetadataTable]) { assert(databaseToWriteTo.isInWriteTransaction) @@ -228,12 +230,14 @@ class NextcloudFilesDatabaseManager : NSObject { etag: %@ """ , metadataToDelete.ocId, metadataToDelete.serverUrl, metadataToDelete.etag) - databaseToWriteTo.delete(metadataToDelete) + + // Can't pass copies, we need the originals from the database + databaseToWriteTo.delete(databaseToWriteTo.objects(NextcloudDirectoryMetadataTable.self).filter("ocId == %@", metadataToDelete.ocId)) } } private func processDirectoryMetadatasToUpdate(databaseToWriteTo: Realm, - existingDirectoryMetadatas: [NextcloudDirectoryMetadataTable], + existingDirectoryMetadatas: Results, updatedDirectoryMetadatas: [NextcloudDirectoryMetadataTable]) { assert(databaseToWriteTo.isInWriteTransaction) @@ -272,7 +276,8 @@ class NextcloudFilesDatabaseManager : NSObject { do { try database.write { - let existingDirectoryMetadatas = directoryMetadatas(account: account, parentDirectoryServerUrl: parentDirectoryServerUrl) + let existingDirectoryMetadatas = ncDatabase().objects(NextcloudDirectoryMetadataTable.self).filter("account == %@ AND parentDirectoryServerUrl == %@", account, parentDirectoryServerUrl) + processDirectoryMetadatasToDelete(databaseToWriteTo: database, existingDirectoryMetadatas: existingDirectoryMetadatas, updatedDirectoryMetadatas: updatedDirectoryMetadatas) -- 2.30.2