create migration
This commit is contained in:
File diff suppressed because one or more lines are too long
@@ -21,12 +21,13 @@ import 'package:drift/drift.dart';
|
|||||||
import 'package:weblibre/features/bangs/data/database/daos/bang.dart';
|
import 'package:weblibre/features/bangs/data/database/daos/bang.dart';
|
||||||
import 'package:weblibre/features/bangs/data/database/daos/sync.dart';
|
import 'package:weblibre/features/bangs/data/database/daos/sync.dart';
|
||||||
import 'package:weblibre/features/bangs/data/database/database.drift.dart';
|
import 'package:weblibre/features/bangs/data/database/database.drift.dart';
|
||||||
|
import 'package:weblibre/features/bangs/data/database/database.steps.dart';
|
||||||
import 'package:weblibre/features/search/domain/fts_tokenizer.dart';
|
import 'package:weblibre/features/search/domain/fts_tokenizer.dart';
|
||||||
|
|
||||||
@DriftDatabase(include: {'definitions.drift'}, daos: [BangDao, SyncDao])
|
@DriftDatabase(include: {'definitions.drift'}, daos: [BangDao, SyncDao])
|
||||||
class BangDatabase extends $BangDatabase with PrefixQueryBuilderMixin {
|
class BangDatabase extends $BangDatabase with PrefixQueryBuilderMixin {
|
||||||
@override
|
@override
|
||||||
final int schemaVersion = 1;
|
final int schemaVersion = 2;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
final int ftsTokenLimit = 6;
|
final int ftsTokenLimit = 6;
|
||||||
@@ -38,6 +39,11 @@ class BangDatabase extends $BangDatabase with PrefixQueryBuilderMixin {
|
|||||||
beforeOpen: (details) async {
|
beforeOpen: (details) async {
|
||||||
await customStatement('PRAGMA foreign_keys = ON;');
|
await customStatement('PRAGMA foreign_keys = ON;');
|
||||||
},
|
},
|
||||||
|
onUpgrade: stepByStep(
|
||||||
|
from1To2: (m, schema) async {
|
||||||
|
//Too many changes, we switch to a new database
|
||||||
|
},
|
||||||
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
BangDatabase(super.e);
|
BangDatabase(super.e);
|
||||||
|
|||||||
@@ -0,0 +1,431 @@
|
|||||||
|
// dart format width=80
|
||||||
|
import 'package:drift/internal/versioned_schema.dart' as i0;
|
||||||
|
import 'package:drift/drift.dart' as i1;
|
||||||
|
import 'package:drift/drift.dart'; // ignore_for_file: type=lint,unused_import
|
||||||
|
|
||||||
|
// GENERATED BY drift_dev, DO NOT MODIFY.
|
||||||
|
final class Schema2 extends i0.VersionedSchema {
|
||||||
|
Schema2({required super.database}) : super(version: 2);
|
||||||
|
@override
|
||||||
|
late final List<i1.DatabaseSchemaEntity> entities = [
|
||||||
|
bang,
|
||||||
|
bangSync,
|
||||||
|
bangFrequency,
|
||||||
|
bangHistory,
|
||||||
|
bangFts,
|
||||||
|
bangDataView,
|
||||||
|
bangAfterInsert,
|
||||||
|
bangAfterDelete,
|
||||||
|
bangAfterUpdate,
|
||||||
|
];
|
||||||
|
late final Shape0 bang = Shape0(
|
||||||
|
source: i0.VersionedTable(
|
||||||
|
entityName: 'bang',
|
||||||
|
withoutRowId: false,
|
||||||
|
isStrict: false,
|
||||||
|
tableConstraints: ['PRIMARY KEY("trigger", "group")'],
|
||||||
|
columns: [
|
||||||
|
_column_0,
|
||||||
|
_column_1,
|
||||||
|
_column_2,
|
||||||
|
_column_3,
|
||||||
|
_column_4,
|
||||||
|
_column_5,
|
||||||
|
_column_6,
|
||||||
|
_column_7,
|
||||||
|
],
|
||||||
|
attachedDatabase: database,
|
||||||
|
),
|
||||||
|
alias: null,
|
||||||
|
);
|
||||||
|
late final Shape1 bangSync = Shape1(
|
||||||
|
source: i0.VersionedTable(
|
||||||
|
entityName: 'bang_sync',
|
||||||
|
withoutRowId: false,
|
||||||
|
isStrict: false,
|
||||||
|
tableConstraints: [],
|
||||||
|
columns: [_column_8, _column_9],
|
||||||
|
attachedDatabase: database,
|
||||||
|
),
|
||||||
|
alias: null,
|
||||||
|
);
|
||||||
|
late final Shape2 bangFrequency = Shape2(
|
||||||
|
source: i0.VersionedTable(
|
||||||
|
entityName: 'bang_frequency',
|
||||||
|
withoutRowId: false,
|
||||||
|
isStrict: false,
|
||||||
|
tableConstraints: [
|
||||||
|
'PRIMARY KEY("trigger", "group")',
|
||||||
|
'FOREIGN KEY("trigger", "group")REFERENCES bang("trigger", "group")ON DELETE CASCADE',
|
||||||
|
],
|
||||||
|
columns: [_column_0, _column_1, _column_10, _column_11],
|
||||||
|
attachedDatabase: database,
|
||||||
|
),
|
||||||
|
alias: null,
|
||||||
|
);
|
||||||
|
late final Shape3 bangHistory = Shape3(
|
||||||
|
source: i0.VersionedTable(
|
||||||
|
entityName: 'bang_history',
|
||||||
|
withoutRowId: false,
|
||||||
|
isStrict: false,
|
||||||
|
tableConstraints: [
|
||||||
|
'FOREIGN KEY("trigger", "group")REFERENCES bang("trigger", "group")',
|
||||||
|
],
|
||||||
|
columns: [_column_12, _column_0, _column_1, _column_13],
|
||||||
|
attachedDatabase: database,
|
||||||
|
),
|
||||||
|
alias: null,
|
||||||
|
);
|
||||||
|
late final Shape4 bangFts = Shape4(
|
||||||
|
source: i0.VersionedVirtualTable(
|
||||||
|
entityName: 'bang_fts',
|
||||||
|
moduleAndArgs:
|
||||||
|
'fts5(trigger, website_name, content=bang, prefix=\'2 3\')',
|
||||||
|
columns: [_column_14, _column_15],
|
||||||
|
attachedDatabase: database,
|
||||||
|
),
|
||||||
|
alias: null,
|
||||||
|
);
|
||||||
|
late final Shape5 bangDataView = Shape5(
|
||||||
|
source: i0.VersionedView(
|
||||||
|
entityName: 'bang_data_view',
|
||||||
|
createViewStmt:
|
||||||
|
'CREATE VIEW bang_data_view AS SELECT b.*, bf.frequency, bf.last_used FROM bang AS b LEFT JOIN bang_frequency AS bf ON b."trigger" = bf."trigger" AND b."group" = bf."group";',
|
||||||
|
columns: [
|
||||||
|
_column_16,
|
||||||
|
_column_17,
|
||||||
|
_column_18,
|
||||||
|
_column_19,
|
||||||
|
_column_20,
|
||||||
|
_column_21,
|
||||||
|
_column_22,
|
||||||
|
_column_23,
|
||||||
|
_column_24,
|
||||||
|
_column_25,
|
||||||
|
],
|
||||||
|
attachedDatabase: database,
|
||||||
|
),
|
||||||
|
alias: null,
|
||||||
|
);
|
||||||
|
final i1.Trigger bangAfterInsert = i1.Trigger(
|
||||||
|
'CREATE TRIGGER bang_after_insert AFTER INSERT ON bang BEGIN INSERT INTO bang_fts ("rowid", "trigger", website_name) VALUES (new."rowid", new."trigger", new.website_name);END',
|
||||||
|
'bang_after_insert',
|
||||||
|
);
|
||||||
|
final i1.Trigger bangAfterDelete = i1.Trigger(
|
||||||
|
'CREATE TRIGGER bang_after_delete AFTER DELETE ON bang BEGIN INSERT INTO bang_fts (bang_fts, "rowid", "trigger", website_name) VALUES (\'delete\', old."rowid", old."trigger", old.website_name);END',
|
||||||
|
'bang_after_delete',
|
||||||
|
);
|
||||||
|
final i1.Trigger bangAfterUpdate = i1.Trigger(
|
||||||
|
'CREATE TRIGGER bang_after_update AFTER UPDATE ON bang BEGIN INSERT INTO bang_fts (bang_fts, "rowid", "trigger", website_name) VALUES (\'delete\', old."rowid", old."trigger", old.website_name);INSERT INTO bang_fts ("rowid", "trigger", website_name) VALUES (new."rowid", new."trigger", new.website_name);END',
|
||||||
|
'bang_after_update',
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
class Shape0 extends i0.VersionedTable {
|
||||||
|
Shape0({required super.source, required super.alias}) : super.aliased();
|
||||||
|
i1.GeneratedColumn<String> get trigger =>
|
||||||
|
columnsByName['trigger']! as i1.GeneratedColumn<String>;
|
||||||
|
i1.GeneratedColumn<int> get group =>
|
||||||
|
columnsByName['group']! as i1.GeneratedColumn<int>;
|
||||||
|
i1.GeneratedColumn<String> get websiteName =>
|
||||||
|
columnsByName['website_name']! as i1.GeneratedColumn<String>;
|
||||||
|
i1.GeneratedColumn<String> get domain =>
|
||||||
|
columnsByName['domain']! as i1.GeneratedColumn<String>;
|
||||||
|
i1.GeneratedColumn<String> get urlTemplate =>
|
||||||
|
columnsByName['url_template']! as i1.GeneratedColumn<String>;
|
||||||
|
i1.GeneratedColumn<String> get category =>
|
||||||
|
columnsByName['category']! as i1.GeneratedColumn<String>;
|
||||||
|
i1.GeneratedColumn<String> get subCategory =>
|
||||||
|
columnsByName['sub_category']! as i1.GeneratedColumn<String>;
|
||||||
|
i1.GeneratedColumn<String> get format =>
|
||||||
|
columnsByName['format']! as i1.GeneratedColumn<String>;
|
||||||
|
}
|
||||||
|
|
||||||
|
i1.GeneratedColumn<String> _column_0(String aliasedName) =>
|
||||||
|
i1.GeneratedColumn<String>(
|
||||||
|
'trigger',
|
||||||
|
aliasedName,
|
||||||
|
false,
|
||||||
|
type: i1.DriftSqlType.string,
|
||||||
|
$customConstraints: 'NOT NULL',
|
||||||
|
);
|
||||||
|
i1.GeneratedColumn<int> _column_1(String aliasedName) =>
|
||||||
|
i1.GeneratedColumn<int>(
|
||||||
|
'group',
|
||||||
|
aliasedName,
|
||||||
|
false,
|
||||||
|
type: i1.DriftSqlType.int,
|
||||||
|
$customConstraints: 'NOT NULL',
|
||||||
|
);
|
||||||
|
i1.GeneratedColumn<String> _column_2(String aliasedName) =>
|
||||||
|
i1.GeneratedColumn<String>(
|
||||||
|
'website_name',
|
||||||
|
aliasedName,
|
||||||
|
false,
|
||||||
|
type: i1.DriftSqlType.string,
|
||||||
|
$customConstraints: 'NOT NULL',
|
||||||
|
);
|
||||||
|
i1.GeneratedColumn<String> _column_3(String aliasedName) =>
|
||||||
|
i1.GeneratedColumn<String>(
|
||||||
|
'domain',
|
||||||
|
aliasedName,
|
||||||
|
false,
|
||||||
|
type: i1.DriftSqlType.string,
|
||||||
|
$customConstraints: 'NOT NULL',
|
||||||
|
);
|
||||||
|
i1.GeneratedColumn<String> _column_4(String aliasedName) =>
|
||||||
|
i1.GeneratedColumn<String>(
|
||||||
|
'url_template',
|
||||||
|
aliasedName,
|
||||||
|
false,
|
||||||
|
type: i1.DriftSqlType.string,
|
||||||
|
$customConstraints: 'NOT NULL',
|
||||||
|
);
|
||||||
|
i1.GeneratedColumn<String> _column_5(String aliasedName) =>
|
||||||
|
i1.GeneratedColumn<String>(
|
||||||
|
'category',
|
||||||
|
aliasedName,
|
||||||
|
true,
|
||||||
|
type: i1.DriftSqlType.string,
|
||||||
|
$customConstraints: '',
|
||||||
|
);
|
||||||
|
i1.GeneratedColumn<String> _column_6(String aliasedName) =>
|
||||||
|
i1.GeneratedColumn<String>(
|
||||||
|
'sub_category',
|
||||||
|
aliasedName,
|
||||||
|
true,
|
||||||
|
type: i1.DriftSqlType.string,
|
||||||
|
$customConstraints: '',
|
||||||
|
);
|
||||||
|
i1.GeneratedColumn<String> _column_7(String aliasedName) =>
|
||||||
|
i1.GeneratedColumn<String>(
|
||||||
|
'format',
|
||||||
|
aliasedName,
|
||||||
|
true,
|
||||||
|
type: i1.DriftSqlType.string,
|
||||||
|
$customConstraints: '',
|
||||||
|
);
|
||||||
|
|
||||||
|
class Shape1 extends i0.VersionedTable {
|
||||||
|
Shape1({required super.source, required super.alias}) : super.aliased();
|
||||||
|
i1.GeneratedColumn<int> get group =>
|
||||||
|
columnsByName['group']! as i1.GeneratedColumn<int>;
|
||||||
|
i1.GeneratedColumn<DateTime> get lastSync =>
|
||||||
|
columnsByName['last_sync']! as i1.GeneratedColumn<DateTime>;
|
||||||
|
}
|
||||||
|
|
||||||
|
i1.GeneratedColumn<int> _column_8(String aliasedName) =>
|
||||||
|
i1.GeneratedColumn<int>(
|
||||||
|
'group',
|
||||||
|
aliasedName,
|
||||||
|
false,
|
||||||
|
type: i1.DriftSqlType.int,
|
||||||
|
$customConstraints: 'PRIMARY KEY NOT NULL',
|
||||||
|
);
|
||||||
|
i1.GeneratedColumn<DateTime> _column_9(String aliasedName) =>
|
||||||
|
i1.GeneratedColumn<DateTime>(
|
||||||
|
'last_sync',
|
||||||
|
aliasedName,
|
||||||
|
false,
|
||||||
|
type: i1.DriftSqlType.dateTime,
|
||||||
|
$customConstraints: 'NOT NULL',
|
||||||
|
);
|
||||||
|
|
||||||
|
class Shape2 extends i0.VersionedTable {
|
||||||
|
Shape2({required super.source, required super.alias}) : super.aliased();
|
||||||
|
i1.GeneratedColumn<String> get trigger =>
|
||||||
|
columnsByName['trigger']! as i1.GeneratedColumn<String>;
|
||||||
|
i1.GeneratedColumn<int> get group =>
|
||||||
|
columnsByName['group']! as i1.GeneratedColumn<int>;
|
||||||
|
i1.GeneratedColumn<int> get frequency =>
|
||||||
|
columnsByName['frequency']! as i1.GeneratedColumn<int>;
|
||||||
|
i1.GeneratedColumn<DateTime> get lastUsed =>
|
||||||
|
columnsByName['last_used']! as i1.GeneratedColumn<DateTime>;
|
||||||
|
}
|
||||||
|
|
||||||
|
i1.GeneratedColumn<int> _column_10(String aliasedName) =>
|
||||||
|
i1.GeneratedColumn<int>(
|
||||||
|
'frequency',
|
||||||
|
aliasedName,
|
||||||
|
false,
|
||||||
|
type: i1.DriftSqlType.int,
|
||||||
|
$customConstraints: 'NOT NULL',
|
||||||
|
);
|
||||||
|
i1.GeneratedColumn<DateTime> _column_11(String aliasedName) =>
|
||||||
|
i1.GeneratedColumn<DateTime>(
|
||||||
|
'last_used',
|
||||||
|
aliasedName,
|
||||||
|
false,
|
||||||
|
type: i1.DriftSqlType.dateTime,
|
||||||
|
$customConstraints: 'NOT NULL',
|
||||||
|
);
|
||||||
|
|
||||||
|
class Shape3 extends i0.VersionedTable {
|
||||||
|
Shape3({required super.source, required super.alias}) : super.aliased();
|
||||||
|
i1.GeneratedColumn<String> get searchQuery =>
|
||||||
|
columnsByName['search_query']! as i1.GeneratedColumn<String>;
|
||||||
|
i1.GeneratedColumn<String> get trigger =>
|
||||||
|
columnsByName['trigger']! as i1.GeneratedColumn<String>;
|
||||||
|
i1.GeneratedColumn<int> get group =>
|
||||||
|
columnsByName['group']! as i1.GeneratedColumn<int>;
|
||||||
|
i1.GeneratedColumn<DateTime> get searchDate =>
|
||||||
|
columnsByName['search_date']! as i1.GeneratedColumn<DateTime>;
|
||||||
|
}
|
||||||
|
|
||||||
|
i1.GeneratedColumn<String> _column_12(String aliasedName) =>
|
||||||
|
i1.GeneratedColumn<String>(
|
||||||
|
'search_query',
|
||||||
|
aliasedName,
|
||||||
|
false,
|
||||||
|
type: i1.DriftSqlType.string,
|
||||||
|
$customConstraints: 'UNIQUE NOT NULL',
|
||||||
|
);
|
||||||
|
i1.GeneratedColumn<DateTime> _column_13(String aliasedName) =>
|
||||||
|
i1.GeneratedColumn<DateTime>(
|
||||||
|
'search_date',
|
||||||
|
aliasedName,
|
||||||
|
false,
|
||||||
|
type: i1.DriftSqlType.dateTime,
|
||||||
|
$customConstraints: 'NOT NULL',
|
||||||
|
);
|
||||||
|
|
||||||
|
class Shape4 extends i0.VersionedVirtualTable {
|
||||||
|
Shape4({required super.source, required super.alias}) : super.aliased();
|
||||||
|
i1.GeneratedColumn<String> get trigger =>
|
||||||
|
columnsByName['trigger']! as i1.GeneratedColumn<String>;
|
||||||
|
i1.GeneratedColumn<String> get websiteName =>
|
||||||
|
columnsByName['website_name']! as i1.GeneratedColumn<String>;
|
||||||
|
}
|
||||||
|
|
||||||
|
i1.GeneratedColumn<String> _column_14(String aliasedName) =>
|
||||||
|
i1.GeneratedColumn<String>(
|
||||||
|
'trigger',
|
||||||
|
aliasedName,
|
||||||
|
false,
|
||||||
|
type: i1.DriftSqlType.string,
|
||||||
|
$customConstraints: '',
|
||||||
|
);
|
||||||
|
i1.GeneratedColumn<String> _column_15(String aliasedName) =>
|
||||||
|
i1.GeneratedColumn<String>(
|
||||||
|
'website_name',
|
||||||
|
aliasedName,
|
||||||
|
false,
|
||||||
|
type: i1.DriftSqlType.string,
|
||||||
|
$customConstraints: '',
|
||||||
|
);
|
||||||
|
|
||||||
|
class Shape5 extends i0.VersionedView {
|
||||||
|
Shape5({required super.source, required super.alias}) : super.aliased();
|
||||||
|
i1.GeneratedColumn<String> get trigger =>
|
||||||
|
columnsByName['trigger']! as i1.GeneratedColumn<String>;
|
||||||
|
i1.GeneratedColumn<int> get group =>
|
||||||
|
columnsByName['group']! as i1.GeneratedColumn<int>;
|
||||||
|
i1.GeneratedColumn<String> get websiteName =>
|
||||||
|
columnsByName['website_name']! as i1.GeneratedColumn<String>;
|
||||||
|
i1.GeneratedColumn<String> get domain =>
|
||||||
|
columnsByName['domain']! as i1.GeneratedColumn<String>;
|
||||||
|
i1.GeneratedColumn<String> get urlTemplate =>
|
||||||
|
columnsByName['url_template']! as i1.GeneratedColumn<String>;
|
||||||
|
i1.GeneratedColumn<String> get category =>
|
||||||
|
columnsByName['category']! as i1.GeneratedColumn<String>;
|
||||||
|
i1.GeneratedColumn<String> get subCategory =>
|
||||||
|
columnsByName['sub_category']! as i1.GeneratedColumn<String>;
|
||||||
|
i1.GeneratedColumn<String> get format =>
|
||||||
|
columnsByName['format']! as i1.GeneratedColumn<String>;
|
||||||
|
i1.GeneratedColumn<int> get frequency =>
|
||||||
|
columnsByName['frequency']! as i1.GeneratedColumn<int>;
|
||||||
|
i1.GeneratedColumn<DateTime> get lastUsed =>
|
||||||
|
columnsByName['last_used']! as i1.GeneratedColumn<DateTime>;
|
||||||
|
}
|
||||||
|
|
||||||
|
i1.GeneratedColumn<String> _column_16(String aliasedName) =>
|
||||||
|
i1.GeneratedColumn<String>(
|
||||||
|
'trigger',
|
||||||
|
aliasedName,
|
||||||
|
false,
|
||||||
|
type: i1.DriftSqlType.string,
|
||||||
|
);
|
||||||
|
i1.GeneratedColumn<int> _column_17(String aliasedName) =>
|
||||||
|
i1.GeneratedColumn<int>(
|
||||||
|
'group',
|
||||||
|
aliasedName,
|
||||||
|
false,
|
||||||
|
type: i1.DriftSqlType.int,
|
||||||
|
);
|
||||||
|
i1.GeneratedColumn<String> _column_18(String aliasedName) =>
|
||||||
|
i1.GeneratedColumn<String>(
|
||||||
|
'website_name',
|
||||||
|
aliasedName,
|
||||||
|
false,
|
||||||
|
type: i1.DriftSqlType.string,
|
||||||
|
);
|
||||||
|
i1.GeneratedColumn<String> _column_19(String aliasedName) =>
|
||||||
|
i1.GeneratedColumn<String>(
|
||||||
|
'domain',
|
||||||
|
aliasedName,
|
||||||
|
false,
|
||||||
|
type: i1.DriftSqlType.string,
|
||||||
|
);
|
||||||
|
i1.GeneratedColumn<String> _column_20(String aliasedName) =>
|
||||||
|
i1.GeneratedColumn<String>(
|
||||||
|
'url_template',
|
||||||
|
aliasedName,
|
||||||
|
false,
|
||||||
|
type: i1.DriftSqlType.string,
|
||||||
|
);
|
||||||
|
i1.GeneratedColumn<String> _column_21(String aliasedName) =>
|
||||||
|
i1.GeneratedColumn<String>(
|
||||||
|
'category',
|
||||||
|
aliasedName,
|
||||||
|
true,
|
||||||
|
type: i1.DriftSqlType.string,
|
||||||
|
);
|
||||||
|
i1.GeneratedColumn<String> _column_22(String aliasedName) =>
|
||||||
|
i1.GeneratedColumn<String>(
|
||||||
|
'sub_category',
|
||||||
|
aliasedName,
|
||||||
|
true,
|
||||||
|
type: i1.DriftSqlType.string,
|
||||||
|
);
|
||||||
|
i1.GeneratedColumn<String> _column_23(String aliasedName) =>
|
||||||
|
i1.GeneratedColumn<String>(
|
||||||
|
'format',
|
||||||
|
aliasedName,
|
||||||
|
true,
|
||||||
|
type: i1.DriftSqlType.string,
|
||||||
|
);
|
||||||
|
i1.GeneratedColumn<int> _column_24(String aliasedName) =>
|
||||||
|
i1.GeneratedColumn<int>(
|
||||||
|
'frequency',
|
||||||
|
aliasedName,
|
||||||
|
true,
|
||||||
|
type: i1.DriftSqlType.int,
|
||||||
|
);
|
||||||
|
i1.GeneratedColumn<DateTime> _column_25(String aliasedName) =>
|
||||||
|
i1.GeneratedColumn<DateTime>(
|
||||||
|
'last_used',
|
||||||
|
aliasedName,
|
||||||
|
true,
|
||||||
|
type: i1.DriftSqlType.dateTime,
|
||||||
|
);
|
||||||
|
i0.MigrationStepWithVersion migrationSteps({
|
||||||
|
required Future<void> Function(i1.Migrator m, Schema2 schema) from1To2,
|
||||||
|
}) {
|
||||||
|
return (currentVersion, database) async {
|
||||||
|
switch (currentVersion) {
|
||||||
|
case 1:
|
||||||
|
final schema = Schema2(database: database);
|
||||||
|
final migrator = i1.Migrator(database, schema);
|
||||||
|
await from1To2(migrator, schema);
|
||||||
|
return 2;
|
||||||
|
default:
|
||||||
|
throw ArgumentError.value('Unknown migration from $currentVersion');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
i1.OnUpgrade stepByStep({
|
||||||
|
required Future<void> Function(i1.Migrator m, Schema2 schema) from1To2,
|
||||||
|
}) => i0.VersionedSchema.stepByStepHelper(
|
||||||
|
step: migrationSteps(from1To2: from1To2),
|
||||||
|
);
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
// dart format width=80
|
||||||
|
// GENERATED CODE, DO NOT EDIT BY HAND.
|
||||||
|
// ignore_for_file: type=lint
|
||||||
|
import 'package:drift/drift.dart';
|
||||||
|
import 'package:drift/internal/migrations.dart';
|
||||||
|
import 'schema_v1.dart' as v1;
|
||||||
|
import 'schema_v2.dart' as v2;
|
||||||
|
|
||||||
|
class GeneratedHelper implements SchemaInstantiationHelper {
|
||||||
|
@override
|
||||||
|
GeneratedDatabase databaseForVersion(QueryExecutor db, int version) {
|
||||||
|
switch (version) {
|
||||||
|
case 1:
|
||||||
|
return v1.DatabaseAtV1(db);
|
||||||
|
case 2:
|
||||||
|
return v2.DatabaseAtV2(db);
|
||||||
|
default:
|
||||||
|
throw MissingSchemaException(version, versions);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static const versions = const [1, 2];
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,97 @@
|
|||||||
|
// dart format width=80
|
||||||
|
// ignore_for_file: unused_local_variable, unused_import
|
||||||
|
import 'package:drift/drift.dart';
|
||||||
|
import 'package:drift_dev/api/migrations_native.dart';
|
||||||
|
import 'package:weblibre/features/bangs/data/database/database.dart';
|
||||||
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
|
import 'generated/schema.dart';
|
||||||
|
|
||||||
|
import 'generated/schema_v1.dart' as v1;
|
||||||
|
import 'generated/schema_v2.dart' as v2;
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
driftRuntimeOptions.dontWarnAboutMultipleDatabases = true;
|
||||||
|
late SchemaVerifier verifier;
|
||||||
|
|
||||||
|
setUpAll(() {
|
||||||
|
verifier = SchemaVerifier(GeneratedHelper());
|
||||||
|
});
|
||||||
|
|
||||||
|
group('simple database migrations', () {
|
||||||
|
// These simple tests verify all possible schema updates with a simple (no
|
||||||
|
// data) migration. This is a quick way to ensure that written database
|
||||||
|
// migrations properly alter the schema.
|
||||||
|
const versions = GeneratedHelper.versions;
|
||||||
|
for (final (i, fromVersion) in versions.indexed) {
|
||||||
|
group('from $fromVersion', () {
|
||||||
|
for (final toVersion in versions.skip(i + 1)) {
|
||||||
|
test('to $toVersion', () async {
|
||||||
|
final schema = await verifier.schemaAt(fromVersion);
|
||||||
|
final db = BangDatabase(schema.newConnection());
|
||||||
|
await verifier.migrateAndValidate(db, toVersion);
|
||||||
|
await db.close();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// The following template shows how to write tests ensuring your migrations
|
||||||
|
// preserve existing data.
|
||||||
|
// Testing this can be useful for migrations that change existing columns
|
||||||
|
// (e.g. by alterating their type or constraints). Migrations that only add
|
||||||
|
// tables or columns typically don't need these advanced tests. For more
|
||||||
|
// information, see https://drift.simonbinder.eu/migrations/tests/#verifying-data-integrity
|
||||||
|
// TODO: This generated template shows how these tests could be written. Adopt
|
||||||
|
// it to your own needs when testing migrations with data integrity.
|
||||||
|
test('migration from v1 to v2 does not corrupt data', () async {
|
||||||
|
// Add data to insert into the old database, and the expected rows after the
|
||||||
|
// migration.
|
||||||
|
// TODO: Fill these lists
|
||||||
|
final oldBangData = <v1.BangData>[];
|
||||||
|
final expectedNewBangData = <v2.BangData>[];
|
||||||
|
|
||||||
|
final oldBangSyncData = <v1.BangSyncData>[];
|
||||||
|
final expectedNewBangSyncData = <v2.BangSyncData>[];
|
||||||
|
|
||||||
|
final oldBangFrequencyData = <v1.BangFrequencyData>[];
|
||||||
|
final expectedNewBangFrequencyData = <v2.BangFrequencyData>[];
|
||||||
|
|
||||||
|
final oldBangHistoryData = <v1.BangHistoryData>[];
|
||||||
|
final expectedNewBangHistoryData = <v2.BangHistoryData>[];
|
||||||
|
|
||||||
|
final oldBangFtsData = <v1.BangFtsData>[];
|
||||||
|
final expectedNewBangFtsData = <v2.BangFtsData>[];
|
||||||
|
|
||||||
|
await verifier.testWithDataIntegrity(
|
||||||
|
oldVersion: 1,
|
||||||
|
newVersion: 2,
|
||||||
|
createOld: v1.DatabaseAtV1.new,
|
||||||
|
createNew: v2.DatabaseAtV2.new,
|
||||||
|
openTestedDatabase: BangDatabase.new,
|
||||||
|
createItems: (batch, oldDb) {
|
||||||
|
batch.insertAll(oldDb.bang, oldBangData);
|
||||||
|
batch.insertAll(oldDb.bangSync, oldBangSyncData);
|
||||||
|
batch.insertAll(oldDb.bangFrequency, oldBangFrequencyData);
|
||||||
|
batch.insertAll(oldDb.bangHistory, oldBangHistoryData);
|
||||||
|
batch.insertAll(oldDb.bangFts, oldBangFtsData);
|
||||||
|
},
|
||||||
|
validateItems: (newDb) async {
|
||||||
|
expect(expectedNewBangData, await newDb.select(newDb.bang).get());
|
||||||
|
expect(
|
||||||
|
expectedNewBangSyncData,
|
||||||
|
await newDb.select(newDb.bangSync).get(),
|
||||||
|
);
|
||||||
|
expect(
|
||||||
|
expectedNewBangFrequencyData,
|
||||||
|
await newDb.select(newDb.bangFrequency).get(),
|
||||||
|
);
|
||||||
|
expect(
|
||||||
|
expectedNewBangHistoryData,
|
||||||
|
await newDb.select(newDb.bangHistory).get(),
|
||||||
|
);
|
||||||
|
expect(expectedNewBangFtsData, await newDb.select(newDb.bangFts).get());
|
||||||
|
},
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user