]> dgit.raspbian.org Git - nextcloud-desktop.git/commitdiff
Fix scanning of child directories in FileProviderEnumerator
authorClaudio Cambra <claudio.cambra@nextcloud.com>
Wed, 1 Feb 2023 18:35:08 +0000 (19:35 +0100)
committerClaudio Cambra <claudio.cambra@nextcloud.com>
Fri, 12 May 2023 05:21:17 +0000 (13:21 +0800)
Signed-off-by: Claudio Cambra <claudio.cambra@nextcloud.com>
shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderEnumerator.swift
shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/NextcloudFilesDatabaseManager.swift

index c4c8e7efbd0cc2259954ee47dc6c163aa3d77521..19c6b8d3110a0672287a0bd4a302510d989c7624 100644 (file)
@@ -172,6 +172,7 @@ class FileProviderEnumerator: NSObject, NSFileProviderEnumerator {
                 return
             }
 
+            // If we have already done a 0 depth scan of this folder then we might get matching etag
             guard directoryEtag != files.first?.etag else {
                 NSLog("Fetched directory etag is same as that stored locally (serverUrl: %@ user: %@). Not fetching child items.", serverUrl, account)
                 finishReadServerUrl(serverUrl, ncKitAccount: ncKitAccount, completionHandler: completionHandler)
@@ -189,9 +190,16 @@ class FileProviderEnumerator: NSObject, NSFileProviderEnumerator {
 
                 NSLog("Starting async conversion of NKFiles for serverUrl: %@ for user: %@", serverUrl, ncKitAccount)
                 DispatchQueue.global().async {
-                    dbManager.convertNKFilesToItemMetadatas(files, account: ncKitAccount) { _, childDirectoriesMetadata, metadatas in
+                    dbManager.convertNKFilesToItemMetadatas(files, account: ncKitAccount) { directoryMetadata, childDirectoriesMetadata, metadatas in
+
+                        // We have now scanned this directory's contents, so update with etag in order to not check again if not needed
+                        dbManager.updateDirectoryMetadatasFromItemMetadatas(account: ncKitAccount, parentDirectoryServerUrl: serverUrl, updatedDirectoryItemMetadatas: [directoryMetadata], recordEtag: true)
+
                         dbManager.updateItemMetadatas(account: ncKitAccount, serverUrl: serverUrl, updatedMetadatas: metadatas)
+
+                        // Since we haven't scanned the contents of these, don't record their itemMetadata etags in the directory tables
                         dbManager.updateDirectoryMetadatasFromItemMetadatas(account: ncKitAccount, parentDirectoryServerUrl: serverUrl, updatedDirectoryItemMetadatas: childDirectoriesMetadata)
+
                         finishReadServerUrl(serverUrl, ncKitAccount: ncKitAccount, completionHandler: completionHandler)
                     }
                 }
index 5de749ed05684206859ef25a3f3a7629f68b6de6..cfdd65a601eed0c2ce0c5a8259fa323bc792d4e9 100644 (file)
@@ -286,28 +286,36 @@ class NextcloudFilesDatabaseManager : NSObject {
         }
     }
 
-    func updateDirectoryMetadatasFromItemMetadatas(account: String, parentDirectoryServerUrl: String, updatedDirectoryItemMetadatas: [NextcloudItemMetadataTable]) {
+    private func directoryMetadataFromItemMetadata(directoryItemMetadata: NextcloudItemMetadataTable, recordEtag: Bool = false) -> NextcloudDirectoryMetadataTable {
+        var newDirectoryMetadata = NextcloudDirectoryMetadataTable()
+        let directoryOcId = directoryItemMetadata.ocId
 
-        var updatedDirMetadatas: [NextcloudDirectoryMetadataTable] = []
+        if let existingDirectoryMetadata = directoryMetadata(ocId: directoryOcId) {
+            newDirectoryMetadata = existingDirectoryMetadata
+        }
 
-        for directoryItemMetadata in updatedDirectoryItemMetadatas {
-            var newDirectoryMetadata = NextcloudDirectoryMetadataTable()
-            let directoryOcId = directoryItemMetadata.ocId
+        if recordEtag {
+            newDirectoryMetadata.etag = directoryItemMetadata.etag
+        }
 
-            if let existingDirectoryMetadata = directoryMetadata(ocId: directoryOcId) {
-                newDirectoryMetadata = existingDirectoryMetadata
-            }
+        newDirectoryMetadata.ocId = directoryOcId
+        newDirectoryMetadata.fileId = directoryItemMetadata.fileId
+        newDirectoryMetadata.parentDirectoryServerUrl = directoryItemMetadata.serverUrl
+        newDirectoryMetadata.serverUrl = directoryItemMetadata.serverUrl + "/" + directoryItemMetadata.fileNameView
+        newDirectoryMetadata.account = directoryItemMetadata.account
+        newDirectoryMetadata.e2eEncrypted = directoryItemMetadata.e2eEncrypted
+        newDirectoryMetadata.favorite = directoryItemMetadata.favorite
+        newDirectoryMetadata.permissions = directoryItemMetadata.permissions
 
-            newDirectoryMetadata.ocId = directoryOcId
-            newDirectoryMetadata.fileId = directoryItemMetadata.fileId
-            newDirectoryMetadata.etag = directoryItemMetadata.etag
-            newDirectoryMetadata.parentDirectoryServerUrl = directoryItemMetadata.serverUrl
-            newDirectoryMetadata.serverUrl = directoryItemMetadata.serverUrl + "/" + directoryItemMetadata.fileNameView
-            newDirectoryMetadata.account = directoryItemMetadata.account
-            newDirectoryMetadata.e2eEncrypted = directoryItemMetadata.e2eEncrypted
-            newDirectoryMetadata.favorite = directoryItemMetadata.favorite
-            newDirectoryMetadata.permissions = directoryItemMetadata.permissions
+        return newDirectoryMetadata
+    }
+
+    func updateDirectoryMetadatasFromItemMetadatas(account: String, parentDirectoryServerUrl: String, updatedDirectoryItemMetadatas: [NextcloudItemMetadataTable], recordEtag: Bool = false) {
 
+        var updatedDirMetadatas: [NextcloudDirectoryMetadataTable] = []
+
+        for directoryItemMetadata in updatedDirectoryItemMetadatas {
+            let newDirectoryMetadata = directoryMetadataFromItemMetadata(directoryItemMetadata: directoryItemMetadata, recordEtag: recordEtag)
             updatedDirMetadatas.append(newDirectoryMetadata)
         }