From 42c38d55e1af97ef95b23455399d030f053b3f18 Mon Sep 17 00:00:00 2001 From: Mikhail Mitrofanov Date: Mon, 7 Sep 2026 16:10:10 +0300 Subject: [PATCH] Fix more bugs --- src/data/repositories.rs | 5 +++-- src/data_provider/card_states.rs | 2 +- src/data_provider/custom_fields.rs | 2 +- src/data_provider/decks.rs | 2 +- src/data_provider/history.rs | 2 +- src/data_provider/mod.rs | 12 ++++++------ src/data_provider/word_groups.rs | 2 +- src/data_provider/words.rs | 2 +- src/pages/repetitions.rs | 13 +++++++++---- 9 files changed, 24 insertions(+), 18 deletions(-) diff --git a/src/data/repositories.rs b/src/data/repositories.rs index f455dc1..56b5dd1 100644 --- a/src/data/repositories.rs +++ b/src/data/repositories.rs @@ -457,14 +457,15 @@ impl> Repository for DataRepositoryIn .write_entity(data, &self.connection.lock())?; } else { let index = fast_position_of(self.temporal.as_slice(), entity).unwrap(); - let mut data = self.temporal.remove(index); + let data = &mut self.temporal[index]; self.data_layer - .add_entity(&mut data, &self.connection.lock())?; + .add_entity(data, &self.connection.lock())?; entity.set_real(true); entity.id = data.id(); entity.set_index(self.cache.len()); self.query_manger.handle_save(original_state, entity, &data); + let data = self.temporal.remove(index); self.cache.push(data); self.shifts += 1; } diff --git a/src/data_provider/card_states.rs b/src/data_provider/card_states.rs index c708f93..ff50ce3 100644 --- a/src/data_provider/card_states.rs +++ b/src/data_provider/card_states.rs @@ -23,7 +23,7 @@ impl TableAccessQuerySet for CardStatesQuerySet { } fn add() -> &'static str { - "INSERT INTO states (word_id, deck_id, score, last_opened, fsrs_opened, fsrs_memory, fsrs_open_day) VALUES (?1, ?2, ?3, ?4)" + "INSERT INTO states (word_id, deck_id, score, last_opened, fsrs_opened, fsrs_memory, fsrs_open_day) VALUES (?1, ?2, ?3, ?4) RETURNING id" } fn name() -> &'static str { diff --git a/src/data_provider/custom_fields.rs b/src/data_provider/custom_fields.rs index 6f09efa..219790f 100644 --- a/src/data_provider/custom_fields.rs +++ b/src/data_provider/custom_fields.rs @@ -16,7 +16,7 @@ impl TableAccessQuerySet for CustomFieldsQuerySet { } fn add() -> &'static str { - "INSERT INTO word_groups (name) VALUES (?1)" + "INSERT INTO word_groups (name) VALUES (?1) RETURNING id" } fn name() -> &'static str { diff --git a/src/data_provider/decks.rs b/src/data_provider/decks.rs index f9bc21d..811edb4 100644 --- a/src/data_provider/decks.rs +++ b/src/data_provider/decks.rs @@ -17,7 +17,7 @@ impl TableAccessQuerySet for DeckQuerySet { } fn add() -> &'static str { - "INSERT INTO states (word_id, set_id, score, last_opened, fsrs_opened, fsrs_memory, fsrs_open_day) VALUES (?1, ?2, ?3, ?4)" + "INSERT INTO decks (name, forward, backward, filter) VALUES (?1, ?2, ?3, ?4) RETURNING id" } fn name() -> &'static str { diff --git a/src/data_provider/history.rs b/src/data_provider/history.rs index 2d64d68..04b68ec 100644 --- a/src/data_provider/history.rs +++ b/src/data_provider/history.rs @@ -21,7 +21,7 @@ impl TableAccessQuerySet for HistoryQuerySet { } fn add() -> &'static str { - "INSERT INTO history (deck_id, state_id, timestamp, answer, before, after, fsrs) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7)" + "INSERT INTO history (deck_id, state_id, timestamp, answer, before, after, fsrs) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7) RETURNING rowid" } fn name() -> &'static str { diff --git a/src/data_provider/mod.rs b/src/data_provider/mod.rs index 9770201..6746198 100644 --- a/src/data_provider/mod.rs +++ b/src/data_provider/mod.rs @@ -3,7 +3,7 @@ use crate::data::entities::{EntityData}; use crate::data::repositories::{BatchedDbLayer, DbLayer}; use crate::notification::MaybeError; use crate::notification::NotificationData::{DbLoadError, DbSaveError}; -use log::debug; +use log::{debug, error}; use rusqlite::{Connection, Error, Params, Row}; use std::marker::PhantomData; use std::time::Instant; @@ -51,8 +51,8 @@ impl> DbLayer for SqliteDbLayer> DbLayer for SqliteDbLayer> DbLayer for SqliteDbLayer> DbLayer for SqliteDbLayer for WordGroupQuerySet { } fn add() -> &'static str { - "INSERT INTO word_groups (name) VALUES (?1)" + "INSERT INTO word_groups (name) VALUES (?1) RETURNING id" } fn name() -> &'static str { diff --git a/src/data_provider/words.rs b/src/data_provider/words.rs index 8e9f696..19089e2 100644 --- a/src/data_provider/words.rs +++ b/src/data_provider/words.rs @@ -20,7 +20,7 @@ impl TableAccessQuerySet for WordQuerySet { } fn add() -> &'static str { - "INSERT INTO words (key, value, tags, more, group_id) VALUES (?1, ?2, ?3, ?4, ?5)" + "INSERT INTO words (key, value, tags, more, group_id) VALUES (?1, ?2, ?3, ?4, ?5) RETURNING id" } fn name() -> &'static str { diff --git a/src/pages/repetitions.rs b/src/pages/repetitions.rs index 070d859..63d80d5 100644 --- a/src/pages/repetitions.rs +++ b/src/pages/repetitions.rs @@ -143,13 +143,18 @@ impl NavigatedPage for RepetitionsState { } Save => { let deck = self.selected_deck().unwrap().clone(); - let handle = self.selected_deck_handle.unwrap(); + let handle = self.selected_deck_handle.as_mut().unwrap(); let mut repo = self.state.decks.write(); - repo.set_static(handle, deck.general_settings.clone()); - if let Err(err) = repo.save(&mut handle.clone()) { + repo.set(handle, deck.general_settings.clone()); + let old = handle.clone(); + if let Err(err) = repo.save(handle) { return push_error_task!(err); } + + let mut deck = self.decks.remove(&old).unwrap(); + deck.settings_handle = *handle; + self.decks.insert(*handle, deck); } SetForward(value) => { let deck = self.selected_deck_mut().unwrap(); @@ -304,7 +309,7 @@ impl RepetitionsState { ] .spacing(QUARTER_SPACING), { - if !deck.id.is_valid() { + if !deck.settings_handle.real() { column![ column![ text!("Передняя сторона"),