瀏覽代碼

Prevent duplicate uploads during reinstallations

Vishnu Mohandas 4 年之前
父節點
當前提交
b699a94b58
共有 3 個文件被更改,包括 28 次插入11 次删除
  1. 1 3
      lib/db/files_db.dart
  2. 17 6
      lib/services/sync_service.dart
  3. 10 2
      lib/utils/file_downloader.dart

+ 1 - 3
lib/db/files_db.dart

@@ -425,18 +425,16 @@ class FilesDB {
     String title,
     String deviceFolder,
     int creationTime,
-    int modificationTime,
   ) async {
     final db = await instance.database;
     final rows = await db.query(
       table,
       where: '''$columnTitle=? AND $columnDeviceFolder=? AND 
-          $columnCreationTime=? AND $columnModificationTime=?''',
+          $columnCreationTime=?''',
       whereArgs: [
         title,
         deviceFolder,
         creationTime,
-        modificationTime,
       ],
     );
     if (rows.isNotEmpty) {

+ 17 - 6
lib/services/sync_service.dart

@@ -203,12 +203,15 @@ class SyncService {
       _collectionsService.getCollectionSyncTime(collectionID),
       _diffLimit,
     );
-    if (diff.isNotEmpty) {
-      await _storeDiff(diff, collectionID);
-      _logger.info("Updated files in collection " + collectionID.toString());
+    if (diff.updatedFiles.isNotEmpty) {
+      await _storeDiff(diff.updatedFiles, collectionID);
+      _logger.info("Updated " +
+          diff.updatedFiles.length.toString() +
+          " files in collection " +
+          collectionID.toString());
       FileRepository.instance.reloadFiles();
       Bus.instance.fire(CollectionUpdatedEvent(collectionID: collectionID));
-      if (diff.length == _diffLimit) {
+      if (diff.fetchCount == _diffLimit) {
         return await _fetchEncryptedFilesDiff(collectionID);
       }
     }
@@ -289,10 +292,12 @@ class SyncService {
 
   Future _storeDiff(List<File> diff, int collectionID) async {
     for (File file in diff) {
-      final existingFiles = await _db.getMatchingFiles(file.title,
-          file.deviceFolder, file.creationTime, file.modificationTime);
+      final existingFiles = await _db.getMatchingFiles(
+          file.title, file.deviceFolder, file.creationTime);
       if (existingFiles == null) {
         // File uploaded from a different device
+        _logger.info("Could not find a matching file for " +
+            file.uploadedFileID.toString());
         file.localID = null;
         await _db.insert(file);
       } else {
@@ -303,6 +308,12 @@ class SyncService {
             existingFiles.length == 1 && existingFiles[0].collectionID == null;
         if (wasUploadedOnAPreviousInstallation) {
           file.generatedID = existingFiles[0].generatedID;
+          if (file.modificationTime != existingFiles[0].modificationTime) {
+            // File was updated since the app was uninstalled
+            _logger.info("Updated since last installation: " +
+                file.uploadedFileID.toString());
+            file.updationTime = null;
+          }
           await _db.update(file);
         } else {
           bool foundMatchingCollection = false;

+ 10 - 2
lib/utils/file_downloader.dart

@@ -18,7 +18,7 @@ class DiffFetcher {
   final _logger = Logger("FileDownloader");
   final _dio = Network.instance.getDio();
 
-  Future<List<File>> getEncryptedFilesDiff(
+  Future<Diff> getEncryptedFilesDiff(
       int collectionID, int sinceTime, int limit) async {
     return _dio
         .get(
@@ -75,10 +75,18 @@ class DiffFetcher {
               file.applyMetadata(metadata);
               files.add(file);
             }
+            return Diff(files, diff.length);
           } else {
             Bus.instance.fire(RemoteSyncEvent(false));
+            return Diff(List<File>(), 0);
           }
-          return files;
         });
   }
 }
+
+class Diff {
+  final List<File> updatedFiles;
+  final int fetchCount;
+
+  Diff(this.updatedFiles, this.fetchCount);
+}