Repo integration #15
No files matched your search
@@ -457,14 +457,15 @@ impl<T: EntityData + Clone, D: DbLayer<T>> Repository<T, D> for DataRepositoryIn
|
|||||||
.write_entity(data, &self.connection.lock())?;
|
.write_entity(data, &self.connection.lock())?;
|
||||||
} else {
|
} else {
|
||||||
let index = fast_position_of(self.temporal.as_slice(), entity).unwrap();
|
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
|
self.data_layer
|
||||||
.add_entity(&mut data, &self.connection.lock())?;
|
.add_entity(data, &self.connection.lock())?;
|
||||||
entity.set_real(true);
|
entity.set_real(true);
|
||||||
entity.id = data.id();
|
entity.id = data.id();
|
||||||
entity.set_index(self.cache.len());
|
entity.set_index(self.cache.len());
|
||||||
self.query_manger.handle_save(original_state, entity, &data);
|
self.query_manger.handle_save(original_state, entity, &data);
|
||||||
|
|
||||||
|
let data = self.temporal.remove(index);
|
||||||
self.cache.push(data);
|
self.cache.push(data);
|
||||||
self.shifts += 1;
|
self.shifts += 1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ impl TableAccessQuerySet<CardState> for CardStatesQuerySet {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn add() -> &'static str {
|
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 {
|
fn name() -> &'static str {
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ impl TableAccessQuerySet<WordGroup> for CustomFieldsQuerySet {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn add() -> &'static str {
|
fn add() -> &'static str {
|
||||||
"INSERT INTO word_groups (name) VALUES (?1)"
|
"INSERT INTO word_groups (name) VALUES (?1) RETURNING id"
|
||||||
}
|
}
|
||||||
|
|
||||||
fn name() -> &'static str {
|
fn name() -> &'static str {
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ impl TableAccessQuerySet<DeckSettings> for DeckQuerySet {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn add() -> &'static str {
|
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 {
|
fn name() -> &'static str {
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ impl TableAccessQuerySet<HistoryNote> for HistoryQuerySet {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn add() -> &'static str {
|
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 {
|
fn name() -> &'static str {
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ use crate::data::entities::{EntityData};
|
|||||||
use crate::data::repositories::{BatchedDbLayer, DbLayer};
|
use crate::data::repositories::{BatchedDbLayer, DbLayer};
|
||||||
use crate::notification::MaybeError;
|
use crate::notification::MaybeError;
|
||||||
use crate::notification::NotificationData::{DbLoadError, DbSaveError};
|
use crate::notification::NotificationData::{DbLoadError, DbSaveError};
|
||||||
use log::debug;
|
use log::{debug, error};
|
||||||
use rusqlite::{Connection, Error, Params, Row};
|
use rusqlite::{Connection, Error, Params, Row};
|
||||||
use std::marker::PhantomData;
|
use std::marker::PhantomData;
|
||||||
use std::time::Instant;
|
use std::time::Instant;
|
||||||
@@ -51,8 +51,8 @@ impl<T: EntityData, Q: TableAccessQuerySet<T>> DbLayer<T> for SqliteDbLayer<T, Q
|
|||||||
let time = Instant::now();
|
let time = Instant::now();
|
||||||
|
|
||||||
connection
|
connection
|
||||||
.execute(Q::load(), Q::update_params(entity))
|
.execute(Q::save(), Q::update_params(entity))
|
||||||
.map_err(|_| DbSaveError)?;
|
.map_err(|e| {error!("{}", e); DbSaveError})?;
|
||||||
debug!("Updated in {} for {:?}", Q::name(), time.elapsed());
|
debug!("Updated in {} for {:?}", Q::name(), time.elapsed());
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
@@ -62,7 +62,7 @@ impl<T: EntityData, Q: TableAccessQuerySet<T>> DbLayer<T> for SqliteDbLayer<T, Q
|
|||||||
|
|
||||||
let index: u32 = connection
|
let index: u32 = connection
|
||||||
.query_row(Q::add(), Q::insert_params(entity), |row| row.get(0))
|
.query_row(Q::add(), Q::insert_params(entity), |row| row.get(0))
|
||||||
.map_err(|_| DbSaveError)?;
|
.map_err(|e| {error!("{}", e); DbSaveError})?;
|
||||||
|
|
||||||
entity.set_id(index.into());
|
entity.set_id(index.into());
|
||||||
debug!("Added into {} for {:?}", Q::name(), time.elapsed());
|
debug!("Added into {} for {:?}", Q::name(), time.elapsed());
|
||||||
@@ -80,7 +80,7 @@ impl<T: EntityData, Q: TableAccessQuerySet<T>> DbLayer<T> for SqliteDbLayer<T, Q
|
|||||||
format!("DELETE FROM {} WHERE id = ?1", Q::name()).as_str(),
|
format!("DELETE FROM {} WHERE id = ?1", Q::name()).as_str(),
|
||||||
(&id,),
|
(&id,),
|
||||||
)
|
)
|
||||||
.map_err(|_| DbSaveError)?;
|
.map_err(|e| {error!("{}", e); DbSaveError})?;
|
||||||
debug!("Deleted from {} for {:?}", Q::name(), time.elapsed());
|
debug!("Deleted from {} for {:?}", Q::name(), time.elapsed());
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
@@ -93,7 +93,7 @@ impl<T: EntityData, Q: TableAccessQuerySet<T>> DbLayer<T> for SqliteDbLayer<T, Q
|
|||||||
.expect("Failed to prepare state query");
|
.expect("Failed to prepare state query");
|
||||||
let iter = stmt
|
let iter = stmt
|
||||||
.query_map([], |row| Ok(Q::from_sql(row)?))
|
.query_map([], |row| Ok(Q::from_sql(row)?))
|
||||||
.map_err(|_| DbLoadError)?;
|
.map_err(|e| {error!("{}", e); DbSaveError})?;
|
||||||
|
|
||||||
iter.filter_map(|res| res.ok())
|
iter.filter_map(|res| res.ok())
|
||||||
.for_each(|i| storage.push(i));
|
.for_each(|i| storage.push(i));
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ impl TableAccessQuerySet<WordGroup> for WordGroupQuerySet {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn add() -> &'static str {
|
fn add() -> &'static str {
|
||||||
"INSERT INTO word_groups (name) VALUES (?1)"
|
"INSERT INTO word_groups (name) VALUES (?1) RETURNING id"
|
||||||
}
|
}
|
||||||
|
|
||||||
fn name() -> &'static str {
|
fn name() -> &'static str {
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ impl TableAccessQuerySet<WordData> for WordQuerySet {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn add() -> &'static str {
|
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 {
|
fn name() -> &'static str {
|
||||||
|
|||||||
@@ -143,13 +143,18 @@ impl NavigatedPage<RepetitionsMessage> for RepetitionsState {
|
|||||||
}
|
}
|
||||||
Save => {
|
Save => {
|
||||||
let deck = self.selected_deck().unwrap().clone();
|
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();
|
let mut repo = self.state.decks.write();
|
||||||
|
|
||||||
repo.set_static(handle, deck.general_settings.clone());
|
repo.set(handle, deck.general_settings.clone());
|
||||||
if let Err(err) = repo.save(&mut handle.clone()) {
|
let old = handle.clone();
|
||||||
|
if let Err(err) = repo.save(handle) {
|
||||||
return push_error_task!(err);
|
return push_error_task!(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let mut deck = self.decks.remove(&old).unwrap();
|
||||||
|
deck.settings_handle = *handle;
|
||||||
|
self.decks.insert(*handle, deck);
|
||||||
}
|
}
|
||||||
SetForward(value) => {
|
SetForward(value) => {
|
||||||
let deck = self.selected_deck_mut().unwrap();
|
let deck = self.selected_deck_mut().unwrap();
|
||||||
@@ -304,7 +309,7 @@ impl RepetitionsState {
|
|||||||
]
|
]
|
||||||
.spacing(QUARTER_SPACING),
|
.spacing(QUARTER_SPACING),
|
||||||
{
|
{
|
||||||
if !deck.id.is_valid() {
|
if !deck.settings_handle.real() {
|
||||||
column![
|
column![
|
||||||
column![
|
column![
|
||||||
text!("Передняя сторона"),
|
text!("Передняя сторона"),
|
||||||
|
|||||||
Reference in new issue
Block a user