Selaa lähdekoodia

Support for persisting magic metadata for file

Neeraj Gupta 3 vuotta sitten
vanhempi
commit
d120f18aab
3 muutettua tiedostoa jossa 67 lisäystä ja 2 poistoa
  1. 34 0
      lib/db/files_db.dart
  2. 9 2
      lib/models/file.dart
  3. 24 0
      lib/models/file_magic_metadata.dart

+ 34 - 0
lib/db/files_db.dart

@@ -51,12 +51,22 @@ class FilesDB {
   static final columnThumbnailDecryptionHeader = 'thumbnail_decryption_header';
   static final columnMetadataDecryptionHeader = 'metadata_decryption_header';
 
+  // MMD -> Magic Metadata
+  static final columnMMdEncodedJson = 'mmd_encoded_json';
+  static final columnMMdVersion = 'mmd_ver';
+
+  // part of magic metadata
+  // Only parse & store selected fields from JSON in separate columns if
+  // we need to write query based on that field
+  static final columnMMdVisibility = 'mmd_visibility';
+
   static final initializationScript = [...createTable(table)];
   static final migrationScripts = [
     ...alterDeviceFolderToAllowNULL(),
     ...alterTimestampColumnTypes(),
     ...addIndices(),
     ...addMetadataColumns(),
+    ...addMagicMetadataColumns(),
   ];
 
   final dbConfig = MigrationConfig(
@@ -227,6 +237,20 @@ class FilesDB {
     ];
   }
 
+  static List<String> addMagicMetadataColumns() {
+    return [
+      '''
+        ALTER TABLE $table ADD COLUMN $columnMMdEncodedJson Text DEFAULT '{}';
+      ''',
+      '''
+        ALTER TABLE $table ADD COLUMN $columnMMdVersion INTEGER DEFAULT 0;
+      ''',
+      '''
+        ALTER TABLE $table ADD COLUMN $columnMMdVisibility INTEGER DEFAULT 0;
+      '''
+    ];
+  }
+
   Future<void> clearTable() async {
     final db = await instance.database;
     await db.delete(table);
@@ -877,6 +901,9 @@ class FilesDB {
     row[columnExif] = file.exif;
     row[columnHash] = file.hash;
     row[columnMetadataVersion] = file.metadataVersion;
+    row[columnMMdVersion] = file.mMdVersion ?? 0;
+    row[columnMMdEncodedJson] = file.mMdEncodedJson ?? '{}';
+    row[columnMMdVisibility] = file.fileMagicMetadata?.visibility ?? 0;
     return row;
   }
 
@@ -903,6 +930,10 @@ class FilesDB {
     row[columnExif] = file.exif;
     row[columnHash] = file.hash;
     row[columnMetadataVersion] = file.metadataVersion;
+
+    row[columnMMdVersion] = file.mMdVersion ?? 0;
+    row[columnMMdEncodedJson] == file.mMdEncodedJson ?? '{}';
+    row[columnMMdVisibility] = file.fileMagicMetadata?.visibility ?? 0;
     return row;
   }
 
@@ -934,6 +965,9 @@ class FilesDB {
     file.exif = row[columnExif];
     file.hash = row[columnHash];
     file.metadataVersion = row[columnMetadataVersion] ?? 0;
+
+    file.mMdVersion = row[columnMMdVersion] ?? 0 ;
+    file.mMdEncodedJson = row[columnMMdEncodedJson] ?? '{}';
     return file;
   }
 }

+ 9 - 2
lib/models/file.dart

@@ -1,15 +1,16 @@
-import 'package:exif/exif.dart';
+import 'dart:io' as io;
+
 import 'package:flutter/foundation.dart';
 import 'package:flutter_sodium/flutter_sodium.dart';
 import 'package:path/path.dart';
 import 'package:photo_manager/photo_manager.dart';
 import 'package:photos/core/configuration.dart';
 import 'package:photos/core/constants.dart';
+import 'package:photos/models/file_magic_metadata.dart';
 import 'package:photos/models/file_type.dart';
 import 'package:photos/models/location.dart';
 import 'package:photos/services/feature_flag_service.dart';
 import 'package:photos/utils/crypto_util.dart';
-import 'dart:io' as io;
 
 class File {
   int generatedID;
@@ -35,6 +36,12 @@ class File {
   String thumbnailDecryptionHeader;
   String metadataDecryptionHeader;
 
+  String mMdEncodedJson;
+  int mMdVersion = 0;
+  FileMagicMetadata _fileMMd;
+  FileMagicMetadata get fileMagicMetadata =>
+      _fileMMd ?? FileMagicMetadata.fromEncodedJson(mMdEncodedJson ?? '{}');
+
   static const kCurrentMetadataVersion = 1;
 
   File();

+ 24 - 0
lib/models/file_magic_metadata.dart

@@ -0,0 +1,24 @@
+import 'dart:convert';
+
+class FileMagicMetadata {
+  // 0 -> visible
+  // 1 -> archived
+  // 2 -> hidden etc?
+  int visibility;
+
+  FileMagicMetadata({this.visibility});
+
+  FileMagicMetadata.fromEncodedJson(String encodedJson) {
+    FileMagicMetadata.fromJson(jsonDecode(encodedJson));
+  }
+
+  FileMagicMetadata.fromJson(dynamic json) {
+    visibility = json['visibility'] ?? 0;
+  }
+
+  Map<String, dynamic> toJson() {
+    var map = <String, dynamic>{};
+    map['visibility'] = visibility;
+    return map;
+  }
+}