Merge pull request #1856 from felfert/fix-mariadb-compat
Some checks failed
Glean probe-scraper / glean-probe-scraper (push) Has been cancelled

fix: mariadb compatibility
This commit is contained in:
Philip Jenvey 2025-11-05 11:17:34 -08:00 committed by GitHub
commit bf4ba77bdc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 35 additions and 1 deletions

View File

@ -3,11 +3,44 @@ use std::{fmt::Debug, marker::PhantomData};
use diesel::{
backend::Backend,
insertable::CanInsertInSingleQuery,
mysql::Mysql,
query_builder::{AstPass, InsertStatement, QueryFragment, QueryId},
query_dsl::methods::LockingDsl,
result::QueryResult,
Expression, QuerySource, RunQueryDsl,
};
/// Emit MySQL <= 5.7's `LOCK IN SHARE MODE`
///
/// MySQL 8 supports `FOR SHARE` as an alias (which diesel natively supports)
/// This is required for MariaDB which does not provide that alias.
pub trait LockInShareModeDsl {
type Output;
fn lock_in_share_mode(self) -> Self::Output;
}
impl<T> LockInShareModeDsl for T
where
T: LockingDsl<LockInShareMode>,
{
type Output = <T as LockingDsl<LockInShareMode>>::Output;
fn lock_in_share_mode(self) -> Self::Output {
self.with_lock(LockInShareMode)
}
}
#[derive(Debug, Clone, Copy, QueryId)]
pub struct LockInShareMode;
impl QueryFragment<Mysql> for LockInShareMode {
fn walk_ast<'b>(&'b self, mut out: AstPass<'_, 'b, Mysql>) -> QueryResult<()> {
out.push_sql(" LOCK IN SHARE MODE");
Ok(())
}
}
#[allow(dead_code)] // Not really dead, Rust can't see it.
#[derive(Debug, Clone)]
pub struct OnDuplicateKeyUpdate<T, U, Op, Ret, DB, X>(

View File

@ -19,6 +19,7 @@ use syncstorage_settings::{Quota, DEFAULT_MAX_TOTAL_RECORDS};
use super::{
batch,
diesel_ext::LockInShareModeDsl,
pool::{CollectionCache, Conn},
schema::{bso, collections, user_collections},
DbError, DbResult,
@ -133,7 +134,7 @@ impl MysqlDb {
.select(user_collections::modified)
.filter(user_collections::user_id.eq(user_id))
.filter(user_collections::collection_id.eq(collection_id))
.for_share()
.lock_in_share_mode()
.first(&mut self.conn)
.await
.optional()?;