diff --git a/lib/database.dart b/lib/database.dart index e374a9a..d9ac728 100644 --- a/lib/database.dart +++ b/lib/database.dart @@ -30,11 +30,10 @@ class Database extends _$Database { int get schemaVersion => 1; @override - MigrationStrategy get migration => MigrationStrategy( - beforeOpen: (details) async { - await customStatement('PRAGMA foreign_keys = ON'); - } - ); + MigrationStrategy get migration => + MigrationStrategy(beforeOpen: (details) async { + await customStatement('PRAGMA foreign_keys = ON'); + }); // TODO: Remove this once https://github.com/simolus3/moor/issues/453 is fixed. Selectable worksByComposer(int id) { @@ -74,4 +73,23 @@ class Database extends _$Database { } }); } + + Future updateEnsemble(Ensemble ensemble) async { + await into(ensembles).insert(ensemble, orReplace: true); + } + + Future updateRole(Role role) async { + await into(roles).insert(role, orReplace: true); + } + + Future updateRecording( + Recording recording, List perfs) async { + await transaction(() async { + await (delete(performances)..where((p) => p.recording.equals(recording.id))).go(); + await into(recordings).insert(recording, orReplace: true); + for (final perf in perfs) { + await into(performances).insert(perf); + } + }); + } } diff --git a/lib/database.moor b/lib/database.moor index 3193bb8..562d0fd 100644 --- a/lib/database.moor +++ b/lib/database.moor @@ -23,6 +23,28 @@ CREATE TABLE instrumentations ( instrument INTEGER NOT NULL REFERENCES instruments(id) ON DELETE CASCADE ); +CREATE TABLE ensembles ( + id INTEGER NOT NULL PRIMARY KEY, + name TEXT NOT NULL +); + +CREATE TABLE roles ( + id INTEGER NOT NULL PRIMARY KEY, + name TEXT NOT NULL +); + +CREATE TABLE recordings ( + id INTEGER NOT NULL PRIMARY KEY, + work INTEGER REFERENCES works(id) +); + +CREATE TABLE performances ( + recording INTEGER NOT NULL REFERENCES recordings(id) ON DELETE CASCADE, + person INTEGER REFERENCES persons(id) ON DELETE CASCADE, + ensemble INTEGER REFERENCES ensembles(id) ON DELETE CASCADE, + role INTEGER REFERENCES roles(id) +); + allPersons: SELECT * FROM persons ORDER BY last_name; @@ -50,3 +72,24 @@ instrumentsByWork: SELECT instruments.* FROM instrumentations JOIN instruments ON instrumentations.instrument=instruments.id WHERE instrumentations.work = :workId; + +allEnsembles: +SELECT * FROM ensembles ORDER BY name; + +ensembleById: +SELECT * FROM ensembles WHERE id = :id LIMIT 1; + +allRoles: +SELECT * FROM roles ORDER BY name; + +roleById: +SELECT * FROM roles WHERE id = :id LIMIT 1; + +recordingById: +SELECT * FROM recordings WHERE id = :id; + +recordingsByWork: +SELECT * FROM recordings WHERE work = :id; + +performancesByRecording: +SELECT * FROM performances WHERE recording = :id; \ No newline at end of file