Merge branch 'perf_minor' into migratie_collections
This commit is contained in:
commit
b98e9c8aec
|
@ -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(
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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()!;
|
||||
|
|
Loading…
Reference in a new issue