From 08c3a6e77a3f61ffc9643a5e1f840df9078d0b36 Mon Sep 17 00:00:00 2001 From: Owen Jacobson Date: Fri, 27 Sep 2024 21:25:15 -0400 Subject: Assign sequence numbers from a counter, not by scanning messages --- src/events/repo/message.rs | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) (limited to 'src') 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 { - 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 { - let current = sqlx::query_scalar!( + async fn assign_sequence(&mut self, channel: &channel::Id) -> Result { + 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> { -- cgit v1.2.3