@@ -73,6 +73,7 @@ pub fn database_attr(attr: TokenStream, input: TokenStream) -> Result<TokenStrea
73
73
let databases = quote_spanned ! ( span => :: rocket_contrib:: databases) ;
74
74
let Poolable = quote_spanned ! ( span => #databases:: Poolable ) ;
75
75
let r2d2 = quote_spanned ! ( span => #databases:: r2d2) ;
76
+ let tokio_executor = quote_spanned ! ( span => #databases:: tokio_executor) ;
76
77
let request = quote ! ( :: rocket:: request) ;
77
78
78
79
let generated_types = quote_spanned ! { span =>
@@ -140,17 +141,21 @@ pub fn database_attr(attr: TokenStream, input: TokenStream) -> Result<TokenStrea
140
141
}
141
142
}
142
143
143
- impl <' a, ' r> #request:: FromRequest <' a, ' r> for #guard_type {
144
+ impl <' a, ' r> #request:: FromRequestAsync <' a, ' r> for #guard_type {
144
145
type Error = ( ) ;
145
146
146
- fn from_request( request: & ' a #request:: Request <' r>) -> #request:: Outcome < Self , ( ) > {
147
+ fn from_request< ' fut> ( request: & ' a #request:: Request <' r>) -> #request:: FromRequestFuture < ' fut , Self , Self :: Error > where ' a : ' fut {
147
148
use :: rocket:: { Outcome , http:: Status } ;
148
- let pool = :: rocket:: try_outcome!( request. guard:: <:: rocket:: State <#pool_type>>( ) ) ;
149
-
150
- match pool. 0 . get( ) {
151
- Ok ( conn) => Outcome :: Success ( #guard_type( conn) ) ,
152
- Err ( _) => Outcome :: Failure ( ( Status :: ServiceUnavailable , ( ) ) ) ,
153
- }
149
+ Box :: pin( async move {
150
+ let pool = :: rocket:: try_outcome!( request. guard:: <:: rocket:: State <' _, #pool_type>>( ) ) . 0 . clone( ) ;
151
+
152
+ #tokio_executor:: blocking:: run( move || {
153
+ match pool. get( ) {
154
+ Ok ( conn) => Outcome :: Success ( #guard_type( conn) ) ,
155
+ Err ( _) => Outcome :: Failure ( ( Status :: ServiceUnavailable , ( ) ) ) ,
156
+ }
157
+ } ) . await
158
+ } )
154
159
}
155
160
}
156
161
} . into ( ) )
0 commit comments