Compare commits

...

2 Commits

Author SHA1 Message Date
wuzihao051119
377b886bd6 fix: lint 2025-07-17 14:14:57 +08:00
wuzihao051119
5d99eabe05 fix: sqlite parameters limit 2025-07-17 14:11:44 +08:00
6 changed files with 75 additions and 37 deletions

View File

@@ -326,12 +326,16 @@ 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 assetToUnLink in assetsToUnLink) {
batch.deleteWhere(
_db.localAlbumAssetEntity,
(row) =>
row.assetId.equals(assetToUnLink) &
row.albumId.equals(albumId),
);
}
});
}
await _deleteAssets(assetsToDelete);
@@ -359,7 +363,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));
}
});
}

View File

@@ -1,4 +1,3 @@
import 'package:collection/collection.dart';
import 'package:drift/drift.dart';
import 'package:immich_mobile/domain/models/asset/base_asset.model.dart';
import 'package:immich_mobile/infrastructure/entities/local_asset.entity.dart';
@@ -46,13 +45,9 @@ class DriftLocalAssetRepository extends DriftDatabaseRepository {
}
Future<void> delete(List<String> ids) {
if (ids.isEmpty) {
return Future.value();
}
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));
}
});
}

View File

@@ -121,10 +121,15 @@ class DriftRemoteAlbumRepository extends DriftDatabaseRepository {
);
}
Future<int> removeAssets(String albumId, List<String> assetIds) {
return _db.remoteAlbumAssetEntity.deleteWhere(
(tbl) => tbl.albumId.equals(albumId) & tbl.assetId.isIn(assetIds),
);
Future<void> removeAssets(String albumId, List<String> 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) {
@@ -160,6 +165,7 @@ class DriftRemoteAlbumRepository extends DriftDatabaseRepository {
final userIds = albumUserRows.map((row) => row.userId);
// TODO: remove this isIn() after removing UserDto
return (_db.select(_db.userEntity)..where((row) => row.id.isIn(userIds)))
.map(
(user) => UserDto(

View File

@@ -129,7 +129,14 @@ class RemoteAssetRepository extends DriftDatabaseRepository {
}
Future<void> delete(List<String> 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<void> updateLocation(List<String> ids, LatLng location) {

View File

@@ -29,8 +29,14 @@ class SyncStreamRepository extends DriftDatabaseRepository {
Future<void> deleteUsersV1(Iterable<SyncUserDeleteV1> 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;
@@ -106,9 +112,14 @@ class SyncStreamRepository extends DriftDatabaseRepository {
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;
@@ -202,9 +213,14 @@ class SyncStreamRepository extends DriftDatabaseRepository {
Future<void> deleteAlbumsV1(Iterable<SyncAlbumDeleteV1> 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;
@@ -371,9 +387,14 @@ class SyncStreamRepository extends DriftDatabaseRepository {
Future<void> deleteMemoriesV1(Iterable<SyncMemoryDeleteV1> 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;
@@ -455,9 +476,14 @@ class SyncStreamRepository extends DriftDatabaseRepository {
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;

View File

@@ -155,14 +155,12 @@ class ActionService {
}
Future<int> removeFromAlbum(List<String> 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;
}
}