Fixes for sqlite data layer
This commit is contained in:
1 parent
7f9aa11d6e
commit
242b56fc21
9 files changed
+73
-67
No files matched your search
+32
-12
@@ -1,8 +1,8 @@
|
||||
use crate::data::Id;
|
||||
use crate::data::entities::{EntityData};
|
||||
use crate::data::entities::EntityData;
|
||||
use crate::data::repositories::{BatchedDbLayer, DbLayer};
|
||||
use crate::notification::MaybeError;
|
||||
use crate::notification::NotificationData::{DbLoadError, DbSaveError};
|
||||
use crate::notification::NotificationData::DbSaveError;
|
||||
use log::{debug, error};
|
||||
use rusqlite::{Connection, Error, Params, Row};
|
||||
use std::marker::PhantomData;
|
||||
@@ -25,6 +25,9 @@ pub trait TableAccessQuerySet<T> {
|
||||
fn save() -> &'static str;
|
||||
fn add() -> &'static str;
|
||||
fn name() -> &'static str;
|
||||
fn id_field() -> &'static str {
|
||||
"id"
|
||||
}
|
||||
fn from_sql(row: &Row) -> Result<T, Error>;
|
||||
fn insert_params(entity: &T) -> impl Params;
|
||||
fn update_params(entity: &T) -> impl Params;
|
||||
@@ -38,9 +41,9 @@ where
|
||||
_phantom: PhantomData<(T, Q)>,
|
||||
}
|
||||
|
||||
impl<T, Q: TableAccessQuerySet<T>> Default for SqliteDbLayer<T, Q>{
|
||||
impl<T, Q: TableAccessQuerySet<T>> Default for SqliteDbLayer<T, Q> {
|
||||
fn default() -> Self {
|
||||
Self{
|
||||
Self {
|
||||
_phantom: PhantomData,
|
||||
}
|
||||
}
|
||||
@@ -52,7 +55,10 @@ impl<T: EntityData, Q: TableAccessQuerySet<T>> DbLayer<T> for SqliteDbLayer<T, Q
|
||||
|
||||
connection
|
||||
.execute(Q::save(), Q::update_params(entity))
|
||||
.map_err(|e| {error!("{}", e); DbSaveError})?;
|
||||
.map_err(|e| {
|
||||
error!("{}", e);
|
||||
DbSaveError
|
||||
})?;
|
||||
debug!("Updated in {} for {:?}", Q::name(), time.elapsed());
|
||||
Ok(())
|
||||
}
|
||||
@@ -61,8 +67,11 @@ impl<T: EntityData, Q: TableAccessQuerySet<T>> DbLayer<T> for SqliteDbLayer<T, Q
|
||||
let time = Instant::now();
|
||||
|
||||
let index: u32 = connection
|
||||
.query_row(Q::add(), Q::insert_params(entity), |row| row.get(0))
|
||||
.map_err(|e| {error!("{}", e); DbSaveError})?;
|
||||
.query_row(format!("{} RETURNING {}", Q::add(), Q::id_field()).as_str(), Q::insert_params(entity), |row| row.get(0))
|
||||
.map_err(|e| {
|
||||
error!("{}", e);
|
||||
DbSaveError
|
||||
})?;
|
||||
|
||||
entity.set_id(index.into());
|
||||
debug!("Added into {} for {:?}", Q::name(), time.elapsed());
|
||||
@@ -80,7 +89,10 @@ impl<T: EntityData, Q: TableAccessQuerySet<T>> DbLayer<T> for SqliteDbLayer<T, Q
|
||||
format!("DELETE FROM {} WHERE id = ?1", Q::name()).as_str(),
|
||||
(&id,),
|
||||
)
|
||||
.map_err(|e| {error!("{}", e); DbSaveError})?;
|
||||
.map_err(|e| {
|
||||
error!("{}", e);
|
||||
DbSaveError
|
||||
})?;
|
||||
debug!("Deleted from {} for {:?}", Q::name(), time.elapsed());
|
||||
Ok(())
|
||||
}
|
||||
@@ -93,7 +105,10 @@ impl<T: EntityData, Q: TableAccessQuerySet<T>> DbLayer<T> for SqliteDbLayer<T, Q
|
||||
.expect("Failed to prepare state query");
|
||||
let iter = stmt
|
||||
.query_map([], |row| Ok(Q::from_sql(row)?))
|
||||
.map_err(|e| {error!("{}", e); DbSaveError})?;
|
||||
.map_err(|e| {
|
||||
error!("{}", e);
|
||||
DbSaveError
|
||||
})?;
|
||||
|
||||
iter.filter_map(|res| res.ok())
|
||||
.for_each(|i| storage.push(i));
|
||||
@@ -123,7 +138,10 @@ impl<T: EntityData, Q: TableAccessQuerySet<T>> BatchedDbLayer<T> for SqliteDbLay
|
||||
format!("DELETE FROM {} WHERE id in ({})", Q::name(), stringed).as_str(),
|
||||
(),
|
||||
)
|
||||
.map_err(|_| DbSaveError)?;
|
||||
.map_err(|e| {
|
||||
error!("{}", e);
|
||||
DbSaveError
|
||||
})?;
|
||||
}
|
||||
debug!(
|
||||
"Deleted {} from {} for {:?}",
|
||||
@@ -145,8 +163,10 @@ impl<T: EntityData, Q: TableAccessQuerySet<T>> BatchedDbLayer<T> for SqliteDbLay
|
||||
{
|
||||
let mut stmt = tx.prepare(Q::add()).expect("Failed to prepare state query");
|
||||
for entity in entities.iter() {
|
||||
stmt.execute(Q::insert_params(entity))
|
||||
.map_err(|_| DbSaveError)?;
|
||||
stmt.execute(Q::insert_params(entity)).map_err(|e| {
|
||||
error!("{}", e);
|
||||
DbSaveError
|
||||
})?;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user