From 8c0afe0c9c599339e6c6306ae32300e5028372ef Mon Sep 17 00:00:00 2001 From: davidemazzocchi Date: Mon, 6 Oct 2025 07:52:12 +0200 Subject: [PATCH] feat: add ToDelete state to entity and perform deletion while persisting --- .../heave/src/fun/sqlite_persist_catalog.rs | 16 ++++++++++++++-- 01.workspace/heave/src/str/catalog.rs | 7 +++++++ 01.workspace/heave/src/str/entity_state.rs | 1 + 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/01.workspace/heave/src/fun/sqlite_persist_catalog.rs b/01.workspace/heave/src/fun/sqlite_persist_catalog.rs index 176f50a..7eaf02f 100644 --- a/01.workspace/heave/src/fun/sqlite_persist_catalog.rs +++ b/01.workspace/heave/src/fun/sqlite_persist_catalog.rs @@ -41,6 +41,14 @@ fn write_attribute( Ok(()) } +fn delete_entity(entity: &Entity, transaction: &rusqlite::Transaction) -> Result<(), FailedTo> { + let entity_id = [&entity.id]; + transaction + .execute(DELETE_ENTITY_STATEMENT, entity_id) + .map_err(|_| sqlite::FailedTo::ExecuteStatement)?; + Ok(()) +} + fn write_entity(entity: &Entity, transaction: &rusqlite::Transaction) -> Result<(), FailedTo> { let entity_id = [&entity.id]; let entity_values = (&entity.id, &entity.class, entity.ref_date); @@ -64,9 +72,13 @@ pub fn run(path: &path::Path, catalog: &Catalog) -> result::Result<(), FailedTo> for entity in catalog .items .values() - .filter(|item| item.state == EntityState::New) + .filter(|item| item.state == EntityState::New || item.state == EntityState::ToDelete) { - write_entity(entity, &transaction)?; + match entity.state { + EntityState::New => write_entity(entity, &transaction)?, + EntityState::ToDelete => delete_entity(entity, &transaction)?, + _ => unreachable!(), + } } transaction .commit() diff --git a/01.workspace/heave/src/str/catalog.rs b/01.workspace/heave/src/str/catalog.rs index 51b030f..fb7d215 100644 --- a/01.workspace/heave/src/str/catalog.rs +++ b/01.workspace/heave/src/str/catalog.rs @@ -138,6 +138,13 @@ impl O { .map(|item| T::from(item.clone())) } + pub fn delete(&mut self, id: &str) { + let entity = self.items.get_mut(id); + if let Some(entity) = entity { + entity.state = EntityState::ToDelete; + } + } + /// Persists the current state of the catalog to the database. pub fn persist(&self) -> result::Result<(), FailedTo> { let path = path::Path::new(&self.path); diff --git a/01.workspace/heave/src/str/entity_state.rs b/01.workspace/heave/src/str/entity_state.rs index b6bc835..f620dfd 100644 --- a/01.workspace/heave/src/str/entity_state.rs +++ b/01.workspace/heave/src/str/entity_state.rs @@ -4,4 +4,5 @@ pub enum E { New, Unknown, Loaded, + ToDelete, }