summaryrefslogtreecommitdiff
path: root/src/event
diff options
context:
space:
mode:
Diffstat (limited to 'src/event')
-rw-r--r--src/event/app.rs6
-rw-r--r--src/event/repo/mod.rs3
-rw-r--r--src/event/repo/sequence.rs44
3 files changed, 50 insertions, 3 deletions
diff --git a/src/event/app.rs b/src/event/app.rs
index b5f2ecc..3d35f1a 100644
--- a/src/event/app.rs
+++ b/src/event/app.rs
@@ -12,11 +12,11 @@ use super::{
types::{self, ChannelEvent},
};
use crate::{
- channel,
+ channel::{self, repo::Provider as _},
clock::DateTime,
- event::Sequence,
+ db::NotFound as _,
+ event::{repo::Provider as _, Sequence},
login::Login,
- repo::{channel::Provider as _, error::NotFound as _, sequence::Provider as _},
};
pub struct Events<'a> {
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)
+ }
+}