diff options
Diffstat (limited to 'src/repo/sequence.rs')
| -rw-r--r-- | src/repo/sequence.rs | 52 |
1 files changed, 37 insertions, 15 deletions
diff --git a/src/repo/sequence.rs b/src/repo/sequence.rs index 8fe9dab..c47b41c 100644 --- a/src/repo/sequence.rs +++ b/src/repo/sequence.rs @@ -1,3 +1,5 @@ +use std::fmt; + use sqlx::{sqlite::Sqlite, SqliteConnection, Transaction}; pub trait Provider { @@ -10,6 +12,37 @@ impl<'c> Provider for Transaction<'c, Sqlite> { } } +pub struct Sequences<'t>(&'t mut SqliteConnection); + +impl<'c> Sequences<'c> { + pub async fn next(&mut self) -> Result<Sequence, sqlx::Error> { + let next = sqlx::query_scalar!( + r#" + update event_sequence + set last_value = last_value + 1 + returning last_value as "next_value: Sequence" + "#, + ) + .fetch_one(&mut *self.0) + .await?; + + Ok(next) + } + + pub async fn current(&mut self) -> Result<Sequence, sqlx::Error> { + let next = sqlx::query_scalar!( + r#" + select last_value as "last_value: Sequence" + from event_sequence + "#, + ) + .fetch_one(&mut *self.0) + .await?; + + Ok(next) + } +} + #[derive( Clone, Copy, @@ -26,20 +59,9 @@ impl<'c> Provider for Transaction<'c, Sqlite> { #[sqlx(transparent)] pub struct Sequence(i64); -pub struct Sequences<'t>(&'t mut SqliteConnection); - -impl<'c> Sequences<'c> { - pub async fn next(&mut self) -> Result<Sequence, sqlx::Error> { - let next = sqlx::query_scalar!( - r#" - update event_sequence - set last_value = last_value + 1 - returning last_value as "next_value: Sequence" - "#, - ) - .fetch_one(&mut *self.0) - .await?; - - Ok(next) +impl fmt::Display for Sequence { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let Self(value) = self; + value.fmt(f) } } |
