2019-12-03 12:42:43 +01:00
|
|
|
import 'dart:math';
|
|
|
|
|
|
2019-12-03 12:03:39 +01:00
|
|
|
import 'package:moor_flutter/moor_flutter.dart';
|
|
|
|
|
|
|
|
|
|
part 'database.g.dart';
|
|
|
|
|
|
2019-12-03 12:42:43 +01:00
|
|
|
final _random = Random(DateTime.now().millisecondsSinceEpoch);
|
|
|
|
|
int generateId() => _random.nextInt(0xFFFFFFFF);
|
|
|
|
|
|
2020-03-21 14:34:45 +01:00
|
|
|
class WorkModel {
|
|
|
|
|
final Work work;
|
|
|
|
|
final List<int> instrumentIds;
|
|
|
|
|
|
|
|
|
|
WorkModel({
|
|
|
|
|
@required this.work,
|
|
|
|
|
@required this.instrumentIds,
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
2019-12-03 12:03:39 +01:00
|
|
|
@UseMoor(
|
|
|
|
|
include: {
|
|
|
|
|
'database.moor',
|
|
|
|
|
},
|
|
|
|
|
)
|
|
|
|
|
class Database extends _$Database {
|
|
|
|
|
Database(String fileName)
|
|
|
|
|
: super(FlutterQueryExecutor.inDatabaseFolder(path: fileName));
|
|
|
|
|
|
|
|
|
|
@override
|
2019-12-04 20:48:03 +01:00
|
|
|
int get schemaVersion => 1;
|
2019-12-03 12:03:39 +01:00
|
|
|
|
2020-03-21 14:34:45 +01:00
|
|
|
// TODO: Remove this once https://github.com/simolus3/moor/issues/453 is fixed.
|
|
|
|
|
Selectable<Work> worksByComposer(int id) {
|
|
|
|
|
return customSelectQuery(
|
|
|
|
|
'SELECT DISTINCT A.* FROM works A, works B ON A.id = B.part_of WHERE A.composer = :id OR B.composer = :id',
|
|
|
|
|
variables: [Variable.withInt(id)],
|
|
|
|
|
readsFrom: {works}).map(_rowToWork);
|
|
|
|
|
}
|
|
|
|
|
|
2019-12-03 12:03:39 +01:00
|
|
|
Future<void> updatePerson(Person person) async {
|
|
|
|
|
await into(persons).insert(person);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Future<void> updateInstrument(Instrument instrument) async {
|
|
|
|
|
await into(instruments).insert(instrument);
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-21 14:34:45 +01:00
|
|
|
Future<void> updateWork(WorkModel model, List<WorkModel> parts) async {
|
2019-12-03 12:03:39 +01:00
|
|
|
await transaction(() async {
|
2020-03-21 14:34:45 +01:00
|
|
|
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();
|
2019-12-03 12:03:39 +01:00
|
|
|
|
2020-03-21 14:34:45 +01:00
|
|
|
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()));
|
|
|
|
|
}
|
2019-12-03 12:03:39 +01:00
|
|
|
|
2020-03-21 14:34:45 +01:00
|
|
|
await insertWork(model);
|
|
|
|
|
for (final part in parts) {
|
|
|
|
|
await insertWork(part);
|
|
|
|
|
}
|
2019-12-03 12:03:39 +01:00
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|