From 767f00ae367ab0485514de7fafb73b0207b08504 Mon Sep 17 00:00:00 2001 From: davidemazzocchi Date: Thu, 2 Oct 2025 20:08:21 +0200 Subject: [PATCH] feat: ensure entity and attributes are read in a single transaction --- 01.workspace/heave/src/fun/sqlite_load_attributes.rs | 4 ++-- 01.workspace/heave/src/fun/sqlite_load_by_class.rs | 8 +++++--- 01.workspace/heave/src/fun/sqlite_load_by_id.rs | 8 +++++--- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/01.workspace/heave/src/fun/sqlite_load_attributes.rs b/01.workspace/heave/src/fun/sqlite_load_attributes.rs index a01d7bf..c2b142d 100644 --- a/01.workspace/heave/src/fun/sqlite_load_attributes.rs +++ b/01.workspace/heave/src/fun/sqlite_load_attributes.rs @@ -6,8 +6,8 @@ const SELECT_ATTRIBUTE_BY_FK: &str = r#" WHERE entity_id = ?1; "#; -pub fn run(connection: &Connection, entity: &mut Entity) { - let mut select_attributes_statement = connection.prepare(SELECT_ATTRIBUTE_BY_FK).unwrap(); +pub fn run(transaction: &Transaction, entity: &mut Entity) { + let mut select_attributes_statement = transaction.prepare(SELECT_ATTRIBUTE_BY_FK).unwrap(); let attributes = select_attributes_statement .query_map([&entity.id], sqlite::map::row_to_attribute) .unwrap(); diff --git a/01.workspace/heave/src/fun/sqlite_load_by_class.rs b/01.workspace/heave/src/fun/sqlite_load_by_class.rs index 5a9d4ff..ee85417 100644 --- a/01.workspace/heave/src/fun/sqlite_load_by_class.rs +++ b/01.workspace/heave/src/fun/sqlite_load_by_class.rs @@ -8,14 +8,16 @@ const SELECT_ENTITY_BY_CLASS: &str = r#" pub fn run(path: &path::Path, entity_class: &str) -> Vec { let mut entities = Vec::::new(); - let connection = Connection::open(path).unwrap(); - let mut statement = connection.prepare(SELECT_ENTITY_BY_CLASS).unwrap(); + let mut connection = Connection::open(path).unwrap(); + let mut transaction = connection.transaction().unwrap(); + transaction.set_drop_behavior(DropBehavior::Commit); + let mut statement = transaction.prepare(SELECT_ENTITY_BY_CLASS).unwrap(); let result = statement .query_map([entity_class], sqlite::map::row_to_entity) .unwrap(); for entity in result { let mut entity = entity.unwrap(); - sqlite::load::attributes(&connection, &mut entity); + sqlite::load::attributes(&transaction, &mut entity); entity.state = EntityState::Loaded; entities.push(entity); } diff --git a/01.workspace/heave/src/fun/sqlite_load_by_id.rs b/01.workspace/heave/src/fun/sqlite_load_by_id.rs index 17fb1a1..416b6b9 100644 --- a/01.workspace/heave/src/fun/sqlite_load_by_id.rs +++ b/01.workspace/heave/src/fun/sqlite_load_by_id.rs @@ -7,13 +7,15 @@ const SELECT_ENTITY_BY_ID: &str = r#" "#; pub fn run(path: &path::Path, entity_id: &str) -> Option { - let connection = Connection::open(path).unwrap(); - let result = connection + let mut connection = Connection::open(path).unwrap(); + let mut transaction = connection.transaction().unwrap(); + transaction.set_drop_behavior(DropBehavior::Commit); + let result = transaction .query_one(SELECT_ENTITY_BY_ID, [entity_id], sqlite::map::row_to_entity) .optional(); let mut entity = result.unwrap(); if let Some(ref mut entity) = entity { - sqlite::load::attributes(&connection, entity); + sqlite::load::attributes(&transaction, entity); entity.state = EntityState::Loaded; } entity