Skip to content

Commit a462acb

Browse files
committed
fix(storage): tolerate existing tor migration columns
1 parent f2ff6f8 commit a462acb

2 files changed

Lines changed: 52 additions & 5 deletions

File tree

lib/core/storage/migrations/schema_14_to_15.dart

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,19 @@ import 'package:drift/drift.dart';
66
/// Adds the persisted Tor transport preferences to the settings table.
77
class Schema14To15 {
88
static Future<void> migrate(Migrator m, Schema15 schema15) async {
9-
await m.addColumn(schema15.settings, schema15.settings.torTransportMode);
10-
await m.addColumn(
11-
schema15.settings,
12-
schema15.settings.lastSuccessfulTorTransport,
13-
);
9+
final existingColumns = await m.database
10+
.customSelect('PRAGMA table_info(settings)')
11+
.map((row) => row.read<String>('name'))
12+
.get();
13+
14+
if (!existingColumns.contains('tor_transport_mode')) {
15+
await m.addColumn(schema15.settings, schema15.settings.torTransportMode);
16+
}
17+
if (!existingColumns.contains('last_successful_tor_transport')) {
18+
await m.addColumn(
19+
schema15.settings,
20+
schema15.settings.lastSuccessfulTorTransport,
21+
);
22+
}
1423
}
1524
}

test/migrations_test/bull_database/schema_v14_to_v15_test.dart

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,4 +42,42 @@ void main() {
4242
expect(settings.single.lastSuccessfulTorTransport, isNull);
4343
await migratedDb.close();
4444
});
45+
46+
test('v14 to v15 preserves Tor columns from an unreleased develop v14', () async {
47+
final schema = await verifier.schemaAt(14);
48+
final oldDb = v14.DatabaseAtV14(schema.newConnection());
49+
await oldDb
50+
.into(oldDb.settings)
51+
.insert(
52+
v14.SettingsCompanion.insert(
53+
environment: 'testnet',
54+
bitcoinUnit: 'sats',
55+
language: 'en',
56+
currency: 'USD',
57+
hideAmounts: 0,
58+
isSuperuser: 0,
59+
),
60+
);
61+
await oldDb.customStatement(
62+
"ALTER TABLE settings ADD COLUMN tor_transport_mode TEXT NOT NULL DEFAULT 'automatic'",
63+
);
64+
await oldDb.customStatement(
65+
'ALTER TABLE settings ADD COLUMN last_successful_tor_transport TEXT NULL',
66+
);
67+
await oldDb.customStatement(
68+
"UPDATE settings SET tor_transport_mode = 'socks5', last_successful_tor_transport = 'tor'",
69+
);
70+
await oldDb.close();
71+
72+
final db = SqliteDatabase(schema.newConnection());
73+
await verifier.migrateAndValidate(db, 15);
74+
await db.close();
75+
76+
final migratedDb = v15.DatabaseAtV15(schema.newConnection());
77+
final settings = await migratedDb.select(migratedDb.settings).get();
78+
expect(settings, hasLength(1));
79+
expect(settings.single.torTransportMode, 'socks5');
80+
expect(settings.single.lastSuccessfulTorTransport, 'tor');
81+
await migratedDb.close();
82+
});
4583
}

0 commit comments

Comments
 (0)