浏览代码

improved NCOperationSynchronization

marinofaggiana 4 年之前
父节点
当前提交
91189244d5

+ 1 - 1
iOSClient/CCGlobal.h

@@ -80,7 +80,7 @@
 
 // Database Realm
 #define k_databaseDefault                               @"nextcloud.realm"
-#define k_databaseSchemaVersion                         152
+#define k_databaseSchemaVersion                         153
 
 // Database JSON
 #define k_databaseDefaultJSON                           @"nextcloud.json"

+ 2 - 1
iOSClient/Data/NCDatabase.swift

@@ -221,7 +221,8 @@ class tableDirectory: Object {
     @objc dynamic var permissions = ""
     @objc dynamic var richWorkspace: String?
     @objc dynamic var serverUrl = ""
-    
+    @objc dynamic var synchronized: Bool = false
+
     override static func primaryKey() -> String {
         return "ocId"
     }

+ 27 - 1
iOSClient/Data/NCManageDatabase.swift

@@ -1253,6 +1253,30 @@ class NCManageDatabase: NSObject {
             NCCommunicationCommon.shared.writeLog("Could not write to database: \(error)")
         }
     }
+    
+    @objc func setDirectory(synchronized: Bool, serverUrl: String, account: String) {
+        
+        let realm = try! Realm()
+                
+        do {
+            try realm.safeWrite {
+                let result = realm.objects(tableDirectory.self).filter("account == %@ AND serverUrl == %@", account, serverUrl).first
+                result?.synchronized = synchronized
+            }
+        } catch let error {
+            NCCommunicationCommon.shared.writeLog("Could not write to database: \(error)")
+        }
+    }
+    
+    func removeDirectoriesSynchronized(serverUrl: String, account: String) {
+        
+        setDirectory(synchronized: false, serverUrl: serverUrl, account: account)
+        let metadatas = NCManageDatabase.sharedInstance.getMetadatas(predicate: NSPredicate(format: "account == %@ AND serverUrl == %@ AND directory == true", account, serverUrl))
+        for metadata in metadatas {
+            let serverUrl = metadata.serverUrl + "/" + metadata.fileName
+            setDirectory(synchronized: false, serverUrl: serverUrl, account: account)
+        }
+    }
 
     //MARK: -
     //MARK: Table e2e Encryption
@@ -1848,7 +1872,7 @@ class NCManageDatabase: NSObject {
     }
 
     @discardableResult
-    func updateMetadatas(_ metadatas: [tableMetadata], metadatasResult: [tableMetadata], addCompareLivePhoto: Bool = true, addExistsInLocal: Bool = false, addCompareEtagLocal: Bool = false) -> (metadatasUpdate: [tableMetadata], metadatasLocalUpdate: [tableMetadata]) {
+    func updateMetadatas(_ metadatas: [tableMetadata], metadatasResult: [tableMetadata], addCompareLivePhoto: Bool = true, addExistsInLocal: Bool = false, addCompareEtagLocal: Bool = false, addDirectorySynchronized: Bool = false) -> (metadatasUpdate: [tableMetadata], metadatasLocalUpdate: [tableMetadata]) {
         
         let realm = try! Realm()
         var ocIdsUdate : [String] = []
@@ -1892,6 +1916,8 @@ class NCManageDatabase: NSObject {
                         let table = realm.objects(tableDirectory.self).filter(NSPredicate(format: "ocId == %@", metadata.ocId)).first
                         if table?.etag != metadata.etag {
                             ocIdsUdate.append(metadata.ocId)
+                        } else if addDirectorySynchronized && table?.synchronized == false {
+                            ocIdsUdate.append(metadata.ocId)
                         }
                     }
                     

+ 4 - 0
iOSClient/Networking/NCNetworking.swift

@@ -1018,6 +1018,10 @@ import Queuer
             if errorCode == 0 && metadata.account == account {
                 
                 NCManageDatabase.sharedInstance.setMetadataFavorite(ocId: metadata.ocId, favorite: favorite)
+                if !favorite && metadata.directory {
+                    let serverUrl = metadata.serverUrl + "/" + metadata.fileName
+                    NCManageDatabase.sharedInstance.removeDirectoriesSynchronized(serverUrl: serverUrl, account: account)
+                }
                 
                 #if !EXTENSION
                 if favorite {

+ 60 - 35
iOSClient/Networking/NCOperationQueue.swift

@@ -261,54 +261,79 @@ class NCOperationSynchronization: ConcurrentOperation {
         } else {
             if metadata.directory {
                 
-                let serverUrlFileName = metadata.serverUrl + "/" + metadata.fileName
-                
-                NCCommunication.shared.readFileOrFolder(serverUrlFileName: serverUrlFileName, depth: "1", showHiddenFiles: CCUtility.getShowHiddenFiles()) { (account, files, responseData, errorCode, errorDescription) in
-                    
-                    if errorCode == 0 {
-                    
-                        NCManageDatabase.sharedInstance.convertNCCommunicationFilesToMetadatas(files, useMetadataFolder: true, account: account) { (metadataFolder, metadatasFolder, metadatas) in
+                let serverUrl = metadata.serverUrl + "/" + metadata.fileName
+                let directory = NCManageDatabase.sharedInstance.getTableDirectory(predicate: NSPredicate(format: "account == %@ AND serverUrl == %@", metadata.account, serverUrl))
+
+                NCCommunication.shared.readFileOrFolder(serverUrlFileName: serverUrl, depth: "0", showHiddenFiles: CCUtility.getShowHiddenFiles()) { (account, files, responseData, errorCode, errorDescription) in
+
+                    if (errorCode == 0) && (directory?.etag != files.first?.etag || directory?.synchronized == false) {
+                        
+                        NCCommunication.shared.readFileOrFolder(serverUrlFileName: serverUrl, depth: "1", showHiddenFiles: CCUtility.getShowHiddenFiles()) { (account, files, responseData, errorCode, errorDescription) in
                             
-                            let metadatasResult = NCManageDatabase.sharedInstance.getMetadatas(predicate: NSPredicate(format: "account == %@ AND serverUrl == %@ AND status == %d", account, serverUrlFileName, k_metadataStatusNormal))
+                            if errorCode == 0 {
                             
-                            if self.selector == selectorDownloadAllFile {
-                                
-                                NCManageDatabase.sharedInstance.updateMetadatas(metadatas, metadatasResult: metadatasResult)
+                                NCManageDatabase.sharedInstance.convertNCCommunicationFilesToMetadatas(files, useMetadataFolder: true, account: account) { (metadataFolder, metadatasFolder, metadatas) in
+                                    
+                                    let metadatasResult = NCManageDatabase.sharedInstance.getMetadatas(predicate: NSPredicate(format: "account == %@ AND serverUrl == %@ AND status == %d", account, serverUrl, k_metadataStatusNormal))
+                                    
+                                    if self.selector == selectorDownloadAllFile {
+                                        
+                                        NCManageDatabase.sharedInstance.updateMetadatas(metadatas, metadatasResult: metadatasResult)
 
-                                for metadata in metadatas {
-                                    if metadata.directory {
-                                        NCOperationQueue.shared.synchronizationMetadata(metadata, selector: self.selector)
+                                        for metadata in metadatas {
+                                            if metadata.directory {
+                                                NCOperationQueue.shared.synchronizationMetadata(metadata, selector: self.selector)
+                                            } else {
+                                                let localFile = NCManageDatabase.sharedInstance.getTableLocalFile(predicate: NSPredicate(format: "ocId == %@", metadata.ocId))
+                                                if localFile == nil || localFile?.etag != metadata.etag {
+                                                    NCOperationQueue.shared.download(metadata: metadata, selector: self.selector, setFavorite: false)
+                                                }
+                                            }
+                                        }
+                                        
                                     } else {
-                                        let localFile = NCManageDatabase.sharedInstance.getTableLocalFile(predicate: NSPredicate(format: "ocId == %@", metadata.ocId))
-                                        if localFile == nil || localFile?.etag != metadata.etag {
+                                    
+                                        let metadatasChanged = NCManageDatabase.sharedInstance.updateMetadatas(metadatas, metadatasResult: metadatasResult, addExistsInLocal: self.download, addCompareEtagLocal: true, addDirectorySynchronized: true)
+
+                                        for metadata in metadatasChanged.metadatasUpdate {
+                                            if metadata.directory {
+                                                NCOperationQueue.shared.synchronizationMetadata(metadata, selector: self.selector)
+                                            }
+                                        }
+                                        
+                                        for metadata in metadatasChanged.metadatasLocalUpdate {
                                             NCOperationQueue.shared.download(metadata: metadata, selector: self.selector, setFavorite: false)
                                         }
                                     }
+                                    
+                                    // Update etag directory
+                                    NCManageDatabase.sharedInstance.addDirectory(encrypted: metadataFolder.e2eEncrypted, favorite: metadataFolder.favorite, ocId: metadataFolder.ocId, fileId: metadataFolder.fileId, etag: metadataFolder.etag, permissions: metadataFolder.permissions, serverUrl: serverUrl, richWorkspace: metadataFolder.richWorkspace, account: metadataFolder.account)
+                                    // Update
+                                    NCManageDatabase.sharedInstance.setDirectory(synchronized: true, serverUrl: serverUrl, account: account)
                                 }
-                                
-                            } else {
                             
-                                let metadatasChanged = NCManageDatabase.sharedInstance.updateMetadatas(metadatas, metadatasResult: metadatasResult, addExistsInLocal: self.download, addCompareEtagLocal: true)
-
-                                for metadata in metadatasChanged.metadatasUpdate {
-                                    if metadata.directory {
-                                        NCOperationQueue.shared.synchronizationMetadata(metadata, selector: self.selector)
-                                    }
-                                }
-                                
-                                for metadata in metadatasChanged.metadatasLocalUpdate {
-                                    NCOperationQueue.shared.download(metadata: metadata, selector: self.selector, setFavorite: false)
-                                }
+                            } else if errorCode == k_CCErrorResourceNotFound && self.metadata.directory {
+                                NCManageDatabase.sharedInstance.deleteDirectoryAndSubDirectory(serverUrl: self.metadata.serverUrl, account: self.metadata.account)
+                            }
+                            
+                            self.finish()
+                        }
+                        
+                    } else {
+                        
+                        let metadatas = NCManageDatabase.sharedInstance.getMetadatas(predicate: NSPredicate(format: "account == %@ AND serverUrl == %@ AND directory == true", account, serverUrl))
+                        for metadata in metadatas {
+                            let serverUrl = metadata.serverUrl + "/" + metadata.fileName
+                            let directory = NCManageDatabase.sharedInstance.getTableDirectory(predicate: NSPredicate(format: "account == %@ AND serverUrl == %@", metadata.account, serverUrl))
+                            if directory?.synchronized == false {
+                                NCOperationQueue.shared.synchronizationMetadata(metadata, selector: self.selector)
                             }
-                            // Update etag directory
-                            NCManageDatabase.sharedInstance.addDirectory(encrypted: metadataFolder.e2eEncrypted, favorite: metadataFolder.favorite, ocId: metadataFolder.ocId, fileId: metadataFolder.fileId, etag: metadataFolder.etag, permissions: metadataFolder.permissions, serverUrl: serverUrlFileName, richWorkspace: metadataFolder.richWorkspace, account: metadataFolder.account)
                         }
-                    
-                    } else if errorCode == k_CCErrorResourceNotFound && self.metadata.directory {
-                        NCManageDatabase.sharedInstance.deleteDirectoryAndSubDirectory(serverUrl: self.metadata.serverUrl, account: self.metadata.account)
+                        
+                        self.finish()
                     }
-                    self.finish()
                 }
+                
             } else {
                 if self.download {
                     let localFile = NCManageDatabase.sharedInstance.getTableLocalFile(predicate: NSPredicate(format: "ocId == %@", metadata.ocId))