Skip to content

Commit 64c9e41

Browse files
camilasani2h3
authored andcommitted
feat: search db for matching original filename based on the lock filename.
Signed-off-by: Camila Ayres <hello@camilasan.com>
1 parent 37b1a3d commit 64c9e41

3 files changed

Lines changed: 52 additions & 9 deletions

File tree

Sources/NextcloudFileProviderKit/Database/FilesDatabaseManager.swift

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -661,4 +661,20 @@ public final class FilesDatabaseManager: Sendable {
661661

662662
return (updated, deleted)
663663
}
664+
665+
public func itemsMetadataFromPattern(
666+
pattern: String
667+
) -> [SendableItemMetadata]? {
668+
logger.debug("Trying to find files matching pattern \(pattern)")
669+
let results = itemMetadatas.where { $0.fileName.ends(with: pattern) && !$0.directory }
670+
guard !results.isEmpty else {
671+
logger.debug("Could not find files matching pattern \(pattern)")
672+
return nil
673+
}
674+
675+
let filesMetadata = results.toUnmanagedResults()
676+
logger.debug("Found \(filesMetadata.count) file(s) that match \(pattern) metadata: \(filesMetadata)")
677+
return filesMetadata
678+
}
679+
664680
}

Sources/NextcloudFileProviderKit/Item/Item+LockFile.swift

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ extension Item {
7878

7979
logger.info("Item to create is a lock file. Will attempt to lock the associated file on the server.", [.name: itemTemplate.filename])
8080

81-
guard let targetFileName = originalFileName(fromLockFileName: itemTemplate.filename) else {
81+
guard let targetFileName = originalFileName(fromLockFileName: itemTemplate.filename, dbManager: dbManager) else {
8282
logger.error("Will not lock the target file because it could not be determined based on the lock file name.", [.name: itemTemplate.filename])
8383
return (nil, nil)
8484
}
@@ -235,8 +235,9 @@ extension Item {
235235

236236
dbManager.deleteItemMetadata(ocId: metadata.ocId)
237237

238-
guard let originalFileName = originalFileName(fromLockFileName: metadata.fileName) else {
238+
guard let originalFileName = originalFileName(fromLockFileName: metadata.fileName, dbManager: dbManager) else {
239239
logger.error("Could not get original filename from lock file filename so will not unlock target file.", [.name: self.metadata.fileName])
240+
240241
return nil
241242
}
242243

Sources/NextcloudFileProviderKit/Utilities/LocalFiles.swift

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -51,23 +51,49 @@ public func isLockFileName(_ filename: String) -> Bool {
5151
///
5252
/// Example for Microsoft Office: `MyDoc.docx` is extracted from `~$MyDoc.docx`.
5353
/// Example for LibreOffice: `MyDoc.odt` is extracted from `.~lock.MyDoc.odt#`.
54-
///
54+
/// Filename with <8 characters: Test.docx → lock file: ~$Test.docx
55+
/// Filename with >8 characters: Document.docx → lock file: ~$cument.docx
56+
/// Filename sandbox-style temporary naming like: Welcome123456.doc.sb-d215eb53-IBAwfU
5557
/// - Returns: Either the original file name parsed from the given lock file name or `nil`, if it is not a recognized lock file format.
5658
///
57-
public func originalFileName(fromLockFileName lockFilename: String) -> String? {
59+
public func originalFileName(fromLockFileName lockFilename: String, dbManager: FilesDatabaseManager) -> String? {
60+
let logger = FileProviderLogger(category: "localfileutils", log: dbManager.logger.log)
61+
logger.debug("Called originalFileName with lock filename: \(lockFilename)")
62+
63+
var targetFilePattern = lockFilename
5864
if lockFilename.hasPrefix("~$") {
59-
// Remove the "~$" prefix
6065
let index = lockFilename.index(lockFilename.startIndex, offsetBy: 2)
61-
return String(lockFilename[index...])
66+
targetFilePattern = String(lockFilename[index...])
6267
}
6368

6469
if lockFilename.hasPrefix(".~lock.") && lockFilename.hasSuffix("#") {
65-
// Strip the prefix and suffix
6670
let start = lockFilename.index(lockFilename.startIndex, offsetBy: 7)
6771
let end = lockFilename.index(before: lockFilename.endIndex)
68-
return String(lockFilename[start..<end])
72+
targetFilePattern = String(lockFilename[start..<end])
6973
}
74+
75+
if let sbRange = lockFilename.range(of: ".sb-") {
76+
targetFilePattern = String(lockFilename[..<sbRange.lowerBound])
77+
}
78+
79+
logger.debug("Target filename is: \(targetFilePattern)")
7080

71-
// Not a recognized lock file
81+
guard let itemsMatchingMetadata = dbManager.itemsMetadataFromPattern(pattern: targetFilePattern) else {
82+
logger.debug("Could not find files in db matching pattern: \(targetFilePattern)")
83+
return targetFilePattern
84+
}
85+
86+
for file in itemsMatchingMetadata {
87+
let potentialOriginalFile = file.fileName
88+
89+
if lockFilename == potentialOriginalFile {
90+
logger.debug("Lock filename \(lockFilename) is the same as filename found in db \(potentialOriginalFile)")
91+
continue;
92+
}
93+
94+
logger.debug("Matched lock filename \(lockFilename) to original filename \(potentialOriginalFile)")
95+
return potentialOriginalFile
96+
}
97+
7298
return nil
7399
}

0 commit comments

Comments
 (0)