@@ -137,31 +137,35 @@ pub async fn connection_db() -> DbPoolConnection {
137137}
138138
139139#[ inline]
140- pub async fn get_update_data ( limit : Queries ) -> ( String , Vec < QueryRow > ) {
140+ pub async fn get_update_data (
141+ limit : Queries ,
142+ ) -> ( String , Vec < QueryRow > , Vec < Queries > , Vec < Queries > ) {
141143 let db_pool: DbPoolConnection = get_db_connection ( ) . await ;
142144 let mut query_res_list: Vec < QueryRow > = Vec :: with_capacity ( limit as usize ) ;
143- let rows: Vec < QueryRow > = get_some_row_id ( limit as Queries , & db_pool) . await ;
144- let mut sql: String = format ! ( "UPDATE {} SET randomNumber = CASE id " , TABLE_NAME_WORLD ) ;
145- let mut id_list: Vec < i32 > = Vec :: with_capacity ( limit as usize ) ;
146- let mut value_list: String = String :: new ( ) ;
147- let mut id_in_clause: String = format ! ( "{}" , rows[ 0 ] . id) ;
148- let last_idx: usize = rows. len ( ) - 1 ;
145+ let rows: Vec < QueryRow > = get_some_row_id ( limit, & db_pool) . await ;
146+ let mut sql = format ! ( "UPDATE {} SET randomNumber = CASE id " , TABLE_NAME_WORLD ) ;
147+ let mut id_list: Vec < i32 > = Vec :: with_capacity ( rows. len ( ) ) ;
148+ let mut value_list: Vec < String > = Vec :: with_capacity ( rows. len ( ) * 2 ) ;
149+ let mut random_numbers: Vec < i32 > = Vec :: with_capacity ( rows. len ( ) ) ;
149150 for ( i, row) in rows. iter ( ) . enumerate ( ) {
150- let new_random_number: Queries = get_random_id ( ) ;
151- let id: i32 = row. id ;
152- id_list. push ( id) ;
153- value_list. push_str ( & format ! ( "WHEN {} THEN {} " , id, new_random_number) ) ;
154- if i < last_idx {
155- id_in_clause. push_str ( & format ! ( ",{}" , id. to_string( ) ) ) ;
156- }
157- query_res_list. push ( QueryRow :: new ( id, new_random_number as i32 ) ) ;
151+ let new_random_number: i32 = get_random_id ( ) as i32 ;
152+ id_list. push ( row. id ) ;
153+ random_numbers. push ( new_random_number) ;
154+ value_list. push ( format ! ( "WHEN ${} THEN ${}" , i * 2 + 1 , i * 2 + 2 ) ) ;
155+ query_res_list. push ( QueryRow :: new ( row. id , new_random_number) ) ;
158156 }
159- sql. push_str ( & value_list) ;
157+ sql. push_str ( & value_list. join ( " " ) ) ;
158+ let id_params: String = id_list
159+ . iter ( )
160+ . enumerate ( )
161+ . map ( |( i, _) | format ! ( "${}" , ( rows. len( ) * 2 + 1 ) + i) )
162+ . collect :: < Vec < _ > > ( )
163+ . join ( "," ) ;
160164 sql. push_str ( & format ! (
161- "ELSE randomNumber END WHERE id IN ({})" ,
162- id_in_clause
165+ " ELSE randomNumber END WHERE id IN ({})" ,
166+ id_params
163167 ) ) ;
164- ( sql, query_res_list)
168+ ( sql, query_res_list, id_list , random_numbers )
165169}
166170
167171#[ inline]
@@ -201,8 +205,15 @@ pub async fn query_world_row(db_pool: &DbPoolConnection, id: Queries) -> QueryRo
201205#[ inline]
202206pub async fn update_world_rows ( limit : Queries ) -> Vec < QueryRow > {
203207 let db_pool: DbPoolConnection = get_db_connection ( ) . await ;
204- let ( sql, data) = get_update_data ( limit) . await ;
205- let _ = query ( & sql) . execute ( & db_pool) . await ;
208+ let ( sql, data, id_list, random_numbers) = get_update_data ( limit) . await ;
209+ let mut query_builder: query:: Query < ' _ , Postgres , postgres:: PgArguments > = query ( & sql) ;
210+ for ( id, random_number) in id_list. iter ( ) . zip ( random_numbers. iter ( ) ) {
211+ query_builder = query_builder. bind ( id) . bind ( random_number) ;
212+ }
213+ for id in & id_list {
214+ query_builder = query_builder. bind ( id) ;
215+ }
216+ let _ = query_builder. execute ( & db_pool) . await ;
206217 data
207218}
208219
0 commit comments