Store local mapping & creation time for remote files
This commit is contained in:
@@ -78,7 +78,7 @@ class RemoteDB with SqlDbBase {
|
||||
collectionFileValues,
|
||||
),
|
||||
_sqliteDB.executeBatch(
|
||||
'INSERT OR REPLACE INTO files ($filesColumns) values(?, ?, ?, ?, ?, ?, ?, ?)',
|
||||
'INSERT INTO files ($filesColumns) values(${getParams(17)}) ON CONFLICT(id) DO UPDATE SET $filesUpdateColumns',
|
||||
fileValues,
|
||||
),
|
||||
]);
|
||||
|
||||
@@ -12,9 +12,20 @@ final String updateCollectionColumns = collectionColumns
|
||||
|
||||
const collectionFilesColumns =
|
||||
'collection_id, file_id, enc_key, enc_key_nonce, created_at, updated_at, is_deleted';
|
||||
|
||||
const filesColumns =
|
||||
'id, owner_id, file_header, thumb_header, metadata, priv_metadata, pub_metadata, info';
|
||||
'id, owner_id, file_header, thumb_header, creation_time, modification_time, title, size, hash, lat, lng, '
|
||||
'metadata, priv_metadata, pub_metadata, info, local_id, local_mapping_src';
|
||||
|
||||
final String filesUpdateColumns = filesColumns
|
||||
.split(', ')
|
||||
.where(
|
||||
(column) => (column != 'id' ||
|
||||
column != 'local_id' ||
|
||||
column != 'local_mapping_src'),
|
||||
) // Exclude primary key from update
|
||||
.map((column) => '$column = excluded.$column') // Use excluded virtual table
|
||||
.join(', ');
|
||||
|
||||
const trashedFilesColumns =
|
||||
'id, owner_id, file_header, thumb_header, metadata, priv_metadata, pub_metadata, info, trash_data';
|
||||
|
||||
@@ -62,11 +73,19 @@ class RemoteDBMigration {
|
||||
owner_id INTEGER NOT NULL,
|
||||
file_header BLOB NOT NULL,
|
||||
thumb_header BLOB NOT NULL,
|
||||
creation_time INTEGER NOT NULL,
|
||||
modification_time INTEGER NOT NULL,
|
||||
title TEXT NOT NULL,
|
||||
size INTEGER NOT NULL DEFAULT -1,
|
||||
hash TEXT,
|
||||
lat REAL DEFAULT NULL,
|
||||
lng REAL DEFAULT NULL,
|
||||
metadata TEXT NOT NULL,
|
||||
priv_metadata TEXT NOT NULL DEFAULT '{}',
|
||||
pub_metadata TEXT NOT NULL DEFAULT '{}',
|
||||
info TEXT DEFAULT '{}',
|
||||
trash_data TEXT
|
||||
priv_metadata TEXT,
|
||||
pub_metadata TEXT,
|
||||
info TEXT,
|
||||
local_id TEXT DEFAULT NULL,
|
||||
local_mapping_src TEXT DEFAULT NULL
|
||||
)
|
||||
''',
|
||||
'''
|
||||
|
||||
@@ -1,6 +1,10 @@
|
||||
import "dart:convert";
|
||||
import "dart:io";
|
||||
import "dart:typed_data";
|
||||
|
||||
import "package:photos/models/location/location.dart";
|
||||
import "package:photos/models/metadata/file_magic.dart";
|
||||
|
||||
class Info {
|
||||
final int fileSize;
|
||||
final int thumbSize;
|
||||
@@ -92,17 +96,74 @@ class FileItem {
|
||||
}
|
||||
|
||||
List<Object?> rowValues() {
|
||||
final Location? loc = location;
|
||||
return [
|
||||
fileID,
|
||||
ownerID,
|
||||
fileDecryotionHeader,
|
||||
thumnailDecryptionHeader,
|
||||
creationTime,
|
||||
modificationTime,
|
||||
title,
|
||||
fileSize,
|
||||
hash,
|
||||
loc?.latitude,
|
||||
loc?.longitude,
|
||||
metadata?.toEncodedJson(),
|
||||
magicMetadata?.toEncodedJson(),
|
||||
pubMagicMetadata?.toEncodedJson(),
|
||||
info?.toEncodedJson(),
|
||||
matchLocalID,
|
||||
'remote_data',
|
||||
];
|
||||
}
|
||||
|
||||
String get title =>
|
||||
pubMagicMetadata?.data['editedName'] ?? metadata?.data['title'] ?? "";
|
||||
|
||||
String? get localID => metadata?.data['localID'];
|
||||
|
||||
String? get matchLocalID => localID == null || deviceFolder == null
|
||||
? null
|
||||
: Platform.isIOS
|
||||
? localID
|
||||
: '$localID-$deviceFolder-$title';
|
||||
|
||||
String? get deviceFolder => metadata?.data['deviceFolder'];
|
||||
|
||||
Location? get location {
|
||||
if (pubMagicMetadata != null && pubMagicMetadata!.data[latKey] != null) {
|
||||
return Location(
|
||||
latitude: pubMagicMetadata!.data[latKey],
|
||||
longitude: pubMagicMetadata!.data[longKey],
|
||||
);
|
||||
}
|
||||
if (metadata != null && metadata!.data['latitude'] == null ||
|
||||
metadata!.data['longitude'] == null) {
|
||||
return null;
|
||||
}
|
||||
final latitude = double.tryParse(metadata!.data["latitude"].toString());
|
||||
final longitude = double.tryParse(metadata!.data["longitude"].toString());
|
||||
if (latitude == null || longitude == null) {
|
||||
return null;
|
||||
} else {
|
||||
return Location(latitude: latitude, longitude: longitude);
|
||||
}
|
||||
}
|
||||
|
||||
int get creationTime =>
|
||||
pubMagicMetadata?.data['editedTime'] ??
|
||||
metadata?.data['creationTime'] ??
|
||||
0;
|
||||
|
||||
int get modificationTime =>
|
||||
metadata?.data['modificationTime'] ?? creationTime;
|
||||
|
||||
// note: during remote to local sync, older live photo hash format from desktop
|
||||
// is already converted to the new format
|
||||
String? get hash => metadata?.data['hash'];
|
||||
|
||||
int get fileSize => info?.fileSize ?? -1;
|
||||
}
|
||||
|
||||
class CollectionFileItem {
|
||||
|
||||
Reference in New Issue
Block a user