diff --git a/lib/models/syncing/database_item.dart b/lib/models/syncing/database_item.dart index d7d3a70..696af00 100644 --- a/lib/models/syncing/database_item.dart +++ b/lib/models/syncing/database_item.dart @@ -17,9 +17,9 @@ import 'package:fladder/providers/user_provider.dart'; part 'database_item.g.dart'; -@TableIndex(name: 'database_id', columns: {#id}) +@TableIndex(name: 'database_id', columns: {#userId, #id}) class DatabaseItems extends Table { - TextColumn get userId => text()(); + TextColumn get userId => text().withLength(min: 1)(); TextColumn get id => text().withLength(min: 1)(); BoolColumn get syncing => boolean()(); TextColumn get sortName => text().nullable()(); @@ -35,7 +35,7 @@ class DatabaseItems extends Table { TextColumn get userData => text().nullable()(); @override - Set> get primaryKey => {id, userId}; + Set> get primaryKey => {userId, id}; } @DriftDatabase(tables: [DatabaseItems]) @@ -47,7 +47,7 @@ class AppDatabase extends _$AppDatabase { String get userId => ref.read(userProvider.select((value) => value?.id ?? "")); @override - int get schemaVersion => 1; + int get schemaVersion => 2; Future clearDatabase() { return transaction(() async { @@ -129,9 +129,11 @@ class AppDatabase extends _$AppDatabase { }); } - Future deleteAllItems(List items) async => await batch((batch) { - batch.deleteWhere(databaseItems, (tbl) => tbl.id.isIn(items.map((e) => e.id))); - }); + Future deleteAllItems(List items) async { + await batch((batch) { + batch.deleteWhere(databaseItems, (tbl) => tbl.id.isIn(items.map((e) => e.id)) & tbl.userId.equals(userId)); + }); + } DatabaseItemsCompanion toDataBaseItem(SyncedItem item) { return DatabaseItemsCompanion( @@ -190,4 +192,27 @@ class AppDatabase extends _$AppDatabase { // If you need web support, see https://drift.simonbinder.eu/platforms/web/ ); } + + @override + MigrationStrategy get migration { + return MigrationStrategy( + onCreate: (Migrator m) { + return m.createAll(); + }, + onUpgrade: (Migrator m, int from, int to) async { + if (from == 1) { + final allItems = await select(databaseItems).get(); + m.deleteTable(databaseItems.actualTableName); + m.createAll(); + await batch((batch) { + batch.insertAll( + databaseItems, + allItems, + mode: InsertMode.insertOrReplace, + ); + }); + } + }, + ); + } } diff --git a/lib/models/syncing/database_item.g.dart b/lib/models/syncing/database_item.g.dart index 96fa85e..d379aca 100644 --- a/lib/models/syncing/database_item.g.dart +++ b/lib/models/syncing/database_item.g.dart @@ -11,9 +11,13 @@ class $DatabaseItemsTable extends DatabaseItems $DatabaseItemsTable(this.attachedDatabase, [this._alias]); static const VerificationMeta _userIdMeta = const VerificationMeta('userId'); @override - late final GeneratedColumn userId = GeneratedColumn( - 'user_id', aliasedName, false, - type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn userId = + GeneratedColumn('user_id', aliasedName, false, + additionalChecks: GeneratedColumn.checkTextLength( + minTextLength: 1, + ), + type: DriftSqlType.string, + requiredDuringInsert: true); static const VerificationMeta _idMeta = const VerificationMeta('id'); @override late final GeneratedColumn id = @@ -194,7 +198,7 @@ class $DatabaseItemsTable extends DatabaseItems } @override - Set get $primaryKey => {id, userId}; + Set get $primaryKey => {userId, id}; @override DatabaseItem map(Map data, {String? tablePrefix}) { final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; @@ -704,8 +708,8 @@ abstract class _$AppDatabase extends GeneratedDatabase { _$AppDatabase(QueryExecutor e) : super(e); $AppDatabaseManager get managers => $AppDatabaseManager(this); late final $DatabaseItemsTable databaseItems = $DatabaseItemsTable(this); - late final Index databaseId = - Index('database_id', 'CREATE INDEX database_id ON database_items (id)'); + late final Index databaseId = Index('database_id', + 'CREATE INDEX database_id ON database_items (user_id, id)'); @override Iterable> get allTables => allSchemaEntities.whereType>();