From: Claudio Cambra Date: Wed, 1 Feb 2023 18:35:08 +0000 (+0100) Subject: Fix scanning of child directories in FileProviderEnumerator X-Git-Tag: archive/raspbian/3.16.7-1_deb13u1+rpi1~1^2~96^2^2~55^2~235 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=3be08bb15ead2b78c0d9ecdb89ea40a398efc1d8;p=nextcloud-desktop.git Fix scanning of child directories in FileProviderEnumerator Signed-off-by: Claudio Cambra --- diff --git a/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderEnumerator.swift b/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderEnumerator.swift index c4c8e7efb..19c6b8d31 100644 --- a/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderEnumerator.swift +++ b/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderEnumerator.swift @@ -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) } } diff --git a/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/NextcloudFilesDatabaseManager.swift b/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/NextcloudFilesDatabaseManager.swift index 5de749ed0..cfdd65a60 100644 --- a/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/NextcloudFilesDatabaseManager.swift +++ b/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/NextcloudFilesDatabaseManager.swift @@ -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) }