1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
use futures_core::future::BoxFuture; use super::PoolConnection; use crate::connection::Connect; use crate::cursor::Cursor; use crate::database::{Database, HasCursor}; use crate::describe::Describe; use crate::executor::Execute; use crate::executor::{Executor, RefExecutor}; use crate::pool::Pool; impl<'p, C, DB> Executor for &'p Pool<C> where C: Connect<Database = DB>, DB: Database<Connection = C>, DB: for<'c, 'q> HasCursor<'c, 'q, Database = DB>, { type Database = DB; fn execute<'e, 'q: 'e, 'c: 'e, E: 'e>( &'c mut self, query: E, ) -> BoxFuture<'e, crate::Result<u64>> 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) -> <Self::Database as HasCursor<'_, 'q>>::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<Describe<Self::Database>>> 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<C> where C: Connect<Database = DB>, DB: Database<Connection = C>, 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) -> <Self::Database as HasCursor<'p, 'q>>::Cursor where E: Execute<'q, DB>, { DB::Cursor::from_pool(self, query) } } impl<C> Executor for PoolConnection<C> where C: Connect, { type Database = C::Database; fn execute<'e, 'q: 'e, 'c: 'e, E: 'e>( &'c mut self, query: E, ) -> BoxFuture<'e, crate::Result<u64>> where E: Execute<'q, Self::Database>, { (**self).execute(query) } fn fetch<'e, 'q, E>(&'e mut self, query: E) -> <C::Database as HasCursor<'_, 'q>>::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<Describe<Self::Database>>> where E: Execute<'q, Self::Database>, { (**self).describe(query) } } impl<'c, C, DB> RefExecutor<'c> for &'c mut PoolConnection<C> where C: Connect<Database = DB>, DB: Database<Connection = C>, 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) -> <Self::Database as HasCursor<'c, 'q>>::Cursor where E: Execute<'q, Self::Database>, { (**self).fetch(query) } }