From e1e24f3d60c16c2a7595d7441ee9f2084e2d4c0d Mon Sep 17 00:00:00 2001 From: shenlong <139912620+shenlong-tanwen@users.noreply.github.com> Date: Fri, 19 Sep 2025 19:17:56 +0530 Subject: [PATCH] fix: sqlite parameters limit (#22119) * fix isNotIns * fix isIns --------- Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com> --- .../drift_schemas/main/drift_schema_v11.json | Bin 0 -> 37513 bytes .../entities/local_album_asset.entity.dart | 3 + .../local_album_asset.entity.drift.dart | Bin 23099 -> 25436 bytes .../repositories/db.repository.dart | 5 +- .../repositories/db.repository.steps.dart | Bin 127239 -> 138040 bytes .../repositories/local_album.repository.dart | 61 ++++++++++++------ .../repositories/local_asset.repository.dart | 5 +- .../repositories/remote_album.repository.dart | 11 +++- .../repositories/remote_asset.repository.dart | 30 ++++++--- .../repositories/sync_stream.repository.dart | 30 +++++++-- mobile/lib/services/action.service.dart | 11 ++-- mobile/test/drift/main/generated/schema.dart | Bin 1312 -> 1402 bytes .../test/drift/main/generated/schema_v11.dart | Bin 0 -> 233465 bytes 13 files changed, 109 insertions(+), 47 deletions(-) create mode 100644 mobile/drift_schemas/main/drift_schema_v11.json create mode 100644 mobile/test/drift/main/generated/schema_v11.dart diff --git a/mobile/drift_schemas/main/drift_schema_v11.json b/mobile/drift_schemas/main/drift_schema_v11.json new file mode 100644 index 0000000000000000000000000000000000000000..1c100ab37f86ea01fb9ce2b539ecfcaf6077c620 GIT binary patch literal 37513 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 literal 0 HcmV?d00001 diff --git a/mobile/lib/infrastructure/entities/local_album_asset.entity.dart b/mobile/lib/infrastructure/entities/local_album_asset.entity.dart index 8de879a09..53f1a1066 100644 --- a/mobile/lib/infrastructure/entities/local_album_asset.entity.dart +++ b/mobile/lib/infrastructure/entities/local_album_asset.entity.dart @@ -10,6 +10,9 @@ class LocalAlbumAssetEntity extends Table with DriftDefaultsMixin { TextColumn get albumId => text().references(LocalAlbumEntity, #id, onDelete: KeyAction.cascade)(); + // Used for mark & sweep + BoolColumn get marker_ => boolean().nullable()(); + @override Set get primaryKey => {assetId, albumId}; } diff --git a/mobile/lib/infrastructure/entities/local_album_asset.entity.drift.dart b/mobile/lib/infrastructure/entities/local_album_asset.entity.drift.dart index 78da361f62f28a4fc39203070dfe4b015fae7a24..70c298332b1a00d1f39ed69c4a809f47ee505009 100644 GIT binary patch delta 1900 zcmcgtOK1~O6eVf3Z7NMuYwRc5+gQzv#?X(7q)mh7qqX*D8f%mgCe5^tPBL+3BK}a9 z-HF_txKVWDLWOamDCk06h@dW9DWWSE;%_Agg7bT0qKyj|&g${rednHc&UtU{-m<-Z zY`giy-VVU^2KF+1i5bf=oT#Ceo#_ok1iq9n#5rDOMM*~( zhIv*dAP^dco>?JZ6eK3gv)fA?pJPSJ0qQraZw*3^tStr1wtjsrYZL~7GOB0|NF`d) zj%qd+wLSEp!vXltxn6nV{8n!Uv#7+vNIML1DWOO*(TDzwTINj(zEFKV-^^X;Q67J6U_fuRSkD zLbW>4i@UroV}mbEifQcH<552CI%)IFaRr74-C@#iP<3xsC`d9+CEZxuSc?n02b%!o zgPcSz9^T*meukR^s=H9)`DtNWR$>b>oH|87pgRQG5)CKKFyxuy0it{wLdHuXa@ut^ z%^~L?p4=MOIV5E5 za)*JDBvu~D8EROQe72M)lhraBNJ5SJxZv~tc1;*N<-i-0>(!_>&XctWs3OpOSRB|Gr#=n|!8%4UmLJ_aGj$P7`v46kB(F;LawTlhNFW}2T- zpH3pko0Je_Spg%VvSi1`nbRGA r{Hn^aR^Wx1quw%=31~Q6acKRXtlPK77BA~eT=5;3QAC&HkRP%$uuyBbYXa1x#d| z{4X#H?5_Aw>B${IM>lT_&SBgf87jv(d3BhfT5w5GW?s6zLSk`oYKdoxjsjdDC#f{o zGX-R`9oJ+7eWl5J{WvC@CumI$G7*|QFI;T%+i)eu$zcIvlM|AhCvS`lova^KJb880 zRYuLpc7X~&XL3%y8r=r8UmDC_5EDCDGd64T{@8Pq*T?lv&Wf*?l+X?~ATN{$=(O0$ SdWpLxJ0|S`8f3y$%LM@OFnzQD diff --git a/mobile/lib/infrastructure/repositories/db.repository.dart b/mobile/lib/infrastructure/repositories/db.repository.dart index f04ed2777..65d26d974 100644 --- a/mobile/lib/infrastructure/repositories/db.repository.dart +++ b/mobile/lib/infrastructure/repositories/db.repository.dart @@ -93,7 +93,7 @@ class Drift extends $Drift implements IDatabaseRepository { } @override - int get schemaVersion => 10; + int get schemaVersion => 11; @override MigrationStrategy get migration => MigrationStrategy( @@ -156,6 +156,9 @@ class Drift extends $Drift implements IDatabaseRepository { await m.addColumn(v10.userEntity, v10.userEntity.avatarColor); await m.alterTable(TableMigration(v10.userEntity)); }, + from10To11: (m, v11) async { + await m.addColumn(v11.localAlbumAssetEntity, v11.localAlbumAssetEntity.marker_); + }, ), ); diff --git a/mobile/lib/infrastructure/repositories/db.repository.steps.dart b/mobile/lib/infrastructure/repositories/db.repository.steps.dart index be6d53d5a8192801eaa115974d847b5ae6917511..7910d9fceed7a914be09c9312e154f72eae3ef34 100644 GIT binary patch delta 278 zcmZpF#J*!2N5d9I$H&vpSuqMT85&M@oT&z)-oMZVQ4Nemllxz)ZTKWHfmL zlh|~J{frzS_C&!)JUR;T$@w{@xq0!%#*-hixJ;h#HF>*14&!g;?PrfLh6pnnO)hj% z0jW-`Pn~QXxoxsQgXrW9dR)_M*E4!=cY4ftf@wO_6Gk&pLqmn)z#B#-W_(6H ac+aTFsHA{ox)l;zhf6_0Q-@2_nhO9(XI_s0 delta 42 ycmdn7jidb$d&3q+$H&_ld6-TzZ5QWf+Q+tif*6w&^Y-tOO!ACunmSyX)?5Hfi43d& diff --git a/mobile/lib/infrastructure/repositories/local_album.repository.dart b/mobile/lib/infrastructure/repositories/local_album.repository.dart index b97884c27..e4bff2487 100644 --- a/mobile/lib/infrastructure/repositories/local_album.repository.dart +++ b/mobile/lib/infrastructure/repositories/local_album.repository.dart @@ -72,17 +72,33 @@ class DriftLocalAlbumRepository extends DriftDatabaseRepository { return Future.value(); } - final deleteSmt = _db.localAssetEntity.delete(); - deleteSmt.where((localAsset) { - final subQuery = _db.localAlbumAssetEntity.selectOnly() - ..addColumns([_db.localAlbumAssetEntity.assetId]) - ..join([innerJoin(_db.localAlbumEntity, _db.localAlbumAssetEntity.albumId.equalsExp(_db.localAlbumEntity.id))]); - subQuery.where( - _db.localAlbumEntity.id.equals(albumId) & _db.localAlbumAssetEntity.assetId.isNotIn(assetIdsToKeep), - ); - return localAsset.id.isInQuery(subQuery); + return _db.transaction(() async { + await _db.managers.localAlbumAssetEntity + .filter((row) => row.albumId.id.equals(albumId)) + .update((album) => album(marker_: const Value(true))); + + await _db.batch((batch) { + for (final assetId in assetIdsToKeep) { + batch.update( + _db.localAlbumAssetEntity, + const LocalAlbumAssetEntityCompanion(marker_: Value(null)), + where: (row) => row.assetId.equals(assetId) & row.albumId.equals(albumId), + ); + } + }); + + final query = _db.localAssetEntity.delete() + ..where( + (row) => row.id.isInQuery( + _db.localAlbumAssetEntity.selectOnly() + ..addColumns([_db.localAlbumAssetEntity.assetId]) + ..where( + _db.localAlbumAssetEntity.albumId.equals(albumId) & _db.localAlbumAssetEntity.marker_.isNotNull(), + ), + ), + ); + await query.go(); }); - await deleteSmt.go(); } Future upsert( @@ -198,10 +214,9 @@ class DriftLocalAlbumRepository extends DriftDatabaseRepository { // List await _db.batch((batch) async { assetAlbums.cast>().forEach((assetId, albumIds) { - batch.deleteWhere( - _db.localAlbumAssetEntity, - (f) => f.albumId.isNotIn(albumIds.cast().nonNulls) & f.assetId.equals(assetId), - ); + for (final albumId in albumIds.cast().nonNulls) { + batch.deleteWhere(_db.localAlbumAssetEntity, (f) => f.albumId.equals(albumId) & f.assetId.equals(assetId)); + } }); }); await _db.batch((batch) async { @@ -288,12 +303,14 @@ class DriftLocalAlbumRepository extends DriftDatabaseRepository { return transaction(() async { if (assetsToUnLink.isNotEmpty) { - await _db.batch( - (batch) => batch.deleteWhere( - _db.localAlbumAssetEntity, - (f) => f.assetId.isIn(assetsToUnLink) & f.albumId.equals(albumId), - ), - ); + await _db.batch((batch) { + for (final assetId in assetsToUnLink) { + batch.deleteWhere( + _db.localAlbumAssetEntity, + (row) => row.assetId.equals(assetId) & row.albumId.equals(albumId), + ); + } + }); } await _deleteAssets(assetsToDelete); @@ -320,7 +337,9 @@ class DriftLocalAlbumRepository extends DriftDatabaseRepository { } return _db.batch((batch) { - batch.deleteWhere(_db.localAssetEntity, (f) => f.id.isIn(ids)); + for (final id in ids) { + batch.deleteWhere(_db.localAssetEntity, (row) => row.id.equals(id)); + } }); } diff --git a/mobile/lib/infrastructure/repositories/local_asset.repository.dart b/mobile/lib/infrastructure/repositories/local_asset.repository.dart index c4f522196..2b76472c9 100644 --- a/mobile/lib/infrastructure/repositories/local_asset.repository.dart +++ b/mobile/lib/infrastructure/repositories/local_asset.repository.dart @@ -1,4 +1,3 @@ -import 'package:collection/collection.dart'; import 'package:drift/drift.dart'; import 'package:immich_mobile/domain/models/album/local_album.model.dart'; import 'package:immich_mobile/domain/models/asset/base_asset.model.dart'; @@ -58,8 +57,8 @@ class DriftLocalAssetRepository extends DriftDatabaseRepository { } return _db.batch((batch) { - for (final slice in ids.slices(32000)) { - batch.deleteWhere(_db.localAssetEntity, (e) => e.id.isIn(slice)); + for (final id in ids) { + batch.deleteWhere(_db.localAssetEntity, (e) => e.id.equals(id)); } }); } diff --git a/mobile/lib/infrastructure/repositories/remote_album.repository.dart b/mobile/lib/infrastructure/repositories/remote_album.repository.dart index 78b56e743..5dfe4ac9b 100644 --- a/mobile/lib/infrastructure/repositories/remote_album.repository.dart +++ b/mobile/lib/infrastructure/repositories/remote_album.repository.dart @@ -166,8 +166,15 @@ class DriftRemoteAlbumRepository extends DriftDatabaseRepository { ); } - Future removeAssets(String albumId, List assetIds) { - return _db.remoteAlbumAssetEntity.deleteWhere((tbl) => tbl.albumId.equals(albumId) & tbl.assetId.isIn(assetIds)); + Future removeAssets(String albumId, List assetIds) { + return _db.batch((batch) { + for (final assetId in assetIds) { + batch.deleteWhere( + _db.remoteAlbumAssetEntity, + (row) => row.albumId.equals(albumId) & row.assetId.equals(assetId), + ); + } + }); } FutureOr<(DateTime, DateTime)> getDateRange(String albumId) { diff --git a/mobile/lib/infrastructure/repositories/remote_asset.repository.dart b/mobile/lib/infrastructure/repositories/remote_asset.repository.dart index 40f397f0a..092bb728d 100644 --- a/mobile/lib/infrastructure/repositories/remote_asset.repository.dart +++ b/mobile/lib/infrastructure/repositories/remote_asset.repository.dart @@ -160,7 +160,11 @@ class RemoteAssetRepository extends DriftDatabaseRepository { } Future delete(List ids) { - return _db.remoteAssetEntity.deleteWhere((row) => row.id.isIn(ids)); + return _db.batch((batch) { + for (final id in ids) { + batch.deleteWhere(_db.remoteAssetEntity, (row) => row.id.equals(id)); + } + }); } Future updateLocation(List ids, LatLng location) { @@ -199,7 +203,11 @@ class RemoteAssetRepository extends DriftDatabaseRepository { .map((row) => row.id) .get(); - await _db.stackEntity.deleteWhere((row) => row.id.isIn(stackIds)); + await _db.batch((batch) { + for (final stackId in stackIds) { + batch.deleteWhere(_db.stackEntity, (row) => row.id.equals(stackId)); + } + }); await _db.batch((batch) { final companion = StackEntityCompanion(ownerId: Value(userId), primaryAssetId: Value(stack.primaryAssetId)); @@ -219,15 +227,21 @@ class RemoteAssetRepository extends DriftDatabaseRepository { Future unStack(List stackIds) { return _db.transaction(() async { - await _db.stackEntity.deleteWhere((row) => row.id.isIn(stackIds)); + await _db.batch((batch) { + for (final stackId in stackIds) { + batch.deleteWhere(_db.stackEntity, (row) => row.id.equals(stackId)); + } + }); // TODO: delete this after adding foreign key on stackId await _db.batch((batch) { - batch.update( - _db.remoteAssetEntity, - const RemoteAssetEntityCompanion(stackId: Value(null)), - where: (e) => e.stackId.isIn(stackIds), - ); + for (final stackId in stackIds) { + batch.update( + _db.remoteAssetEntity, + const RemoteAssetEntityCompanion(stackId: Value(null)), + where: (e) => e.stackId.equals(stackId), + ); + } }); }); } diff --git a/mobile/lib/infrastructure/repositories/sync_stream.repository.dart b/mobile/lib/infrastructure/repositories/sync_stream.repository.dart index 960a84435..f4720fb11 100644 --- a/mobile/lib/infrastructure/repositories/sync_stream.repository.dart +++ b/mobile/lib/infrastructure/repositories/sync_stream.repository.dart @@ -93,7 +93,11 @@ class SyncStreamRepository extends DriftDatabaseRepository { Future deleteUsersV1(Iterable data) async { try { - await _db.userEntity.deleteWhere((row) => row.id.isIn(data.map((e) => e.userId))); + await _db.batch((batch) { + for (final user in data) { + batch.deleteWhere(_db.userEntity, (row) => row.id.equals(user.userId)); + } + }); } catch (error, stack) { _logger.severe('Error: SyncUserDeleteV1', error, stack); rethrow; @@ -158,7 +162,11 @@ class SyncStreamRepository extends DriftDatabaseRepository { Future deleteAssetsV1(Iterable data, {String debugLabel = 'user'}) async { try { - await _db.remoteAssetEntity.deleteWhere((row) => row.id.isIn(data.map((e) => e.assetId))); + await _db.batch((batch) { + for (final asset in data) { + batch.deleteWhere(_db.remoteAssetEntity, (row) => row.id.equals(asset.assetId)); + } + }); } catch (error, stack) { _logger.severe('Error: deleteAssetsV1 - $debugLabel', error, stack); rethrow; @@ -243,7 +251,11 @@ class SyncStreamRepository extends DriftDatabaseRepository { Future deleteAlbumsV1(Iterable data) async { try { - await _db.remoteAlbumEntity.deleteWhere((row) => row.id.isIn(data.map((e) => e.albumId))); + await _db.batch((batch) { + for (final album in data) { + batch.deleteWhere(_db.remoteAlbumEntity, (row) => row.id.equals(album.albumId)); + } + }); } catch (error, stack) { _logger.severe('Error: deleteAlbumsV1', error, stack); rethrow; @@ -379,7 +391,11 @@ class SyncStreamRepository extends DriftDatabaseRepository { Future deleteMemoriesV1(Iterable data) async { try { - await _db.memoryEntity.deleteWhere((row) => row.id.isIn(data.map((e) => e.memoryId))); + await _db.batch((batch) { + for (final memory in data) { + batch.deleteWhere(_db.memoryEntity, (row) => row.id.equals(memory.memoryId)); + } + }); } catch (error, stack) { _logger.severe('Error: deleteMemoriesV1', error, stack); rethrow; @@ -443,7 +459,11 @@ class SyncStreamRepository extends DriftDatabaseRepository { Future deleteStacksV1(Iterable data, {String debugLabel = 'user'}) async { try { - await _db.stackEntity.deleteWhere((row) => row.id.isIn(data.map((e) => e.stackId))); + await _db.batch((batch) { + for (final stack in data) { + batch.deleteWhere(_db.stackEntity, (row) => row.id.equals(stack.stackId)); + } + }); } catch (error, stack) { _logger.severe('Error: deleteStacksV1 - $debugLabel', error, stack); rethrow; diff --git a/mobile/lib/services/action.service.dart b/mobile/lib/services/action.service.dart index 9a12745ac..4edd49fec 100644 --- a/mobile/lib/services/action.service.dart +++ b/mobile/lib/services/action.service.dart @@ -1,7 +1,6 @@ -import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:immich_mobile/repositories/download.repository.dart'; import 'package:auto_route/auto_route.dart'; import 'package:flutter/material.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:immich_mobile/constants/enums.dart'; import 'package:immich_mobile/domain/models/asset/base_asset.model.dart'; import 'package:immich_mobile/infrastructure/repositories/local_asset.repository.dart'; @@ -11,6 +10,7 @@ import 'package:immich_mobile/providers/infrastructure/album.provider.dart'; import 'package:immich_mobile/providers/infrastructure/asset.provider.dart'; import 'package:immich_mobile/repositories/asset_api.repository.dart'; import 'package:immich_mobile/repositories/asset_media.repository.dart'; +import 'package:immich_mobile/repositories/download.repository.dart'; import 'package:immich_mobile/repositories/drift_album_api_repository.dart'; import 'package:immich_mobile/routing/router.dart'; import 'package:immich_mobile/widgets/common/date_time_picker.dart'; @@ -199,14 +199,11 @@ class ActionService { } Future removeFromAlbum(List remoteIds, String albumId) async { - int removedCount = 0; final result = await _albumApiRepository.removeAssets(albumId, remoteIds); - if (result.removed.isNotEmpty) { - removedCount = await _remoteAlbumRepository.removeAssets(albumId, result.removed); + await _remoteAlbumRepository.removeAssets(albumId, result.removed); } - - return removedCount; + return result.removed.length; } Future updateDescription(String assetId, String description) async { diff --git a/mobile/test/drift/main/generated/schema.dart b/mobile/test/drift/main/generated/schema.dart index 76573e4997e16933e6397c7809fd4da42d06ef95..1d78a44317628d54e5898055c53540662b1c5cff 100644 GIT binary patch delta 100 zcmZ3$^^0r6D@OUu+=Bd~5(V|*?XY&ij6-=7RiN&c3 thK5#L3Q$m#T2fk+2U4Ktl30?M1eA9y2{SaD+`=-QQwOLt)|#u93jnf}ABq3~ delta 22 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 Rw4bA6_S*$-$$tOKe*gzP;(Gu9 literal 0 HcmV?d00001