artis 0.2.13

Artis is a SQL library
Documentation
use std::sync::Arc;

use rbatis::{rbatis, RBatis};

use crate::{Artis, ArtisExecutor, BoxFuture, ExecResult, Result, Value};

#[derive(Debug)]
pub struct InnerRBatis {
    rb: Arc<RBatis>,
}

impl From<Arc<RBatis>> for Artis {
    fn from(value: Arc<RBatis>) -> Self {
        let rb = Box::new(InnerRBatis { rb: value });
        (rb as Box<dyn ArtisExecutor>).into()
    }
}

impl From<RBatis> for crate::Artis {
    fn from(value: RBatis) -> Self {
        Arc::new(value).into()
    }
}

impl ArtisExecutor for InnerRBatis {
    fn query(&self, raw: String, args: crate::types::Args) -> BoxFuture<'_, Result<Value>> {
        Box::pin(async move {
            #[cfg(feature = "log")]
            let elapsed = crate::unix::Elapsed::default();
            let rst = self.rb.query(&raw, args).await?;
            #[cfg(feature = "log")]
            elapsed.finish(&format!("{}", raw))?;
            Ok(rst)
        })
    }

    fn exec(&self, raw: String, args: crate::types::Args) -> BoxFuture<'_, Result<ExecResult>> {
        Box::pin(async move {
            #[cfg(feature = "log")]
            let elapsed = crate::unix::Elapsed::default();
            let rst = self.rb.exec(&raw, args).await?;
            #[cfg(feature = "log")]
            elapsed.finish(&format!("{}", raw))?;
            Ok(ExecResult {
                rows_affected: rst.rows_affected,
                last_insert_id: rst.last_insert_id,
            })
        })
    }

    fn begin(&self) -> BoxFuture<'_, Result<crate::ArtisTx>> {
        Box::pin(async move { Ok(self.rb.acquire_begin().await?.into()) })
    }
}