@@ -25,16 +25,10 @@ use futures_util::{pin_mut, TryStreamExt};
25
25
use std:: { borrow:: Cow , sync:: Arc } ;
26
26
27
27
impl MySqlConnection {
28
- async fn get_or_prepare < ' c > (
28
+ async fn prepare_statement < ' c > (
29
29
& mut self ,
30
30
sql : & str ,
31
- persistent : bool ,
32
31
) -> Result < ( u32 , MySqlStatementMetadata ) , Error > {
33
- if let Some ( statement) = self . cache_statement . get_mut ( sql) {
34
- // <MySqlStatementMetadata> is internally reference-counted
35
- return Ok ( ( * statement) . clone ( ) ) ;
36
- }
37
-
38
32
// https://dev.mysql.com/doc/internals/en/com-stmt-prepare.html
39
33
// https://dev.mysql.com/doc/internals/en/com-stmt-prepare-response.html#packet-COM_STMT_PREPARE_OK
40
34
@@ -72,11 +66,23 @@ impl MySqlConnection {
72
66
column_names : Arc :: new ( column_names) ,
73
67
} ;
74
68
75
- if persistent && self . cache_statement . is_enabled ( ) {
76
- // in case of the cache being full, close the least recently used statement
77
- if let Some ( ( id, _) ) = self . cache_statement . insert ( sql, ( id, metadata. clone ( ) ) ) {
78
- self . stream . send_packet ( StmtClose { statement : id } ) . await ?;
79
- }
69
+ Ok ( ( id, metadata) )
70
+ }
71
+
72
+ async fn get_or_prepare_statement < ' c > (
73
+ & mut self ,
74
+ sql : & str ,
75
+ ) -> Result < ( u32 , MySqlStatementMetadata ) , Error > {
76
+ if let Some ( statement) = self . cache_statement . get_mut ( sql) {
77
+ // <MySqlStatementMetadata> is internally reference-counted
78
+ return Ok ( ( * statement) . clone ( ) ) ;
79
+ }
80
+
81
+ let ( id, metadata) = self . prepare_statement ( sql) . await ?;
82
+
83
+ // in case of the cache being full, close the least recently used statement
84
+ if let Some ( ( id, _) ) = self . cache_statement . insert ( sql, ( id, metadata. clone ( ) ) ) {
85
+ self . stream . send_packet ( StmtClose { statement : id } ) . await ?;
80
86
}
81
87
82
88
Ok ( ( id, metadata) )
@@ -102,21 +108,37 @@ impl MySqlConnection {
102
108
let mut columns = Arc :: new( Vec :: new( ) ) ;
103
109
104
110
let ( mut column_names, format, mut needs_metadata) = if let Some ( arguments) = arguments {
105
- let ( id, metadata) = self . get_or_prepare(
106
- sql,
107
- persistent,
108
- )
109
- . await ?;
110
-
111
- // https://dev.mysql.com/doc/internals/en/com-stmt-execute.html
112
- self . stream
113
- . send_packet( StatementExecute {
114
- statement: id,
115
- arguments: & arguments,
116
- } )
117
- . await ?;
118
-
119
- ( metadata. column_names, MySqlValueFormat :: Binary , false )
111
+ if persistent && self . cache_statement. is_enabled( ) {
112
+ let ( id, metadata) = self
113
+ . get_or_prepare_statement( sql)
114
+ . await ?;
115
+
116
+ // https://dev.mysql.com/doc/internals/en/com-stmt-execute.html
117
+ self . stream
118
+ . send_packet( StatementExecute {
119
+ statement: id,
120
+ arguments: & arguments,
121
+ } )
122
+ . await ?;
123
+
124
+ ( metadata. column_names, MySqlValueFormat :: Binary , false )
125
+ } else {
126
+ let ( id, metadata) = self
127
+ . prepare_statement( sql)
128
+ . await ?;
129
+
130
+ // https://dev.mysql.com/doc/internals/en/com-stmt-execute.html
131
+ self . stream
132
+ . send_packet( StatementExecute {
133
+ statement: id,
134
+ arguments: & arguments,
135
+ } )
136
+ . await ?;
137
+
138
+ self . stream. send_packet( StmtClose { statement: id } ) . await ?;
139
+
140
+ ( metadata. column_names, MySqlValueFormat :: Binary , false )
141
+ }
120
142
} else {
121
143
// https://dev.mysql.com/doc/internals/en/com-query.html
122
144
self . stream. send_packet( Query ( sql) ) . await ?;
@@ -269,7 +291,15 @@ impl<'c> Executor<'c> for &'c mut MySqlConnection {
269
291
Box :: pin ( async move {
270
292
self . stream . wait_until_ready ( ) . await ?;
271
293
272
- let ( _, metadata) = self . get_or_prepare ( sql, true ) . await ?;
294
+ let metadata = if self . cache_statement . is_enabled ( ) {
295
+ self . get_or_prepare_statement ( sql) . await ?. 1
296
+ } else {
297
+ let ( id, metadata) = self . prepare_statement ( sql) . await ?;
298
+
299
+ self . stream . send_packet ( StmtClose { statement : id } ) . await ?;
300
+
301
+ metadata
302
+ } ;
273
303
274
304
Ok ( MySqlStatement {
275
305
sql : Cow :: Borrowed ( sql) ,
@@ -287,7 +317,9 @@ impl<'c> Executor<'c> for &'c mut MySqlConnection {
287
317
Box :: pin ( async move {
288
318
self . stream . wait_until_ready ( ) . await ?;
289
319
290
- let ( _, metadata) = self . get_or_prepare ( sql, false ) . await ?;
320
+ let ( id, metadata) = self . prepare_statement ( sql) . await ?;
321
+
322
+ self . stream . send_packet ( StmtClose { statement : id } ) . await ?;
291
323
292
324
let columns = ( & * metadata. columns ) . clone ( ) ;
293
325
0 commit comments