Skip to main content

a3s_orm/query/
table_lock.rs

1use std::marker::PhantomData;
2
3use crate::ast::{QueryNode, TableLockNode, TableNode};
4use crate::schema::Table;
5
6use super::Query;
7
8#[derive(Clone, Copy, Debug, PartialEq, Eq)]
9pub enum PostgresTableLockMode {
10    AccessShare,
11    RowShare,
12    RowExclusive,
13    ShareUpdateExclusive,
14    Share,
15    ShareRowExclusive,
16    Exclusive,
17    AccessExclusive,
18}
19
20#[derive(Clone, Debug)]
21pub struct TableLockQuery<T: Table> {
22    node: TableLockNode,
23    marker: PhantomData<fn() -> T>,
24}
25
26pub fn lock_table<T: Table>(mode: PostgresTableLockMode) -> TableLockQuery<T> {
27    TableLockQuery {
28        node: TableLockNode {
29            table: TableNode {
30                name: T::NAME,
31                alias: None,
32            },
33            mode,
34            no_wait: false,
35        },
36        marker: PhantomData,
37    }
38}
39
40impl<T: Table> TableLockQuery<T> {
41    /// Fail instead of waiting for a conflicting table lock.
42    pub fn no_wait(mut self) -> Self {
43        self.node.no_wait = true;
44        self
45    }
46}
47
48impl<T: Table> Query for TableLockQuery<T> {
49    type Output = ();
50
51    fn compile(self, dialect: &impl crate::Dialect) -> crate::Result<crate::CompiledQuery> {
52        crate::compiler::compile(QueryNode::TableLock(self.node), dialect)
53    }
54}