Переглянути джерело

Merge pull request #59 from ente-io/fix_duplicate_files

Vishnu Mohandas 3 роки тому
батько
коміт
d4a4d07678
1 змінених файлів з 24 додано та 0 видалено
  1. 24 0
      lib/db/files_db.dart

+ 24 - 0
lib/db/files_db.dart

@@ -68,6 +68,7 @@ class FilesDB {
     ...addIndices(),
     ...addIndices(),
     ...addMetadataColumns(),
     ...addMetadataColumns(),
     ...addMagicMetadataColumns(),
     ...addMagicMetadataColumns(),
+    ...addUniqueConstraintOnCollectionFiles(),
   ];
   ];
 
 
   final dbConfig = MigrationConfig(
   final dbConfig = MigrationConfig(
@@ -252,6 +253,29 @@ class FilesDB {
     ];
     ];
   }
   }
 
 
+  static List<String> addUniqueConstraintOnCollectionFiles() {
+    return [
+      '''
+      DELETE from $table where ($columnCollectionID, $columnUploadedFileID) IN 
+      (SELECT $columnCollectionID, $columnUploadedFileID from $table WHERE 
+        $columnCollectionID is not NULL AND $columnUploadedFileID is NOT NULL
+        AND $columnCollectionID != -1 AND $columnUploadedFileID  != -1
+        GROUP BY $columnCollectionID, $columnUploadedFileID HAVING count(*) > 1)
+      AND  ($columnCollectionID, $columnUploadedFileID,$columnGeneratedID) NOT IN 
+      (SELECT $columnCollectionID, $columnUploadedFileID, max($columnGeneratedID)
+       from $table WHERE 
+       $columnCollectionID is not NULL AND $columnUploadedFileID is NOT NULL
+       AND $columnCollectionID != -1 AND $columnUploadedFileID  != -1 GROUP BY 
+       $columnCollectionID, $columnUploadedFileID HAVING count(*) > 1);
+      ''',
+      '''
+      CREATE UNIQUE INDEX cid_uid ON $table ($columnCollectionID, $columnUploadedFileID) 
+      WHERE $columnCollectionID is not NULL AND $columnUploadedFileID is not NULL
+      AND $columnCollectionID != -1 AND $columnUploadedFileID  != -1;
+      '''
+    ];
+  }
+
   Future<void> clearTable() async {
   Future<void> clearTable() async {
     final db = await instance.database;
     final db = await instance.database;
     await db.delete(table);
     await db.delete(table);