use crate::drivers::{Driver, DriverMutConnectionDeref};
use crate::pool::{ConnectionAdapter, ConnectionPool, PooledConnection};
use crate::{ReadTransaction, Transaction};
use std::ops::{Deref, DerefMut};
pub type SyncConnectionPool<T> = ConnectionPool<T, SyncConnectionAdapter<T>>;
pub type SyncPooledConnection<T> = PooledConnection<T, SyncConnectionAdapter<T>>;
pub struct SyncConnectionAdapter<T: Driver>(T::Connection);
impl<T: Driver> ConnectionAdapter<T> for SyncConnectionAdapter<T> {
fn from_driver_connection(connection: T::Connection) -> Self {
Self(connection)
}
}
impl<T: Driver> PooledConnection<T, SyncConnectionAdapter<T>> {
pub fn read_transaction_closure<F, R, E>(&mut self, closure: F) -> Result<R, E>
where
F: FnOnce(&mut ReadTransaction<'_, T>) -> Result<R, E>,
E: From<T::Error>,
{
ReadTransaction::scoped(&mut self.connection_mut().0, closure)
}
pub fn transaction_closure<F, R, E>(&mut self, closure: F) -> Result<R, E>
where
F: FnOnce(&mut Transaction<'_, T>) -> Result<R, E>,
E: From<T::Error>,
{
self.pool.transaction_closure(closure)
}
pub fn transaction(&mut self) -> Result<Transaction<'_, T>, T::Error> {
self.pool.transaction()
}
pub fn read_transaction(&mut self) -> Result<ReadTransaction<'_, T>, T::Error> {
ReadTransaction::new(&mut self.connection_mut().0)
}
}
impl<T: Driver> Deref for PooledConnection<T, SyncConnectionAdapter<T>> {
type Target = T::Connection;
fn deref(&self) -> &Self::Target {
&self.connection().0
}
}
impl<T: DriverMutConnectionDeref> DerefMut for PooledConnection<T, SyncConnectionAdapter<T>> {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.connection_mut().0
}
}