Store local mapping & creation time for remote files

This commit is contained in:
Neeraj Gupta
2025-04-21 15:04:42 +05:30
parent 151a0d13a4
commit ca62012a6f
3 changed files with 87 additions and 7 deletions

View File

@@ -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,
),
]);

View File

@@ -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
)
''',
'''

View File

@@ -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 {