mirror of https://github.com/AMT-Cheif/drift.git
Tests for pooled connections, move to main lib
This commit is contained in:
parent
01d48fa0d3
commit
a43f6bdb91
|
@ -1,26 +0,0 @@
|
||||||
/// Support library to support pooled connections with moor.
|
|
||||||
///
|
|
||||||
/// Note that using a pooled connection is not necessary for most moor apps.
|
|
||||||
@experimental
|
|
||||||
library connection_pool;
|
|
||||||
|
|
||||||
import 'package:meta/meta.dart';
|
|
||||||
import 'package:moor/backends.dart';
|
|
||||||
import 'package:moor/moor.dart';
|
|
||||||
|
|
||||||
part 'src/runtime/executor/connection_pool_impl.dart';
|
|
||||||
|
|
||||||
/// A query executor for moor that delegates work to multiple executors.
|
|
||||||
abstract class MultiExecutor extends QueryExecutor {
|
|
||||||
/// Creates a query executor that will delegate work to different executors.
|
|
||||||
///
|
|
||||||
/// Updating statements, or statements that run in a transaction, will be run
|
|
||||||
/// with [write]. Select statements outside of a transaction are executed on
|
|
||||||
/// [read].
|
|
||||||
factory MultiExecutor(
|
|
||||||
{@required QueryExecutor read, @required QueryExecutor write}) {
|
|
||||||
return _MultiExecutorImpl(read, write);
|
|
||||||
}
|
|
||||||
|
|
||||||
MultiExecutor._();
|
|
||||||
}
|
|
|
@ -10,6 +10,7 @@ export 'package:meta/meta.dart' show required;
|
||||||
export 'package:moor/src/dsl/dsl.dart';
|
export 'package:moor/src/dsl/dsl.dart';
|
||||||
export 'package:moor/src/runtime/query_builder/query_builder.dart';
|
export 'package:moor/src/runtime/query_builder/query_builder.dart';
|
||||||
|
|
||||||
|
export 'package:moor/src/runtime/executor/connection_pool.dart';
|
||||||
export 'package:moor/src/runtime/executor/executor.dart';
|
export 'package:moor/src/runtime/executor/executor.dart';
|
||||||
export 'package:moor/src/runtime/executor/transactions.dart';
|
export 'package:moor/src/runtime/executor/transactions.dart';
|
||||||
export 'package:moor/src/runtime/data_verification.dart';
|
export 'package:moor/src/runtime/data_verification.dart';
|
||||||
|
|
|
@ -25,6 +25,12 @@ class DatabaseConnection {
|
||||||
DatabaseConnection.fromExecutor(this.executor)
|
DatabaseConnection.fromExecutor(this.executor)
|
||||||
: typeSystem = SqlTypeSystem.defaultInstance,
|
: typeSystem = SqlTypeSystem.defaultInstance,
|
||||||
streamQueries = StreamQueryStore();
|
streamQueries = StreamQueryStore();
|
||||||
|
|
||||||
|
/// Returns a database connection that is identical to this one, except that
|
||||||
|
/// it uses the provided [executor].
|
||||||
|
DatabaseConnection withExecutor(QueryExecutor executor) {
|
||||||
|
return DatabaseConnection(typeSystem, executor, streamQueries);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Manages a [DatabaseConnection] to send queries to the database.
|
/// Manages a [DatabaseConnection] to send queries to the database.
|
||||||
|
|
|
@ -1,4 +1,21 @@
|
||||||
part of 'package:moor/connection_pool.dart';
|
import 'package:meta/meta.dart';
|
||||||
|
import 'package:moor/backends.dart';
|
||||||
|
import 'package:moor/moor.dart';
|
||||||
|
|
||||||
|
/// A query executor for moor that delegates work to multiple executors.
|
||||||
|
abstract class MultiExecutor extends QueryExecutor {
|
||||||
|
/// Creates a query executor that will delegate work to different executors.
|
||||||
|
///
|
||||||
|
/// Updating statements, or statements that run in a transaction, will be run
|
||||||
|
/// with [write]. Select statements outside of a transaction are executed on
|
||||||
|
/// [read].
|
||||||
|
factory MultiExecutor(
|
||||||
|
{@required QueryExecutor read, @required QueryExecutor write}) {
|
||||||
|
return _MultiExecutorImpl(read, write);
|
||||||
|
}
|
||||||
|
|
||||||
|
MultiExecutor._();
|
||||||
|
}
|
||||||
|
|
||||||
class _MultiExecutorImpl extends MultiExecutor {
|
class _MultiExecutorImpl extends MultiExecutor {
|
||||||
final QueryExecutor _reads;
|
final QueryExecutor _reads;
|
|
@ -0,0 +1,46 @@
|
||||||
|
@TestOn('vm')
|
||||||
|
import 'dart:io';
|
||||||
|
|
||||||
|
import 'package:moor/isolate.dart';
|
||||||
|
import 'package:moor/moor.dart';
|
||||||
|
import 'package:moor_ffi/moor_ffi.dart';
|
||||||
|
import 'package:test/test.dart';
|
||||||
|
|
||||||
|
import 'package:path/path.dart' show join;
|
||||||
|
|
||||||
|
import '../data/tables/todos.dart';
|
||||||
|
|
||||||
|
String fileName = 'moor-wal-integration-test.db';
|
||||||
|
final _file = File(join(Directory.systemTemp.path, fileName));
|
||||||
|
|
||||||
|
QueryExecutor _createExecutor() => VmDatabase(_file);
|
||||||
|
|
||||||
|
DatabaseConnection _forBackgroundIsolate() {
|
||||||
|
return DatabaseConnection.fromExecutor(_createExecutor());
|
||||||
|
}
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
test('can use a multi-executor setup', () async {
|
||||||
|
final isolate = await MoorIsolate.spawn(_forBackgroundIsolate);
|
||||||
|
|
||||||
|
// create an executor that runs selects in this isolate and writes in
|
||||||
|
// another isolate.
|
||||||
|
final background = await isolate.connect();
|
||||||
|
final foreground = background.withExecutor(MultiExecutor(
|
||||||
|
read: _createExecutor(),
|
||||||
|
write: background.executor,
|
||||||
|
));
|
||||||
|
|
||||||
|
final db = TodoDb.connect(foreground);
|
||||||
|
|
||||||
|
await db
|
||||||
|
.into(db.categories)
|
||||||
|
.insert(CategoriesCompanion.insert(description: 'description'));
|
||||||
|
|
||||||
|
final result = await db.select(db.categories).getSingle();
|
||||||
|
expect(result.description, 'description');
|
||||||
|
|
||||||
|
await db.close();
|
||||||
|
await isolate.shutdownAll();
|
||||||
|
});
|
||||||
|
}
|
|
@ -0,0 +1,75 @@
|
||||||
|
import 'package:moor/moor.dart';
|
||||||
|
import 'package:test/test.dart';
|
||||||
|
|
||||||
|
import '../data/tables/todos.dart';
|
||||||
|
import '../data/utils/mocks.dart';
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
MockExecutor read, write;
|
||||||
|
MultiExecutor multi;
|
||||||
|
TodoDb db;
|
||||||
|
|
||||||
|
setUp(() {
|
||||||
|
read = MockExecutor();
|
||||||
|
write = MockExecutor();
|
||||||
|
|
||||||
|
multi = MultiExecutor(read: read, write: write);
|
||||||
|
db = TodoDb(multi);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('opens delegated executors when opening', () async {
|
||||||
|
await multi.ensureOpen();
|
||||||
|
|
||||||
|
verify(write.databaseInfo = db);
|
||||||
|
verify(read.databaseInfo = any);
|
||||||
|
|
||||||
|
verify(read.ensureOpen());
|
||||||
|
verify(write.ensureOpen());
|
||||||
|
});
|
||||||
|
|
||||||
|
test('runs selects on the reading executor', () async {
|
||||||
|
await multi.ensureOpen();
|
||||||
|
|
||||||
|
when(read.runSelect(any, any)).thenAnswer((_) async {
|
||||||
|
return [
|
||||||
|
{'foo': 'bar'}
|
||||||
|
];
|
||||||
|
});
|
||||||
|
|
||||||
|
final result = await multi.runSelect('statement', [1, 2]);
|
||||||
|
|
||||||
|
verify(read.runSelect('statement', [1, 2]));
|
||||||
|
verifyNever(write.runSelect(any, any));
|
||||||
|
|
||||||
|
expect(result, [
|
||||||
|
{'foo': 'bar'}
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('runs updates on the writing executor', () async {
|
||||||
|
await multi.ensureOpen();
|
||||||
|
|
||||||
|
await multi.runUpdate('update', []);
|
||||||
|
await multi.runInsert('insert', []);
|
||||||
|
await multi.runDelete('delete', []);
|
||||||
|
await multi.runBatched([]);
|
||||||
|
|
||||||
|
verify(write.runUpdate('update', []));
|
||||||
|
verify(write.runInsert('insert', []));
|
||||||
|
verify(write.runDelete('delete', []));
|
||||||
|
verify(write.runBatched([]));
|
||||||
|
});
|
||||||
|
|
||||||
|
test('runs transactions on the writing executor', () async {
|
||||||
|
await multi.ensureOpen();
|
||||||
|
|
||||||
|
final transation = multi.beginTransaction();
|
||||||
|
await transation.doWhenOpened((e) async {
|
||||||
|
await e.runSelect('select', []);
|
||||||
|
});
|
||||||
|
|
||||||
|
verify(write.beginTransaction());
|
||||||
|
verify(write.transactions.doWhenOpened(any));
|
||||||
|
verify(write.transactions.runSelect('select', []));
|
||||||
|
});
|
||||||
|
}
|
Loading…
Reference in New Issue