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)
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)
}
}
}
}
- 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)
}