From 90fe013a4117ca59a99319ccf5d9b62013f8814c Mon Sep 17 00:00:00 2001 From: Dzejkop Date: Tue, 15 Oct 2024 15:42:59 +0200 Subject: [PATCH] transactions --- src/database/methods.rs | 79 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 75 insertions(+), 4 deletions(-) diff --git a/src/database/methods.rs b/src/database/methods.rs index 9469f1248..132c164cf 100644 --- a/src/database/methods.rs +++ b/src/database/methods.rs @@ -68,15 +68,83 @@ pub trait DbMethods<'c>: Acquire<'c, Database = Postgres> + Sized { Ok(Some(root_id as usize)) } + async fn mark_root_as_processed(self, root: &Hash) -> Result<(), Error> { + let mut conn = self.acquire().await?; + + let root_id = conn.get_id_by_root(root).await?; + + let Some(root_id) = root_id else { + return Err(Error::MissingRoot { root: *root }); + }; + + let root_id = root_id as i64; + + sqlx::query( + r#" + UPDATE identities + SET status = $2, mined_at = CURRENT_TIMESTAMP + WHERE id <= $1 + AND status <> $2 + AND status <> $3; + "#, + ) + .bind(root_id) + .bind(<&str>::from(ProcessedStatus::Processed)) + .bind(<&str>::from(ProcessedStatus::Mined)) + .execute(&mut *conn) + .await?; + + sqlx::query( + r#" + UPDATE identities + SET status = $2, mined_at = NULL + WHERE id > $1 + "#, + ) + .bind(root_id) + .bind(<&str>::from(ProcessedStatus::Pending)) + .execute(&mut *conn) + .await?; + + Ok(()) + } + + async fn mark_root_as_mined(self, root: &Hash) -> Result<(), Error> { + let mut conn = self.acquire().await?; + + let root_id = conn.get_id_by_root(root).await?; + + let Some(root_id) = root_id else { + return Err(Error::MissingRoot { root: *root }); + }; + + let root_id = root_id as i64; + + sqlx::query( + r#" + UPDATE identities + SET status = $2 + WHERE id <= $1 + AND status <> $2 + "#, + ) + .bind(root_id) + .bind(<&str>::from(ProcessedStatus::Mined)) + .execute(&mut *conn) + .await?; + + Ok(()) + } + async fn mark_all_as_pending(self) -> Result<(), Error> { let mut conn = self.acquire().await?; sqlx::query( r#" - UPDATE identities - SET status = $1, mined_at = NULL - WHERE status <> $1 - "#, + UPDATE identities + SET status = $1, mined_at = NULL + WHERE status <> $1 + "#, ) .bind(<&str>::from(ProcessedStatus::Pending)) .execute(&mut *conn) @@ -884,3 +952,6 @@ pub trait DbMethods<'c>: Acquire<'c, Database = Postgres> + Sized { Ok(()) } } + +// Blanket implementation for all types that satisfy the trait bounds +impl<'c, T> DbMethods<'c> for T where T: Acquire<'c, Database = Postgres> + Send + Sync + Sized {}