mirror of
https://github.com/johrpan/musicus_mobile.git
synced 2025-10-26 18:57:25 +01:00
The role and instrument tables have been merged into one (the instrument table). There are not that many roles that aren't instruments and it is much simpler to mange this way. The role editor and role selector have been removed and the instrument related UI parts have been modified accordingly.
103 lines
2.6 KiB
Dart
103 lines
2.6 KiB
Dart
import 'dart:math';
|
|
|
|
import 'package:moor_flutter/moor_flutter.dart';
|
|
|
|
part 'database.g.dart';
|
|
|
|
final _random = Random(DateTime.now().millisecondsSinceEpoch);
|
|
int generateId() => _random.nextInt(0xFFFFFFFF);
|
|
|
|
class WorkModel {
|
|
final Work work;
|
|
final List<int> instrumentIds;
|
|
|
|
WorkModel({
|
|
@required this.work,
|
|
@required this.instrumentIds,
|
|
});
|
|
}
|
|
|
|
class PerformanceModel {
|
|
final Person person;
|
|
final Ensemble ensemble;
|
|
final Instrument role;
|
|
|
|
PerformanceModel({
|
|
this.person,
|
|
this.ensemble,
|
|
this.role,
|
|
});
|
|
}
|
|
|
|
@UseMoor(
|
|
include: {
|
|
'database.moor',
|
|
},
|
|
)
|
|
class Database extends _$Database {
|
|
Database(String fileName)
|
|
: super(FlutterQueryExecutor.inDatabaseFolder(path: fileName));
|
|
|
|
@override
|
|
int get schemaVersion => 1;
|
|
|
|
@override
|
|
MigrationStrategy get migration => MigrationStrategy(
|
|
beforeOpen: (details) async {
|
|
await customStatement('PRAGMA foreign_keys = ON');
|
|
},
|
|
);
|
|
|
|
Future<void> updatePerson(Person person) async {
|
|
await into(persons).insert(person, orReplace: true);
|
|
}
|
|
|
|
Future<void> updateInstrument(Instrument instrument) async {
|
|
await into(instruments).insert(instrument, orReplace: true);
|
|
}
|
|
|
|
Future<void> updateWork(WorkModel model, List<WorkModel> parts) async {
|
|
await transaction(() async {
|
|
final workId = model.work.id;
|
|
await (delete(works)..where((w) => w.id.equals(workId))).go();
|
|
await (delete(works)..where((w) => w.partOf.equals(workId))).go();
|
|
|
|
Future<void> insertWork(WorkModel model) async {
|
|
await into(works).insert(model.work);
|
|
await batch((b) => b.insertAll(
|
|
instrumentations,
|
|
model.instrumentIds
|
|
.map((id) =>
|
|
Instrumentation(work: model.work.id, instrument: id))
|
|
.toList()));
|
|
}
|
|
|
|
await insertWork(model);
|
|
for (final part in parts) {
|
|
await insertWork(part);
|
|
}
|
|
});
|
|
}
|
|
|
|
Future<void> updateEnsemble(Ensemble ensemble) async {
|
|
await into(ensembles).insert(ensemble, orReplace: true);
|
|
}
|
|
|
|
Future<void> updateRecording(
|
|
Recording recording, List<PerformanceModel> models) async {
|
|
await transaction(() async {
|
|
await (delete(performances)
|
|
..where((p) => p.recording.equals(recording.id)))
|
|
.go();
|
|
await into(recordings).insert(recording, orReplace: true);
|
|
for (final model in models) {
|
|
await into(performances).insert(Performance(
|
|
recording: recording.id,
|
|
person: model.person?.id,
|
|
ensemble: model.ensemble?.id,
|
|
role: model.role?.id,
|
|
));
|
|
}
|
|
});
|
|
}
|
|
}
|