summaryrefslogtreecommitdiff
path: root/src/events/repo/message.rs
diff options
context:
space:
mode:
authorOwen Jacobson <owen@grimoire.ca>2024-09-27 21:25:15 -0400
committerOwen Jacobson <owen@grimoire.ca>2024-09-28 01:00:12 -0400
commit08c3a6e77a3f61ffc9643a5e1f840df9078d0b36 (patch)
tree9a5a373cdac46bc08524e0a173bceb15a70d2fba /src/events/repo/message.rs
parentc7720ffd94da86782df062d84f88b2687d317384 (diff)
Assign sequence numbers from a counter, not by scanning messages
Diffstat (limited to 'src/events/repo/message.rs')
-rw-r--r--src/events/repo/message.rs20
1 files changed, 10 insertions, 10 deletions
diff --git a/src/events/repo/message.rs b/src/events/repo/message.rs
index ec17d55..f6fce0e 100644
--- a/src/events/repo/message.rs
+++ b/src/events/repo/message.rs
@@ -4,7 +4,7 @@ use crate::{
clock::DateTime,
events::types::{self, Sequence},
repo::{
- channel::Channel,
+ channel::{self, Channel},
login::{self, Login},
message,
},
@@ -30,7 +30,7 @@ impl<'c> Events<'c> {
body: &str,
sent_at: &DateTime,
) -> Result<types::ChannelEvent, sqlx::Error> {
- let sequence = self.next_sequence_for(channel).await?;
+ let sequence = self.assign_sequence(&channel.id).await?;
let id = message::Id::generate();
@@ -72,20 +72,20 @@ impl<'c> Events<'c> {
Ok(message)
}
- async fn next_sequence_for(&mut self, channel: &Channel) -> Result<Sequence, sqlx::Error> {
- let current = sqlx::query_scalar!(
+ async fn assign_sequence(&mut self, channel: &channel::Id) -> Result<Sequence, sqlx::Error> {
+ let next = sqlx::query_scalar!(
r#"
- -- `max` never returns null, but sqlx can't detect that
- select max(sequence) as "sequence!: Sequence"
- from message
- where channel = $1
+ update channel
+ set last_sequence = last_sequence + 1
+ where id = $1
+ returning last_sequence as "next_sequence: Sequence"
"#,
- channel.id,
+ channel,
)
.fetch_one(&mut *self.0)
.await?;
- Ok(current.next())
+ Ok(next)
}
pub async fn expire(&mut self, expire_at: &DateTime) -> Result<(), sqlx::Error> {