diff options
| author | Owen Jacobson <owen@grimoire.ca> | 2024-10-02 01:10:09 -0400 |
|---|---|---|
| committer | Owen Jacobson <owen@grimoire.ca> | 2024-10-02 01:10:09 -0400 |
| commit | 6f07e6869bbf62903ac83c9bc061e7bde997e6a8 (patch) | |
| tree | 75fa34f83ccf207db83d3d0a34ff9963927fadf8 /src/event/repo | |
| parent | 5d3392799f88c5a3d3f9c656c73d6e8ac5c4d793 (diff) | |
Retire top-level `repo`.
This helped me discover an organizational scheme I like more.
Diffstat (limited to 'src/event/repo')
| -rw-r--r-- | src/event/repo/mod.rs | 3 | ||||
| -rw-r--r-- | src/event/repo/sequence.rs | 44 |
2 files changed, 47 insertions, 0 deletions
diff --git a/src/event/repo/mod.rs b/src/event/repo/mod.rs index e216a50..cee840c 100644 --- a/src/event/repo/mod.rs +++ b/src/event/repo/mod.rs @@ -1 +1,4 @@ pub mod message; +mod sequence; + +pub use self::sequence::Provider; diff --git a/src/event/repo/sequence.rs b/src/event/repo/sequence.rs new file mode 100644 index 0000000..c985869 --- /dev/null +++ b/src/event/repo/sequence.rs @@ -0,0 +1,44 @@ +use sqlx::{sqlite::Sqlite, SqliteConnection, Transaction}; + +use crate::event::Sequence; + +pub trait Provider { + fn sequence(&mut self) -> Sequences; +} + +impl<'c> Provider for Transaction<'c, Sqlite> { + fn sequence(&mut self) -> Sequences { + Sequences(self) + } +} + +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) + } +} |
