@@ -106,6 +106,10 @@ pub fn prepare(
106
106
}
107
107
}
108
108
109
+ fn prepare_rec ( client : Arc < InnerClient > , query : & str , types : & [ Type ] ) -> Pin < Box < dyn Future < Output = Result < Statement , Error > > + ' static + Send > > {
110
+ Box :: pin ( prepare ( client, query, types) )
111
+ }
112
+
109
113
fn encode ( name : & str , query : & str , types : & [ Type ] ) -> Result < Vec < u8 > , Error > {
110
114
let mut buf = vec ! [ ] ;
111
115
frontend:: parse ( name, query, types. iter ( ) . map ( Type :: oid) , & mut buf) . map_err ( Error :: encode) ?;
@@ -182,10 +186,10 @@ async fn typeinfo_statement(client: &Arc<InnerClient>) -> Result<Statement, Erro
182
186
return Ok ( stmt) ;
183
187
}
184
188
185
- let stmt = match Box :: pin ( prepare ( client. clone ( ) , TYPEINFO_QUERY , & [ ] ) ) . await {
189
+ let stmt = match prepare_rec ( client. clone ( ) , TYPEINFO_QUERY , & [ ] ) . await {
186
190
Ok ( stmt) => stmt,
187
191
Err ( ref e) if e. code ( ) == Some ( & SqlState :: UNDEFINED_TABLE ) => {
188
- Box :: pin ( prepare ( client. clone ( ) , TYPEINFO_FALLBACK_QUERY , & [ ] ) ) . await ?
192
+ prepare_rec ( client. clone ( ) , TYPEINFO_FALLBACK_QUERY , & [ ] ) . await ?
189
193
}
190
194
Err ( e) => return Err ( e) ,
191
195
} ;
@@ -209,10 +213,10 @@ async fn typeinfo_enum_statement(client: &Arc<InnerClient>) -> Result<Statement,
209
213
return Ok ( stmt) ;
210
214
}
211
215
212
- let stmt = match Box :: pin ( prepare ( client. clone ( ) , TYPEINFO_ENUM_QUERY , & [ ] ) ) . await {
216
+ let stmt = match prepare_rec ( client. clone ( ) , TYPEINFO_ENUM_QUERY , & [ ] ) . await {
213
217
Ok ( stmt) => stmt,
214
218
Err ( ref e) if e. code ( ) == Some ( & SqlState :: UNDEFINED_COLUMN ) => {
215
- Box :: pin ( prepare ( client. clone ( ) , TYPEINFO_ENUM_FALLBACK_QUERY , & [ ] ) ) . await ?
219
+ prepare_rec ( client. clone ( ) , TYPEINFO_ENUM_FALLBACK_QUERY , & [ ] ) . await ?
216
220
}
217
221
Err ( e) => return Err ( e) ,
218
222
} ;
@@ -233,7 +237,7 @@ async fn get_composite_fields(client: &Arc<InnerClient>, oid: Oid) -> Result<Vec
233
237
for row in rows {
234
238
let name = row. try_get ( 0 ) ?;
235
239
let oid = row. try_get ( 1 ) ?;
236
- let type_ = Box :: pin ( get_type ( client, oid) ) . await ?;
240
+ let type_ = get_type_rec ( client, oid) . await ?;
237
241
fields. push ( Field :: new ( name, type_) ) ;
238
242
}
239
243
@@ -245,7 +249,7 @@ async fn typeinfo_composite_statement(client: &Arc<InnerClient>) -> Result<State
245
249
return Ok ( stmt) ;
246
250
}
247
251
248
- let stmt = Box :: pin ( prepare ( client. clone ( ) , TYPEINFO_COMPOSITE_QUERY , & [ ] ) ) . await ?;
252
+ let stmt = prepare_rec ( client. clone ( ) , TYPEINFO_COMPOSITE_QUERY , & [ ] ) . await ?;
249
253
250
254
client. set_typeinfo_composite ( & stmt) ;
251
255
Ok ( stmt)
0 commit comments