]> dgit.raspbian.org Git - nextcloud-desktop.git/commitdiff
Split up the huge NextcloudFilesDatabaseTables file into separate files for each...
authorClaudio Cambra <claudio.cambra@nextcloud.com>
Mon, 13 Mar 2023 11:43:27 +0000 (12:43 +0100)
committerClaudio Cambra <claudio.cambra@nextcloud.com>
Fri, 12 May 2023 05:21:30 +0000 (13:21 +0800)
Signed-off-by: Claudio Cambra <claudio.cambra@nextcloud.com>
shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/Database/NextcloudDirectoryMetadataTable.swift [new file with mode: 0644]
shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/Database/NextcloudFilesDatabaseTables.swift [deleted file]
shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/Database/NextcloudItemMetadataTable.swift [new file with mode: 0644]
shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/Database/NextcloudLocalFileMetadataTable.swift [new file with mode: 0644]
shell_integration/MacOSX/NextcloudIntegration/NextcloudIntegration.xcodeproj/project.pbxproj

diff --git a/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/Database/NextcloudDirectoryMetadataTable.swift b/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/Database/NextcloudDirectoryMetadataTable.swift
new file mode 100644 (file)
index 0000000..fa941fc
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2023 by Claudio Cambra <claudio.cambra@nextcloud.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ */
+
+import Foundation
+import RealmSwift
+
+class NextcloudDirectoryMetadataTable: Object {
+    func isInSameRemoteState(_ comparingMetadata: NextcloudDirectoryMetadataTable) -> Bool {
+        return comparingMetadata.etag == self.etag &&
+            comparingMetadata.e2eEncrypted == self.e2eEncrypted &&
+            comparingMetadata.favorite == self.favorite &&
+            comparingMetadata.permissions == self.permissions
+    }
+
+    @Persisted(primaryKey: true) var ocId: String
+    @Persisted var account = ""
+    @Persisted var colorFolder: String?
+    @Persisted var e2eEncrypted: Bool = false
+    @Persisted var etag = ""
+    @Persisted var favorite: Bool = false
+    @Persisted var fileId = ""
+    @Persisted var offline: Bool = false
+    @Persisted var permissions = ""
+    @Persisted var richWorkspace: String?
+    @Persisted var serverUrl = ""
+    @Persisted var parentDirectoryServerUrl = ""
+}
diff --git a/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/Database/NextcloudFilesDatabaseTables.swift b/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/Database/NextcloudFilesDatabaseTables.swift
deleted file mode 100644 (file)
index 59d759d..0000000
+++ /dev/null
@@ -1,234 +0,0 @@
-/*
- * Copyright (C) 2022 by Claudio Cambra <claudio.cambra@nextcloud.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * for more details.
- */
-
-import Foundation
-import RealmSwift
-import FileProvider
-import NextcloudKit
-
-class NextcloudItemMetadataTable: Object {
-    enum Status: Int {
-        case downloadError = -4
-        case downloading = -3
-        case inDownload = -2
-        case waitDownload = -1
-
-        case normal = 0
-
-        case waitUpload = 1
-        case inUpload = 2
-        case uploading = 3
-        case uploadError = 4
-    }
-
-    enum SharePermissions: Int {
-        case readShare = 1
-        case updateShare = 2
-        case createShare = 4
-        case deleteShare = 8
-        case shareShare = 16
-
-        case maxFileShare = 19
-        case maxFolderShare = 31
-    }
-
-    override func isEqual(_ object: Any?) -> Bool {
-        if let object = object as? NextcloudItemMetadataTable {
-            return self.fileId == object.fileId &&
-                   self.account == object.account &&
-                   self.path == object.path &&
-                   self.fileName == object.fileName
-        }
-
-        return false
-    }
-
-    func isInSameDatabaseStoreableRemoteState(_ comparingMetadata: NextcloudItemMetadataTable) -> Bool {
-        return comparingMetadata.etag == self.etag &&
-            comparingMetadata.fileNameView == self.fileNameView &&
-            comparingMetadata.date == self.date &&
-            comparingMetadata.permissions == self.permissions &&
-            comparingMetadata.hasPreview == self.hasPreview &&
-            comparingMetadata.note == self.note &&
-            comparingMetadata.lock == self.lock &&
-            comparingMetadata.sharePermissionsCollaborationServices == self.sharePermissionsCollaborationServices &&
-            comparingMetadata.favorite == self.favorite
-    }
-
-    @Persisted(primaryKey: true) var ocId: String
-    @Persisted var account = ""
-    @Persisted var assetLocalIdentifier = ""
-    @Persisted var checksums = ""
-    @Persisted var chunk: Bool = false
-    @Persisted var classFile = ""
-    @Persisted var commentsUnread: Bool = false
-    @Persisted var contentType = ""
-    @Persisted var creationDate = Date()
-    @Persisted var dataFingerprint = ""
-    @Persisted var date = Date()
-    @Persisted var directory: Bool = false
-    @Persisted var deleteAssetLocalIdentifier: Bool = false
-    @Persisted var downloadURL = ""
-    @Persisted var e2eEncrypted: Bool = false
-    @Persisted var edited: Bool = false
-    @Persisted var etag = ""
-    @Persisted var etagResource = ""
-    @Persisted var favorite: Bool = false
-    @Persisted var fileId = ""
-    @Persisted var fileName = ""
-    @Persisted var fileNameView = ""
-    @Persisted var hasPreview: Bool = false
-    @Persisted var iconName = ""
-    @Persisted var iconUrl = ""
-    @Persisted var isExtractFile: Bool = false
-    @Persisted var livePhoto: Bool = false
-    @Persisted var mountType = ""
-    @Persisted var name = "" // for unifiedSearch is the provider.id
-    @Persisted var note = ""
-    @Persisted var ownerId = ""
-    @Persisted var ownerDisplayName = ""
-    @Persisted var lock = false
-    @Persisted var lockOwner = ""
-    @Persisted var lockOwnerEditor = ""
-    @Persisted var lockOwnerType = 0
-    @Persisted var lockOwnerDisplayName = ""
-    @Persisted var lockTime: Date?
-    @Persisted var lockTimeOut: Date?
-    @Persisted var path = ""
-    @Persisted var permissions = ""
-    @Persisted var quotaUsedBytes: Int64 = 0
-    @Persisted var quotaAvailableBytes: Int64 = 0
-    @Persisted var resourceType = ""
-    @Persisted var richWorkspace: String?
-    @Persisted var serverUrl = "" // For parent directory!!
-    @Persisted var session = ""
-    @Persisted var sessionError = ""
-    @Persisted var sessionSelector = ""
-    @Persisted var sessionTaskIdentifier: Int = 0
-    @Persisted var sharePermissionsCollaborationServices: Int = 0
-    let sharePermissionsCloudMesh = List<String>() // TODO: Find a way to compare these in remote state check
-    let shareType = List<Int>()
-    @Persisted var size: Int64 = 0
-    @Persisted var status: Int = 0
-    @Persisted var subline: String?
-    @Persisted var trashbinFileName = ""
-    @Persisted var trashbinOriginalLocation = ""
-    @Persisted var trashbinDeletionTime = Date()
-    @Persisted var uploadDate = Date()
-    @Persisted var url = ""
-    @Persisted var urlBase = ""
-    @Persisted var user = ""
-    @Persisted var userId = ""
-
-    var fileExtension: String {
-        (fileNameView as NSString).pathExtension
-    }
-
-    var fileNoExtension: String {
-        (fileNameView as NSString).deletingPathExtension
-    }
-
-    var isRenameable: Bool {
-        return lock
-    }
-
-    var isPrintable: Bool {
-        if isDocumentViewableOnly {
-            return false
-        }
-        if ["application/pdf", "com.adobe.pdf"].contains(contentType) || contentType.hasPrefix("text/") || classFile == NKCommon.TypeClassFile.image.rawValue {
-            return true
-        }
-        return false
-    }
-
-    var isDocumentViewableOnly: Bool {
-        return sharePermissionsCollaborationServices == SharePermissions.readShare.rawValue &&
-            classFile == NKCommon.TypeClassFile.document.rawValue
-    }
-
-    var isCopyableInPasteboard: Bool {
-        !isDocumentViewableOnly && !directory
-    }
-
-    var isModifiableWithQuickLook: Bool {
-        if directory || isDocumentViewableOnly {
-            return false
-        }
-        return contentType == "com.adobe.pdf" || contentType == "application/pdf" || classFile == NKCommon.TypeClassFile.image.rawValue
-    }
-
-    var isSettableOnOffline: Bool {
-        return session.isEmpty && !isDocumentViewableOnly
-    }
-
-    var canOpenIn: Bool {
-        return session.isEmpty && !isDocumentViewableOnly && !directory
-    }
-
-    var isDownloadUpload: Bool {
-        return status == Status.inDownload.rawValue ||
-            status == Status.downloading.rawValue ||
-            status == Status.inUpload.rawValue ||
-            status == Status.uploading.rawValue
-    }
-
-    var isDownload: Bool {
-        status == Status.inDownload.rawValue || status == Status.downloading.rawValue
-    }
-
-    var isUpload: Bool {
-        status == Status.inUpload.rawValue || status == Status.uploading.rawValue
-    }
-
-    /// Returns false if the user is lokced out of the file. I.e. The file is locked but by somone else
-    func canUnlock(as user: String) -> Bool {
-        return !lock || (lockOwner == user && lockOwnerType == 0)
-    }
-}
-
-class NextcloudDirectoryMetadataTable: Object {
-    func isInSameRemoteState(_ comparingMetadata: NextcloudDirectoryMetadataTable) -> Bool {
-        return comparingMetadata.etag == self.etag &&
-            comparingMetadata.e2eEncrypted == self.e2eEncrypted &&
-            comparingMetadata.favorite == self.favorite &&
-            comparingMetadata.permissions == self.permissions
-    }
-
-    @Persisted(primaryKey: true) var ocId: String
-    @Persisted var account = ""
-    @Persisted var colorFolder: String?
-    @Persisted var e2eEncrypted: Bool = false
-    @Persisted var etag = ""
-    @Persisted var favorite: Bool = false
-    @Persisted var fileId = ""
-    @Persisted var offline: Bool = false
-    @Persisted var permissions = ""
-    @Persisted var richWorkspace: String?
-    @Persisted var serverUrl = ""
-    @Persisted var parentDirectoryServerUrl = ""
-}
-
-class NextcloudLocalFileMetadataTable: Object {
-    @Persisted(primaryKey: true) var ocId: String
-    @Persisted var account = ""
-    @Persisted var etag = ""
-    @Persisted var exifDate: Date?
-    @Persisted var exifLatitude = ""
-    @Persisted var exifLongitude = ""
-    @Persisted var exifLensModel: String?
-    @Persisted var favorite: Bool = false
-    @Persisted var fileName = ""
-    @Persisted var offline: Bool = false
-}
diff --git a/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/Database/NextcloudItemMetadataTable.swift b/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/Database/NextcloudItemMetadataTable.swift
new file mode 100644 (file)
index 0000000..0ac1409
--- /dev/null
@@ -0,0 +1,199 @@
+/*
+ * Copyright (C) 2023 by Claudio Cambra <claudio.cambra@nextcloud.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ */
+
+import Foundation
+import RealmSwift
+import FileProvider
+import NextcloudKit
+
+class NextcloudItemMetadataTable: Object {
+    enum Status: Int {
+        case downloadError = -4
+        case downloading = -3
+        case inDownload = -2
+        case waitDownload = -1
+
+        case normal = 0
+
+        case waitUpload = 1
+        case inUpload = 2
+        case uploading = 3
+        case uploadError = 4
+    }
+
+    enum SharePermissions: Int {
+        case readShare = 1
+        case updateShare = 2
+        case createShare = 4
+        case deleteShare = 8
+        case shareShare = 16
+
+        case maxFileShare = 19
+        case maxFolderShare = 31
+    }
+
+    override func isEqual(_ object: Any?) -> Bool {
+        if let object = object as? NextcloudItemMetadataTable {
+            return self.fileId == object.fileId &&
+                   self.account == object.account &&
+                   self.path == object.path &&
+                   self.fileName == object.fileName
+        }
+
+        return false
+    }
+
+    func isInSameDatabaseStoreableRemoteState(_ comparingMetadata: NextcloudItemMetadataTable) -> Bool {
+        return comparingMetadata.etag == self.etag &&
+            comparingMetadata.fileNameView == self.fileNameView &&
+            comparingMetadata.date == self.date &&
+            comparingMetadata.permissions == self.permissions &&
+            comparingMetadata.hasPreview == self.hasPreview &&
+            comparingMetadata.note == self.note &&
+            comparingMetadata.lock == self.lock &&
+            comparingMetadata.sharePermissionsCollaborationServices == self.sharePermissionsCollaborationServices &&
+            comparingMetadata.favorite == self.favorite
+    }
+
+    @Persisted(primaryKey: true) var ocId: String
+    @Persisted var account = ""
+    @Persisted var assetLocalIdentifier = ""
+    @Persisted var checksums = ""
+    @Persisted var chunk: Bool = false
+    @Persisted var classFile = ""
+    @Persisted var commentsUnread: Bool = false
+    @Persisted var contentType = ""
+    @Persisted var creationDate = Date()
+    @Persisted var dataFingerprint = ""
+    @Persisted var date = Date()
+    @Persisted var directory: Bool = false
+    @Persisted var deleteAssetLocalIdentifier: Bool = false
+    @Persisted var downloadURL = ""
+    @Persisted var e2eEncrypted: Bool = false
+    @Persisted var edited: Bool = false
+    @Persisted var etag = ""
+    @Persisted var etagResource = ""
+    @Persisted var favorite: Bool = false
+    @Persisted var fileId = ""
+    @Persisted var fileName = ""
+    @Persisted var fileNameView = ""
+    @Persisted var hasPreview: Bool = false
+    @Persisted var iconName = ""
+    @Persisted var iconUrl = ""
+    @Persisted var isExtractFile: Bool = false
+    @Persisted var livePhoto: Bool = false
+    @Persisted var mountType = ""
+    @Persisted var name = "" // for unifiedSearch is the provider.id
+    @Persisted var note = ""
+    @Persisted var ownerId = ""
+    @Persisted var ownerDisplayName = ""
+    @Persisted var lock = false
+    @Persisted var lockOwner = ""
+    @Persisted var lockOwnerEditor = ""
+    @Persisted var lockOwnerType = 0
+    @Persisted var lockOwnerDisplayName = ""
+    @Persisted var lockTime: Date?
+    @Persisted var lockTimeOut: Date?
+    @Persisted var path = ""
+    @Persisted var permissions = ""
+    @Persisted var quotaUsedBytes: Int64 = 0
+    @Persisted var quotaAvailableBytes: Int64 = 0
+    @Persisted var resourceType = ""
+    @Persisted var richWorkspace: String?
+    @Persisted var serverUrl = "" // For parent directory!!
+    @Persisted var session = ""
+    @Persisted var sessionError = ""
+    @Persisted var sessionSelector = ""
+    @Persisted var sessionTaskIdentifier: Int = 0
+    @Persisted var sharePermissionsCollaborationServices: Int = 0
+    let sharePermissionsCloudMesh = List<String>() // TODO: Find a way to compare these in remote state check
+    let shareType = List<Int>()
+    @Persisted var size: Int64 = 0
+    @Persisted var status: Int = 0
+    @Persisted var subline: String?
+    @Persisted var trashbinFileName = ""
+    @Persisted var trashbinOriginalLocation = ""
+    @Persisted var trashbinDeletionTime = Date()
+    @Persisted var uploadDate = Date()
+    @Persisted var url = ""
+    @Persisted var urlBase = ""
+    @Persisted var user = ""
+    @Persisted var userId = ""
+
+    var fileExtension: String {
+        (fileNameView as NSString).pathExtension
+    }
+
+    var fileNoExtension: String {
+        (fileNameView as NSString).deletingPathExtension
+    }
+
+    var isRenameable: Bool {
+        return lock
+    }
+
+    var isPrintable: Bool {
+        if isDocumentViewableOnly {
+            return false
+        }
+        if ["application/pdf", "com.adobe.pdf"].contains(contentType) || contentType.hasPrefix("text/") || classFile == NKCommon.TypeClassFile.image.rawValue {
+            return true
+        }
+        return false
+    }
+
+    var isDocumentViewableOnly: Bool {
+        return sharePermissionsCollaborationServices == SharePermissions.readShare.rawValue &&
+            classFile == NKCommon.TypeClassFile.document.rawValue
+    }
+
+    var isCopyableInPasteboard: Bool {
+        !isDocumentViewableOnly && !directory
+    }
+
+    var isModifiableWithQuickLook: Bool {
+        if directory || isDocumentViewableOnly {
+            return false
+        }
+        return contentType == "com.adobe.pdf" || contentType == "application/pdf" || classFile == NKCommon.TypeClassFile.image.rawValue
+    }
+
+    var isSettableOnOffline: Bool {
+        return session.isEmpty && !isDocumentViewableOnly
+    }
+
+    var canOpenIn: Bool {
+        return session.isEmpty && !isDocumentViewableOnly && !directory
+    }
+
+    var isDownloadUpload: Bool {
+        return status == Status.inDownload.rawValue ||
+            status == Status.downloading.rawValue ||
+            status == Status.inUpload.rawValue ||
+            status == Status.uploading.rawValue
+    }
+
+    var isDownload: Bool {
+        status == Status.inDownload.rawValue || status == Status.downloading.rawValue
+    }
+
+    var isUpload: Bool {
+        status == Status.inUpload.rawValue || status == Status.uploading.rawValue
+    }
+
+    /// Returns false if the user is lokced out of the file. I.e. The file is locked but by somone else
+    func canUnlock(as user: String) -> Bool {
+        return !lock || (lockOwner == user && lockOwnerType == 0)
+    }
+}
diff --git a/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/Database/NextcloudLocalFileMetadataTable.swift b/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/Database/NextcloudLocalFileMetadataTable.swift
new file mode 100644 (file)
index 0000000..7eda481
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2023 by Claudio Cambra <claudio.cambra@nextcloud.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ */
+
+import Foundation
+import RealmSwift
+
+class NextcloudLocalFileMetadataTable: Object {
+    @Persisted(primaryKey: true) var ocId: String
+    @Persisted var account = ""
+    @Persisted var etag = ""
+    @Persisted var exifDate: Date?
+    @Persisted var exifLatitude = ""
+    @Persisted var exifLongitude = ""
+    @Persisted var exifLensModel: String?
+    @Persisted var favorite: Bool = false
+    @Persisted var fileName = ""
+    @Persisted var offline: Bool = false
+}
index 2570a0b49d48a79d4c19939bcef9c5917bcc6e65..d540d9d37686b4d02d66f865ef1921dd6102e467 100644 (file)
                5307A6E62965C6FA001E0C6A /* NextcloudKit in Frameworks */ = {isa = PBXBuildFile; productRef = 5307A6E52965C6FA001E0C6A /* NextcloudKit */; };
                5307A6E82965DAD8001E0C6A /* NextcloudKit in Frameworks */ = {isa = PBXBuildFile; productRef = 5307A6E72965DAD8001E0C6A /* NextcloudKit */; };
                5307A6EB2965DB8D001E0C6A /* RealmSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 5307A6EA2965DB8D001E0C6A /* RealmSwift */; };
-               5307A6F029674953001E0C6A /* NextcloudFilesDatabaseTables.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5307A6EF29674953001E0C6A /* NextcloudFilesDatabaseTables.swift */; };
                5307A6F229675346001E0C6A /* NextcloudFilesDatabaseManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5307A6F129675346001E0C6A /* NextcloudFilesDatabaseManager.swift */; };
+               5318AD9129BF42FB00CBB71C /* NextcloudItemMetadataTable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5318AD9029BF42FB00CBB71C /* NextcloudItemMetadataTable.swift */; };
+               5318AD9329BF432B00CBB71C /* NextcloudDirectoryMetadataTable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5318AD9229BF432B00CBB71C /* NextcloudDirectoryMetadataTable.swift */; };
+               5318AD9529BF438F00CBB71C /* NextcloudLocalFileMetadataTable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5318AD9429BF438F00CBB71C /* NextcloudLocalFileMetadataTable.swift */; };
                5352E85B29B7BFE6002CE85C /* Progress+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5352E85A29B7BFE6002CE85C /* Progress+Extensions.swift */; };
                536EFBF7295CF58100F4CB13 /* FileProviderSocketLineProcessor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 536EFBF6295CF58100F4CB13 /* FileProviderSocketLineProcessor.swift */; };
                536EFC36295E3C1100F4CB13 /* NextcloudAccount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 536EFC35295E3C1100F4CB13 /* NextcloudAccount.swift */; };
@@ -31,7 +33,7 @@
                53903D352956184400D0B308 /* LocalSocketClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 539158B127BE891500816F56 /* LocalSocketClient.h */; settings = {ATTRIBUTES = (Public, ); }; };
                53903D37295618A400D0B308 /* LineProcessor.h in Headers */ = {isa = PBXBuildFile; fileRef = 53903D36295618A400D0B308 /* LineProcessor.h */; settings = {ATTRIBUTES = (Public, ); }; };
                539158AC27BE71A900816F56 /* FinderSyncSocketLineProcessor.m in Sources */ = {isa = PBXBuildFile; fileRef = 539158AB27BE71A900816F56 /* FinderSyncSocketLineProcessor.m */; };
-               53D056312970594F00988392 /* NextcloudFileProviderFilesUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53D056302970594F00988392 /* NextcloudFileProviderFilesUtils.swift */; };
+               53D056312970594F00988392 /* LocalFilesUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53D056302970594F00988392 /* LocalFilesUtils.swift */; };
                C2B573BA1B1CD91E00303B36 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = C2B573B91B1CD91E00303B36 /* main.m */; };
                C2B573D21B1CD94B00303B36 /* main.m in Resources */ = {isa = PBXBuildFile; fileRef = C2B573B91B1CD91E00303B36 /* main.m */; };
                C2B573DE1B1CD9CE00303B36 /* FinderSync.m in Sources */ = {isa = PBXBuildFile; fileRef = C2B573DD1B1CD9CE00303B36 /* FinderSync.m */; };
 /* End PBXCopyFilesBuildPhase section */
 
 /* Begin PBXFileReference section */
-               5307A6EF29674953001E0C6A /* NextcloudFilesDatabaseTables.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NextcloudFilesDatabaseTables.swift; sourceTree = "<group>"; };
                5307A6F129675346001E0C6A /* NextcloudFilesDatabaseManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NextcloudFilesDatabaseManager.swift; sourceTree = "<group>"; };
+               5318AD9029BF42FB00CBB71C /* NextcloudItemMetadataTable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NextcloudItemMetadataTable.swift; sourceTree = "<group>"; };
+               5318AD9229BF432B00CBB71C /* NextcloudDirectoryMetadataTable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NextcloudDirectoryMetadataTable.swift; sourceTree = "<group>"; };
+               5318AD9429BF438F00CBB71C /* NextcloudLocalFileMetadataTable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NextcloudLocalFileMetadataTable.swift; sourceTree = "<group>"; };
                5352E85A29B7BFE6002CE85C /* Progress+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Progress+Extensions.swift"; sourceTree = "<group>"; };
                536EFBF6295CF58100F4CB13 /* FileProviderSocketLineProcessor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileProviderSocketLineProcessor.swift; sourceTree = "<group>"; };
                536EFC35295E3C1100F4CB13 /* NextcloudAccount.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NextcloudAccount.swift; sourceTree = "<group>"; };
                539158AB27BE71A900816F56 /* FinderSyncSocketLineProcessor.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FinderSyncSocketLineProcessor.m; sourceTree = "<group>"; };
                539158B127BE891500816F56 /* LocalSocketClient.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = LocalSocketClient.h; sourceTree = "<group>"; };
                539158B227BEC98A00816F56 /* LocalSocketClient.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = LocalSocketClient.m; sourceTree = "<group>"; };
-               53D056302970594F00988392 /* NextcloudFileProviderFilesUtils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NextcloudFileProviderFilesUtils.swift; sourceTree = "<group>"; };
+               53D056302970594F00988392 /* LocalFilesUtils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalFilesUtils.swift; sourceTree = "<group>"; };
                C2B573B11B1CD91E00303B36 /* desktopclient.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = desktopclient.app; sourceTree = BUILT_PRODUCTS_DIR; };
                C2B573B51B1CD91E00303B36 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
                C2B573B91B1CD91E00303B36 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
 /* End PBXFrameworksBuildPhase section */
 
 /* Begin PBXGroup section */
+               5318AD8F29BF406500CBB71C /* Database */ = {
+                       isa = PBXGroup;
+                       children = (
+                               5307A6F129675346001E0C6A /* NextcloudFilesDatabaseManager.swift */,
+                               5318AD9029BF42FB00CBB71C /* NextcloudItemMetadataTable.swift */,
+                               5318AD9229BF432B00CBB71C /* NextcloudDirectoryMetadataTable.swift */,
+                               5318AD9429BF438F00CBB71C /* NextcloudLocalFileMetadataTable.swift */,
+                       );
+                       path = Database;
+                       sourceTree = "<group>";
+               };
                5352E85929B7BFB4002CE85C /* Extensions */ = {
                        isa = PBXGroup;
                        children = (
                538E396B27F4765000FA63D5 /* FileProviderExt */ = {
                        isa = PBXGroup;
                        children = (
+                               5318AD8F29BF406500CBB71C /* Database */,
                                5352E85929B7BFB4002CE85C /* Extensions */,
                                538E397027F4765000FA63D5 /* FileProviderEnumerator.swift */,
                                538E396C27F4765000FA63D5 /* FileProviderExtension.swift */,
                                538E396E27F4765000FA63D5 /* FileProviderItem.swift */,
                                536EFBF6295CF58100F4CB13 /* FileProviderSocketLineProcessor.swift */,
                                536EFC35295E3C1100F4CB13 /* NextcloudAccount.swift */,
-                               53D056302970594F00988392 /* NextcloudFileProviderFilesUtils.swift */,
-                               5307A6F129675346001E0C6A /* NextcloudFilesDatabaseManager.swift */,
-                               5307A6EF29674953001E0C6A /* NextcloudFilesDatabaseTables.swift */,
+                               53D056302970594F00988392 /* LocalFilesUtils.swift */,
                                538E397327F4765000FA63D5 /* FileProviderExt.entitlements */,
                                538E397227F4765000FA63D5 /* Info.plist */,
                        );
                        buildActionMask = 2147483647;
                        files = (
                                5352E85B29B7BFE6002CE85C /* Progress+Extensions.swift in Sources */,
-                               5307A6F029674953001E0C6A /* NextcloudFilesDatabaseTables.swift in Sources */,
                                536EFC36295E3C1100F4CB13 /* NextcloudAccount.swift in Sources */,
                                538E396D27F4765000FA63D5 /* FileProviderExtension.swift in Sources */,
+                               5318AD9329BF432B00CBB71C /* NextcloudDirectoryMetadataTable.swift in Sources */,
                                536EFBF7295CF58100F4CB13 /* FileProviderSocketLineProcessor.swift in Sources */,
+                               5318AD9529BF438F00CBB71C /* NextcloudLocalFileMetadataTable.swift in Sources */,
                                5307A6F229675346001E0C6A /* NextcloudFilesDatabaseManager.swift in Sources */,
-                               53D056312970594F00988392 /* NextcloudFileProviderFilesUtils.swift in Sources */,
+                               53D056312970594F00988392 /* LocalFilesUtils.swift in Sources */,
                                538E396F27F4765000FA63D5 /* FileProviderItem.swift in Sources */,
+                               5318AD9129BF42FB00CBB71C /* NextcloudItemMetadataTable.swift in Sources */,
                                538E397127F4765000FA63D5 /* FileProviderEnumerator.swift in Sources */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                        isa = XCRemoteSwiftPackageReference;
                        repositoryURL = "https://github.com/nextcloud/NextcloudKit";
                        requirement = {
-                               branch = "develop";
+                               branch = develop;
                                kind = branch;
                        };
                };