From c5afaf52213adff586db83708c5f1cc4671de1f5 Mon Sep 17 00:00:00 2001 From: Fabian Freund Date: Fri, 21 Nov 2025 07:03:09 +0100 Subject: [PATCH] bang history delete on cascade --- app/drift_schemas/bangs/drift_schema_v4.json | 1 + .../bangs/data/database/database.dart | 5 +- .../bangs/data/database/database.drift.dart | 7 + .../bangs/data/database/database.steps.dart | 191 +- .../bangs/data/database/definitions.drift | 2 +- .../data/database/definitions.drift.dart | 2 +- app/test/drift/bangs/generated/schema.dart | 5 +- app/test/drift/bangs/generated/schema_v4.dart | 2228 +++++++++++++++++ 8 files changed, 2436 insertions(+), 5 deletions(-) create mode 100644 app/drift_schemas/bangs/drift_schema_v4.json create mode 100644 app/test/drift/bangs/generated/schema_v4.dart diff --git a/app/drift_schemas/bangs/drift_schema_v4.json b/app/drift_schemas/bangs/drift_schema_v4.json new file mode 100644 index 00000000..0e6b4096 --- /dev/null +++ b/app/drift_schemas/bangs/drift_schema_v4.json @@ -0,0 +1 @@ +{"_meta":{"description":"This file contains a serialized version of schema entities for drift.","version":"1.2.0"},"options":{"store_date_time_values_as_text":false},"entities":[{"id":0,"references":[],"type":"table","data":{"name":"bang","was_declared_in_moor":true,"columns":[{"name":"trigger","getter_name":"trigger","moor_type":"string","nullable":false,"customConstraints":"NOT NULL","default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"group","getter_name":"group","moor_type":"int","nullable":false,"customConstraints":"NOT NULL","default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumIndexConverter(BangGroup.values)","dart_type_name":"BangGroup"}},{"name":"website_name","getter_name":"websiteName","moor_type":"string","nullable":false,"customConstraints":"NOT NULL","default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"domain","getter_name":"domain","moor_type":"string","nullable":false,"customConstraints":"NOT NULL","default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"url_template","getter_name":"urlTemplate","moor_type":"string","nullable":false,"customConstraints":"NOT NULL","default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"category","getter_name":"category","moor_type":"string","nullable":true,"customConstraints":"","default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"sub_category","getter_name":"subCategory","moor_type":"string","nullable":true,"customConstraints":"","default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"format","getter_name":"format","moor_type":"string","nullable":true,"customConstraints":"","default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const BangFormatConverter()","dart_type_name":"Set?"}},{"name":"additional_triggers","getter_name":"additionalTriggers","moor_type":"string","nullable":true,"customConstraints":"","default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const TriggerListConverter()","dart_type_name":"Set?"}},{"name":"searxng_api","getter_name":"searxngApi","moor_type":"bool","nullable":false,"customConstraints":"NOT NULL DEFAULT FALSE","default_dart":"const CustomExpression('FALSE')","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":["PRIMARY KEY(\"trigger\", \"group\")"],"explicit_pk":["trigger","group"]}},{"id":1,"references":[0],"type":"table","data":{"name":"bang_triggers","was_declared_in_moor":true,"columns":[{"name":"trigger","getter_name":"trigger","moor_type":"string","nullable":false,"customConstraints":"NOT NULL","default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"group","getter_name":"group","moor_type":"int","nullable":false,"customConstraints":"NOT NULL","default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumIndexConverter(BangGroup.values)","dart_type_name":"BangGroup"}},{"name":"additional_trigger","getter_name":"additionalTrigger","moor_type":"string","nullable":false,"customConstraints":"NOT NULL","default_dart":null,"default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":["PRIMARY KEY(\"trigger\", \"group\", additional_trigger)","FOREIGN KEY(\"trigger\", \"group\")REFERENCES bang(\"trigger\", \"group\")ON DELETE CASCADE"],"explicit_pk":["trigger","group","additional_trigger"]}},{"id":2,"references":[1],"type":"index","data":{"on":1,"name":"idx_bang_triggers_lookup","sql":"CREATE INDEX idx_bang_triggers_lookup ON bang_triggers (additional_trigger, \"group\");","unique":false,"columns":[]}},{"id":3,"references":[0,1],"type":"trigger","data":{"on":0,"references_in_body":[0,1],"name":"bang_triggers_after_insert","sql":"CREATE TRIGGER bang_triggers_after_insert AFTER INSERT ON bang \nWHEN new.additional_triggers IS NOT NULL\nBEGIN\n INSERT INTO bang_triggers(\"trigger\", \"group\", additional_trigger)\n SELECT \n new.\"trigger\",\n new.\"group\",\n json_each.value\n FROM json_each(new.additional_triggers);\nEND;"}},{"id":4,"references":[0,1],"type":"trigger","data":{"on":0,"references_in_body":[0,1],"name":"bang_triggers_after_update","sql":"CREATE TRIGGER bang_triggers_after_update AFTER UPDATE ON bang BEGIN\n -- Delete old additional triggers\n DELETE FROM bang_triggers \n WHERE \"trigger\" = old.\"trigger\" AND \"group\" = old.\"group\";\n\n -- Insert new additional triggers if they exist\n INSERT INTO bang_triggers(\"trigger\", \"group\", additional_trigger)\n SELECT \n new.\"trigger\",\n new.\"group\",\n json_each.value\n FROM json_each(new.additional_triggers)\n WHERE new.additional_triggers IS NOT NULL;\nEND;"}},{"id":5,"references":[],"type":"table","data":{"name":"bang_sync","was_declared_in_moor":true,"columns":[{"name":"group","getter_name":"group","moor_type":"int","nullable":false,"customConstraints":"PRIMARY KEY NOT NULL","default_dart":null,"default_client_dart":null,"dsl_features":["primary-key"],"type_converter":{"dart_expr":"const EnumIndexConverter(BangGroup.values)","dart_type_name":"BangGroup"}},{"name":"last_sync","getter_name":"lastSync","moor_type":"dateTime","nullable":false,"customConstraints":"NOT NULL","default_dart":null,"default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":6,"references":[0],"type":"table","data":{"name":"bang_frequency","was_declared_in_moor":true,"columns":[{"name":"trigger","getter_name":"trigger","moor_type":"string","nullable":false,"customConstraints":"NOT NULL","default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"group","getter_name":"group","moor_type":"int","nullable":false,"customConstraints":"NOT NULL","default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumIndexConverter(BangGroup.values)","dart_type_name":"BangGroup"}},{"name":"frequency","getter_name":"frequency","moor_type":"int","nullable":false,"customConstraints":"NOT NULL","default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"last_used","getter_name":"lastUsed","moor_type":"dateTime","nullable":false,"customConstraints":"NOT NULL","default_dart":null,"default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":["PRIMARY KEY(\"trigger\", \"group\")","FOREIGN KEY(\"trigger\", \"group\")REFERENCES bang(\"trigger\", \"group\")ON DELETE CASCADE"],"explicit_pk":["trigger","group"]}},{"id":7,"references":[0],"type":"table","data":{"name":"bang_history","was_declared_in_moor":true,"columns":[{"name":"search_query","getter_name":"searchQuery","moor_type":"string","nullable":false,"customConstraints":"UNIQUE NOT NULL","default_dart":null,"default_client_dart":null,"dsl_features":["unique"]},{"name":"trigger","getter_name":"trigger","moor_type":"string","nullable":false,"customConstraints":"NOT NULL","default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"group","getter_name":"group","moor_type":"int","nullable":false,"customConstraints":"NOT NULL","default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumIndexConverter(BangGroup.values)","dart_type_name":"BangGroup"}},{"name":"search_date","getter_name":"searchDate","moor_type":"dateTime","nullable":false,"customConstraints":"NOT NULL","default_dart":null,"default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":["FOREIGN KEY(\"trigger\", \"group\")REFERENCES bang(\"trigger\", \"group\")ON DELETE CASCADE"]}},{"id":8,"references":[0],"type":"table","data":{"name":"bang_fts","was_declared_in_moor":true,"columns":[{"name":"trigger","getter_name":"trigger","moor_type":"string","nullable":false,"customConstraints":"","default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"website_name","getter_name":"websiteName","moor_type":"string","nullable":false,"customConstraints":"","default_dart":null,"default_client_dart":null,"dsl_features":[]}],"is_virtual":true,"create_virtual_stmt":"CREATE VIRTUAL TABLE \"bang_fts\" USING fts5(trigger, website_name, content=bang, prefix='2 3')","without_rowid":false,"constraints":[]}},{"id":9,"references":[1],"type":"table","data":{"name":"bang_triggers_fts","was_declared_in_moor":true,"columns":[{"name":"additional_trigger","getter_name":"additionalTrigger","moor_type":"string","nullable":false,"customConstraints":"","default_dart":null,"default_client_dart":null,"dsl_features":[]}],"is_virtual":true,"create_virtual_stmt":"CREATE VIRTUAL TABLE \"bang_triggers_fts\" USING fts5(additional_trigger, content=bang_triggers, prefix='2 3')","without_rowid":false,"constraints":[]}},{"id":10,"references":[0,6],"type":"view","data":{"name":"bang_data_view","sql":"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\";","dart_info_name":"BangDataView","columns":[{"name":"trigger","getter_name":"trigger","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"group","getter_name":"group","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumIndexConverter(BangGroup.values)","dart_type_name":"BangGroup"}},{"name":"website_name","getter_name":"websiteName","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"domain","getter_name":"domain","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"url_template","getter_name":"urlTemplate","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"category","getter_name":"category","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"sub_category","getter_name":"subCategory","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"format","getter_name":"format","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const BangFormatConverter()","dart_type_name":"Set?"}},{"name":"additional_triggers","getter_name":"additionalTriggers","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const TriggerListConverter()","dart_type_name":"Set?"}},{"name":"searxng_api","getter_name":"searxngApi","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"searxng_api\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"searxng_api\" IN (0, 1))"},"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"frequency","getter_name":"frequency","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"last_used","getter_name":"lastUsed","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]}]}},{"id":11,"references":[0,8],"type":"trigger","data":{"on":0,"references_in_body":[0,8],"name":"bang_after_insert","sql":"CREATE TRIGGER bang_after_insert AFTER INSERT ON bang BEGIN\n INSERT INTO \n bang_fts(rowid, \"trigger\", website_name) \n VALUES (new.rowid, new.\"trigger\", new.website_name);\nEND;"}},{"id":12,"references":[0,8],"type":"trigger","data":{"on":0,"references_in_body":[0,8],"name":"bang_after_delete","sql":"CREATE TRIGGER bang_after_delete AFTER DELETE ON bang BEGIN\n INSERT INTO \n bang_fts(bang_fts, rowid, \"trigger\", website_name) \n VALUES('delete', old.rowid, old.\"trigger\", old.website_name);\nEND;"}},{"id":13,"references":[0,8],"type":"trigger","data":{"on":0,"references_in_body":[0,8],"name":"bang_after_update","sql":"CREATE TRIGGER bang_after_update AFTER UPDATE ON bang BEGIN\n INSERT INTO \n bang_fts(bang_fts, rowid, \"trigger\", website_name) \n VALUES('delete', old.rowid, old.\"trigger\", old.website_name);\n INSERT INTO \n bang_fts(rowid, \"trigger\", website_name) \n VALUES (new.rowid, new.\"trigger\", new.website_name);\nEND;"}},{"id":14,"references":[1,9],"type":"trigger","data":{"on":1,"references_in_body":[1,9],"name":"bang_triggers_after_insert_fts","sql":"CREATE TRIGGER bang_triggers_after_insert_fts AFTER INSERT ON bang_triggers BEGIN\n INSERT INTO \n bang_triggers_fts(rowid, additional_trigger) \n VALUES (new.rowid, new.additional_trigger);\nEND;"}},{"id":15,"references":[1,9],"type":"trigger","data":{"on":1,"references_in_body":[1,9],"name":"bang_triggers_after_delete_fts","sql":"CREATE TRIGGER bang_triggers_after_delete_fts AFTER DELETE ON bang_triggers BEGIN\n INSERT INTO \n bang_triggers_fts(bang_triggers_fts, rowid, additional_trigger) \n VALUES('delete', old.rowid, old.additional_trigger);\nEND;"}},{"id":16,"references":[1,9],"type":"trigger","data":{"on":1,"references_in_body":[1,9],"name":"bang_triggers_after_update_fts","sql":"CREATE TRIGGER bang_triggers_after_update_fts AFTER UPDATE ON bang_triggers BEGIN\n INSERT INTO \n bang_triggers_fts(bang_triggers_fts, rowid, additional_trigger) \n VALUES('delete', old.rowid, old.additional_trigger);\n INSERT INTO \n bang_triggers_fts(rowid, additional_trigger) \n VALUES (new.rowid, new.additional_trigger);\nEND;"}}]} \ No newline at end of file diff --git a/app/lib/features/bangs/data/database/database.dart b/app/lib/features/bangs/data/database/database.dart index 6e13f61c..1e002371 100644 --- a/app/lib/features/bangs/data/database/database.dart +++ b/app/lib/features/bangs/data/database/database.dart @@ -30,7 +30,7 @@ import 'package:weblibre/features/search/domain/fts_tokenizer.dart'; @DriftDatabase(include: {'definitions.drift'}, daos: [BangDao, SyncDao]) class BangDatabase extends $BangDatabase with PrefixQueryBuilderMixin { @override - final int schemaVersion = 3; + final int schemaVersion = 4; @override final int ftsTokenLimit = 6; @@ -91,5 +91,8 @@ class BangDatabase extends $BangDatabase with PrefixQueryBuilderMixin { final bangAtV3 = schema.bang; await m.addColumn(bangAtV3, bangAtV3.searxngApi); }, + from3To4: (m, schema) async { + await m.alterTable(TableMigration(schema.bangHistory)); + }, ); } diff --git a/app/lib/features/bangs/data/database/database.drift.dart b/app/lib/features/bangs/data/database/database.drift.dart index 639c8312..91054a57 100644 --- a/app/lib/features/bangs/data/database/database.drift.dart +++ b/app/lib/features/bangs/data/database/database.drift.dart @@ -82,6 +82,13 @@ abstract class $BangDatabase extends i0.GeneratedDatabase { ), result: [i0.TableUpdate('bang_frequency', kind: i0.UpdateKind.delete)], ), + i0.WritePropagation( + on: i0.TableUpdateQuery.onTableName( + 'bang', + limitUpdateKind: i0.UpdateKind.delete, + ), + result: [i0.TableUpdate('bang_history', kind: i0.UpdateKind.delete)], + ), i0.WritePropagation( on: i0.TableUpdateQuery.onTableName( 'bang', diff --git a/app/lib/features/bangs/data/database/database.steps.dart b/app/lib/features/bangs/data/database/database.steps.dart index f3a5837a..ce7f3f67 100644 --- a/app/lib/features/bangs/data/database/database.steps.dart +++ b/app/lib/features/bangs/data/database/database.steps.dart @@ -707,9 +707,188 @@ i1.GeneratedColumn _column_31(String aliasedName) => 'CHECK ("searxng_api" IN (0, 1))', ), ); + +final class Schema4 extends i0.VersionedSchema { + Schema4({required super.database}) : super(version: 4); + @override + late final List entities = [ + bang, + bangTriggers, + idxBangTriggersLookup, + bangTriggersAfterInsert, + bangTriggersAfterUpdate, + bangSync, + bangFrequency, + bangHistory, + bangFts, + bangTriggersFts, + bangDataView, + bangAfterInsert, + bangAfterDelete, + bangAfterUpdate, + bangTriggersAfterInsertFts, + bangTriggersAfterDeleteFts, + bangTriggersAfterUpdateFts, + ]; + late final Shape6 bang = Shape6( + 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, + _column_26, + _column_27, + ], + attachedDatabase: database, + ), + alias: null, + ); + late final Shape7 bangTriggers = Shape7( + source: i0.VersionedTable( + entityName: 'bang_triggers', + withoutRowId: false, + isStrict: false, + tableConstraints: [ + 'PRIMARY KEY("trigger", "group", additional_trigger)', + 'FOREIGN KEY("trigger", "group")REFERENCES bang("trigger", "group")ON DELETE CASCADE', + ], + columns: [_column_0, _column_1, _column_28], + attachedDatabase: database, + ), + alias: null, + ); + final i1.Index idxBangTriggersLookup = i1.Index( + 'idx_bang_triggers_lookup', + 'CREATE INDEX idx_bang_triggers_lookup ON bang_triggers (additional_trigger, "group")', + ); + final i1.Trigger bangTriggersAfterInsert = i1.Trigger( + 'CREATE TRIGGER bang_triggers_after_insert AFTER INSERT ON bang WHEN new.additional_triggers IS NOT NULL BEGIN INSERT INTO bang_triggers ("trigger", "group", additional_trigger) SELECT new."trigger", new."group", json_each.value FROM json_each(new.additional_triggers);END', + 'bang_triggers_after_insert', + ); + final i1.Trigger bangTriggersAfterUpdate = i1.Trigger( + 'CREATE TRIGGER bang_triggers_after_update AFTER UPDATE ON bang BEGIN DELETE FROM bang_triggers WHERE "trigger" = old."trigger" AND "group" = old."group";INSERT INTO bang_triggers ("trigger", "group", additional_trigger) SELECT new."trigger", new."group", json_each.value FROM json_each(new.additional_triggers)WHERE new.additional_triggers IS NOT NULL;END', + 'bang_triggers_after_update', + ); + 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")ON DELETE CASCADE', + ], + 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 Shape8 bangTriggersFts = Shape8( + source: i0.VersionedVirtualTable( + entityName: 'bang_triggers_fts', + moduleAndArgs: + 'fts5(additional_trigger, content=bang_triggers, prefix=\'2 3\')', + columns: [_column_29], + attachedDatabase: database, + ), + alias: null, + ); + late final Shape9 bangDataView = Shape9( + 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_30, + _column_31, + _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', + ); + final i1.Trigger bangTriggersAfterInsertFts = i1.Trigger( + 'CREATE TRIGGER bang_triggers_after_insert_fts AFTER INSERT ON bang_triggers BEGIN INSERT INTO bang_triggers_fts ("rowid", additional_trigger) VALUES (new."rowid", new.additional_trigger);END', + 'bang_triggers_after_insert_fts', + ); + final i1.Trigger bangTriggersAfterDeleteFts = i1.Trigger( + 'CREATE TRIGGER bang_triggers_after_delete_fts AFTER DELETE ON bang_triggers BEGIN INSERT INTO bang_triggers_fts (bang_triggers_fts, "rowid", additional_trigger) VALUES (\'delete\', old."rowid", old.additional_trigger);END', + 'bang_triggers_after_delete_fts', + ); + final i1.Trigger bangTriggersAfterUpdateFts = i1.Trigger( + 'CREATE TRIGGER bang_triggers_after_update_fts AFTER UPDATE ON bang_triggers BEGIN INSERT INTO bang_triggers_fts (bang_triggers_fts, "rowid", additional_trigger) VALUES (\'delete\', old."rowid", old.additional_trigger);INSERT INTO bang_triggers_fts ("rowid", additional_trigger) VALUES (new."rowid", new.additional_trigger);END', + 'bang_triggers_after_update_fts', + ); +} + i0.MigrationStepWithVersion migrationSteps({ required Future Function(i1.Migrator m, Schema2 schema) from1To2, required Future Function(i1.Migrator m, Schema3 schema) from2To3, + required Future Function(i1.Migrator m, Schema4 schema) from3To4, }) { return (currentVersion, database) async { switch (currentVersion) { @@ -723,6 +902,11 @@ i0.MigrationStepWithVersion migrationSteps({ final migrator = i1.Migrator(database, schema); await from2To3(migrator, schema); return 3; + case 3: + final schema = Schema4(database: database); + final migrator = i1.Migrator(database, schema); + await from3To4(migrator, schema); + return 4; default: throw ArgumentError.value('Unknown migration from $currentVersion'); } @@ -732,6 +916,11 @@ i0.MigrationStepWithVersion migrationSteps({ i1.OnUpgrade stepByStep({ required Future Function(i1.Migrator m, Schema2 schema) from1To2, required Future Function(i1.Migrator m, Schema3 schema) from2To3, + required Future Function(i1.Migrator m, Schema4 schema) from3To4, }) => i0.VersionedSchema.stepByStepHelper( - step: migrationSteps(from1To2: from1To2, from2To3: from2To3), + step: migrationSteps( + from1To2: from1To2, + from2To3: from2To3, + from3To4: from3To4, + ), ); diff --git a/app/lib/features/bangs/data/database/definitions.drift b/app/lib/features/bangs/data/database/definitions.drift index cbd23aaa..7422355d 100644 --- a/app/lib/features/bangs/data/database/definitions.drift +++ b/app/lib/features/bangs/data/database/definitions.drift @@ -75,7 +75,7 @@ CREATE TABLE bang_history ( "trigger" TEXT NOT NULL, "group" ENUM(BangGroup) NOT NULL, search_date DATETIME NOT NULL, - FOREIGN KEY ("trigger", "group") REFERENCES bang ("trigger", "group") + FOREIGN KEY ("trigger", "group") REFERENCES bang ("trigger", "group") ON DELETE CASCADE ); CREATE VIRTUAL TABLE bang_fts diff --git a/app/lib/features/bangs/data/database/definitions.drift.dart b/app/lib/features/bangs/data/database/definitions.drift.dart index 97b44548..2a429cd2 100644 --- a/app/lib/features/bangs/data/database/definitions.drift.dart +++ b/app/lib/features/bangs/data/database/definitions.drift.dart @@ -2469,7 +2469,7 @@ class BangHistory extends i0.Table const i0.EnumIndexConverter(i2.BangGroup.values); @override List get customConstraints => const [ - 'FOREIGN KEY("trigger", "group")REFERENCES bang("trigger", "group")', + 'FOREIGN KEY("trigger", "group")REFERENCES bang("trigger", "group")ON DELETE CASCADE', ]; @override bool get dontWriteConstraints => true; diff --git a/app/test/drift/bangs/generated/schema.dart b/app/test/drift/bangs/generated/schema.dart index 209e70d7..22131b11 100644 --- a/app/test/drift/bangs/generated/schema.dart +++ b/app/test/drift/bangs/generated/schema.dart @@ -6,6 +6,7 @@ import 'package:drift/internal/migrations.dart'; import 'schema_v1.dart' as v1; import 'schema_v2.dart' as v2; import 'schema_v3.dart' as v3; +import 'schema_v4.dart' as v4; class GeneratedHelper implements SchemaInstantiationHelper { @override @@ -17,10 +18,12 @@ class GeneratedHelper implements SchemaInstantiationHelper { return v2.DatabaseAtV2(db); case 3: return v3.DatabaseAtV3(db); + case 4: + return v4.DatabaseAtV4(db); default: throw MissingSchemaException(version, versions); } } - static const versions = const [1, 2, 3]; + static const versions = const [1, 2, 3, 4]; } diff --git a/app/test/drift/bangs/generated/schema_v4.dart b/app/test/drift/bangs/generated/schema_v4.dart new file mode 100644 index 00000000..bc38da4d --- /dev/null +++ b/app/test/drift/bangs/generated/schema_v4.dart @@ -0,0 +1,2228 @@ +// dart format width=80 +// GENERATED CODE, DO NOT EDIT BY HAND. +// ignore_for_file: type=lint +import 'package:drift/drift.dart'; + +class Bang extends Table with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + Bang(this.attachedDatabase, [this._alias]); + late final GeneratedColumn trigger = GeneratedColumn( + 'trigger', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + $customConstraints: 'NOT NULL', + ); + late final GeneratedColumn group = GeneratedColumn( + 'group', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: true, + $customConstraints: 'NOT NULL', + ); + late final GeneratedColumn websiteName = GeneratedColumn( + 'website_name', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + $customConstraints: 'NOT NULL', + ); + late final GeneratedColumn domain = GeneratedColumn( + 'domain', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + $customConstraints: 'NOT NULL', + ); + late final GeneratedColumn urlTemplate = GeneratedColumn( + 'url_template', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + $customConstraints: 'NOT NULL', + ); + late final GeneratedColumn category = GeneratedColumn( + 'category', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + $customConstraints: '', + ); + late final GeneratedColumn subCategory = GeneratedColumn( + 'sub_category', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + $customConstraints: '', + ); + late final GeneratedColumn format = GeneratedColumn( + 'format', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + $customConstraints: '', + ); + late final GeneratedColumn additionalTriggers = + GeneratedColumn( + 'additional_triggers', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + $customConstraints: '', + ); + late final GeneratedColumn searxngApi = GeneratedColumn( + 'searxng_api', + aliasedName, + false, + type: DriftSqlType.bool, + requiredDuringInsert: false, + $customConstraints: 'NOT NULL DEFAULT FALSE', + defaultValue: const CustomExpression('FALSE'), + ); + @override + List get $columns => [ + trigger, + group, + websiteName, + domain, + urlTemplate, + category, + subCategory, + format, + additionalTriggers, + searxngApi, + ]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'bang'; + @override + Set get $primaryKey => {trigger, group}; + @override + BangData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return BangData( + trigger: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}trigger'], + )!, + group: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}group'], + )!, + websiteName: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}website_name'], + )!, + domain: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}domain'], + )!, + urlTemplate: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}url_template'], + )!, + category: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}category'], + ), + subCategory: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}sub_category'], + ), + format: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}format'], + ), + additionalTriggers: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}additional_triggers'], + ), + searxngApi: attachedDatabase.typeMapping.read( + DriftSqlType.bool, + data['${effectivePrefix}searxng_api'], + )!, + ); + } + + @override + Bang createAlias(String alias) { + return Bang(attachedDatabase, alias); + } + + @override + List get customConstraints => const [ + 'PRIMARY KEY("trigger", "group")', + ]; + @override + bool get dontWriteConstraints => true; +} + +class BangData extends DataClass implements Insertable { + final String trigger; + final int group; + final String websiteName; + final String domain; + final String urlTemplate; + final String? category; + final String? subCategory; + final String? format; + final String? additionalTriggers; + final bool searxngApi; + const BangData({ + required this.trigger, + required this.group, + required this.websiteName, + required this.domain, + required this.urlTemplate, + this.category, + this.subCategory, + this.format, + this.additionalTriggers, + required this.searxngApi, + }); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['trigger'] = Variable(trigger); + map['group'] = Variable(group); + map['website_name'] = Variable(websiteName); + map['domain'] = Variable(domain); + map['url_template'] = Variable(urlTemplate); + if (!nullToAbsent || category != null) { + map['category'] = Variable(category); + } + if (!nullToAbsent || subCategory != null) { + map['sub_category'] = Variable(subCategory); + } + if (!nullToAbsent || format != null) { + map['format'] = Variable(format); + } + if (!nullToAbsent || additionalTriggers != null) { + map['additional_triggers'] = Variable(additionalTriggers); + } + map['searxng_api'] = Variable(searxngApi); + return map; + } + + factory BangData.fromJson( + Map json, { + ValueSerializer? serializer, + }) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return BangData( + trigger: serializer.fromJson(json['trigger']), + group: serializer.fromJson(json['group']), + websiteName: serializer.fromJson(json['websiteName']), + domain: serializer.fromJson(json['domain']), + urlTemplate: serializer.fromJson(json['urlTemplate']), + category: serializer.fromJson(json['category']), + subCategory: serializer.fromJson(json['subCategory']), + format: serializer.fromJson(json['format']), + additionalTriggers: serializer.fromJson( + json['additionalTriggers'], + ), + searxngApi: serializer.fromJson(json['searxngApi']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'trigger': serializer.toJson(trigger), + 'group': serializer.toJson(group), + 'websiteName': serializer.toJson(websiteName), + 'domain': serializer.toJson(domain), + 'urlTemplate': serializer.toJson(urlTemplate), + 'category': serializer.toJson(category), + 'subCategory': serializer.toJson(subCategory), + 'format': serializer.toJson(format), + 'additionalTriggers': serializer.toJson(additionalTriggers), + 'searxngApi': serializer.toJson(searxngApi), + }; + } + + BangData copyWith({ + String? trigger, + int? group, + String? websiteName, + String? domain, + String? urlTemplate, + Value category = const Value.absent(), + Value subCategory = const Value.absent(), + Value format = const Value.absent(), + Value additionalTriggers = const Value.absent(), + bool? searxngApi, + }) => BangData( + trigger: trigger ?? this.trigger, + group: group ?? this.group, + websiteName: websiteName ?? this.websiteName, + domain: domain ?? this.domain, + urlTemplate: urlTemplate ?? this.urlTemplate, + category: category.present ? category.value : this.category, + subCategory: subCategory.present ? subCategory.value : this.subCategory, + format: format.present ? format.value : this.format, + additionalTriggers: additionalTriggers.present + ? additionalTriggers.value + : this.additionalTriggers, + searxngApi: searxngApi ?? this.searxngApi, + ); + BangData copyWithCompanion(BangCompanion data) { + return BangData( + trigger: data.trigger.present ? data.trigger.value : this.trigger, + group: data.group.present ? data.group.value : this.group, + websiteName: data.websiteName.present + ? data.websiteName.value + : this.websiteName, + domain: data.domain.present ? data.domain.value : this.domain, + urlTemplate: data.urlTemplate.present + ? data.urlTemplate.value + : this.urlTemplate, + category: data.category.present ? data.category.value : this.category, + subCategory: data.subCategory.present + ? data.subCategory.value + : this.subCategory, + format: data.format.present ? data.format.value : this.format, + additionalTriggers: data.additionalTriggers.present + ? data.additionalTriggers.value + : this.additionalTriggers, + searxngApi: data.searxngApi.present + ? data.searxngApi.value + : this.searxngApi, + ); + } + + @override + String toString() { + return (StringBuffer('BangData(') + ..write('trigger: $trigger, ') + ..write('group: $group, ') + ..write('websiteName: $websiteName, ') + ..write('domain: $domain, ') + ..write('urlTemplate: $urlTemplate, ') + ..write('category: $category, ') + ..write('subCategory: $subCategory, ') + ..write('format: $format, ') + ..write('additionalTriggers: $additionalTriggers, ') + ..write('searxngApi: $searxngApi') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash( + trigger, + group, + websiteName, + domain, + urlTemplate, + category, + subCategory, + format, + additionalTriggers, + searxngApi, + ); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is BangData && + other.trigger == this.trigger && + other.group == this.group && + other.websiteName == this.websiteName && + other.domain == this.domain && + other.urlTemplate == this.urlTemplate && + other.category == this.category && + other.subCategory == this.subCategory && + other.format == this.format && + other.additionalTriggers == this.additionalTriggers && + other.searxngApi == this.searxngApi); +} + +class BangCompanion extends UpdateCompanion { + final Value trigger; + final Value group; + final Value websiteName; + final Value domain; + final Value urlTemplate; + final Value category; + final Value subCategory; + final Value format; + final Value additionalTriggers; + final Value searxngApi; + final Value rowid; + const BangCompanion({ + this.trigger = const Value.absent(), + this.group = const Value.absent(), + this.websiteName = const Value.absent(), + this.domain = const Value.absent(), + this.urlTemplate = const Value.absent(), + this.category = const Value.absent(), + this.subCategory = const Value.absent(), + this.format = const Value.absent(), + this.additionalTriggers = const Value.absent(), + this.searxngApi = const Value.absent(), + this.rowid = const Value.absent(), + }); + BangCompanion.insert({ + required String trigger, + required int group, + required String websiteName, + required String domain, + required String urlTemplate, + this.category = const Value.absent(), + this.subCategory = const Value.absent(), + this.format = const Value.absent(), + this.additionalTriggers = const Value.absent(), + this.searxngApi = const Value.absent(), + this.rowid = const Value.absent(), + }) : trigger = Value(trigger), + group = Value(group), + websiteName = Value(websiteName), + domain = Value(domain), + urlTemplate = Value(urlTemplate); + static Insertable custom({ + Expression? trigger, + Expression? group, + Expression? websiteName, + Expression? domain, + Expression? urlTemplate, + Expression? category, + Expression? subCategory, + Expression? format, + Expression? additionalTriggers, + Expression? searxngApi, + Expression? rowid, + }) { + return RawValuesInsertable({ + if (trigger != null) 'trigger': trigger, + if (group != null) 'group': group, + if (websiteName != null) 'website_name': websiteName, + if (domain != null) 'domain': domain, + if (urlTemplate != null) 'url_template': urlTemplate, + if (category != null) 'category': category, + if (subCategory != null) 'sub_category': subCategory, + if (format != null) 'format': format, + if (additionalTriggers != null) 'additional_triggers': additionalTriggers, + if (searxngApi != null) 'searxng_api': searxngApi, + if (rowid != null) 'rowid': rowid, + }); + } + + BangCompanion copyWith({ + Value? trigger, + Value? group, + Value? websiteName, + Value? domain, + Value? urlTemplate, + Value? category, + Value? subCategory, + Value? format, + Value? additionalTriggers, + Value? searxngApi, + Value? rowid, + }) { + return BangCompanion( + trigger: trigger ?? this.trigger, + group: group ?? this.group, + websiteName: websiteName ?? this.websiteName, + domain: domain ?? this.domain, + urlTemplate: urlTemplate ?? this.urlTemplate, + category: category ?? this.category, + subCategory: subCategory ?? this.subCategory, + format: format ?? this.format, + additionalTriggers: additionalTriggers ?? this.additionalTriggers, + searxngApi: searxngApi ?? this.searxngApi, + rowid: rowid ?? this.rowid, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (trigger.present) { + map['trigger'] = Variable(trigger.value); + } + if (group.present) { + map['group'] = Variable(group.value); + } + if (websiteName.present) { + map['website_name'] = Variable(websiteName.value); + } + if (domain.present) { + map['domain'] = Variable(domain.value); + } + if (urlTemplate.present) { + map['url_template'] = Variable(urlTemplate.value); + } + if (category.present) { + map['category'] = Variable(category.value); + } + if (subCategory.present) { + map['sub_category'] = Variable(subCategory.value); + } + if (format.present) { + map['format'] = Variable(format.value); + } + if (additionalTriggers.present) { + map['additional_triggers'] = Variable(additionalTriggers.value); + } + if (searxngApi.present) { + map['searxng_api'] = Variable(searxngApi.value); + } + if (rowid.present) { + map['rowid'] = Variable(rowid.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('BangCompanion(') + ..write('trigger: $trigger, ') + ..write('group: $group, ') + ..write('websiteName: $websiteName, ') + ..write('domain: $domain, ') + ..write('urlTemplate: $urlTemplate, ') + ..write('category: $category, ') + ..write('subCategory: $subCategory, ') + ..write('format: $format, ') + ..write('additionalTriggers: $additionalTriggers, ') + ..write('searxngApi: $searxngApi, ') + ..write('rowid: $rowid') + ..write(')')) + .toString(); + } +} + +class BangTriggers extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + BangTriggers(this.attachedDatabase, [this._alias]); + late final GeneratedColumn trigger = GeneratedColumn( + 'trigger', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + $customConstraints: 'NOT NULL', + ); + late final GeneratedColumn group = GeneratedColumn( + 'group', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: true, + $customConstraints: 'NOT NULL', + ); + late final GeneratedColumn additionalTrigger = + GeneratedColumn( + 'additional_trigger', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + $customConstraints: 'NOT NULL', + ); + @override + List get $columns => [trigger, group, additionalTrigger]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'bang_triggers'; + @override + Set get $primaryKey => {trigger, group, additionalTrigger}; + @override + BangTriggersData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return BangTriggersData( + trigger: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}trigger'], + )!, + group: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}group'], + )!, + additionalTrigger: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}additional_trigger'], + )!, + ); + } + + @override + BangTriggers createAlias(String alias) { + return BangTriggers(attachedDatabase, alias); + } + + @override + List get customConstraints => const [ + 'PRIMARY KEY("trigger", "group", additional_trigger)', + 'FOREIGN KEY("trigger", "group")REFERENCES bang("trigger", "group")ON DELETE CASCADE', + ]; + @override + bool get dontWriteConstraints => true; +} + +class BangTriggersData extends DataClass + implements Insertable { + final String trigger; + final int group; + final String additionalTrigger; + const BangTriggersData({ + required this.trigger, + required this.group, + required this.additionalTrigger, + }); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['trigger'] = Variable(trigger); + map['group'] = Variable(group); + map['additional_trigger'] = Variable(additionalTrigger); + return map; + } + + factory BangTriggersData.fromJson( + Map json, { + ValueSerializer? serializer, + }) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return BangTriggersData( + trigger: serializer.fromJson(json['trigger']), + group: serializer.fromJson(json['group']), + additionalTrigger: serializer.fromJson(json['additionalTrigger']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'trigger': serializer.toJson(trigger), + 'group': serializer.toJson(group), + 'additionalTrigger': serializer.toJson(additionalTrigger), + }; + } + + BangTriggersData copyWith({ + String? trigger, + int? group, + String? additionalTrigger, + }) => BangTriggersData( + trigger: trigger ?? this.trigger, + group: group ?? this.group, + additionalTrigger: additionalTrigger ?? this.additionalTrigger, + ); + BangTriggersData copyWithCompanion(BangTriggersCompanion data) { + return BangTriggersData( + trigger: data.trigger.present ? data.trigger.value : this.trigger, + group: data.group.present ? data.group.value : this.group, + additionalTrigger: data.additionalTrigger.present + ? data.additionalTrigger.value + : this.additionalTrigger, + ); + } + + @override + String toString() { + return (StringBuffer('BangTriggersData(') + ..write('trigger: $trigger, ') + ..write('group: $group, ') + ..write('additionalTrigger: $additionalTrigger') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(trigger, group, additionalTrigger); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is BangTriggersData && + other.trigger == this.trigger && + other.group == this.group && + other.additionalTrigger == this.additionalTrigger); +} + +class BangTriggersCompanion extends UpdateCompanion { + final Value trigger; + final Value group; + final Value additionalTrigger; + final Value rowid; + const BangTriggersCompanion({ + this.trigger = const Value.absent(), + this.group = const Value.absent(), + this.additionalTrigger = const Value.absent(), + this.rowid = const Value.absent(), + }); + BangTriggersCompanion.insert({ + required String trigger, + required int group, + required String additionalTrigger, + this.rowid = const Value.absent(), + }) : trigger = Value(trigger), + group = Value(group), + additionalTrigger = Value(additionalTrigger); + static Insertable custom({ + Expression? trigger, + Expression? group, + Expression? additionalTrigger, + Expression? rowid, + }) { + return RawValuesInsertable({ + if (trigger != null) 'trigger': trigger, + if (group != null) 'group': group, + if (additionalTrigger != null) 'additional_trigger': additionalTrigger, + if (rowid != null) 'rowid': rowid, + }); + } + + BangTriggersCompanion copyWith({ + Value? trigger, + Value? group, + Value? additionalTrigger, + Value? rowid, + }) { + return BangTriggersCompanion( + trigger: trigger ?? this.trigger, + group: group ?? this.group, + additionalTrigger: additionalTrigger ?? this.additionalTrigger, + rowid: rowid ?? this.rowid, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (trigger.present) { + map['trigger'] = Variable(trigger.value); + } + if (group.present) { + map['group'] = Variable(group.value); + } + if (additionalTrigger.present) { + map['additional_trigger'] = Variable(additionalTrigger.value); + } + if (rowid.present) { + map['rowid'] = Variable(rowid.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('BangTriggersCompanion(') + ..write('trigger: $trigger, ') + ..write('group: $group, ') + ..write('additionalTrigger: $additionalTrigger, ') + ..write('rowid: $rowid') + ..write(')')) + .toString(); + } +} + +class BangSync extends Table with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + BangSync(this.attachedDatabase, [this._alias]); + late final GeneratedColumn group = GeneratedColumn( + 'group', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: false, + $customConstraints: 'PRIMARY KEY NOT NULL', + ); + late final GeneratedColumn lastSync = GeneratedColumn( + 'last_sync', + aliasedName, + false, + type: DriftSqlType.dateTime, + requiredDuringInsert: true, + $customConstraints: 'NOT NULL', + ); + @override + List get $columns => [group, lastSync]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'bang_sync'; + @override + Set get $primaryKey => {group}; + @override + BangSyncData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return BangSyncData( + group: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}group'], + )!, + lastSync: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}last_sync'], + )!, + ); + } + + @override + BangSync createAlias(String alias) { + return BangSync(attachedDatabase, alias); + } + + @override + bool get dontWriteConstraints => true; +} + +class BangSyncData extends DataClass implements Insertable { + final int group; + final DateTime lastSync; + const BangSyncData({required this.group, required this.lastSync}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['group'] = Variable(group); + map['last_sync'] = Variable(lastSync); + return map; + } + + factory BangSyncData.fromJson( + Map json, { + ValueSerializer? serializer, + }) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return BangSyncData( + group: serializer.fromJson(json['group']), + lastSync: serializer.fromJson(json['lastSync']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'group': serializer.toJson(group), + 'lastSync': serializer.toJson(lastSync), + }; + } + + BangSyncData copyWith({int? group, DateTime? lastSync}) => BangSyncData( + group: group ?? this.group, + lastSync: lastSync ?? this.lastSync, + ); + BangSyncData copyWithCompanion(BangSyncCompanion data) { + return BangSyncData( + group: data.group.present ? data.group.value : this.group, + lastSync: data.lastSync.present ? data.lastSync.value : this.lastSync, + ); + } + + @override + String toString() { + return (StringBuffer('BangSyncData(') + ..write('group: $group, ') + ..write('lastSync: $lastSync') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(group, lastSync); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is BangSyncData && + other.group == this.group && + other.lastSync == this.lastSync); +} + +class BangSyncCompanion extends UpdateCompanion { + final Value group; + final Value lastSync; + const BangSyncCompanion({ + this.group = const Value.absent(), + this.lastSync = const Value.absent(), + }); + BangSyncCompanion.insert({ + this.group = const Value.absent(), + required DateTime lastSync, + }) : lastSync = Value(lastSync); + static Insertable custom({ + Expression? group, + Expression? lastSync, + }) { + return RawValuesInsertable({ + if (group != null) 'group': group, + if (lastSync != null) 'last_sync': lastSync, + }); + } + + BangSyncCompanion copyWith({Value? group, Value? lastSync}) { + return BangSyncCompanion( + group: group ?? this.group, + lastSync: lastSync ?? this.lastSync, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (group.present) { + map['group'] = Variable(group.value); + } + if (lastSync.present) { + map['last_sync'] = Variable(lastSync.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('BangSyncCompanion(') + ..write('group: $group, ') + ..write('lastSync: $lastSync') + ..write(')')) + .toString(); + } +} + +class BangFrequency extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + BangFrequency(this.attachedDatabase, [this._alias]); + late final GeneratedColumn trigger = GeneratedColumn( + 'trigger', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + $customConstraints: 'NOT NULL', + ); + late final GeneratedColumn group = GeneratedColumn( + 'group', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: true, + $customConstraints: 'NOT NULL', + ); + late final GeneratedColumn frequency = GeneratedColumn( + 'frequency', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: true, + $customConstraints: 'NOT NULL', + ); + late final GeneratedColumn lastUsed = GeneratedColumn( + 'last_used', + aliasedName, + false, + type: DriftSqlType.dateTime, + requiredDuringInsert: true, + $customConstraints: 'NOT NULL', + ); + @override + List get $columns => [trigger, group, frequency, lastUsed]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'bang_frequency'; + @override + Set get $primaryKey => {trigger, group}; + @override + BangFrequencyData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return BangFrequencyData( + trigger: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}trigger'], + )!, + group: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}group'], + )!, + frequency: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}frequency'], + )!, + lastUsed: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}last_used'], + )!, + ); + } + + @override + BangFrequency createAlias(String alias) { + return BangFrequency(attachedDatabase, alias); + } + + @override + List get customConstraints => const [ + 'PRIMARY KEY("trigger", "group")', + 'FOREIGN KEY("trigger", "group")REFERENCES bang("trigger", "group")ON DELETE CASCADE', + ]; + @override + bool get dontWriteConstraints => true; +} + +class BangFrequencyData extends DataClass + implements Insertable { + final String trigger; + final int group; + final int frequency; + final DateTime lastUsed; + const BangFrequencyData({ + required this.trigger, + required this.group, + required this.frequency, + required this.lastUsed, + }); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['trigger'] = Variable(trigger); + map['group'] = Variable(group); + map['frequency'] = Variable(frequency); + map['last_used'] = Variable(lastUsed); + return map; + } + + factory BangFrequencyData.fromJson( + Map json, { + ValueSerializer? serializer, + }) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return BangFrequencyData( + trigger: serializer.fromJson(json['trigger']), + group: serializer.fromJson(json['group']), + frequency: serializer.fromJson(json['frequency']), + lastUsed: serializer.fromJson(json['lastUsed']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'trigger': serializer.toJson(trigger), + 'group': serializer.toJson(group), + 'frequency': serializer.toJson(frequency), + 'lastUsed': serializer.toJson(lastUsed), + }; + } + + BangFrequencyData copyWith({ + String? trigger, + int? group, + int? frequency, + DateTime? lastUsed, + }) => BangFrequencyData( + trigger: trigger ?? this.trigger, + group: group ?? this.group, + frequency: frequency ?? this.frequency, + lastUsed: lastUsed ?? this.lastUsed, + ); + BangFrequencyData copyWithCompanion(BangFrequencyCompanion data) { + return BangFrequencyData( + trigger: data.trigger.present ? data.trigger.value : this.trigger, + group: data.group.present ? data.group.value : this.group, + frequency: data.frequency.present ? data.frequency.value : this.frequency, + lastUsed: data.lastUsed.present ? data.lastUsed.value : this.lastUsed, + ); + } + + @override + String toString() { + return (StringBuffer('BangFrequencyData(') + ..write('trigger: $trigger, ') + ..write('group: $group, ') + ..write('frequency: $frequency, ') + ..write('lastUsed: $lastUsed') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(trigger, group, frequency, lastUsed); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is BangFrequencyData && + other.trigger == this.trigger && + other.group == this.group && + other.frequency == this.frequency && + other.lastUsed == this.lastUsed); +} + +class BangFrequencyCompanion extends UpdateCompanion { + final Value trigger; + final Value group; + final Value frequency; + final Value lastUsed; + final Value rowid; + const BangFrequencyCompanion({ + this.trigger = const Value.absent(), + this.group = const Value.absent(), + this.frequency = const Value.absent(), + this.lastUsed = const Value.absent(), + this.rowid = const Value.absent(), + }); + BangFrequencyCompanion.insert({ + required String trigger, + required int group, + required int frequency, + required DateTime lastUsed, + this.rowid = const Value.absent(), + }) : trigger = Value(trigger), + group = Value(group), + frequency = Value(frequency), + lastUsed = Value(lastUsed); + static Insertable custom({ + Expression? trigger, + Expression? group, + Expression? frequency, + Expression? lastUsed, + Expression? rowid, + }) { + return RawValuesInsertable({ + if (trigger != null) 'trigger': trigger, + if (group != null) 'group': group, + if (frequency != null) 'frequency': frequency, + if (lastUsed != null) 'last_used': lastUsed, + if (rowid != null) 'rowid': rowid, + }); + } + + BangFrequencyCompanion copyWith({ + Value? trigger, + Value? group, + Value? frequency, + Value? lastUsed, + Value? rowid, + }) { + return BangFrequencyCompanion( + trigger: trigger ?? this.trigger, + group: group ?? this.group, + frequency: frequency ?? this.frequency, + lastUsed: lastUsed ?? this.lastUsed, + rowid: rowid ?? this.rowid, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (trigger.present) { + map['trigger'] = Variable(trigger.value); + } + if (group.present) { + map['group'] = Variable(group.value); + } + if (frequency.present) { + map['frequency'] = Variable(frequency.value); + } + if (lastUsed.present) { + map['last_used'] = Variable(lastUsed.value); + } + if (rowid.present) { + map['rowid'] = Variable(rowid.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('BangFrequencyCompanion(') + ..write('trigger: $trigger, ') + ..write('group: $group, ') + ..write('frequency: $frequency, ') + ..write('lastUsed: $lastUsed, ') + ..write('rowid: $rowid') + ..write(')')) + .toString(); + } +} + +class BangHistory extends Table with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + BangHistory(this.attachedDatabase, [this._alias]); + late final GeneratedColumn searchQuery = GeneratedColumn( + 'search_query', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + $customConstraints: 'UNIQUE NOT NULL', + ); + late final GeneratedColumn trigger = GeneratedColumn( + 'trigger', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + $customConstraints: 'NOT NULL', + ); + late final GeneratedColumn group = GeneratedColumn( + 'group', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: true, + $customConstraints: 'NOT NULL', + ); + late final GeneratedColumn searchDate = GeneratedColumn( + 'search_date', + aliasedName, + false, + type: DriftSqlType.dateTime, + requiredDuringInsert: true, + $customConstraints: 'NOT NULL', + ); + @override + List get $columns => [ + searchQuery, + trigger, + group, + searchDate, + ]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'bang_history'; + @override + Set get $primaryKey => const {}; + @override + BangHistoryData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return BangHistoryData( + searchQuery: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}search_query'], + )!, + trigger: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}trigger'], + )!, + group: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}group'], + )!, + searchDate: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}search_date'], + )!, + ); + } + + @override + BangHistory createAlias(String alias) { + return BangHistory(attachedDatabase, alias); + } + + @override + List get customConstraints => const [ + 'FOREIGN KEY("trigger", "group")REFERENCES bang("trigger", "group")ON DELETE CASCADE', + ]; + @override + bool get dontWriteConstraints => true; +} + +class BangHistoryData extends DataClass implements Insertable { + final String searchQuery; + final String trigger; + final int group; + final DateTime searchDate; + const BangHistoryData({ + required this.searchQuery, + required this.trigger, + required this.group, + required this.searchDate, + }); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['search_query'] = Variable(searchQuery); + map['trigger'] = Variable(trigger); + map['group'] = Variable(group); + map['search_date'] = Variable(searchDate); + return map; + } + + factory BangHistoryData.fromJson( + Map json, { + ValueSerializer? serializer, + }) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return BangHistoryData( + searchQuery: serializer.fromJson(json['searchQuery']), + trigger: serializer.fromJson(json['trigger']), + group: serializer.fromJson(json['group']), + searchDate: serializer.fromJson(json['searchDate']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'searchQuery': serializer.toJson(searchQuery), + 'trigger': serializer.toJson(trigger), + 'group': serializer.toJson(group), + 'searchDate': serializer.toJson(searchDate), + }; + } + + BangHistoryData copyWith({ + String? searchQuery, + String? trigger, + int? group, + DateTime? searchDate, + }) => BangHistoryData( + searchQuery: searchQuery ?? this.searchQuery, + trigger: trigger ?? this.trigger, + group: group ?? this.group, + searchDate: searchDate ?? this.searchDate, + ); + BangHistoryData copyWithCompanion(BangHistoryCompanion data) { + return BangHistoryData( + searchQuery: data.searchQuery.present + ? data.searchQuery.value + : this.searchQuery, + trigger: data.trigger.present ? data.trigger.value : this.trigger, + group: data.group.present ? data.group.value : this.group, + searchDate: data.searchDate.present + ? data.searchDate.value + : this.searchDate, + ); + } + + @override + String toString() { + return (StringBuffer('BangHistoryData(') + ..write('searchQuery: $searchQuery, ') + ..write('trigger: $trigger, ') + ..write('group: $group, ') + ..write('searchDate: $searchDate') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(searchQuery, trigger, group, searchDate); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is BangHistoryData && + other.searchQuery == this.searchQuery && + other.trigger == this.trigger && + other.group == this.group && + other.searchDate == this.searchDate); +} + +class BangHistoryCompanion extends UpdateCompanion { + final Value searchQuery; + final Value trigger; + final Value group; + final Value searchDate; + final Value rowid; + const BangHistoryCompanion({ + this.searchQuery = const Value.absent(), + this.trigger = const Value.absent(), + this.group = const Value.absent(), + this.searchDate = const Value.absent(), + this.rowid = const Value.absent(), + }); + BangHistoryCompanion.insert({ + required String searchQuery, + required String trigger, + required int group, + required DateTime searchDate, + this.rowid = const Value.absent(), + }) : searchQuery = Value(searchQuery), + trigger = Value(trigger), + group = Value(group), + searchDate = Value(searchDate); + static Insertable custom({ + Expression? searchQuery, + Expression? trigger, + Expression? group, + Expression? searchDate, + Expression? rowid, + }) { + return RawValuesInsertable({ + if (searchQuery != null) 'search_query': searchQuery, + if (trigger != null) 'trigger': trigger, + if (group != null) 'group': group, + if (searchDate != null) 'search_date': searchDate, + if (rowid != null) 'rowid': rowid, + }); + } + + BangHistoryCompanion copyWith({ + Value? searchQuery, + Value? trigger, + Value? group, + Value? searchDate, + Value? rowid, + }) { + return BangHistoryCompanion( + searchQuery: searchQuery ?? this.searchQuery, + trigger: trigger ?? this.trigger, + group: group ?? this.group, + searchDate: searchDate ?? this.searchDate, + rowid: rowid ?? this.rowid, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (searchQuery.present) { + map['search_query'] = Variable(searchQuery.value); + } + if (trigger.present) { + map['trigger'] = Variable(trigger.value); + } + if (group.present) { + map['group'] = Variable(group.value); + } + if (searchDate.present) { + map['search_date'] = Variable(searchDate.value); + } + if (rowid.present) { + map['rowid'] = Variable(rowid.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('BangHistoryCompanion(') + ..write('searchQuery: $searchQuery, ') + ..write('trigger: $trigger, ') + ..write('group: $group, ') + ..write('searchDate: $searchDate, ') + ..write('rowid: $rowid') + ..write(')')) + .toString(); + } +} + +class BangFts extends Table + with + TableInfo, + VirtualTableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + BangFts(this.attachedDatabase, [this._alias]); + late final GeneratedColumn trigger = GeneratedColumn( + 'trigger', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + $customConstraints: '', + ); + late final GeneratedColumn websiteName = GeneratedColumn( + 'website_name', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + $customConstraints: '', + ); + @override + List get $columns => [trigger, websiteName]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'bang_fts'; + @override + Set get $primaryKey => const {}; + @override + BangFtsData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return BangFtsData( + trigger: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}trigger'], + )!, + websiteName: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}website_name'], + )!, + ); + } + + @override + BangFts createAlias(String alias) { + return BangFts(attachedDatabase, alias); + } + + @override + String get moduleAndArgs => + 'fts5(trigger, website_name, content=bang, prefix=\'2 3\')'; +} + +class BangFtsData extends DataClass implements Insertable { + final String trigger; + final String websiteName; + const BangFtsData({required this.trigger, required this.websiteName}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['trigger'] = Variable(trigger); + map['website_name'] = Variable(websiteName); + return map; + } + + factory BangFtsData.fromJson( + Map json, { + ValueSerializer? serializer, + }) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return BangFtsData( + trigger: serializer.fromJson(json['trigger']), + websiteName: serializer.fromJson(json['websiteName']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'trigger': serializer.toJson(trigger), + 'websiteName': serializer.toJson(websiteName), + }; + } + + BangFtsData copyWith({String? trigger, String? websiteName}) => BangFtsData( + trigger: trigger ?? this.trigger, + websiteName: websiteName ?? this.websiteName, + ); + BangFtsData copyWithCompanion(BangFtsCompanion data) { + return BangFtsData( + trigger: data.trigger.present ? data.trigger.value : this.trigger, + websiteName: data.websiteName.present + ? data.websiteName.value + : this.websiteName, + ); + } + + @override + String toString() { + return (StringBuffer('BangFtsData(') + ..write('trigger: $trigger, ') + ..write('websiteName: $websiteName') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(trigger, websiteName); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is BangFtsData && + other.trigger == this.trigger && + other.websiteName == this.websiteName); +} + +class BangFtsCompanion extends UpdateCompanion { + final Value trigger; + final Value websiteName; + final Value rowid; + const BangFtsCompanion({ + this.trigger = const Value.absent(), + this.websiteName = const Value.absent(), + this.rowid = const Value.absent(), + }); + BangFtsCompanion.insert({ + required String trigger, + required String websiteName, + this.rowid = const Value.absent(), + }) : trigger = Value(trigger), + websiteName = Value(websiteName); + static Insertable custom({ + Expression? trigger, + Expression? websiteName, + Expression? rowid, + }) { + return RawValuesInsertable({ + if (trigger != null) 'trigger': trigger, + if (websiteName != null) 'website_name': websiteName, + if (rowid != null) 'rowid': rowid, + }); + } + + BangFtsCompanion copyWith({ + Value? trigger, + Value? websiteName, + Value? rowid, + }) { + return BangFtsCompanion( + trigger: trigger ?? this.trigger, + websiteName: websiteName ?? this.websiteName, + rowid: rowid ?? this.rowid, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (trigger.present) { + map['trigger'] = Variable(trigger.value); + } + if (websiteName.present) { + map['website_name'] = Variable(websiteName.value); + } + if (rowid.present) { + map['rowid'] = Variable(rowid.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('BangFtsCompanion(') + ..write('trigger: $trigger, ') + ..write('websiteName: $websiteName, ') + ..write('rowid: $rowid') + ..write(')')) + .toString(); + } +} + +class BangTriggersFts extends Table + with + TableInfo, + VirtualTableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + BangTriggersFts(this.attachedDatabase, [this._alias]); + late final GeneratedColumn additionalTrigger = + GeneratedColumn( + 'additional_trigger', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + $customConstraints: '', + ); + @override + List get $columns => [additionalTrigger]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'bang_triggers_fts'; + @override + Set get $primaryKey => const {}; + @override + BangTriggersFtsData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return BangTriggersFtsData( + additionalTrigger: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}additional_trigger'], + )!, + ); + } + + @override + BangTriggersFts createAlias(String alias) { + return BangTriggersFts(attachedDatabase, alias); + } + + @override + String get moduleAndArgs => + 'fts5(additional_trigger, content=bang_triggers, prefix=\'2 3\')'; +} + +class BangTriggersFtsData extends DataClass + implements Insertable { + final String additionalTrigger; + const BangTriggersFtsData({required this.additionalTrigger}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['additional_trigger'] = Variable(additionalTrigger); + return map; + } + + factory BangTriggersFtsData.fromJson( + Map json, { + ValueSerializer? serializer, + }) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return BangTriggersFtsData( + additionalTrigger: serializer.fromJson(json['additionalTrigger']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'additionalTrigger': serializer.toJson(additionalTrigger), + }; + } + + BangTriggersFtsData copyWith({String? additionalTrigger}) => + BangTriggersFtsData( + additionalTrigger: additionalTrigger ?? this.additionalTrigger, + ); + BangTriggersFtsData copyWithCompanion(BangTriggersFtsCompanion data) { + return BangTriggersFtsData( + additionalTrigger: data.additionalTrigger.present + ? data.additionalTrigger.value + : this.additionalTrigger, + ); + } + + @override + String toString() { + return (StringBuffer('BangTriggersFtsData(') + ..write('additionalTrigger: $additionalTrigger') + ..write(')')) + .toString(); + } + + @override + int get hashCode => additionalTrigger.hashCode; + @override + bool operator ==(Object other) => + identical(this, other) || + (other is BangTriggersFtsData && + other.additionalTrigger == this.additionalTrigger); +} + +class BangTriggersFtsCompanion extends UpdateCompanion { + final Value additionalTrigger; + final Value rowid; + const BangTriggersFtsCompanion({ + this.additionalTrigger = const Value.absent(), + this.rowid = const Value.absent(), + }); + BangTriggersFtsCompanion.insert({ + required String additionalTrigger, + this.rowid = const Value.absent(), + }) : additionalTrigger = Value(additionalTrigger); + static Insertable custom({ + Expression? additionalTrigger, + Expression? rowid, + }) { + return RawValuesInsertable({ + if (additionalTrigger != null) 'additional_trigger': additionalTrigger, + if (rowid != null) 'rowid': rowid, + }); + } + + BangTriggersFtsCompanion copyWith({ + Value? additionalTrigger, + Value? rowid, + }) { + return BangTriggersFtsCompanion( + additionalTrigger: additionalTrigger ?? this.additionalTrigger, + rowid: rowid ?? this.rowid, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (additionalTrigger.present) { + map['additional_trigger'] = Variable(additionalTrigger.value); + } + if (rowid.present) { + map['rowid'] = Variable(rowid.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('BangTriggersFtsCompanion(') + ..write('additionalTrigger: $additionalTrigger, ') + ..write('rowid: $rowid') + ..write(')')) + .toString(); + } +} + +class BangDataViewData extends DataClass { + final String trigger; + final int group; + final String websiteName; + final String domain; + final String urlTemplate; + final String? category; + final String? subCategory; + final String? format; + final String? additionalTriggers; + final bool searxngApi; + final int? frequency; + final DateTime? lastUsed; + const BangDataViewData({ + required this.trigger, + required this.group, + required this.websiteName, + required this.domain, + required this.urlTemplate, + this.category, + this.subCategory, + this.format, + this.additionalTriggers, + required this.searxngApi, + this.frequency, + this.lastUsed, + }); + factory BangDataViewData.fromJson( + Map json, { + ValueSerializer? serializer, + }) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return BangDataViewData( + trigger: serializer.fromJson(json['trigger']), + group: serializer.fromJson(json['group']), + websiteName: serializer.fromJson(json['websiteName']), + domain: serializer.fromJson(json['domain']), + urlTemplate: serializer.fromJson(json['urlTemplate']), + category: serializer.fromJson(json['category']), + subCategory: serializer.fromJson(json['subCategory']), + format: serializer.fromJson(json['format']), + additionalTriggers: serializer.fromJson( + json['additionalTriggers'], + ), + searxngApi: serializer.fromJson(json['searxngApi']), + frequency: serializer.fromJson(json['frequency']), + lastUsed: serializer.fromJson(json['lastUsed']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'trigger': serializer.toJson(trigger), + 'group': serializer.toJson(group), + 'websiteName': serializer.toJson(websiteName), + 'domain': serializer.toJson(domain), + 'urlTemplate': serializer.toJson(urlTemplate), + 'category': serializer.toJson(category), + 'subCategory': serializer.toJson(subCategory), + 'format': serializer.toJson(format), + 'additionalTriggers': serializer.toJson(additionalTriggers), + 'searxngApi': serializer.toJson(searxngApi), + 'frequency': serializer.toJson(frequency), + 'lastUsed': serializer.toJson(lastUsed), + }; + } + + BangDataViewData copyWith({ + String? trigger, + int? group, + String? websiteName, + String? domain, + String? urlTemplate, + Value category = const Value.absent(), + Value subCategory = const Value.absent(), + Value format = const Value.absent(), + Value additionalTriggers = const Value.absent(), + bool? searxngApi, + Value frequency = const Value.absent(), + Value lastUsed = const Value.absent(), + }) => BangDataViewData( + trigger: trigger ?? this.trigger, + group: group ?? this.group, + websiteName: websiteName ?? this.websiteName, + domain: domain ?? this.domain, + urlTemplate: urlTemplate ?? this.urlTemplate, + category: category.present ? category.value : this.category, + subCategory: subCategory.present ? subCategory.value : this.subCategory, + format: format.present ? format.value : this.format, + additionalTriggers: additionalTriggers.present + ? additionalTriggers.value + : this.additionalTriggers, + searxngApi: searxngApi ?? this.searxngApi, + frequency: frequency.present ? frequency.value : this.frequency, + lastUsed: lastUsed.present ? lastUsed.value : this.lastUsed, + ); + @override + String toString() { + return (StringBuffer('BangDataViewData(') + ..write('trigger: $trigger, ') + ..write('group: $group, ') + ..write('websiteName: $websiteName, ') + ..write('domain: $domain, ') + ..write('urlTemplate: $urlTemplate, ') + ..write('category: $category, ') + ..write('subCategory: $subCategory, ') + ..write('format: $format, ') + ..write('additionalTriggers: $additionalTriggers, ') + ..write('searxngApi: $searxngApi, ') + ..write('frequency: $frequency, ') + ..write('lastUsed: $lastUsed') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash( + trigger, + group, + websiteName, + domain, + urlTemplate, + category, + subCategory, + format, + additionalTriggers, + searxngApi, + frequency, + lastUsed, + ); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is BangDataViewData && + other.trigger == this.trigger && + other.group == this.group && + other.websiteName == this.websiteName && + other.domain == this.domain && + other.urlTemplate == this.urlTemplate && + other.category == this.category && + other.subCategory == this.subCategory && + other.format == this.format && + other.additionalTriggers == this.additionalTriggers && + other.searxngApi == this.searxngApi && + other.frequency == this.frequency && + other.lastUsed == this.lastUsed); +} + +class BangDataView extends ViewInfo + implements HasResultSet { + final String? _alias; + @override + final DatabaseAtV4 attachedDatabase; + BangDataView(this.attachedDatabase, [this._alias]); + @override + List get $columns => [ + trigger, + group, + websiteName, + domain, + urlTemplate, + category, + subCategory, + format, + additionalTriggers, + searxngApi, + frequency, + lastUsed, + ]; + @override + String get aliasedName => _alias ?? entityName; + @override + String get entityName => 'bang_data_view'; + @override + Map get createViewStatements => { + SqlDialect.sqlite: + '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";', + }; + @override + BangDataView get asDslTable => this; + @override + BangDataViewData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return BangDataViewData( + trigger: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}trigger'], + )!, + group: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}group'], + )!, + websiteName: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}website_name'], + )!, + domain: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}domain'], + )!, + urlTemplate: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}url_template'], + )!, + category: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}category'], + ), + subCategory: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}sub_category'], + ), + format: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}format'], + ), + additionalTriggers: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}additional_triggers'], + ), + searxngApi: attachedDatabase.typeMapping.read( + DriftSqlType.bool, + data['${effectivePrefix}searxng_api'], + )!, + frequency: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}frequency'], + ), + lastUsed: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}last_used'], + ), + ); + } + + late final GeneratedColumn trigger = GeneratedColumn( + 'trigger', + aliasedName, + false, + type: DriftSqlType.string, + ); + late final GeneratedColumn group = GeneratedColumn( + 'group', + aliasedName, + false, + type: DriftSqlType.int, + ); + late final GeneratedColumn websiteName = GeneratedColumn( + 'website_name', + aliasedName, + false, + type: DriftSqlType.string, + ); + late final GeneratedColumn domain = GeneratedColumn( + 'domain', + aliasedName, + false, + type: DriftSqlType.string, + ); + late final GeneratedColumn urlTemplate = GeneratedColumn( + 'url_template', + aliasedName, + false, + type: DriftSqlType.string, + ); + late final GeneratedColumn category = GeneratedColumn( + 'category', + aliasedName, + true, + type: DriftSqlType.string, + ); + late final GeneratedColumn subCategory = GeneratedColumn( + 'sub_category', + aliasedName, + true, + type: DriftSqlType.string, + ); + late final GeneratedColumn format = GeneratedColumn( + 'format', + aliasedName, + true, + type: DriftSqlType.string, + ); + late final GeneratedColumn additionalTriggers = + GeneratedColumn( + 'additional_triggers', + aliasedName, + true, + type: DriftSqlType.string, + ); + late final GeneratedColumn searxngApi = GeneratedColumn( + 'searxng_api', + aliasedName, + false, + type: DriftSqlType.bool, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'CHECK ("searxng_api" IN (0, 1))', + ), + ); + late final GeneratedColumn frequency = GeneratedColumn( + 'frequency', + aliasedName, + true, + type: DriftSqlType.int, + ); + late final GeneratedColumn lastUsed = GeneratedColumn( + 'last_used', + aliasedName, + true, + type: DriftSqlType.dateTime, + ); + @override + BangDataView createAlias(String alias) { + return BangDataView(attachedDatabase, alias); + } + + @override + Query? get query => null; + @override + Set get readTables => const {}; +} + +class DatabaseAtV4 extends GeneratedDatabase { + DatabaseAtV4(QueryExecutor e) : super(e); + late final Bang bang = Bang(this); + late final BangTriggers bangTriggers = BangTriggers(this); + late final Index idxBangTriggersLookup = Index( + 'idx_bang_triggers_lookup', + 'CREATE INDEX idx_bang_triggers_lookup ON bang_triggers (additional_trigger, "group")', + ); + late final Trigger bangTriggersAfterInsert = Trigger( + 'CREATE TRIGGER bang_triggers_after_insert AFTER INSERT ON bang WHEN new.additional_triggers IS NOT NULL BEGIN INSERT INTO bang_triggers ("trigger", "group", additional_trigger) SELECT new."trigger", new."group", json_each.value FROM json_each(new.additional_triggers);END', + 'bang_triggers_after_insert', + ); + late final Trigger bangTriggersAfterUpdate = Trigger( + 'CREATE TRIGGER bang_triggers_after_update AFTER UPDATE ON bang BEGIN DELETE FROM bang_triggers WHERE "trigger" = old."trigger" AND "group" = old."group";INSERT INTO bang_triggers ("trigger", "group", additional_trigger) SELECT new."trigger", new."group", json_each.value FROM json_each(new.additional_triggers)WHERE new.additional_triggers IS NOT NULL;END', + 'bang_triggers_after_update', + ); + late final BangSync bangSync = BangSync(this); + late final BangFrequency bangFrequency = BangFrequency(this); + late final BangHistory bangHistory = BangHistory(this); + late final BangFts bangFts = BangFts(this); + late final BangTriggersFts bangTriggersFts = BangTriggersFts(this); + late final BangDataView bangDataView = BangDataView(this); + late final Trigger bangAfterInsert = 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', + ); + late final Trigger bangAfterDelete = 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', + ); + late final Trigger bangAfterUpdate = 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', + ); + late final Trigger bangTriggersAfterInsertFts = Trigger( + 'CREATE TRIGGER bang_triggers_after_insert_fts AFTER INSERT ON bang_triggers BEGIN INSERT INTO bang_triggers_fts ("rowid", additional_trigger) VALUES (new."rowid", new.additional_trigger);END', + 'bang_triggers_after_insert_fts', + ); + late final Trigger bangTriggersAfterDeleteFts = Trigger( + 'CREATE TRIGGER bang_triggers_after_delete_fts AFTER DELETE ON bang_triggers BEGIN INSERT INTO bang_triggers_fts (bang_triggers_fts, "rowid", additional_trigger) VALUES (\'delete\', old."rowid", old.additional_trigger);END', + 'bang_triggers_after_delete_fts', + ); + late final Trigger bangTriggersAfterUpdateFts = Trigger( + 'CREATE TRIGGER bang_triggers_after_update_fts AFTER UPDATE ON bang_triggers BEGIN INSERT INTO bang_triggers_fts (bang_triggers_fts, "rowid", additional_trigger) VALUES (\'delete\', old."rowid", old.additional_trigger);INSERT INTO bang_triggers_fts ("rowid", additional_trigger) VALUES (new."rowid", new.additional_trigger);END', + 'bang_triggers_after_update_fts', + ); + @override + Iterable> get allTables => + allSchemaEntities.whereType>(); + @override + List get allSchemaEntities => [ + bang, + bangTriggers, + idxBangTriggersLookup, + bangTriggersAfterInsert, + bangTriggersAfterUpdate, + bangSync, + bangFrequency, + bangHistory, + bangFts, + bangTriggersFts, + bangDataView, + bangAfterInsert, + bangAfterDelete, + bangAfterUpdate, + bangTriggersAfterInsertFts, + bangTriggersAfterDeleteFts, + bangTriggersAfterUpdateFts, + ]; + @override + StreamQueryUpdateRules get streamUpdateRules => const StreamQueryUpdateRules([ + WritePropagation( + on: TableUpdateQuery.onTableName( + 'bang', + limitUpdateKind: UpdateKind.delete, + ), + result: [], + ), + WritePropagation( + on: TableUpdateQuery.onTableName( + 'bang', + limitUpdateKind: UpdateKind.delete, + ), + result: [], + ), + WritePropagation( + on: TableUpdateQuery.onTableName( + 'bang', + limitUpdateKind: UpdateKind.delete, + ), + result: [], + ), + WritePropagation( + on: TableUpdateQuery.onTableName( + 'bang', + limitUpdateKind: UpdateKind.delete, + ), + result: [], + ), + WritePropagation( + on: TableUpdateQuery.onTableName( + 'bang', + limitUpdateKind: UpdateKind.delete, + ), + result: [], + ), + WritePropagation( + on: TableUpdateQuery.onTableName( + 'bang_triggers', + limitUpdateKind: UpdateKind.delete, + ), + result: [], + ), + WritePropagation( + on: TableUpdateQuery.onTableName( + 'bang_triggers', + limitUpdateKind: UpdateKind.delete, + ), + result: [], + ), + WritePropagation( + on: TableUpdateQuery.onTableName( + 'bang_triggers', + limitUpdateKind: UpdateKind.delete, + ), + result: [], + ), + ]); + @override + int get schemaVersion => 4; +}