2020-11-17 15:52:47 +01:00
|
|
|
use super::*;
|
|
|
|
|
use futures_channel::oneshot;
|
|
|
|
|
use futures_channel::oneshot::Sender;
|
|
|
|
|
use std::sync::mpsc;
|
|
|
|
|
use std::thread;
|
|
|
|
|
|
|
|
|
|
/// An action the database thread can perform.
|
2021-02-04 17:43:36 +01:00
|
|
|
pub enum Action {
|
|
|
|
|
UpdatePerson(Person, Sender<DatabaseResult<()>>),
|
|
|
|
|
GetPerson(String, Sender<DatabaseResult<Option<Person>>>),
|
|
|
|
|
DeletePerson(String, Sender<DatabaseResult<()>>),
|
|
|
|
|
GetPersons(Sender<DatabaseResult<Vec<Person>>>),
|
|
|
|
|
UpdateInstrument(Instrument, Sender<DatabaseResult<()>>),
|
|
|
|
|
GetInstrument(String, Sender<DatabaseResult<Option<Instrument>>>),
|
|
|
|
|
DeleteInstrument(String, Sender<DatabaseResult<()>>),
|
|
|
|
|
GetInstruments(Sender<DatabaseResult<Vec<Instrument>>>),
|
|
|
|
|
UpdateWork(Work, Sender<DatabaseResult<()>>),
|
|
|
|
|
DeleteWork(String, Sender<DatabaseResult<()>>),
|
|
|
|
|
GetWorks(String, Sender<DatabaseResult<Vec<Work>>>),
|
|
|
|
|
UpdateEnsemble(Ensemble, Sender<DatabaseResult<()>>),
|
|
|
|
|
GetEnsemble(String, Sender<DatabaseResult<Option<Ensemble>>>),
|
|
|
|
|
DeleteEnsemble(String, Sender<DatabaseResult<()>>),
|
|
|
|
|
GetEnsembles(Sender<DatabaseResult<Vec<Ensemble>>>),
|
|
|
|
|
UpdateRecording(Recording, Sender<DatabaseResult<()>>),
|
|
|
|
|
DeleteRecording(String, Sender<DatabaseResult<()>>),
|
|
|
|
|
GetRecordingsForPerson(String, Sender<DatabaseResult<Vec<Recording>>>),
|
|
|
|
|
GetRecordingsForEnsemble(String, Sender<DatabaseResult<Vec<Recording>>>),
|
|
|
|
|
GetRecordingsForWork(String, Sender<DatabaseResult<Vec<Recording>>>),
|
|
|
|
|
RecordingExists(String, Sender<DatabaseResult<bool>>),
|
|
|
|
|
UpdateMedium(Medium, Sender<DatabaseResult<()>>),
|
|
|
|
|
GetMedium(String, Sender<DatabaseResult<Option<Medium>>>),
|
|
|
|
|
DeleteMedium(String, Sender<DatabaseResult<()>>),
|
|
|
|
|
GetTrackSets(String, Sender<DatabaseResult<Vec<TrackSet>>>),
|
2020-11-17 15:52:47 +01:00
|
|
|
Stop(Sender<()>),
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
use Action::*;
|
|
|
|
|
|
|
|
|
|
/// A database running within a thread.
|
|
|
|
|
pub struct DbThread {
|
|
|
|
|
action_sender: mpsc::Sender<Action>,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl DbThread {
|
|
|
|
|
/// Create a new database connection in a background thread.
|
2021-02-04 17:43:36 +01:00
|
|
|
pub async fn new(path: String) -> DatabaseResult<Self> {
|
2020-11-17 15:52:47 +01:00
|
|
|
let (action_sender, action_receiver) = mpsc::channel();
|
|
|
|
|
let (ready_sender, ready_receiver) = oneshot::channel();
|
|
|
|
|
|
|
|
|
|
thread::spawn(move || {
|
|
|
|
|
let db = match Database::new(&path) {
|
|
|
|
|
Ok(db) => {
|
|
|
|
|
ready_sender.send(Ok(())).unwrap();
|
|
|
|
|
db
|
|
|
|
|
}
|
|
|
|
|
Err(error) => {
|
|
|
|
|
ready_sender.send(Err(error)).unwrap();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
for action in action_receiver {
|
|
|
|
|
match action {
|
|
|
|
|
UpdatePerson(person, sender) => {
|
|
|
|
|
sender.send(db.update_person(person)).unwrap();
|
|
|
|
|
}
|
|
|
|
|
GetPerson(id, sender) => {
|
2020-11-28 21:45:22 +01:00
|
|
|
sender.send(db.get_person(&id)).unwrap();
|
2020-11-17 15:52:47 +01:00
|
|
|
}
|
|
|
|
|
DeletePerson(id, sender) => {
|
2020-11-28 21:45:22 +01:00
|
|
|
sender.send(db.delete_person(&id)).unwrap();
|
2020-11-17 15:52:47 +01:00
|
|
|
}
|
|
|
|
|
GetPersons(sender) => {
|
|
|
|
|
sender.send(db.get_persons()).unwrap();
|
|
|
|
|
}
|
|
|
|
|
UpdateInstrument(instrument, sender) => {
|
|
|
|
|
sender.send(db.update_instrument(instrument)).unwrap();
|
|
|
|
|
}
|
|
|
|
|
GetInstrument(id, sender) => {
|
2020-11-28 21:45:22 +01:00
|
|
|
sender.send(db.get_instrument(&id)).unwrap();
|
2020-11-17 15:52:47 +01:00
|
|
|
}
|
|
|
|
|
DeleteInstrument(id, sender) => {
|
2020-11-28 21:45:22 +01:00
|
|
|
sender.send(db.delete_instrument(&id)).unwrap();
|
2020-11-17 15:52:47 +01:00
|
|
|
}
|
|
|
|
|
GetInstruments(sender) => {
|
|
|
|
|
sender.send(db.get_instruments()).unwrap();
|
|
|
|
|
}
|
|
|
|
|
UpdateWork(work, sender) => {
|
|
|
|
|
sender.send(db.update_work(work)).unwrap();
|
|
|
|
|
}
|
|
|
|
|
DeleteWork(id, sender) => {
|
2020-11-28 21:45:22 +01:00
|
|
|
sender.send(db.delete_work(&id)).unwrap();
|
2020-11-17 15:52:47 +01:00
|
|
|
}
|
|
|
|
|
GetWorks(id, sender) => {
|
2020-11-28 21:45:22 +01:00
|
|
|
sender.send(db.get_works(&id)).unwrap();
|
2020-11-17 15:52:47 +01:00
|
|
|
}
|
|
|
|
|
UpdateEnsemble(ensemble, sender) => {
|
|
|
|
|
sender.send(db.update_ensemble(ensemble)).unwrap();
|
|
|
|
|
}
|
|
|
|
|
GetEnsemble(id, sender) => {
|
2020-11-28 21:45:22 +01:00
|
|
|
sender.send(db.get_ensemble(&id)).unwrap();
|
2020-11-17 15:52:47 +01:00
|
|
|
}
|
|
|
|
|
DeleteEnsemble(id, sender) => {
|
2020-11-28 21:45:22 +01:00
|
|
|
sender.send(db.delete_ensemble(&id)).unwrap();
|
2020-11-17 15:52:47 +01:00
|
|
|
}
|
|
|
|
|
GetEnsembles(sender) => {
|
|
|
|
|
sender.send(db.get_ensembles()).unwrap();
|
|
|
|
|
}
|
|
|
|
|
UpdateRecording(recording, sender) => {
|
|
|
|
|
sender.send(db.update_recording(recording)).unwrap();
|
|
|
|
|
}
|
|
|
|
|
DeleteRecording(id, sender) => {
|
2020-11-28 21:45:22 +01:00
|
|
|
sender.send(db.delete_recording(&id)).unwrap();
|
2020-11-17 15:52:47 +01:00
|
|
|
}
|
|
|
|
|
GetRecordingsForPerson(id, sender) => {
|
2020-11-28 21:45:22 +01:00
|
|
|
sender.send(db.get_recordings_for_person(&id)).unwrap();
|
2020-11-17 15:52:47 +01:00
|
|
|
}
|
|
|
|
|
GetRecordingsForEnsemble(id, sender) => {
|
2020-11-28 21:45:22 +01:00
|
|
|
sender.send(db.get_recordings_for_ensemble(&id)).unwrap();
|
2020-11-17 15:52:47 +01:00
|
|
|
}
|
|
|
|
|
GetRecordingsForWork(id, sender) => {
|
2020-11-28 21:45:22 +01:00
|
|
|
sender.send(db.get_recordings_for_work(&id)).unwrap();
|
2020-11-17 15:52:47 +01:00
|
|
|
}
|
2020-11-29 10:01:34 +01:00
|
|
|
RecordingExists(id, sender) => {
|
|
|
|
|
sender.send(db.recording_exists(&id)).unwrap();
|
|
|
|
|
}
|
2020-12-20 11:47:27 +01:00
|
|
|
UpdateMedium(medium, sender) => {
|
|
|
|
|
sender.send(db.update_medium(medium)).unwrap();
|
2020-11-17 15:52:47 +01:00
|
|
|
}
|
2020-12-20 11:47:27 +01:00
|
|
|
GetMedium(id, sender) => {
|
|
|
|
|
sender.send(db.get_medium(&id)).unwrap();
|
2020-11-17 15:52:47 +01:00
|
|
|
}
|
2020-12-20 11:47:27 +01:00
|
|
|
DeleteMedium(id, sender) => {
|
|
|
|
|
sender.send(db.delete_medium(&id)).unwrap();
|
|
|
|
|
}
|
2021-01-16 15:08:12 +01:00
|
|
|
GetTrackSets(recording_id, sender) => {
|
|
|
|
|
sender.send(db.get_track_sets(&recording_id)).unwrap();
|
2020-11-17 15:52:47 +01:00
|
|
|
}
|
|
|
|
|
Stop(sender) => {
|
|
|
|
|
sender.send(()).unwrap();
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
ready_receiver.await??;
|
|
|
|
|
Ok(Self { action_sender })
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Update an existing person or insert a new one.
|
2021-02-04 17:43:36 +01:00
|
|
|
pub async fn update_person(&self, person: Person) -> DatabaseResult<()> {
|
2020-11-17 15:52:47 +01:00
|
|
|
let (sender, receiver) = oneshot::channel();
|
|
|
|
|
self.action_sender.send(UpdatePerson(person, sender))?;
|
|
|
|
|
receiver.await?
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Get an existing person.
|
2021-02-04 17:43:36 +01:00
|
|
|
pub async fn get_person(&self, id: &str) -> DatabaseResult<Option<Person>> {
|
2020-11-17 15:52:47 +01:00
|
|
|
let (sender, receiver) = oneshot::channel();
|
2020-11-28 21:45:22 +01:00
|
|
|
self.action_sender.send(GetPerson(id.to_string(), sender))?;
|
2020-11-17 15:52:47 +01:00
|
|
|
receiver.await?
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Delete an existing person. This will fail, if there are still other items referencing
|
|
|
|
|
/// this person.
|
2021-02-04 17:43:36 +01:00
|
|
|
pub async fn delete_person(&self, id: &str) -> DatabaseResult<()> {
|
2020-11-17 15:52:47 +01:00
|
|
|
let (sender, receiver) = oneshot::channel();
|
2020-11-28 21:45:22 +01:00
|
|
|
self.action_sender
|
|
|
|
|
.send(DeletePerson(id.to_string(), sender))?;
|
2020-11-17 15:52:47 +01:00
|
|
|
receiver.await?
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Get all existing persons.
|
2021-02-04 17:43:36 +01:00
|
|
|
pub async fn get_persons(&self) -> DatabaseResult<Vec<Person>> {
|
2020-11-17 15:52:47 +01:00
|
|
|
let (sender, receiver) = oneshot::channel();
|
|
|
|
|
self.action_sender.send(GetPersons(sender))?;
|
|
|
|
|
receiver.await?
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Update an existing instrument or insert a new one.
|
2021-02-04 17:43:36 +01:00
|
|
|
pub async fn update_instrument(&self, instrument: Instrument) -> DatabaseResult<()> {
|
2020-11-17 15:52:47 +01:00
|
|
|
let (sender, receiver) = oneshot::channel();
|
|
|
|
|
self.action_sender
|
|
|
|
|
.send(UpdateInstrument(instrument, sender))?;
|
|
|
|
|
receiver.await?
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Get an existing instrument.
|
2021-02-04 17:43:36 +01:00
|
|
|
pub async fn get_instrument(&self, id: &str) -> DatabaseResult<Option<Instrument>> {
|
2020-11-17 15:52:47 +01:00
|
|
|
let (sender, receiver) = oneshot::channel();
|
2020-11-28 21:45:22 +01:00
|
|
|
self.action_sender
|
|
|
|
|
.send(GetInstrument(id.to_string(), sender))?;
|
2020-11-17 15:52:47 +01:00
|
|
|
receiver.await?
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Delete an existing instrument. This will fail, if there are still other items referencing
|
|
|
|
|
/// this instrument.
|
2021-02-04 17:43:36 +01:00
|
|
|
pub async fn delete_instrument(&self, id: &str) -> DatabaseResult<()> {
|
2020-11-17 15:52:47 +01:00
|
|
|
let (sender, receiver) = oneshot::channel();
|
2020-11-28 21:45:22 +01:00
|
|
|
self.action_sender
|
|
|
|
|
.send(DeleteInstrument(id.to_string(), sender))?;
|
2020-11-17 15:52:47 +01:00
|
|
|
receiver.await?
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Get all existing instruments.
|
2021-02-04 17:43:36 +01:00
|
|
|
pub async fn get_instruments(&self) -> DatabaseResult<Vec<Instrument>> {
|
2020-11-17 15:52:47 +01:00
|
|
|
let (sender, receiver) = oneshot::channel();
|
|
|
|
|
self.action_sender.send(GetInstruments(sender))?;
|
|
|
|
|
receiver.await?
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Update an existing work or insert a new one.
|
2021-02-04 17:43:36 +01:00
|
|
|
pub async fn update_work(&self, work: Work) -> DatabaseResult<()> {
|
2020-11-17 15:52:47 +01:00
|
|
|
let (sender, receiver) = oneshot::channel();
|
|
|
|
|
self.action_sender.send(UpdateWork(work, sender))?;
|
|
|
|
|
receiver.await?
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Delete an existing work. This will fail, if there are still other items referencing
|
|
|
|
|
/// this work.
|
2021-02-04 17:43:36 +01:00
|
|
|
pub async fn delete_work(&self, id: &str) -> DatabaseResult<()> {
|
2020-11-17 15:52:47 +01:00
|
|
|
let (sender, receiver) = oneshot::channel();
|
2020-11-28 21:45:22 +01:00
|
|
|
self.action_sender
|
|
|
|
|
.send(DeleteWork(id.to_string(), sender))?;
|
2020-11-17 15:52:47 +01:00
|
|
|
receiver.await?
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Get information on all existing works by a composer.
|
2021-02-04 17:43:36 +01:00
|
|
|
pub async fn get_works(&self, person_id: &str) -> DatabaseResult<Vec<Work>> {
|
2020-11-17 15:52:47 +01:00
|
|
|
let (sender, receiver) = oneshot::channel();
|
2020-11-28 21:45:22 +01:00
|
|
|
self.action_sender
|
|
|
|
|
.send(GetWorks(person_id.to_string(), sender))?;
|
2020-11-17 15:52:47 +01:00
|
|
|
receiver.await?
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Update an existing ensemble or insert a new one.
|
2021-02-04 17:43:36 +01:00
|
|
|
pub async fn update_ensemble(&self, ensemble: Ensemble) -> DatabaseResult<()> {
|
2020-11-17 15:52:47 +01:00
|
|
|
let (sender, receiver) = oneshot::channel();
|
|
|
|
|
self.action_sender.send(UpdateEnsemble(ensemble, sender))?;
|
|
|
|
|
receiver.await?
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Get an existing ensemble.
|
2021-02-04 17:43:36 +01:00
|
|
|
pub async fn get_ensemble(&self, id: &str) -> DatabaseResult<Option<Ensemble>> {
|
2020-11-17 15:52:47 +01:00
|
|
|
let (sender, receiver) = oneshot::channel();
|
2020-11-28 21:45:22 +01:00
|
|
|
self.action_sender
|
|
|
|
|
.send(GetEnsemble(id.to_string(), sender))?;
|
2020-11-17 15:52:47 +01:00
|
|
|
receiver.await?
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Delete an existing ensemble. This will fail, if there are still other items referencing
|
|
|
|
|
/// this ensemble.
|
2021-02-04 17:43:36 +01:00
|
|
|
pub async fn delete_ensemble(&self, id: &str) -> DatabaseResult<()> {
|
2020-11-17 15:52:47 +01:00
|
|
|
let (sender, receiver) = oneshot::channel();
|
2020-11-28 21:45:22 +01:00
|
|
|
self.action_sender
|
|
|
|
|
.send(DeleteEnsemble(id.to_string(), sender))?;
|
2020-11-17 15:52:47 +01:00
|
|
|
receiver.await?
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Get all existing ensembles.
|
2021-02-04 17:43:36 +01:00
|
|
|
pub async fn get_ensembles(&self) -> DatabaseResult<Vec<Ensemble>> {
|
2020-11-17 15:52:47 +01:00
|
|
|
let (sender, receiver) = oneshot::channel();
|
|
|
|
|
self.action_sender.send(GetEnsembles(sender))?;
|
|
|
|
|
receiver.await?
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Update an existing recording or insert a new one.
|
2021-02-04 17:43:36 +01:00
|
|
|
pub async fn update_recording(&self, recording: Recording) -> DatabaseResult<()> {
|
2020-11-17 15:52:47 +01:00
|
|
|
let (sender, receiver) = oneshot::channel();
|
|
|
|
|
self.action_sender
|
|
|
|
|
.send(UpdateRecording(recording, sender))?;
|
|
|
|
|
receiver.await?
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Delete an existing recording.
|
2021-02-04 17:43:36 +01:00
|
|
|
pub async fn delete_recording(&self, id: &str) -> DatabaseResult<()> {
|
2020-11-17 15:52:47 +01:00
|
|
|
let (sender, receiver) = oneshot::channel();
|
2020-11-28 21:45:22 +01:00
|
|
|
self.action_sender
|
|
|
|
|
.send(DeleteRecording(id.to_string(), sender))?;
|
2020-11-17 15:52:47 +01:00
|
|
|
receiver.await?
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Get information on all recordings in which a person performs.
|
2021-02-04 17:43:36 +01:00
|
|
|
pub async fn get_recordings_for_person(&self, person_id: &str) -> DatabaseResult<Vec<Recording>> {
|
2020-11-17 15:52:47 +01:00
|
|
|
let (sender, receiver) = oneshot::channel();
|
|
|
|
|
self.action_sender
|
2020-11-28 21:45:22 +01:00
|
|
|
.send(GetRecordingsForPerson(person_id.to_string(), sender))?;
|
2020-11-17 15:52:47 +01:00
|
|
|
receiver.await?
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Get information on all recordings in which an ensemble performs.
|
2021-02-04 17:43:36 +01:00
|
|
|
pub async fn get_recordings_for_ensemble(&self, ensemble_id: &str) -> DatabaseResult<Vec<Recording>> {
|
2020-11-17 15:52:47 +01:00
|
|
|
let (sender, receiver) = oneshot::channel();
|
|
|
|
|
self.action_sender
|
2020-11-28 21:45:22 +01:00
|
|
|
.send(GetRecordingsForEnsemble(ensemble_id.to_string(), sender))?;
|
2020-11-17 15:52:47 +01:00
|
|
|
receiver.await?
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Get information on all recordings of a work.
|
2021-02-04 17:43:36 +01:00
|
|
|
pub async fn get_recordings_for_work(&self, work_id: &str) -> DatabaseResult<Vec<Recording>> {
|
2020-11-17 15:52:47 +01:00
|
|
|
let (sender, receiver) = oneshot::channel();
|
|
|
|
|
self.action_sender
|
2020-11-28 21:45:22 +01:00
|
|
|
.send(GetRecordingsForWork(work_id.to_string(), sender))?;
|
2020-11-17 15:52:47 +01:00
|
|
|
receiver.await?
|
|
|
|
|
}
|
|
|
|
|
|
2020-11-29 10:01:34 +01:00
|
|
|
/// Check whether a recording exists within the database.
|
2021-02-04 17:43:36 +01:00
|
|
|
pub async fn recording_exists(&self, id: &str) -> DatabaseResult<bool> {
|
2020-11-29 10:01:34 +01:00
|
|
|
let (sender, receiver) = oneshot::channel();
|
|
|
|
|
self.action_sender
|
|
|
|
|
.send(RecordingExists(id.to_string(), sender))?;
|
|
|
|
|
receiver.await?
|
|
|
|
|
}
|
|
|
|
|
|
2020-12-20 11:47:27 +01:00
|
|
|
/// Update an existing medium or insert a new one.
|
2021-02-04 17:43:36 +01:00
|
|
|
pub async fn update_medium(&self, medium: Medium) -> DatabaseResult<()> {
|
2020-12-20 11:47:27 +01:00
|
|
|
let (sender, receiver) = oneshot::channel();
|
|
|
|
|
self.action_sender.send(UpdateMedium(medium, sender))?;
|
|
|
|
|
receiver.await?
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Delete an existing medium. This will fail, if there are still other
|
|
|
|
|
/// items referencing this medium.
|
2021-02-04 17:43:36 +01:00
|
|
|
pub async fn delete_medium(&self, id: &str) -> DatabaseResult<()> {
|
2020-11-17 15:52:47 +01:00
|
|
|
let (sender, receiver) = oneshot::channel();
|
2020-12-20 11:47:27 +01:00
|
|
|
|
2020-11-17 15:52:47 +01:00
|
|
|
self.action_sender
|
2020-12-20 11:47:27 +01:00
|
|
|
.send(DeleteMedium(id.to_owned(), sender))?;
|
|
|
|
|
|
2020-11-17 15:52:47 +01:00
|
|
|
receiver.await?
|
|
|
|
|
}
|
|
|
|
|
|
2020-12-20 11:47:27 +01:00
|
|
|
/// Get an existing medium.
|
2021-02-04 17:43:36 +01:00
|
|
|
pub async fn get_medium(&self, id: &str) -> DatabaseResult<Option<Medium>> {
|
2020-11-17 15:52:47 +01:00
|
|
|
let (sender, receiver) = oneshot::channel();
|
2020-12-20 11:47:27 +01:00
|
|
|
self.action_sender.send(GetMedium(id.to_owned(), sender))?;
|
|
|
|
|
receiver.await?
|
|
|
|
|
}
|
|
|
|
|
|
2021-01-16 15:08:12 +01:00
|
|
|
/// Get all track sets for a recording.
|
2021-02-04 17:43:36 +01:00
|
|
|
pub async fn get_track_sets(&self, recording_id: &str) -> DatabaseResult<Vec<TrackSet>> {
|
2020-11-17 15:52:47 +01:00
|
|
|
let (sender, receiver) = oneshot::channel();
|
2021-01-16 15:08:12 +01:00
|
|
|
self.action_sender.send(GetTrackSets(recording_id.to_owned(), sender))?;
|
2020-11-17 15:52:47 +01:00
|
|
|
receiver.await?
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Stop the database thread. Any future access to the database will fail.
|
2021-02-04 17:43:36 +01:00
|
|
|
pub async fn stop(&self) -> DatabaseResult<()> {
|
2020-11-17 15:52:47 +01:00
|
|
|
let (sender, receiver) = oneshot::channel();
|
|
|
|
|
self.action_sender.send(Stop(sender))?;
|
|
|
|
|
Ok(receiver.await?)
|
|
|
|
|
}
|
|
|
|
|
}
|