Browse Source

change DB and Creating image cache #933

marinofaggiana 5 years ago
parent
commit
36c80a96dd

+ 1 - 1
File Provider Extension/FileProviderExtension+Actions.swift

@@ -132,7 +132,7 @@ extension FileProviderExtension {
                 
                 if metadataFrom.directory {
                     NCManageDatabase.sharedInstance.deleteDirectoryAndSubDirectory(serverUrl: serverUrlFrom, account: account!)
-                    _ = NCManageDatabase.sharedInstance.addDirectory(encrypted: false, favorite: false, ocId: nil, permissions: nil, serverUrl: serverUrlTo, account: account!)
+                    NCManageDatabase.sharedInstance.renameDirectory(ocId: ocIdFrom, serverUrl: serverUrlTo)                    
                 }
                 
                 NCManageDatabase.sharedInstance.moveMetadata(ocId: ocIdFrom, serverUrlTo: serverUrlTo)

+ 1 - 1
iOSClient/CCGlobal.h

@@ -82,7 +82,7 @@
 
 // Database Realm
 #define k_databaseDefault                               @"nextcloud.realm"
-#define k_databaseSchemaVersion                         74
+#define k_databaseSchemaVersion                         77
 
 // Intro selector
 #define k_intro_login                                   0

+ 3 - 6
iOSClient/Database/NCDatabase.swift

@@ -228,7 +228,6 @@ class tableDirectory: Object {
     
     @objc dynamic var account = ""
     @objc dynamic var dateReadDirectory: NSDate? = nil
-    @objc dynamic var directoryID = ""
     @objc dynamic var e2eEncrypted: Bool = false
     @objc dynamic var etag = ""
     @objc dynamic var favorite: Bool = false
@@ -239,7 +238,7 @@ class tableDirectory: Object {
     @objc dynamic var serverUrl = ""
     
     override static func primaryKey() -> String {
-        return "directoryID"
+        return "ocId"
     }
 }
 
@@ -339,7 +338,6 @@ class tableMedia: Object {
     @objc dynamic var ownerId = ""
     @objc dynamic var ownerDisplayName = ""
     @objc dynamic var permissions = ""
-    @objc dynamic var primaryKey = ""
     @objc dynamic var quotaUsedBytes: Double = 0
     @objc dynamic var quotaAvailableBytes: Double = 0
     @objc dynamic var resourceType = ""
@@ -357,7 +355,7 @@ class tableMedia: Object {
     @objc dynamic var url = ""
     
     override static func primaryKey() -> String {
-        return "primaryKey"
+        return "ocId"
     }
 }
 
@@ -382,7 +380,6 @@ class tableMetadata: Object {
     @objc dynamic var ownerId = ""
     @objc dynamic var ownerDisplayName = ""
     @objc dynamic var permissions = ""
-    @objc dynamic var primaryKey = ""
     @objc dynamic var quotaUsedBytes: Double = 0
     @objc dynamic var quotaAvailableBytes: Double = 0
     @objc dynamic var resourceType = ""
@@ -400,7 +397,7 @@ class tableMetadata: Object {
     @objc dynamic var url = ""
 
     override static func primaryKey() -> String {
-        return "primaryKey"
+        return "ocId"
     }
 }
 

+ 30 - 30
iOSClient/Database/NCManageDatabase.swift

@@ -48,17 +48,6 @@ class NCManageDatabase: NSObject {
                     migration.deleteData(forType: tableDirectory.className())
                 }
                 
-                if oldSchemaVersion < 54 {
-                    /*
-                    migration.enumerateObjects(ofType: tableMetadata.className()) { oldObject, newObject in
-                        newObject!["primaryKey"] = (oldObject!["account"] as! String) + (oldObject!["fileID"] as! String)
-                    }
-                    migration.enumerateObjects(ofType: tableMedia.className()) { oldObject, newObject in
-                        newObject!["primaryKey"] = (oldObject!["account"] as! String) + (oldObject!["fileID"] as! String)
-                    }
-                    */
-                }
-                
                 if oldSchemaVersion < 61 {
                     migration.deleteData(forType: tableShare.className())
                 }
@@ -87,11 +76,18 @@ class NCManageDatabase: NSObject {
                     migration.deleteData(forType: tableComments.className())
                     migration.deleteData(forType: tableDirectory.className())
                     migration.deleteData(forType: tableMetadata.className())
+                    migration.deleteData(forType: tableMedia.className())
                     migration.deleteData(forType: tableE2eEncryptionLock.className())
                     migration.deleteData(forType: tableTag.className())
                     migration.deleteData(forType: tableTrash.className())
                 }
                 
+                if oldSchemaVersion < 77 {
+                    migration.deleteData(forType: tableDirectory.className())
+                    migration.deleteData(forType: tableMetadata.className())
+                    migration.deleteData(forType: tableMedia.className())
+                }
+                
             }, shouldCompactOnLaunch: { totalBytes, usedBytes in
                 
                 // totalBytes refers to the size of the file on disk in bytes (data + free space)
@@ -1063,26 +1059,17 @@ class NCManageDatabase: NSObject {
     //MARK: -
     //MARK: Table Directory
     
-    @objc func addDirectory(encrypted: Bool, favorite: Bool, ocId: String?, permissions: String?, serverUrl: String, account: String) -> tableDirectory? {
+    @objc func addDirectory(encrypted: Bool, favorite: Bool, ocId: String, permissions: String?, serverUrl: String, account: String) -> tableDirectory? {
         
         let realm = try! Realm()
         realm.beginWrite()
         
-        var addObject = tableDirectory()
-        
-        let result = realm.objects(tableDirectory.self).filter("account == %@ AND serverUrl == %@", account, serverUrl).first
-        if result != nil {
-            addObject = result!
-        } else {
-            addObject.directoryID = CCUtility.createDirectoyID(fromAccount: account, serverUrl: serverUrl)
-        }
+        let addObject = tableDirectory()
         
+        addObject.ocId = ocId
         addObject.account = account
         addObject.e2eEncrypted = encrypted
         addObject.favorite = favorite
-        if let ocId = ocId {
-            addObject.ocId = ocId
-        }
         if let permissions = permissions {
             addObject.permissions = permissions
         }
@@ -1149,7 +1136,6 @@ class NCManageDatabase: NSObject {
                 if let serverUrlTo = serverUrlTo {
                     directory.serverUrl = serverUrlTo
                 }
-                directory.directoryID = CCUtility.createDirectoyID(fromAccount: account, serverUrl: directory.serverUrl)
                 
                 realm.add(directory, update: .all)
             }
@@ -1228,6 +1214,26 @@ class NCManageDatabase: NSObject {
         }
     }
     
+    @objc func renameDirectory(ocId: String, serverUrl: String) {
+        
+        let realm = try! Realm()
+        
+        realm.beginWrite()
+        
+        guard let result = realm.objects(tableDirectory.self).filter("ocId == %@", ocId).first else {
+            realm.cancelWrite()
+            return
+        }
+        
+        result.serverUrl = serverUrl
+        
+        do {
+            try realm.commitWrite()
+        } catch let error {
+            print("[LOG] Could not write to database: ", error)
+        }
+    }
+    
     @objc func setClearAllDateReadDirectory() {
         
         let realm = try! Realm()
@@ -1727,9 +1733,6 @@ class NCManageDatabase: NSObject {
             return nil
         }
         
-        // create primaryKey
-        metadata.primaryKey = metadata.account + metadata.ocId
-        
         let serverUrl = metadata.serverUrl
         let account = metadata.account
         
@@ -1762,9 +1765,6 @@ class NCManageDatabase: NSObject {
         do {
             try realm.write {
                 for metadata in metadatas {
-                    // create primaryKey
-                    metadata.primaryKey = metadata.account + metadata.ocId
-                     
                     directoryToClearDate[metadata.serverUrl] = metadata.account
                     realm.add(metadata, update: .all)
                 }

+ 41 - 23
iOSClient/Main/NCMainCommon.swift

@@ -224,22 +224,8 @@ class NCMainCommon: NSObject, PhotoEditorDelegate, NCAudioRecorderViewController
     
     func collectionViewCellForItemAt(_ indexPath: IndexPath, collectionView: UICollectionView, cell: UICollectionViewCell, metadata: tableMetadata, metadataFolder: tableMetadata?, serverUrl: String, isEditMode: Bool, selectocId: [String], autoUploadFileName: String, autoUploadDirectory: String, hideButtonMore: Bool, downloadThumbnail: Bool, shares: [tableShare]?, source: UIViewController) {
         
-        var image: UIImage?
-        var isImagePreviewLoaded = false
         var tableShare: tableShare?
         
-        // Image Preview
-        if FileManager().fileExists(atPath: CCUtility.getDirectoryProviderStorageIconOcId(metadata.ocId, fileNameView: metadata.fileName)) {
-            image = UIImage.init(contentsOfFile: CCUtility.getDirectoryProviderStorageIconOcId(metadata.ocId, fileNameView: metadata.fileName))
-            isImagePreviewLoaded = true
-        } else {
-            if metadata.iconName.count > 0 {
-                image = UIImage.init(named: metadata.iconName)
-            } else {
-                image = UIImage.init(named: "file")
-            }
-        }
-        
         // Share
         if shares != nil {
             for share in shares! {
@@ -315,7 +301,18 @@ class NCMainCommon: NSObject, PhotoEditorDelegate, NCAudioRecorderViewController
                 
             } else {
                 
-                cell.imageItem.image = image
+                if FileManager().fileExists(atPath: CCUtility.getDirectoryProviderStorageIconOcId(metadata.ocId, fileNameView: metadata.fileName)) {
+                    NCUtility.sharedInstance.loadImage(ocId: metadata.ocId, fileNameView: metadata.fileNameView) { (image) in
+                        cell.imageItem.image = image
+                    }
+                } else {
+                    if metadata.iconName.count > 0 {
+                        cell.imageItem.image = UIImage.init(named: metadata.iconName)
+                    } else {
+                        cell.imageItem.image = UIImage.init(named: "file")
+                    }
+                }
+                
                 cell.labelInfo.text = CCUtility.dateDiff(metadata.date as Date) + ", " + CCUtility.transformedSize(metadata.size)
                 
                 // image Local
@@ -437,10 +434,16 @@ class NCMainCommon: NSObject, PhotoEditorDelegate, NCAudioRecorderViewController
                 
             } else {
                 
-                cell.imageItem.image = image
-                if isImagePreviewLoaded == false {
-                    let width = cell.imageItem.image!.size.width * 2
-                    cell.imageItem.image = NCUtility.sharedInstance.resizeImage(image: image!, newWidth: width)
+                if FileManager().fileExists(atPath: CCUtility.getDirectoryProviderStorageIconOcId(metadata.ocId, fileNameView: metadata.fileName)) {
+                    NCUtility.sharedInstance.loadImage(ocId: metadata.ocId, fileNameView: metadata.fileNameView) { (image) in
+                        cell.imageItem.image = image
+                    }
+                } else {
+                    if metadata.iconName.count > 0 {
+                        cell.imageItem.image = UIImage.init(named: metadata.iconName)
+                    } else {
+                        cell.imageItem.image = UIImage.init(named: "file")
+                    }
                 }
                 
                 // image Local
@@ -477,8 +480,19 @@ class NCMainCommon: NSObject, PhotoEditorDelegate, NCAudioRecorderViewController
             cell.imageStatus.image = nil
             cell.imageLocal.image = nil
             cell.imageFavorite.image = nil
-            cell.imageItem.image = image
-          
+            
+            if FileManager().fileExists(atPath: CCUtility.getDirectoryProviderStorageIconOcId(metadata.ocId, fileNameView: metadata.fileName)) {
+                NCUtility.sharedInstance.loadImage(ocId: metadata.ocId, fileNameView: metadata.fileNameView) { (image) in
+                    cell.imageItem.image = image
+                }
+            } else {
+                if metadata.iconName.count > 0 {
+                    cell.imageItem.image = UIImage.init(named: metadata.iconName)
+                } else {
+                    cell.imageItem.image = UIImage.init(named: "file")
+                }
+            }
+            
             // image Local
             let tableLocalFile = NCManageDatabase.sharedInstance.getTableLocalFile(predicate: NSPredicate(format: "ocId == %@", metadata.ocId))
             if tableLocalFile != nil && CCUtility.fileProviderStorageExists(metadata.ocId, fileNameView: metadata.fileNameView) {
@@ -600,7 +614,9 @@ class NCMainCommon: NSObject, PhotoEditorDelegate, NCAudioRecorderViewController
                 
                 // File Image
                 if iconFileExists {
-                    cell.file.image = UIImage.init(contentsOfFile: CCUtility.getDirectoryProviderStorageIconOcId(metadata.ocId, fileNameView: metadata.fileNameView))
+                    NCUtility.sharedInstance.loadImage(ocId: metadata.ocId, fileNameView: metadata.fileNameView) { (image) in
+                        cell.file.image = image
+                    }
                 } else {
                     if metadata.iconName.count > 0 {
                         cell.file.image = UIImage.init(named: metadata.iconName)
@@ -737,7 +753,9 @@ class NCMainCommon: NSObject, PhotoEditorDelegate, NCAudioRecorderViewController
             let iconFileExists = FileManager.default.fileExists(atPath: CCUtility.getDirectoryProviderStorageIconOcId(metadata.ocId, fileNameView: metadata.fileNameView))
 
             if iconFileExists {
-                cell.file.image = UIImage.init(contentsOfFile: CCUtility.getDirectoryProviderStorageIconOcId(metadata.ocId, fileNameView: metadata.fileNameView))
+                NCUtility.sharedInstance.loadImage(ocId: metadata.ocId, fileNameView: metadata.fileNameView) { (image) in
+                    cell.file.image = image
+                }
             } else {
                 if metadata.iconName.count > 0 {
                     cell.file.image = UIImage.init(named: metadata.iconName)

+ 0 - 1
iOSClient/Utility/CCUtility.h

@@ -252,7 +252,6 @@
 + (tableMetadata *)insertFileSystemInMetadata:(tableMetadata *)metadata;
 + (NSString *)insertTypeFileIconName:(NSString *)fileNameView metadata:(tableMetadata *)metadata;
 
-+ (NSString *)createDirectoyIDFromAccount:(NSString *)account serverUrl:(NSString *)serverUrl;
 + (NSString *)createMetadataIDFromAccount:(NSString *)account serverUrl:(NSString *)serverUrl fileNameView:(NSString *)fileNameView directory:(BOOL)directory;
 
 // ===== Third parts =====

+ 3 - 9
iOSClient/Utility/CCUtility.m

@@ -1395,7 +1395,6 @@
     metadata.ocId = ocId;
     metadata.fileName = fileName;
     metadata.fileNameView = fileName;
-    metadata.primaryKey = [account stringByAppendingString:ocId];
     metadata.serverUrl = serverUrl;
     metadata.size = size;
     metadata.status = status;
@@ -1439,7 +1438,6 @@
     metadata.ownerId = itemDto.ownerId;
     metadata.ownerDisplayName = itemDto.ownerDisplayName;
     metadata.permissions = itemDto.permissions;
-    metadata.primaryKey = [account stringByAppendingString:itemDto.ocId];
     metadata.quotaUsedBytes = itemDto.quotaUsedBytes;
     metadata.quotaAvailableBytes = itemDto.quotaAvailableBytes;
     metadata.resourceType = itemDto.resourceType;
@@ -1574,7 +1572,7 @@
     return metadata;
 }
 
-+ (NSString *)createDirectoyIDFromAccount:(NSString *)account serverUrl:(NSString *)serverUrl
++ (NSString *)createMetadataIDFromAccount:(NSString *)account serverUrl:(NSString *)serverUrl fileNameView:(NSString *)fileNameView directory:(BOOL)directory
 {
     NSArray *arrayForbiddenCharacters = [NSArray arrayWithObjects:@"\\",@"<",@">",@":",@"\"",@"|",@"?",@"*",@"/", nil];
     
@@ -1586,12 +1584,8 @@
         serverUrl = [serverUrl stringByReplacingOccurrencesOfString:currentCharacter withString:@""];
     }
     
-    return [[account stringByAppendingString:serverUrl] lowercaseString];
-}
-
-+ (NSString *)createMetadataIDFromAccount:(NSString *)account serverUrl:(NSString *)serverUrl fileNameView:(NSString *)fileNameView directory:(BOOL)directory
-{
-    NSString *metadataID =  [[[self createDirectoyIDFromAccount:account serverUrl:serverUrl] stringByAppendingString:fileNameView] lowercaseString];
+    NSString *uniqueID = [[account stringByAppendingString:serverUrl] lowercaseString];
+    NSString *metadataID =  [[uniqueID stringByAppendingString:fileNameView] lowercaseString];
     
     if (directory) {
         return [metadataID stringByAppendingString:@"-dir"];

+ 22 - 1
iOSClient/Utility/NCUtility.swift

@@ -32,6 +32,7 @@ class NCUtility: NSObject {
     }()
     
     let activityIndicator = UIActivityIndicatorView(style: .whiteLarge)
+    let cache = NSCache<NSString, UIImage>()
     
     @objc func createFileName(_ fileName: String, serverUrl: String, account: String) -> String {
         
@@ -411,5 +412,25 @@ class NCUtility: NSObject {
         
         return imageAvatar
     }
+    
+    func loadImage(ocId: String, fileNameView: String, completion: @escaping (UIImage?) -> Void) {
+        
+        if let image = cache.object(forKey: ocId as NSString) {
+            completion(image)
+            return
+        }
+        
+        DispatchQueue.global(qos: .background).async { [weak self] in
+            
+            let loadedImage = UIImage(contentsOfFile: CCUtility.getDirectoryProviderStorageIconOcId(ocId, fileNameView: fileNameView))
+            
+            DispatchQueue.main.async {
+                
+                if let loadedImage = loadedImage {
+                    self?.cache.setObject(loadedImage, forKey: ocId as NSString)
+                }
+                completion(loadedImage)
+            }
+        }
+    }
 }
-