Complete stable ride identity migration and fresh database initialization
This commit is contained in:
parent
657ee85a4c
commit
55d0905f91
|
|
@ -22,7 +22,14 @@ class AppDatabase extends _$AppDatabase {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
MigrationStrategy get migration => MigrationStrategy(
|
MigrationStrategy get migration => MigrationStrategy(
|
||||||
onCreate: (Migrator m) async => m.createAll(),
|
onCreate: (Migrator m) async {
|
||||||
|
await m.createAll();
|
||||||
|
// database.g.dart is generated during normal development/CI. Keep the
|
||||||
|
// schema self-healing for installations that temporarily have a stale
|
||||||
|
// generated file: cloud identity must exist even on a brand-new DB.
|
||||||
|
await customStatement('ALTER TABLE rides ADD COLUMN cloud_ride_id TEXT');
|
||||||
|
await customStatement('CREATE UNIQUE INDEX rides_cloud_ride_id_idx ON rides(cloud_ride_id)');
|
||||||
|
},
|
||||||
onUpgrade: (Migrator m, int from, int to) async {
|
onUpgrade: (Migrator m, int from, int to) async {
|
||||||
if (from < 2) {
|
if (from < 2) {
|
||||||
await m.addColumn(rides, rides.distance);
|
await m.addColumn(rides, rides.distance);
|
||||||
|
|
@ -67,16 +74,11 @@ class AppDatabase extends _$AppDatabase {
|
||||||
} catch (_) {}
|
} catch (_) {}
|
||||||
}
|
}
|
||||||
if (from < 6) {
|
if (from < 6) {
|
||||||
// Nullable during migration so existing installations can be upgraded
|
|
||||||
// without losing rides. We immediately backfill every existing ride
|
|
||||||
// with a stable random identifier that is independent of local ID.
|
|
||||||
await m.addColumn(rides, rides.cloudRideId);
|
await m.addColumn(rides, rides.cloudRideId);
|
||||||
final rows = await customSelect('SELECT id FROM rides').get();
|
await customStatement('CREATE UNIQUE INDEX rides_cloud_ride_id_idx ON rides(cloud_ride_id)');
|
||||||
|
final rows = await customSelect('SELECT id FROM rides WHERE cloud_ride_id IS NULL').get();
|
||||||
for (final row in rows) {
|
for (final row in rows) {
|
||||||
await customStatement(
|
await customStatement('UPDATE rides SET cloud_ride_id = ? WHERE id = ?', [_newCloudRideId(), row.data['id']]);
|
||||||
'UPDATE rides SET cloud_ride_id = ? WHERE id = ?',
|
|
||||||
[_newCloudRideId(), row.data['id']],
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
@ -88,14 +90,8 @@ class AppDatabase extends _$AppDatabase {
|
||||||
return 'ride_$hex';
|
return 'ride_$hex';
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the persisted stable MotorCloud identity for a local ride.
|
|
||||||
/// Uses raw SQL until `database.g.dart` is regenerated; this keeps the
|
|
||||||
/// migration deployable without hand-editing generated Drift output.
|
|
||||||
Future<String?> getCloudRideId(int rideId) async {
|
Future<String?> getCloudRideId(int rideId) async {
|
||||||
final rows = await customSelect(
|
final rows = await customSelect('SELECT cloud_ride_id FROM rides WHERE id = ?', variables: [Variable<int>(rideId)]).get();
|
||||||
'SELECT cloud_ride_id FROM rides WHERE id = ?',
|
|
||||||
variables: [Variable<int>(rideId)],
|
|
||||||
).get();
|
|
||||||
if (rows.isEmpty) return null;
|
if (rows.isEmpty) return null;
|
||||||
return rows.first.data['cloud_ride_id'] as String?;
|
return rows.first.data['cloud_ride_id'] as String?;
|
||||||
}
|
}
|
||||||
|
|
@ -104,17 +100,12 @@ class AppDatabase extends _$AppDatabase {
|
||||||
final existing = await getCloudRideId(rideId);
|
final existing = await getCloudRideId(rideId);
|
||||||
if (existing != null && existing.isNotEmpty) return existing;
|
if (existing != null && existing.isNotEmpty) return existing;
|
||||||
final created = _newCloudRideId();
|
final created = _newCloudRideId();
|
||||||
await customStatement(
|
await customStatement('UPDATE rides SET cloud_ride_id = ? WHERE id = ?', [created, rideId]);
|
||||||
'UPDATE rides SET cloud_ride_id = ? WHERE id = ?',
|
|
||||||
[created, rideId],
|
|
||||||
);
|
|
||||||
return created;
|
return created;
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<int> startRide() async {
|
Future<int> startRide() async {
|
||||||
final id = await into(rides).insert(RidesCompanion.insert(
|
final id = await into(rides).insert(RidesCompanion.insert(startTime: DateTime.now()));
|
||||||
startTime: DateTime.now(),
|
|
||||||
));
|
|
||||||
await ensureCloudRideId(id);
|
await ensureCloudRideId(id);
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue