]> dgit.raspbian.org Git - nextcloud-desktop.git/commitdiff
Properly report pagination for working set enumeration
authorClaudio Cambra <claudio.cambra@nextcloud.com>
Fri, 10 Mar 2023 02:21:01 +0000 (03:21 +0100)
committerClaudio Cambra <claudio.cambra@nextcloud.com>
Fri, 12 May 2023 05:21:24 +0000 (13:21 +0800)
Signed-off-by: Claudio Cambra <claudio.cambra@nextcloud.com>
shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderEnumerator.swift

index 49961eaa3f618da55f16e89d8aa9a69499bc0271..62297a8f1cf0feb27fc57d49234169a28ed88180 100644 (file)
@@ -82,40 +82,47 @@ class FileProviderEnumerator: NSObject, NSFileProviderEnumerator {
         let dbManager = NextcloudFilesDatabaseManager.shared
 
         if enumeratedItemIdentifier == .workingSet && dbManager.anyItemMetadatasForAccount(ncAccount.ncKitAccount) {
-            NSLog("Enumerating working set for user: %@ with serverUrl: %@", ncAccount.username, serverUrl)
+            if page == NSFileProviderPage.initialPageSortedByDate as NSFileProviderPage ||
+                page == NSFileProviderPage.initialPageSortedByName as NSFileProviderPage {
 
-            let directoryMetadatas = dbManager.directoryMetadatas(account: ncAccount.ncKitAccount)
-            var allMetadatas: [NextcloudItemMetadataTable] = []
 
-            let dispatchGroup = DispatchGroup()
-            dispatchGroup.notify(queue: .main) { // Wait for all read tasks to finish
-                FileProviderEnumerator.completeEnumerationObserver(observer, ncKit: self.ncKit, numPage: 1, itemMetadatas: allMetadatas)
-            }
+                let directoryMetadatas = dbManager.directoryMetadatas(account: ncAccount.ncKitAccount)
+                var allMetadatas: [NextcloudItemMetadataTable] = []
 
-            for directoryMetadata in directoryMetadatas {
-                dispatchGroup.enter()
+                let dispatchGroup = DispatchGroup()
 
-                FileProviderEnumerator.readServerUrl(directoryMetadata.serverUrl, ncAccount: ncAccount, ncKit: ncKit) { metadatas, _, _, _, readError in
-                    guard readError == nil else {
-                        NSLog("Finishing enumeration of working set directory %@ with error %@", directoryMetadata.serverUrl, readError!.localizedDescription)
+                for directoryMetadata in directoryMetadatas {
+                    dispatchGroup.enter()
 
-                        if let nkReadError = readError as? NKError, nkReadError.errorCode == 404 {
-                            NSLog("404 error means item no longer exists. Deleting metadata and reporting as deletion without error")
-                            dbManager.deleteDirectoryAndSubdirectoriesMetadata(ocId: directoryMetadata.ocId)
+                    FileProviderEnumerator.readServerUrl(directoryMetadata.serverUrl, ncAccount: ncAccount, ncKit: ncKit) { metadatas, _, _, _, readError in
+                        guard readError == nil else {
+                            NSLog("Finishing enumeration of working set directory %@ with error %@", directoryMetadata.serverUrl, readError!.localizedDescription)
+
+                            if let nkReadError = readError as? NKError, nkReadError.errorCode == 404 {
+                                NSLog("404 error means item no longer exists. Deleting metadata and reporting as deletion without error")
+                                dbManager.deleteDirectoryAndSubdirectoriesMetadata(ocId: directoryMetadata.ocId)
+                            }
+
+                            dispatchGroup.leave()
+                            return
                         }
 
-                        dispatchGroup.leave()
-                        return
-                    }
+                        if let metadatas = metadatas {
+                            allMetadatas += metadatas
+                        } else {
+                            allMetadatas += dbManager.itemMetadatas(account: self.ncAccount.ncKitAccount, serverUrl: directoryMetadata.serverUrl)
+                        }
 
-                    if let metadatas = metadatas {
-                        allMetadatas += metadatas
-                    } else {
-                        allMetadatas += dbManager.itemMetadatas(account: self.ncAccount.ncKitAccount, serverUrl: directoryMetadata.serverUrl)
+                        dispatchGroup.leave()
                     }
 
-                    dispatchGroup.leave()
+                    dispatchGroup.wait()
                 }
+
+                FileProviderEnumerator.completeEnumerationObserver(observer, ncKit: self.ncKit, numPage: 1, itemMetadatas: allMetadatas)
+            } else {
+                NSLog("Enumerating page of working set for user: %@ with serverUrl: %@", ncAccount.username, serverUrl)
+                observer.finishEnumerating(upTo: nil)
             }
 
             return
@@ -216,7 +223,7 @@ class FileProviderEnumerator: NSObject, NSFileProviderEnumerator {
 
                 FileProviderEnumerator.readServerUrl(directoryMetadata.serverUrl, ncAccount: ncAccount, ncKit: ncKit) { _, newMetadatas, updatedMetadatas, deletedMetadatas, readError in
                     guard readError == nil else {
-                        NSLog("Finishing enumeration of changes at %@ with error %@", self.serverUrl, readError!.localizedDescription)
+                        NSLog("Finishing enumeration of changes at %@ with error %@", directoryMetadata.serverUrl, readError!.localizedDescription)
 
                         if let nkReadError = readError as? NKError, nkReadError.errorCode == 404 {
                             NSLog("404 error means item no longer exists. Deleting metadata and reporting as deletion without error")
@@ -235,23 +242,23 @@ class FileProviderEnumerator: NSObject, NSFileProviderEnumerator {
                         return
                     }
 
-                    NSLog("Finished reading serverUrl: %@ for user: %@", self.serverUrl, self.ncAccount.ncKitAccount)
+                    NSLog("Finished reading serverUrl: %@ for user: %@", directoryMetadata.serverUrl, self.ncAccount.ncKitAccount)
                     if let newMetadatas = newMetadatas {
                         allNewMetadatas += newMetadatas
                     } else {
-                        NSLog("WARNING: Nil new metadatas received for reading of changes at %@ for user: %@", self.serverUrl, self.ncAccount.ncKitAccount)
+                        NSLog("WARNING: Nil new metadatas received for reading of changes at %@ for user: %@", directoryMetadata.serverUrl, self.ncAccount.ncKitAccount)
                     }
 
                     if let updatedMetadatas = updatedMetadatas {
                         allUpdatedMetadatas += updatedMetadatas
                     } else {
-                        NSLog("WARNING: Nil updated metadatas received for reading of changes at %@ for user: %@", self.serverUrl, self.ncAccount.ncKitAccount)
+                        NSLog("WARNING: Nil updated metadatas received for reading of changes at %@ for user: %@", directoryMetadata.serverUrl, self.ncAccount.ncKitAccount)
                     }
 
                     if let deletedMetadatas = deletedMetadatas {
                         allDeletedMetadatas += deletedMetadatas
                     } else {
-                        NSLog("WARNING: Nil deleted metadatas received for reading of changes at %@ for user: %@", self.serverUrl, self.ncAccount.ncKitAccount)
+                        NSLog("WARNING: Nil deleted metadatas received for reading of changes at %@ for user: %@", directoryMetadata.serverUrl, self.ncAccount.ncKitAccount)
                     }
 
                     dispatchGroup.leave()