a3s_orm/query/
table_lock.rs1use 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 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}