@@ -77,35 +77,50 @@ fn connection() -> Connection {
7777 conn
7878}
7979
80- fn insert_users (
80+ fn insert_users < ' a > (
8181 size : usize ,
82- conn : & mut Connection ,
82+ conn : & ' a Connection ,
83+ stmt_handle : & mut Option < rusqlite:: Statement < ' a > > ,
8384 hair_color_init : impl Fn ( usize ) -> Option < String > ,
8485) {
8586 if size == 0 {
8687 return ;
8788 }
89+ let mut params = Vec :: < ( String , Option < String > ) > :: with_capacity ( size) ;
8890
89- let conn = conn. transaction ( ) . unwrap ( ) ;
91+ let stmt = if let Some ( stmt) = stmt_handle {
92+ for x in 0 ..size {
93+ params. push ( ( format ! ( "User {}" , x) , hair_color_init ( x) ) ) ;
94+ }
9095
91- {
92- let mut query = conn
93- . prepare ( "INSERT INTO users (name, hair_color) VALUES (?, ?)" )
94- . unwrap ( ) ;
96+ stmt
97+ } else {
98+ let mut query = String :: from ( "INSERT INTO users (name, hair_color) VALUES" ) ;
9599
96100 for x in 0 ..size {
97- query
98- . execute ( params ! ( format!( "User {}" , x) , hair_color_init( x) ) )
99- . unwrap ( ) ;
101+ if x != 0 {
102+ query += "," ;
103+ }
104+ query += "(?, ?)" ;
105+ params. push ( ( format ! ( "User {}" , x) , hair_color_init ( x) ) ) ;
100106 }
101- }
107+ let query = conn . prepare ( & query ) . unwrap ( ) ;
102108
103- conn. commit ( ) . unwrap ( ) ;
109+ * stmt_handle = Some ( query) ;
110+ stmt_handle. as_mut ( ) . unwrap ( )
111+ } ;
112+
113+ let params: Vec < _ > = params
114+ . iter ( )
115+ . flat_map ( |& ( ref name, ref hair_color) | [ name as & dyn rusqlite:: ToSql , hair_color as _ ] )
116+ . collect ( ) ;
117+ stmt. execute ( & params as & [ _ ] ) . unwrap ( ) ;
104118}
105119
106120pub fn bench_trivial_query_by_id ( b : & mut Bencher , size : usize ) {
107- let mut conn = connection ( ) ;
108- insert_users ( size, & mut conn, |_| None ) ;
121+ let conn = connection ( ) ;
122+ let mut insert_stmt = None ;
123+ insert_users ( size, & conn, & mut insert_stmt, |_| None ) ;
109124
110125 let mut query = conn
111126 . prepare ( "SELECT id, name, hair_color FROM users" )
@@ -120,8 +135,9 @@ pub fn bench_trivial_query_by_id(b: &mut Bencher, size: usize) {
120135}
121136
122137pub fn bench_trivial_query_by_name ( b : & mut Bencher , size : usize ) {
123- let mut conn = connection ( ) ;
124- insert_users ( size, & mut conn, |_| None ) ;
138+ let conn = connection ( ) ;
139+ let mut insert_stmt = None ;
140+ insert_users ( size, & conn, & mut insert_stmt, |_| None ) ;
125141
126142 let mut query = conn
127143 . prepare ( "SELECT id, name, hair_color FROM users" )
@@ -136,8 +152,9 @@ pub fn bench_trivial_query_by_name(b: &mut Bencher, size: usize) {
136152}
137153
138154pub fn bench_medium_complex_query_by_id ( b : & mut Bencher , size : usize ) {
139- let mut conn = connection ( ) ;
140- insert_users ( size, & mut conn, |i| {
155+ let conn = connection ( ) ;
156+ let mut insert_stmt = None ;
157+ insert_users ( size, & conn, & mut insert_stmt, |i| {
141158 Some ( if i % 2 == 0 { "black" } else { "brown" } . into ( ) )
142159 } ) ;
143160
@@ -168,8 +185,9 @@ pub fn bench_medium_complex_query_by_id(b: &mut Bencher, size: usize) {
168185}
169186
170187pub fn bench_medium_complex_query_by_name ( b : & mut Bencher , size : usize ) {
171- let mut conn = connection ( ) ;
172- insert_users ( size, & mut conn, |i| {
188+ let conn = connection ( ) ;
189+ let mut insert_stmt = None ;
190+ insert_users ( size, & conn, & mut insert_stmt, |i| {
173191 Some ( if i % 2 == 0 { "black" } else { "brown" } . into ( ) )
174192 } ) ;
175193
@@ -204,15 +222,20 @@ pub fn bench_medium_complex_query_by_name(b: &mut Bencher, size: usize) {
204222}
205223
206224pub fn bench_insert ( b : & mut Bencher , size : usize ) {
207- let mut conn = connection ( ) ;
225+ let conn = connection ( ) ;
208226
209- b. iter ( || insert_users ( size, & mut conn, |_| Some ( String :: from ( "hair_color" ) ) ) )
227+ let mut insert_stmt = None ;
228+ b. iter ( || {
229+ insert_users ( size, & conn, & mut insert_stmt, |_| {
230+ Some ( String :: from ( "hair_color" ) )
231+ } )
232+ } )
210233}
211234
212235pub fn loading_associations_sequentially ( b : & mut Bencher ) {
213- let mut conn = connection ( ) ;
214-
215- insert_users ( 9 , & mut conn , |i| {
236+ let conn = connection ( ) ;
237+ let mut insert_stmt = None ;
238+ insert_users ( 9 , & conn , & mut insert_stmt , |i| {
216239 Some ( if i % 2 == 0 {
217240 String :: from ( "black" )
218241 } else {
@@ -231,7 +254,6 @@ pub fn loading_associations_sequentially(b: &mut Bencher) {
231254 } ;
232255
233256 {
234- let conn = conn. transaction ( ) . unwrap ( ) ;
235257 {
236258 let mut insert_posts = conn
237259 . prepare ( "INSERT INTO posts(title, user_id, body) VALUES (?, ?, ?)" )
@@ -249,8 +271,6 @@ pub fn loading_associations_sequentially(b: &mut Bencher) {
249271 }
250272 }
251273 }
252-
253- conn. commit ( ) . unwrap ( ) ;
254274 }
255275
256276 let all_posts = {
@@ -264,7 +284,6 @@ pub fn loading_associations_sequentially(b: &mut Bencher) {
264284 } ;
265285
266286 {
267- let conn = conn. transaction ( ) . unwrap ( ) ;
268287 {
269288 let mut insert_comments = conn
270289 . prepare ( "INSERT INTO comments(text, post_id) VALUES (?, ?)" )
@@ -281,8 +300,6 @@ pub fn loading_associations_sequentially(b: &mut Bencher) {
281300 }
282301 }
283302 }
284-
285- conn. commit ( ) . unwrap ( ) ;
286303 }
287304
288305 let mut user_query = conn
0 commit comments