use std::ops::DerefMut; use futures_core::{future::BoxFuture, stream::BoxStream}; use futures_util::StreamExt; use crate::{ connection::{Connect, Connection}, describe::Describe, executor::{Executor, RefExecutor}, pool::Pool, Cursor, Database, }; use super::PoolConnection; use crate::database::HasCursor; use crate::executor::Execute; impl<'p, C, DB> Executor for &'p Pool where C: Connect, DB: Database, DB: for<'c, 'q> HasCursor<'c, 'q, Database = DB>, { type Database = DB; fn execute<'e, 'q, E: 'e>(&'e mut self, query: E) -> BoxFuture<'e, crate::Result> where E: Execute<'q, Self::Database>, { Box::pin(async move { self.acquire().await?.execute(query).await }) } fn fetch<'e, 'q, E>(&'e mut self, query: E) -> >::Cursor where E: Execute<'q, DB>, { DB::Cursor::from_pool(self, query) } fn describe<'e, 'q, E: 'e>( &'e mut self, query: E, ) -> BoxFuture<'e, crate::Result>> where E: Execute<'q, Self::Database>, { Box::pin(async move { self.acquire().await?.describe(query).await }) } } impl<'p, C, DB> RefExecutor<'p> for &'p Pool where C: Connect, DB: Database, DB: for<'c, 'q> HasCursor<'c, 'q>, for<'c> &'c mut C: RefExecutor<'c>, { type Database = DB; fn fetch_by_ref<'q, E>(self, query: E) -> >::Cursor where E: Execute<'q, DB>, { DB::Cursor::from_pool(self, query) } } impl Executor for PoolConnection where C: Connect, { type Database = C::Database; fn execute<'e, 'q, E: 'e>(&'e mut self, query: E) -> BoxFuture<'e, crate::Result> where E: Execute<'q, Self::Database>, { (**self).execute(query) } fn fetch<'e, 'q, E>(&'e mut self, query: E) -> >::Cursor where E: Execute<'q, Self::Database>, { (**self).fetch(query) } fn describe<'e, 'q, E: 'e>( &'e mut self, query: E, ) -> BoxFuture<'e, crate::Result>> where E: Execute<'q, Self::Database>, { (**self).describe(query) } } impl<'c, C, DB> RefExecutor<'c> for &'c mut PoolConnection where C: Connect, DB: Database, DB: for<'c2, 'q> HasCursor<'c2, 'q, Database = DB>, &'c mut C: RefExecutor<'c, Database = DB>, { type Database = DB; fn fetch_by_ref<'q, E>(self, query: E) -> >::Cursor where E: Execute<'q, Self::Database>, { (**self).fetch(query) } }