Db layers #14
No files matched your search
@@ -19,7 +19,6 @@ use rusqlite::Connection;
|
|||||||
pub const USER_FONT: Font = Font::with_name("Noto Sans JP");
|
pub const USER_FONT: Font = Font::with_name("Noto Sans JP");
|
||||||
|
|
||||||
pub fn start() -> iced::Result {
|
pub fn start() -> iced::Result {
|
||||||
println!("{}", size_of::<WordData>());
|
|
||||||
info!("Welcome to JapLearn");
|
info!("Welcome to JapLearn");
|
||||||
iced::application(ScreenState::boot, ScreenState::update, ScreenState::view)
|
iced::application(ScreenState::boot, ScreenState::update, ScreenState::view)
|
||||||
.window(window_settings())
|
.window(window_settings())
|
||||||
|
|||||||
@@ -37,22 +37,38 @@ where
|
|||||||
|
|
||||||
impl<T: EntityData, Q: TableAccessQuerySet<T>> DbLayer<T> for SqliteDbLayer<T, Q> {
|
impl<T: EntityData, Q: TableAccessQuerySet<T>> DbLayer<T> for SqliteDbLayer<T, Q> {
|
||||||
fn write_entity(&self, entity: &T, connection: &Connection) -> MaybeError {
|
fn write_entity(&self, entity: &T, connection: &Connection) -> MaybeError {
|
||||||
|
let time = Instant::now();
|
||||||
|
|
||||||
connection
|
connection
|
||||||
.execute(Q::load(), Q::update_params(entity))
|
.execute(Q::load(), Q::update_params(entity))
|
||||||
.map_err(|_| DbSaveError)?;
|
.map_err(|_| DbSaveError)?;
|
||||||
|
info!(
|
||||||
|
"Updated in {} for {:?}",
|
||||||
|
Q::name(),
|
||||||
|
time.elapsed()
|
||||||
|
);
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn add_entity(&mut self, entity: &mut T, connection: &Connection) -> MaybeError {
|
fn add_entity(&mut self, entity: &mut T, connection: &Connection) -> MaybeError {
|
||||||
|
let time = Instant::now();
|
||||||
|
|
||||||
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(|_| DbSaveError)?;
|
||||||
|
|
||||||
entity.set_id(index.into());
|
entity.set_id(index.into());
|
||||||
|
info!(
|
||||||
|
"Added into {} for {:?}",
|
||||||
|
Q::name(),
|
||||||
|
time.elapsed()
|
||||||
|
);
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn delete_entity(&mut self, id: Id, connection: &Connection) -> MaybeError {
|
fn delete_entity(&mut self, id: Id, connection: &Connection) -> MaybeError {
|
||||||
|
let time = Instant::now();
|
||||||
|
|
||||||
if !id.is_valid() {
|
if !id.is_valid() {
|
||||||
return Err(DbSaveError);
|
return Err(DbSaveError);
|
||||||
}
|
}
|
||||||
@@ -62,10 +78,17 @@ impl<T: EntityData, Q: TableAccessQuerySet<T>> DbLayer<T> for SqliteDbLayer<T, Q
|
|||||||
(&id,),
|
(&id,),
|
||||||
)
|
)
|
||||||
.map_err(|_| DbSaveError)?;
|
.map_err(|_| DbSaveError)?;
|
||||||
|
info!(
|
||||||
|
"Deleted from {} for {:?}",
|
||||||
|
Q::name(),
|
||||||
|
time.elapsed()
|
||||||
|
);
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn load_all(&self, storage: &mut Vec<T>, connection: &Connection) -> MaybeError {
|
fn load_all(&self, storage: &mut Vec<T>, connection: &Connection) -> MaybeError {
|
||||||
|
let time = Instant::now();
|
||||||
|
|
||||||
let mut stmt = connection
|
let mut stmt = connection
|
||||||
.prepare(Q::load())
|
.prepare(Q::load())
|
||||||
.expect("Failed to prepare state query");
|
.expect("Failed to prepare state query");
|
||||||
@@ -75,12 +98,21 @@ impl<T: EntityData, Q: TableAccessQuerySet<T>> DbLayer<T> for SqliteDbLayer<T, Q
|
|||||||
|
|
||||||
iter.filter_map(|res| res.ok())
|
iter.filter_map(|res| res.ok())
|
||||||
.for_each(|i| storage.push(i));
|
.for_each(|i| storage.push(i));
|
||||||
|
info!(
|
||||||
|
"Loaded {} from {} for {:?}",
|
||||||
|
storage.len(),
|
||||||
|
Q::name(),
|
||||||
|
time.elapsed()
|
||||||
|
);
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: EntityData, Q: TableAccessQuerySet<T>> BatchedDbLayer<T> for SqliteDbLayer<T, Q> {
|
impl<T: EntityData, Q: TableAccessQuerySet<T>> BatchedDbLayer<T> for SqliteDbLayer<T, Q> {
|
||||||
fn delete_many_entities(&mut self, ids: &[Id], connection: &mut Connection) -> MaybeError {
|
fn delete_many_entities(&mut self, ids: &[Id], connection: &mut Connection) -> MaybeError {
|
||||||
|
let time = Instant::now();
|
||||||
|
|
||||||
for chunk in ids.chunks(1000) {
|
for chunk in ids.chunks(1000) {
|
||||||
let stringed = chunk
|
let stringed = chunk
|
||||||
.iter()
|
.iter()
|
||||||
@@ -94,6 +126,13 @@ impl<T: EntityData, Q: TableAccessQuerySet<T>> BatchedDbLayer<T> for SqliteDbLay
|
|||||||
)
|
)
|
||||||
.map_err(|_| DbSaveError)?;
|
.map_err(|_| DbSaveError)?;
|
||||||
}
|
}
|
||||||
|
info!(
|
||||||
|
"Deleted {} from {} for {:?}",
|
||||||
|
ids.len(),
|
||||||
|
Q::name(),
|
||||||
|
time.elapsed()
|
||||||
|
);
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -121,7 +160,12 @@ impl<T: EntityData, Q: TableAccessQuerySet<T>> BatchedDbLayer<T> for SqliteDbLay
|
|||||||
entities[index].set_id(id.into());
|
entities[index].set_id(id.into());
|
||||||
}
|
}
|
||||||
|
|
||||||
info!("Added {} entities for {:?}", entities.len(), time.elapsed());
|
info!(
|
||||||
|
"Added {} into {} for {:?}",
|
||||||
|
entities.len(),
|
||||||
|
Q::name(),
|
||||||
|
time.elapsed()
|
||||||
|
);
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user