From d9e368cbe7758a63309405338e79ecae3867234e Mon Sep 17 00:00:00 2001 From: Claudio Cambra Date: Thu, 26 Jan 2023 18:09:19 +0100 Subject: [PATCH] Refactor updateDirectoryMetadatas in the database manager Signed-off-by: Claudio Cambra --- .../NextcloudFilesDatabaseManager.swift | 114 ++++++++++++++---- 1 file changed, 93 insertions(+), 21 deletions(-) diff --git a/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/NextcloudFilesDatabaseManager.swift b/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/NextcloudFilesDatabaseManager.swift index 729ac9df5..9a83996f0 100644 --- a/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/NextcloudFilesDatabaseManager.swift +++ b/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/NextcloudFilesDatabaseManager.swift @@ -184,35 +184,107 @@ class NextcloudFilesDatabaseManager : NSObject { return directoryMetadata(account: itemMetadata.account, serverUrl: itemMetadata.serverUrl) } - func updateDirectoryMetadatasFromItemMetadatas(_ directoryItemMetadatas: [NextcloudItemMetadataTable]) { + private func processDirectoryMetadatasToDelete(databaseToWriteTo: Realm, + existingDirectoryMetadatas: [NextcloudDirectoryMetadataTable], + updatedDirectoryMetadatas: [NextcloudDirectoryMetadataTable]) { + + assert(databaseToWriteTo.isInWriteTransaction) + + for existingMetadata in existingDirectoryMetadatas { + guard !updatedDirectoryMetadatas.contains(where: { $0.ocId == existingMetadata.ocId }), + let metadataToDelete = directoryMetadata(ocId: existingMetadata.ocId) else { continue } + + print(""" + Deleting directory metadata. + ocID: %@, + serverUrl: %@, + etag: %@ + """ + , metadataToDelete.ocId, metadataToDelete.serverUrl, metadataToDelete.etag) + databaseToWriteTo.delete(metadataToDelete) + } + } + + private func processDirectoryMetadatasToUpdate(databaseToWriteTo: Realm, + existingDirectoryMetadatas: [NextcloudDirectoryMetadataTable], + updatedDirectoryMetadatas: [NextcloudDirectoryMetadataTable]) { + + assert(databaseToWriteTo.isInWriteTransaction) + + for updatedMetadata in updatedDirectoryMetadatas { + if let existingMetadata = existingDirectoryMetadatas.first(where: { $0.ocId == updatedMetadata.ocId }) { + + if !existingMetadata.isInSameRemoteState(updatedMetadata) { + + databaseToWriteTo.add(NextcloudDirectoryMetadataTable.init(value: updatedMetadata), update: .all) + print(""" + Updated existing directory metadata. + ocID: %@, + serverUrl: %@, + etag: %@ + """ + , updatedMetadata.ocId, updatedMetadata.serverUrl, updatedMetadata.etag) + } + // Don't update under other circumstances in which the metadata already exists + + } else { // This is a new metadata + databaseToWriteTo.add(NextcloudDirectoryMetadataTable.init(value: updatedMetadata), update: .all) + print(""" + Created new metadata. + ocID: %@, + serverUrl: %@, + etag: %@ + """ + , updatedMetadata.ocId, updatedMetadata.serverUrl, updatedMetadata.etag) + } + } + } + + func updateDirectoryMetadatas(existingDirectoryMetadatas: [NextcloudDirectoryMetadataTable], updatedDirectoryMetadatas: [NextcloudDirectoryMetadataTable]) { let database = ncDatabase() + do { try database.write { - for directoryItemMetadata in directoryItemMetadatas { - var newDirectoryMetadata = NextcloudDirectoryMetadataTable() - let directoryOcId = directoryItemMetadata.ocId - - if let existingDirectoryMetadata = directoryMetadata(ocId: directoryOcId) { - newDirectoryMetadata = existingDirectoryMetadata - } - - newDirectoryMetadata.ocId = directoryOcId - newDirectoryMetadata.fileId = directoryItemMetadata.fileId - newDirectoryMetadata.etag = directoryItemMetadata.etag - newDirectoryMetadata.serverUrl = directoryItemMetadata.serverUrl + "/" + directoryItemMetadata.fileNameView - newDirectoryMetadata.account = directoryItemMetadata.account - newDirectoryMetadata.e2eEncrypted = directoryItemMetadata.e2eEncrypted - newDirectoryMetadata.favorite = directoryItemMetadata.favorite - newDirectoryMetadata.permissions = directoryItemMetadata.permissions - - database.add(newDirectoryMetadata, update: .all) - } + processDirectoryMetadatasToDelete(databaseToWriteTo: database, + existingDirectoryMetadatas: existingDirectoryMetadatas, + updatedDirectoryMetadatas: updatedDirectoryMetadatas) + + processDirectoryMetadatasToUpdate(databaseToWriteTo: database, + existingDirectoryMetadatas: existingDirectoryMetadatas, + updatedDirectoryMetadatas: updatedDirectoryMetadatas) } } catch let error { - print("Could not update directory metadatas in database, received error: %@", error) + print("Could not update directory metadatas, received error: %@", error) } } + func updateDirectoryMetadatasFromItemMetadatas(existingDirectoryMetadatas: [NextcloudDirectoryMetadataTable], updatedDirectoryItemMetadatas: [NextcloudItemMetadataTable]) { + + var updatedDirMetadatas: [NextcloudDirectoryMetadataTable] = [] + + for directoryItemMetadata in updatedDirectoryItemMetadatas { + var newDirectoryMetadata = NextcloudDirectoryMetadataTable() + let directoryOcId = directoryItemMetadata.ocId + + if let existingDirectoryMetadata = directoryMetadata(ocId: directoryOcId) { + newDirectoryMetadata = existingDirectoryMetadata + } + + newDirectoryMetadata.ocId = directoryOcId + newDirectoryMetadata.fileId = directoryItemMetadata.fileId + newDirectoryMetadata.etag = directoryItemMetadata.etag + newDirectoryMetadata.serverUrl = directoryItemMetadata.serverUrl + "/" + directoryItemMetadata.fileNameView + newDirectoryMetadata.account = directoryItemMetadata.account + newDirectoryMetadata.e2eEncrypted = directoryItemMetadata.e2eEncrypted + newDirectoryMetadata.favorite = directoryItemMetadata.favorite + newDirectoryMetadata.permissions = directoryItemMetadata.permissions + + updatedDirMetadatas.append(newDirectoryMetadata) + } + + updateDirectoryMetadatas(existingDirectoryMetadatas: existingDirectoryMetadatas, updatedDirectoryMetadatas: updatedDirMetadatas) + } + func localFileMetadataFromOcId(_ ocId: String) -> NextcloudLocalFileMetadataTable? { return ncDatabase().objects(NextcloudLocalFileMetadataTable.self).filter("ocId == %@", ocId).first } -- 2.30.2