use async_trait::async_trait;
use ecat_data::{Dialect, RdbmsClient, RdbmsError, SqlExecutor, Transaction, TransactionInner};
use std::time::Duration;
use crate::pool::Pool;
use crate::transaction::{MyTx, PgTx, SqTx};
use crate::{SqlxClient, db_err, mysql_replica_status_sql, parse_mysql_replica_lag};
#[async_trait]
impl RdbmsClient for SqlxClient {
async fn transaction(&self) -> Result<Transaction, RdbmsError> {
let dialect = self.pool.dialect();
let query_timeout = self.query_timeout;
let inner: Box<dyn TransactionInner> = match &self.pool {
Pool::Pg(p) => Box::new(PgTx {
inner: Some(p.begin().await.map_err(db_err)?),
dialect,
query_timeout,
}),
Pool::My(p) => Box::new(MyTx {
inner: Some(p.begin().await.map_err(db_err)?),
dialect,
query_timeout,
}),
Pool::Sq(p) => Box::new(SqTx {
inner: Some(p.begin().await.map_err(db_err)?),
dialect,
query_timeout,
}),
};
Ok(Transaction::with_inner(inner))
}
async fn replica_lag(&self) -> Option<Duration> {
if self.pool.dialect() != Dialect::MySql {
return None;
}
let version = self.mysql_version().await?;
let rows = self.query(mysql_replica_status_sql(&version)).await.ok()?;
parse_mysql_replica_lag(&rows)
}
fn pool_size(&self) -> Option<u32> {
Some(self.pool.max_connections())
}
}