use std::ops::{Deref, DerefMut};
use std::sync::Arc;
use crossbeam_channel::Sender;
use tokio::sync::Notify;
use super::connection::OdbcConn;
pub struct PooledConn {
pub(crate) conn: Option<OdbcConn>,
pub(crate) return_tx: Sender<OdbcConn>,
pub(crate) notify: Arc<Notify>,
}
impl PooledConn {
pub(crate) fn new(conn: OdbcConn, return_tx: Sender<OdbcConn>, notify: Arc<Notify>) -> Self {
Self { conn: Some(conn), return_tx, notify }
}
pub(crate) fn take(mut self) -> (OdbcConn, Sender<OdbcConn>, Arc<Notify>) {
(self.conn.take().unwrap(), self.return_tx.clone(), self.notify.clone())
}
}
impl Deref for PooledConn {
type Target = OdbcConn;
fn deref(&self) -> &Self::Target {
self.conn.as_ref().unwrap()
}
}
impl DerefMut for PooledConn {
fn deref_mut(&mut self) -> &mut Self::Target {
self.conn.as_mut().unwrap()
}
}
impl Drop for PooledConn {
fn drop(&mut self) {
if let Some(mut conn) = self.conn.take() {
conn.last_used_at = std::time::Instant::now();
conn.needs_reset = true;
let _ = self.return_tx.send(conn);
self.notify.notify_one();
}
}
}