Skip to content

Commit cf7fec3

Browse files
authored
Merge pull request #93 from nextcloud/feature/fast-enumeration-try2
Only enumerate materialised items in working set
2 parents 26c6cac + d661817 commit cf7fec3

19 files changed

Lines changed: 938 additions & 906 deletions

Sources/NextcloudFileProviderKit/Database/FilesDatabaseManager.swift

Lines changed: 64 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)