predawn_sea_orm/
function.rs

1use std::sync::Arc;
2
3use snafu::OptionExt;
4
5use crate::{
6    error::{Error, NotFoundDataSourceSnafu, NotSetDataSourcesSnafu},
7    DataSources, Transaction, DATA_SOURCES, DEFAULT_DATA_SOURCE,
8};
9
10#[inline(always)]
11pub async fn default_txn() -> Result<Transaction, Error> {
12    current_txn(DEFAULT_DATA_SOURCE).await
13}
14
15pub async fn current_txn(name: &str) -> Result<Transaction, Error> {
16    let txn = data_sources()?
17        .get(name)
18        .context(NotFoundDataSourceSnafu { name })?
19        .current_txn()
20        .await?;
21
22    Ok(txn)
23}
24
25pub async fn create_txn(name: &str) -> Result<Transaction, Error> {
26    let txn = data_sources()?
27        .get(name)
28        .context(NotFoundDataSourceSnafu { name })?
29        .create_txn()
30        .await?;
31
32    Ok(txn)
33}
34
35pub async fn commit(txn: Transaction) -> Result<(), Error> {
36    let data_sources = data_sources()?;
37
38    let source = data_sources
39        .get(&txn.name)
40        .context(NotFoundDataSourceSnafu {
41            name: txn.name.as_ref(),
42        })?;
43
44    source.commit(txn).await
45}
46
47pub async fn rollback(txn: Transaction) -> Result<(), Error> {
48    let data_sources = data_sources()?;
49
50    let source = data_sources
51        .get(&txn.name)
52        .context(NotFoundDataSourceSnafu {
53            name: txn.name.as_ref(),
54        })?;
55
56    source.rollback(txn).await
57}
58
59pub fn data_sources() -> Result<Arc<DataSources>, Error> {
60    DATA_SOURCES
61        .try_with(Arc::clone)
62        .map_err(|_| NotSetDataSourcesSnafu.build())
63}