mirror of https://github.com/AMT-Cheif/drift.git
Add interceptor example to docs
This commit is contained in:
parent
446832c341
commit
b096e84fd4
|
@ -0,0 +1,92 @@
|
|||
import 'dart:async';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:drift/drift.dart';
|
||||
import 'package:drift/native.dart';
|
||||
|
||||
// #docregion class
|
||||
class LogInterceptor extends QueryInterceptor {
|
||||
Future<T> _run<T>(
|
||||
String description, FutureOr<T> Function() operation) async {
|
||||
final stopwatch = Stopwatch()..start();
|
||||
print('Running $description');
|
||||
|
||||
try {
|
||||
final result = await operation();
|
||||
print(' => succeeded after ${stopwatch.elapsedMilliseconds}ms');
|
||||
return result;
|
||||
} on Object catch (e) {
|
||||
print(' => failed after ${stopwatch.elapsedMilliseconds}ms ($e)');
|
||||
rethrow;
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
TransactionExecutor beginTransaction(QueryExecutor parent) {
|
||||
print('begin');
|
||||
return super.beginTransaction(parent);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> commitTransaction(TransactionExecutor inner) {
|
||||
return _run('commit', () => inner.send());
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> rollbackTransaction(TransactionExecutor inner) {
|
||||
return _run('rollback', () => inner.rollback());
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> runBatched(
|
||||
QueryExecutor executor, BatchedStatements statements) {
|
||||
return _run(
|
||||
'batch with $statements', () => executor.runBatched(statements));
|
||||
}
|
||||
|
||||
@override
|
||||
Future<int> runInsert(
|
||||
QueryExecutor executor, String statement, List<Object?> args) {
|
||||
return _run(
|
||||
'$statement with $args', () => executor.runInsert(statement, args));
|
||||
}
|
||||
|
||||
@override
|
||||
Future<int> runUpdate(
|
||||
QueryExecutor executor, String statement, List<Object?> args) {
|
||||
return _run(
|
||||
'$statement with $args', () => executor.runUpdate(statement, args));
|
||||
}
|
||||
|
||||
@override
|
||||
Future<int> runDelete(
|
||||
QueryExecutor executor, String statement, List<Object?> args) {
|
||||
return _run(
|
||||
'$statement with $args', () => executor.runDelete(statement, args));
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> runCustom(
|
||||
QueryExecutor executor, String statement, List<Object?> args) {
|
||||
return _run(
|
||||
'$statement with $args', () => executor.runCustom(statement, args));
|
||||
}
|
||||
|
||||
@override
|
||||
Future<List<Map<String, Object?>>> runSelect(
|
||||
QueryExecutor executor, String statement, List<Object?> args) {
|
||||
return _run(
|
||||
'$statement with $args', () => executor.runSelect(statement, args));
|
||||
}
|
||||
}
|
||||
// #enddocregion class
|
||||
|
||||
void use() {
|
||||
final myDatabaseFile = File('/dev/null');
|
||||
|
||||
// #docregion use
|
||||
NativeDatabase.createInBackground(
|
||||
myDatabaseFile,
|
||||
).interceptWith(LogInterceptor());
|
||||
// #enddocregion use
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
---
|
||||
data:
|
||||
title: "Tracing database operations"
|
||||
description: Using the `QueryInterceptor` API to log details about database operations.
|
||||
template: layouts/docs/single
|
||||
---
|
||||
|
||||
{% assign snippets = 'package:drift_docs/snippets/log_interceptor.dart.excerpt.json' | readString | json_decode %}
|
||||
|
||||
Drift provides the relatively simple `logStatements` option to print the statements it
|
||||
executes.
|
||||
The `QueryInterceptor` API can be used to extend this logging to provide more information,
|
||||
which this example will show.
|
||||
|
||||
{% include "blocks/snippet" snippets=snippets name="class" %}
|
||||
|
||||
Interceptors can be applied with the `interceptWith` extension on `QueryExecutor` and
|
||||
`DatabaseConnection`:
|
||||
|
||||
{% include "blocks/snippet" snippets=snippets name="use" %}
|
||||
|
||||
The `QueryInterceptor` class is pretty powerful, as it allows you to fully control the underlying
|
||||
database connection. You could also use it to retry some failing statements or to aggregate
|
||||
statistics about query times to an external monitoring service.
|
|
@ -1,6 +1,7 @@
|
|||
import 'package:drift/drift.dart';
|
||||
import 'package:drift/native.dart';
|
||||
import 'package:drift_docs/snippets/dart_api/datetime_conversion.dart';
|
||||
import 'package:drift_docs/snippets/log_interceptor.dart';
|
||||
import 'package:drift_docs/snippets/modular/schema_inspection.dart';
|
||||
import 'package:test/test.dart';
|
||||
|
||||
|
@ -117,4 +118,34 @@ void main() {
|
|||
expect(row.name, 'bar');
|
||||
});
|
||||
});
|
||||
|
||||
test('interceptor', () {
|
||||
expect(
|
||||
() async {
|
||||
final db =
|
||||
Database(NativeDatabase.memory().interceptWith(LogInterceptor()));
|
||||
|
||||
await db.batch((batch) {
|
||||
batch.insert(db.users, UsersCompanion.insert(name: 'foo'));
|
||||
});
|
||||
|
||||
await db.users.all().get();
|
||||
},
|
||||
prints(
|
||||
allOf(
|
||||
stringContainsInOrder(
|
||||
[
|
||||
'begin',
|
||||
'Running batch with BatchedStatements',
|
||||
' => succeeded after ',
|
||||
'Running commit',
|
||||
' => succeeded after ',
|
||||
'Running SELECT * FROM "users"; with []',
|
||||
' => succeeded after'
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
});
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue