Explorar el Código

[mob][photos] Migrate to sqlite_async(8): Fix faulty update statements due to incorrect query generation

ashilkn hace 1 año
padre
commit
7fdc2b5e66
Se han modificado 1 ficheros con 48 adiciones y 24 borrados
  1. 48 24
      mobile/lib/db/files_db.dart

+ 48 - 24
mobile/lib/db/files_db.dart

@@ -539,7 +539,7 @@ class FilesDB {
     PrimitiveWrapper batchCounter, {
     required bool isGenIdNull,
   }) async {
-    parameterSets.add(_getParameterSetForFileV2(file));
+    parameterSets.add(_getParameterSetForFile(file));
     batchCounter.value++;
 
     final columnNames = isGenIdNull
@@ -1149,11 +1149,14 @@ class FilesDB {
 
   Future<void> update(EnteFile file) async {
     final db = await instance.sqliteAsyncDB;
-    final setClause = _getSetClauseForFile(file);
+    final parameterSet = _getParameterSetForFile(file)..add(file.generatedID);
+    final updateAssignments = _generateUpdateAssignmentsWithPlaceholders(
+      fileGenId: file.generatedID,
+    );
     await db.execute(
-      'UPDATE $filesTable SET '
-      '$setClause WHERE $columnGeneratedID = ?',
-      [file.generatedID],
+      'UPDATE $filesTable '
+      'SET $updateAssignments WHERE $columnGeneratedID = ?',
+      parameterSet,
     );
   }
 
@@ -1167,6 +1170,21 @@ class FilesDB {
     );
   }
 
+  Future<void> updateUploadedFileAcrossCollectionsNew(EnteFile file) async {
+    final db = await instance.sqliteAsyncDB;
+    final parameterSet = _getParameterSetForFile(file, omitCollectionId: true)
+      ..add(file.uploadedFileID);
+    final updateAssignments = _generateUpdateAssignmentsWithPlaceholders(
+      fileGenId: file.generatedID,
+      omitCollectionId: true,
+    );
+    await db.execute(
+      'UPDATE $filesTable'
+      'SET $updateAssignments WHERE $columnUploadedFileID = ?',
+      parameterSet,
+    );
+  }
+
   Future<void> updateLocalIDForUploaded(int uploadedID, String localID) async {
     final db = await instance.sqliteAsyncDB;
     await db.execute(
@@ -1782,8 +1800,8 @@ class FilesDB {
     return convertToFiles(results);
   }
 
-  String _getSetClauseForFile(EnteFile file) {
-    final row = _getRowForFile(file);
+  String _getSetClauseForFileWithoutCollection(EnteFile file) {
+    final row = _getRowForFileWithoutCollection(file);
     final setClause = <String>[];
     for (int i = 0; i < row.entries.length; i++) {
       final entry = row.entries.elementAt(i);
@@ -1792,18 +1810,30 @@ class FilesDB {
     return setClause.join(', ');
   }
 
-  List<Object?> _getParameterSetForFile(EnteFile file) {
-    final row = _getRowForFile(file);
-    final values = <Object?>[];
-    for (int i = 0; i < row.entries.length; i++) {
-      values.add(row.entries.elementAt(i).value);
+  ///Returns "columnName1 = ?, columnName2 = ?, ..."
+  String _generateUpdateAssignmentsWithPlaceholders({
+    required int? fileGenId,
+    bool omitCollectionId = false,
+  }) {
+    final setClauses = <String>[];
+
+    for (String columnName in _columnNames) {
+      if (columnName == columnGeneratedID && fileGenId == null) {
+        continue;
+      }
+      if (columnName == columnCollectionID && omitCollectionId) {
+        continue;
+      }
+      setClauses.add("$columnName = ?");
     }
-    return values;
+
+    return setClauses.join(",");
   }
 
-  List<Object?> _getParameterSetForFileV2(
+  List<Object?> _getParameterSetForFile(
     EnteFile file, {
     bool omitNullGenId = true,
+    bool omitCollectionId = false,
   }) {
     final values = <Object?>[];
     double? latitude;
@@ -1854,17 +1884,11 @@ class FilesDB {
       file.addedTime ?? DateTime.now().microsecondsSinceEpoch,
     ]);
 
-    return values;
-  }
-
-  String _getSetClauseForFileWithoutCollection(EnteFile file) {
-    final row = _getRowForFileWithoutCollection(file);
-    final setClause = <String>[];
-    for (int i = 0; i < row.entries.length; i++) {
-      final entry = row.entries.elementAt(i);
-      setClause.add('${entry.key} = ${entry.value}');
+    if (omitCollectionId) {
+      values.removeAt(3);
     }
-    return setClause.join(', ');
+
+    return values;
   }
 
   Map<String, dynamic> _getRowForFile(EnteFile file) {