From 1406fc8f21532283225c10cada4d0dfa31d6bcc7 Mon Sep 17 00:00:00 2001 From: Mikhail Mitrofanov Date: Thu, 20 Aug 2026 18:53:13 +0300 Subject: [PATCH] Change TEXT to INTEGER in card_stats --- .gitignore | 3 +-- sql/card_stats.sql | 4 ++-- src/data_provider/import.rs | 40 ++++++++++++++++++++----------------- src/data_provider/sqlite.rs | 4 +--- src/repetition.rs | 26 +++++++++++++++--------- 5 files changed, 43 insertions(+), 34 deletions(-) diff --git a/.gitignore b/.gitignore index 3d5cb63..2a0038a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,2 @@ /target -.idea -.DS_Store \ No newline at end of file +.idea \ No newline at end of file diff --git a/sql/card_stats.sql b/sql/card_stats.sql index 1655391..fb2b675 100644 --- a/sql/card_stats.sql +++ b/sql/card_stats.sql @@ -5,9 +5,9 @@ create table card_stats word_id INTEGER not null references words on delete cascade, - set_id TEXT not null + set_id INTEGER not null references card_set on delete cascade, score INTEGER default 1 not null, - last_opened integer not null + last_opened INTEGER not null ); \ No newline at end of file diff --git a/src/data_provider/import.rs b/src/data_provider/import.rs index 0e22cb0..432bfa0 100644 --- a/src/data_provider/import.rs +++ b/src/data_provider/import.rs @@ -40,25 +40,29 @@ pub fn load_groups(connection: &Connection) -> ImportData { .collect::>(); for (_, collection) in sets { - let fields = collection["flds"] - .as_array() - .unwrap() - .iter() - .map(|x| x["name"].as_str().unwrap().to_string()) - .collect(); - let mut group = ImportGroup { - id: collection["id"].as_u64().unwrap(), - name: collection["name"].as_str().unwrap().to_string(), - fields, - mapping: Default::default(), - length: 0, - imported: false, - }; - if let Some((_, count)) = counts.iter().find(|(id, _)| *id == group.id as i64) { - group.length = *count as u64 + let fields_property = collection.get("fields"); + if let Some(fields_property) = fields_property { + let fields = fields_property + .as_array() + .unwrap() + .iter() + .map(|x| x["name"].as_str().unwrap().to_string()) + .collect(); + let mut group = ImportGroup { + id: collection["id"].as_u64().unwrap(), + name: collection["name"].as_str().unwrap().to_string(), + fields, + mapping: Default::default(), + length: 0, + imported: false, + }; + if let Some((_, count)) = counts.iter().find(|(id, _)| *id == group.id as i64) { + group.length = *count as u64 + } + println!("{:?}", group); + total_data.0.push(group); } - println!("{:?}", group); - total_data.0.push(group); + } total_data } diff --git a/src/data_provider/sqlite.rs b/src/data_provider/sqlite.rs index 493b0c7..3ef4478 100644 --- a/src/data_provider/sqlite.rs +++ b/src/data_provider/sqlite.rs @@ -17,9 +17,7 @@ pub fn create_db() { } } -fn ensure_db_schema(connection: &Connection) { - -} +fn ensure_db_schema(_: &Connection) {} fn create_tables(conn: &Connection) { make_card_set(conn).unwrap(); diff --git a/src/repetition.rs b/src/repetition.rs index 298a3d2..7ef3db8 100644 --- a/src/repetition.rs +++ b/src/repetition.rs @@ -25,7 +25,7 @@ pub struct RepetitionState { current_statistic: CardStatistics, open: bool, can_play: bool, - sink: Arc, + sink: Arc>, opened: HashSet, } @@ -100,7 +100,12 @@ impl RepetitionState { pub(crate) fn new(set: DeckSettings, state: Arc>) -> RepetitionState { let mut card_set = DeckData::new(&set, state.clone()); let (word, stat) = card_set.next(); - let sink_handle = rodio::DeviceSinkBuilder::open_default_sink().unwrap(); + + let sink_handle = if set.forward.contains("speech") || set.backward.contains("speech") { + rodio::DeviceSinkBuilder::open_default_sink().ok() + } else { + None + }; RepetitionState { state, @@ -138,11 +143,12 @@ impl RepetitionState { self.current_word = next.0; self.current_statistic = next.1; - if self.settings.require_speech() { - return Task::perform( - play_sound(self.sink.clone(), self.current_word.key.clone()), - |_| RootMessage::Repetition(RepetitionMessage::PlayFinished), - ); + if self.settings.require_speech() && self.sink.is_some() { + let sink = self.sink.clone(); + let task = play_sound(sink, self.current_word.key.clone()); + return Task::perform(task, |_| { + RootMessage::Repetition(RepetitionMessage::PlayFinished) + }); } self.increment_counter(); Task::none() @@ -316,10 +322,12 @@ pub enum RepetitionMessage { PlayFinished, } -async fn play_sound(sink: Arc, text: String) { +async fn play_sound(sink: Arc>, text: String) { if let Ok(data) = get_voice(text.as_str()).await { spawn_blocking(move || { - if let Ok(play) = rodio::play(sink.mixer(), data) { + if let Some(sink) = sink.as_ref() + && let Ok(play) = rodio::play(sink.mixer(), data) + { play.sleep_until_end() } })