From 79aedea60eb160f0b6f3958209acf24eb0f9b758 Mon Sep 17 00:00:00 2001 From: YeungKC Date: Thu, 10 Mar 2022 21:36:02 +0800 Subject: [PATCH] Determine schema version. (#1743) Avoid an unnecessary write to the database when no migration is needed. --- docs/lib/snippets/migrations/runtime_verification.dart | 2 +- drift/lib/src/runtime/executor/helpers/engines.dart | 3 ++- drift/test/engines/delegated_database_test.dart | 8 +++++++- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/docs/lib/snippets/migrations/runtime_verification.dart b/docs/lib/snippets/migrations/runtime_verification.dart index 500abcee..c29d9ce3 100644 --- a/docs/lib/snippets/migrations/runtime_verification.dart +++ b/docs/lib/snippets/migrations/runtime_verification.dart @@ -42,4 +42,4 @@ class MyDatabase extends _$MyDatabase { }, ); } -// #enddocregion \ No newline at end of file +// #enddocregion diff --git a/drift/lib/src/runtime/executor/helpers/engines.dart b/drift/lib/src/runtime/executor/helpers/engines.dart index 3d842ae9..0fa766cc 100644 --- a/drift/lib/src/runtime/executor/helpers/engines.dart +++ b/drift/lib/src/runtime/executor/helpers/engines.dart @@ -334,7 +334,8 @@ class DelegatedDatabase extends _BaseExecutor { final openingDetails = OpeningDetails(oldVersion, currentVersion); await user.beforeOpen(_BeforeOpeningExecutor(this), openingDetails); - if (versionDelegate is DynamicVersionDelegate) { + if (versionDelegate is DynamicVersionDelegate && + (oldVersion == null || oldVersion < currentVersion)) { // set version now, after migrations ran successfully await versionDelegate.setSchemaVersion(currentVersion); } diff --git a/drift/test/engines/delegated_database_test.dart b/drift/test/engines/delegated_database_test.dart index efd54a51..d0f6e5c8 100644 --- a/drift/test/engines/delegated_database_test.dart +++ b/drift/test/engines/delegated_database_test.dart @@ -109,14 +109,20 @@ void main() { test('when the database supports dynamic version', () async { final version = _MockDynamicVersionDelegate(); + when(userDb.schemaVersion).thenReturn(3); when(version.schemaVersion).thenAnswer((_) => Future.value(3)); - when(delegate.versionDelegate).thenReturn(version); await db.ensureOpen(userDb); verify(delegate.open(userDb)); verifyNever(delegate.runCustom(any, any)); verify(version.schemaVersion); + // Running migrations from version 3 to 3 + verifyNever(version.setSchemaVersion(3)); + + when(version.schemaVersion).thenAnswer((_) => Future.value(2)); + await db.ensureOpen(userDb); + // Running migrations from version 2 to 3 verify(version.setSchemaVersion(3)); });