Merge branch 'perf_minor' into migratie_collections

This commit is contained in:
Neeraj Gupta 2023-05-23 17:04:38 +05:30
commit b98e9c8aec
3 changed files with 66 additions and 31 deletions

View file

@ -188,6 +188,24 @@ class CollectionsDB {
return collections;
}
// getActiveCollectionIDsAndUpdationTime returns map of collectionID to
// updationTime for non-deleted collections
Future<Map<int, int>> getActiveIDsAndRemoteUpdateTime() async {
final db = await instance.database;
final rows = await db.query(
table,
where: '($columnIsDeleted = ? OR $columnIsDeleted IS NULL)',
whereArgs: [_sqlBoolFalse],
columns: [columnID, columnUpdationTime],
);
final collectionIDsAndUpdationTime = <int, int>{};
for (final row in rows) {
collectionIDsAndUpdationTime[row[columnID] as int] =
int.parse(row[columnUpdationTime] as String);
}
return collectionIDsAndUpdationTime;
}
Future<int> deleteCollection(int collectionID) async {
final db = await instance.database;
return db.delete(

View file

@ -167,15 +167,18 @@ class CollectionsService {
_cachedKeys.clear();
}
Future<List<Collection>> getCollectionsToBeSynced() async {
final collections = await _db.getAllCollections();
final updatedCollections = <Collection>[];
for (final c in collections) {
if (c.updationTime > getCollectionSyncTime(c.id) && !c.isDeleted) {
updatedCollections.add(c);
Future<Map<int, int>> getCollectionIDsToBeSynced() async {
final idsToRemoveUpdateTimeMap =
await _db.getActiveIDsAndRemoteUpdateTime();
final result = <int, int>{};
for (final MapEntry<int, int> e in idsToRemoveUpdateTimeMap.entries) {
final int cid = e.key;
final int remoteUpdateTime = e.value;
if (remoteUpdateTime > getCollectionSyncTime(cid)) {
result[cid] = remoteUpdateTime;
}
}
return updatedCollections;
return result;
}
Set<int> getArchivedCollections() {

View file

@ -181,14 +181,19 @@ class RemoteSyncService {
}
Future<void> _syncUpdatedCollections() async {
final updatedCollections =
await _collectionsService.getCollectionsToBeSynced();
for (final c in updatedCollections) {
final idsToRemoteUpdationTimeMap =
await _collectionsService.getCollectionIDsToBeSynced();
for (final cid in idsToRemoteUpdationTimeMap.keys) {
await _syncCollectionDiff(
c.id,
_collectionsService.getCollectionSyncTime(c.id),
cid,
_collectionsService.getCollectionSyncTime(cid),
);
await _collectionsService.setCollectionSyncTime(c.id, c.updationTime);
// update syncTime for the collection in sharedPrefs. Note: the
// syncTime can change on remote but we might not get a diff for the
// collection if there are not changes in the file, but the collection
// metadata (name, archive status, sharing etc) has changed.
final remoteUpdateTime = idsToRemoteUpdationTimeMap[cid];
await _collectionsService.setCollectionSyncTime(cid, remoteUpdateTime);
}
_logger.info("All updated collections synced");
}
@ -216,24 +221,7 @@ class RemoteSyncService {
final diff =
await _diffFetcher.getEncryptedFilesDiff(collectionID, sinceTime);
if (diff.deletedFiles.isNotEmpty) {
final fileIDs = diff.deletedFiles.map((f) => f.uploadedFileID!).toList();
final deletedFiles = (await _db.getFilesFromIDs(fileIDs)).values.toList();
await _db.deleteFilesFromCollection(collectionID, fileIDs);
Bus.instance.fire(
CollectionUpdatedEvent(
collectionID,
deletedFiles,
"syncDeleteFromRemote",
type: EventType.deletedFromRemote,
),
);
Bus.instance.fire(
LocalPhotosUpdatedEvent(
deletedFiles,
type: EventType.deletedFromRemote,
source: "syncDeleteFromRemote",
),
);
await _syncCollectionDiffDelete(diff, collectionID);
}
if (diff.updatedFiles.isNotEmpty) {
await _storeDiff(diff.updatedFiles, collectionID);
@ -274,6 +262,32 @@ class RemoteSyncService {
}
}
Future<void> _syncCollectionDiffDelete(Diff diff, int collectionID) async {
final fileIDs = diff.deletedFiles.map((f) => f.uploadedFileID!).toList();
final localDeleteCount =
await _db.deleteFilesFromCollection(collectionID, fileIDs);
if (localDeleteCount > 0) {
final collectionFiles =
(await _db.getFilesFromIDs(fileIDs)).values.toList();
collectionFiles.removeWhere((f) => f.collectionID != collectionID);
Bus.instance.fire(
CollectionUpdatedEvent(
collectionID,
collectionFiles,
"syncDeleteFromRemote",
type: EventType.deletedFromRemote,
),
);
Bus.instance.fire(
LocalPhotosUpdatedEvent(
collectionFiles,
type: EventType.deletedFromRemote,
source: "syncDeleteFromRemote",
),
);
}
}
Future<void> syncDeviceCollectionFilesForUpload() async {
_logger.info("Syncing device collections to be uploaded");
final int ownerID = _config.getUserID()!;