]> dgit.raspbian.org Git - nextcloud-desktop.git/commitdiff
Refactor updateDirectoryMetadatas in the database manager
authorClaudio Cambra <claudio.cambra@nextcloud.com>
Thu, 26 Jan 2023 17:09:19 +0000 (18:09 +0100)
committerClaudio Cambra <claudio.cambra@nextcloud.com>
Fri, 12 May 2023 05:21:14 +0000 (13:21 +0800)
Signed-off-by: Claudio Cambra <claudio.cambra@nextcloud.com>
shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/NextcloudFilesDatabaseManager.swift

index 729ac9df5f6cc97a3d7a3396fa000330382ab01a..9a83996f0a07711d61315a0234cef45938e91f6d 100644 (file)
@@ -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
     }