import 'dart:io'; import 'package:drift/drift.dart'; import 'package:drift/native.dart'; import 'package:path_provider/path_provider.dart'; import 'package:path/path.dart' as p; import 'tables.dart'; import 'daos/month_dao.dart'; import 'daos/settings_dao.dart'; part 'database.g.dart'; @DriftDatabase( tables: [ MonthPlans, PaycheckDefinitions, PayPeriodItems, BillDefinitions, PaymentRules, Payouts, MiscItems, AppSettings, ], daos: [MonthDao, SettingsDao], ) class AppDatabase extends _$AppDatabase { AppDatabase() : super(_openConnection()); AppDatabase.forTesting(super.e); @override int get schemaVersion => 5; @override MigrationStrategy get migration => MigrationStrategy( onCreate: (m) async { await m.createAll(); await into(appSettings).insert(AppSettingsCompanion.insert()); }, onUpgrade: (m, from, to) async { if (from < 2) { await m.addColumn(billDefinitions, billDefinitions.nameOverride); await m.addColumn(billDefinitions, billDefinitions.dueDayOverride); await m.addColumn(billDefinitions, billDefinitions.isOutside); } if (from < 3) { await m.addColumn(billDefinitions, billDefinitions.subtitleOverride); } if (from < 4) { await m.deleteTable('payment_rules'); await m.deleteTable('month_payment_rules'); await m.createTable(paymentRules); await m.addColumn(billDefinitions, billDefinitions.paymentMode); } if (from < 5) { // Remove monthPaymentRuleId from bills (leave column, just unused) // Recreate payment_rules with new per-month schema await m.deleteTable('payment_rules'); await m.deleteTable('month_payment_rules'); await m.createTable(paymentRules); await m.addColumn(billDefinitions, billDefinitions.balanceType); } }, ); } LazyDatabase _openConnection() { return LazyDatabase(() async { final dir = await getApplicationSupportDirectory(); final file = File(p.join(dir.path, 'own_ledger.sqlite')); return NativeDatabase.createInBackground(file); }); }