#[cfg(feature = "nightly")]
use crate::syn::TransactionClient;
use crate::syn::{ConnectionClient, PersistencePool};
pub use r2d2::{Pool, PooledConnection};
pub use r2d2_sqlite::rusqlite;
pub use r2d2_sqlite::SqliteConnectionManager as Manager;
pub type InnerConn = PooledConnection<Manager>;
#[cfg(feature = "nightly")]
pub type InnerTrx<'t> = rusqlite::Transaction<'t>;
#[must_use]
pub fn new(pool: &Pool<Manager>) -> Persistence {
Persistence(pool)
}
#[derive(Clone)]
pub struct Persistence<'p>(&'p Pool<Manager>);
impl PersistencePool for Persistence<'_> {
type Conn = Connection;
fn get_connection(&self) -> crate::Result<Self::Conn> {
self.0
.get()
.map_err(|_| crate::Error::GetConnection)
.map(Connection)
}
}
pub struct Connection(InnerConn);
impl ConnectionClient for Connection {
type InnerConn = InnerConn;
#[cfg(feature = "nightly")]
type Trx<'t> = Transaction<'t>;
fn inner(&mut self) -> &mut Self::InnerConn {
&mut self.0
}
#[cfg(feature = "nightly")]
fn start_transaction(&mut self) -> crate::Result<Self::Trx<'_>> {
self.0
.transaction()
.map_err(|_| crate::Error::UpgradeToTransaction)
.map(Transaction)
}
}
#[cfg(feature = "nightly")]
pub struct Transaction<'me>(InnerTrx<'me>);
#[cfg(feature = "nightly")]
impl<'me> ConnectionClient for Transaction<'me> {
type InnerConn = InnerTrx<'me>;
#[cfg(feature = "nightly")]
type Trx<'t> = Transaction<'t>;
fn inner(&mut self) -> &mut Self::InnerConn {
&mut self.0
}
#[cfg(feature = "nightly")]
fn start_transaction(&mut self) -> crate::Result<Self::Trx<'_>> {
Err(crate::Error::UpgradeToNestedTransaction)
}
}
#[cfg(feature = "nightly")]
impl TransactionClient for Transaction<'_> {
fn commit(self) -> crate::Result<()> {
self.0.commit().map_err(|_| crate::Error::CommitTransaction)
}
fn rollback(self) -> crate::Result<()> {
self.0
.rollback()
.map_err(|_| crate::Error::RollbackTransaction)
}
}