@@ -240,7 +240,12 @@ public final class FilesDatabaseManager: Sendable {
240240 deletedMetadatas. append ( metadataToDelete)
241241
242242 Self . logger. debug (
243- " Deleting item metadata during update. ocID: \( existingMetadata. ocId, privacy: . public) , etag: \( existingMetadata. etag, privacy: . public) , fileName: \( existingMetadata. fileName, privacy: . public) "
243+ """
244+ Deleting item metadata during update.
245+ ocID: \( existingMetadata. ocId, privacy: . public)
246+ etag: \( existingMetadata. etag, privacy: . public)
247+ fileName: \( existingMetadata. fileName, privacy: . public) "
248+ """
244249 )
245250 }
246251
@@ -336,24 +341,48 @@ public final class FilesDatabaseManager: Sendable {
336341 //
337342 // - the ones that do exist remotely still are either the same or have been updated
338343 // - the ones that don't have been deleted
344+ var cleanServerUrl = serverUrl
345+ if cleanServerUrl. last == " / " {
346+ cleanServerUrl. removeLast ( )
347+ }
339348 let existingMetadatas = database
340349 . objects ( RealmItemMetadata . self)
341- . where { $0. account == account && $0. serverUrl == serverUrl && $0. uploaded }
350+ . where {
351+ // Don't worry — root will be updated at the end of this method if is the target
352+ $0. ocId != NSFileProviderItemIdentifier . rootContainer. rawValue &&
353+ $0. account == account &&
354+ $0. serverUrl == cleanServerUrl &&
355+ $0. uploaded
356+ }
357+
358+ var updatedChildMetadatas = updatedMetadatas
359+
360+ let readTargetMetadata : SendableItemMetadata ?
361+ if let targetMetadata = updatedMetadatas. first {
362+ if targetMetadata. directory {
363+ readTargetMetadata = updatedChildMetadatas. removeFirst ( )
364+ } else {
365+ readTargetMetadata = targetMetadata
366+ }
367+ } else {
368+ readTargetMetadata = nil
369+ }
342370
343371 // NOTE: These metadatas are managed -- be careful!
344372 let metadatasToDelete = processItemMetadatasToDelete (
345373 existingMetadatas: existingMetadatas,
346- updatedMetadatas: updatedMetadatas)
374+ updatedMetadatas: updatedChildMetadatas
375+ )
347376 let metadatasToDeleteCopy = metadatasToDelete. map { SendableItemMetadata ( value: $0) }
348377
349378 let metadatasToChange = processItemMetadatasToUpdate (
350379 existingMetadatas: existingMetadatas,
351- updatedMetadatas: updatedMetadatas ,
380+ updatedMetadatas: updatedChildMetadatas ,
352381 keepExistingDownloadState: keepExistingDownloadState
353382 )
354383
355384 var metadatasToUpdate = metadatasToChange. updatedMetadatas
356- let metadatasToCreate = metadatasToChange. newMetadatas
385+ var metadatasToCreate = metadatasToChange. newMetadatas
357386 let directoriesNeedingRename = metadatasToChange. directoriesNeedingRename
358387
359388 for metadata in directoriesNeedingRename {
@@ -366,6 +395,26 @@ public final class FilesDatabaseManager: Sendable {
366395 }
367396 }
368397
398+ if var readTargetMetadata {
399+ if let existing = itemMetadata ( ocId: readTargetMetadata. ocId) {
400+ if existing. status == Status . normal. rawValue,
401+ !existing. isInSameDatabaseStoreableRemoteState ( readTargetMetadata)
402+ {
403+ Self . logger. info ( " Depth 1 read target changed: \( readTargetMetadata. ocId) " )
404+ if keepExistingDownloadState {
405+ readTargetMetadata. downloaded = existing. downloaded
406+ }
407+ if readTargetMetadata. directory {
408+ readTargetMetadata. visitedDirectory = true
409+ }
410+ metadatasToUpdate. insert ( readTargetMetadata, at: 0 )
411+ }
412+ } else {
413+ Self . logger. info ( " Depth 1 read target is new: \( readTargetMetadata. ocId) " )
414+ metadatasToCreate. insert ( readTargetMetadata, at: 0 )
415+ }
416+ }
417+
369418 try database. write {
370419 database. delete ( metadatasToDelete)
371420 database. add ( metadatasToUpdate. map { RealmItemMetadata ( value: $0) } , update: . modified)
@@ -463,6 +512,7 @@ public final class FilesDatabaseManager: Sendable {
463512 trashbinFileName: \( metadata. trashbinFileName, privacy: . public)
464513 downloaded: \( metadata. downloaded, privacy: . public)
465514 uploaded: \( metadata. uploaded, privacy: . public)
515+ visitedDirectory: \( metadata. visitedDirectory, privacy: . public)
466516 """
467517 )
468518 }
@@ -601,4 +651,13 @@ public final class FilesDatabaseManager: Sendable {
601651 }
602652 return NSFileProviderItemIdentifier ( parentMetadata. ocId)
603653 }
654+
655+ public func materialisedItemMetadatas( account: String ) -> [ SendableItemMetadata ] {
656+ itemMetadatas
657+ . where {
658+ $0. account == account &&
659+ ( ( $0. directory && $0. visitedDirectory) || ( !$0. directory && $0. downloaded) )
660+ }
661+ . toUnmanagedResults ( )
662+ }
604663}
0 commit comments