drift logs
This commit is contained in:
@@ -7,6 +7,7 @@ import 'package:immich_mobile/infrastructure/entities/exif.entity.dart';
|
||||
import 'package:immich_mobile/infrastructure/entities/local_album.entity.dart';
|
||||
import 'package:immich_mobile/infrastructure/entities/local_album_asset.entity.dart';
|
||||
import 'package:immich_mobile/infrastructure/entities/local_asset.entity.dart';
|
||||
import 'package:immich_mobile/infrastructure/entities/log.entity.dart';
|
||||
import 'package:immich_mobile/infrastructure/entities/partner.entity.dart';
|
||||
import 'package:immich_mobile/infrastructure/entities/remote_album.entity.dart';
|
||||
import 'package:immich_mobile/infrastructure/entities/remote_album_asset.entity.dart';
|
||||
@@ -48,6 +49,7 @@ class IsarDatabaseRepository implements IDatabaseRepository {
|
||||
RemoteAlbumAssetEntity,
|
||||
RemoteAlbumUserEntity,
|
||||
StoreEntity,
|
||||
LoggerMessageEntity,
|
||||
],
|
||||
include: {
|
||||
'package:immich_mobile/infrastructure/entities/merged_asset.drift',
|
||||
|
||||
+12
-5
@@ -25,9 +25,11 @@ import 'package:immich_mobile/infrastructure/entities/remote_album_user.entity.d
|
||||
as i11;
|
||||
import 'package:immich_mobile/infrastructure/entities/store.entity.drift.dart'
|
||||
as i12;
|
||||
import 'package:immich_mobile/infrastructure/entities/merged_asset.drift.dart'
|
||||
import 'package:immich_mobile/infrastructure/entities/log.entity.drift.dart'
|
||||
as i13;
|
||||
import 'package:drift/internal/modular.dart' as i14;
|
||||
import 'package:immich_mobile/infrastructure/entities/merged_asset.drift.dart'
|
||||
as i14;
|
||||
import 'package:drift/internal/modular.dart' as i15;
|
||||
|
||||
abstract class $Drift extends i0.GeneratedDatabase {
|
||||
$Drift(i0.QueryExecutor e) : super(e);
|
||||
@@ -54,8 +56,10 @@ abstract class $Drift extends i0.GeneratedDatabase {
|
||||
late final i11.$RemoteAlbumUserEntityTable remoteAlbumUserEntity =
|
||||
i11.$RemoteAlbumUserEntityTable(this);
|
||||
late final i12.$StoreEntityTable storeEntity = i12.$StoreEntityTable(this);
|
||||
i13.MergedAssetDrift get mergedAssetDrift => i14.ReadDatabaseContainer(this)
|
||||
.accessor<i13.MergedAssetDrift>(i13.MergedAssetDrift.new);
|
||||
late final i13.$LoggerMessageEntityTable loggerMessageEntity =
|
||||
i13.$LoggerMessageEntityTable(this);
|
||||
i14.MergedAssetDrift get mergedAssetDrift => i15.ReadDatabaseContainer(this)
|
||||
.accessor<i14.MergedAssetDrift>(i14.MergedAssetDrift.new);
|
||||
@override
|
||||
Iterable<i0.TableInfo<i0.Table, Object?>> get allTables =>
|
||||
allSchemaEntities.whereType<i0.TableInfo<i0.Table, Object?>>();
|
||||
@@ -75,7 +79,8 @@ abstract class $Drift extends i0.GeneratedDatabase {
|
||||
remoteAlbumEntity,
|
||||
remoteAlbumAssetEntity,
|
||||
remoteAlbumUserEntity,
|
||||
storeEntity
|
||||
storeEntity,
|
||||
loggerMessageEntity
|
||||
];
|
||||
@override
|
||||
i0.StreamQueryUpdateRules get streamUpdateRules =>
|
||||
@@ -214,4 +219,6 @@ class $DriftManager {
|
||||
.$$RemoteAlbumUserEntityTableTableManager(_db, _db.remoteAlbumUserEntity);
|
||||
i12.$$StoreEntityTableTableManager get storeEntity =>
|
||||
i12.$$StoreEntityTableTableManager(_db, _db.storeEntity);
|
||||
i13.$$LoggerMessageEntityTableTableManager get loggerMessageEntity =>
|
||||
i13.$$LoggerMessageEntityTableTableManager(_db, _db.loggerMessageEntity);
|
||||
}
|
||||
|
||||
@@ -1,46 +1,99 @@
|
||||
import 'package:drift/drift.dart';
|
||||
import 'package:immich_mobile/domain/models/log.model.dart';
|
||||
import 'package:immich_mobile/infrastructure/entities/log.entity.dart';
|
||||
import 'package:immich_mobile/infrastructure/entities/log.entity.drift.dart';
|
||||
import 'package:immich_mobile/infrastructure/repositories/db.repository.dart';
|
||||
import 'package:isar/isar.dart';
|
||||
import 'package:immich_mobile/providers/infrastructure/db.provider.dart';
|
||||
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||
|
||||
class IsarLogRepository extends IsarDatabaseRepository {
|
||||
final Isar _db;
|
||||
const IsarLogRepository(super.db) : _db = db;
|
||||
final driftLogRepositoryProvider = Provider<LogRepository>(
|
||||
(ref) => LogRepository(ref.watch(driftProvider)),
|
||||
);
|
||||
|
||||
class LogRepository {
|
||||
final Drift _db;
|
||||
|
||||
const LogRepository(this._db);
|
||||
|
||||
Future<bool> deleteAll() async {
|
||||
await transaction(() async => await _db.loggerMessages.clear());
|
||||
await _db.transaction(() async {
|
||||
await _db.delete(_db.loggerMessageEntity).go();
|
||||
});
|
||||
return true;
|
||||
}
|
||||
|
||||
Future<List<LogMessage>> getAll() async {
|
||||
final logs =
|
||||
await _db.loggerMessages.where().sortByCreatedAtDesc().findAll();
|
||||
return logs.map((l) => l.toDto()).toList();
|
||||
final query = _db.select(_db.loggerMessageEntity)
|
||||
..orderBy([(t) => OrderingTerm.desc(t.createdAt)]);
|
||||
final results = await query.get();
|
||||
return results
|
||||
.map(
|
||||
(row) => LogMessage(
|
||||
message: row.message,
|
||||
level: row.level,
|
||||
createdAt: row.createdAt,
|
||||
logger: row.context1,
|
||||
error: row.details,
|
||||
stack: row.context2,
|
||||
),
|
||||
)
|
||||
.toList();
|
||||
}
|
||||
|
||||
Future<bool> insert(LogMessage log) async {
|
||||
final logEntity = LoggerMessage.fromDto(log);
|
||||
await transaction(() async {
|
||||
await _db.loggerMessages.put(logEntity);
|
||||
await _db.transaction(() async {
|
||||
await _db.into(_db.loggerMessageEntity).insert(
|
||||
LoggerMessageEntityCompanion.insert(
|
||||
id: 0, // Will be auto-incremented by the database
|
||||
message: log.message,
|
||||
details: Value(log.error),
|
||||
level: log.level,
|
||||
createdAt: log.createdAt,
|
||||
context1: Value(log.logger),
|
||||
context2: Value(log.stack),
|
||||
),
|
||||
);
|
||||
});
|
||||
return true;
|
||||
}
|
||||
|
||||
Future<bool> insertAll(Iterable<LogMessage> logs) async {
|
||||
await transaction(() async {
|
||||
final logEntities =
|
||||
logs.map((log) => LoggerMessage.fromDto(log)).toList();
|
||||
await _db.loggerMessages.putAll(logEntities);
|
||||
await _db.transaction(() async {
|
||||
for (final log in logs) {
|
||||
await _db.into(_db.loggerMessageEntity).insert(
|
||||
LoggerMessageEntityCompanion.insert(
|
||||
id: 0, // Will be auto-incremented by the database
|
||||
message: log.message,
|
||||
details: Value(log.error),
|
||||
level: log.level,
|
||||
createdAt: log.createdAt,
|
||||
context1: Value(log.logger),
|
||||
context2: Value(log.stack),
|
||||
),
|
||||
);
|
||||
}
|
||||
});
|
||||
return true;
|
||||
}
|
||||
|
||||
Future<void> truncate({int limit = 250}) async {
|
||||
await transaction(() async {
|
||||
final count = await _db.loggerMessages.count();
|
||||
await _db.transaction(() async {
|
||||
final countQuery = _db.selectOnly(_db.loggerMessageEntity)
|
||||
..addColumns([_db.loggerMessageEntity.id.count()]);
|
||||
final countResult = await countQuery.getSingle();
|
||||
final count = countResult.read(_db.loggerMessageEntity.id.count()) ?? 0;
|
||||
|
||||
if (count <= limit) return;
|
||||
|
||||
final toRemove = count - limit;
|
||||
await _db.loggerMessages.where().limit(toRemove).deleteAll();
|
||||
final oldestIds = await (_db.select(_db.loggerMessageEntity)
|
||||
..orderBy([(t) => OrderingTerm.asc(t.createdAt)])
|
||||
..limit(toRemove))
|
||||
.get();
|
||||
|
||||
final idsToDelete = oldestIds.map((row) => row.id).toList();
|
||||
await (_db.delete(_db.loggerMessageEntity)
|
||||
..where((tbl) => tbl.id.isIn(idsToDelete)))
|
||||
.go();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user