@@ -113,37 +113,19 @@ pub async fn connection_db() -> DbPoolConnection {
113113 pool
114114}
115115
116- pub async fn get_update_data (
117- limit : Queries ,
118- ) -> ( String , Vec < QueryRow > , Vec < Queries > , Vec < Queries > ) {
116+ pub async fn get_update_data ( limit : Queries ) -> ( Vec < QueryRow > , Vec < i32 > , Vec < i32 > ) {
119117 let db_pool: & DbPoolConnection = get_db_connection ( ) ;
120118 let mut query_res_list: Vec < QueryRow > = Vec :: with_capacity ( limit as usize ) ;
121119 let rows: Vec < QueryRow > = get_some_row_id ( limit, db_pool) . await ;
122- let mut sql: String = String :: with_capacity ( rows. len ( ) * 32 ) ;
123- sql. push_str ( & format ! (
124- "UPDATE {} SET randomNumber = CASE id " ,
125- TABLE_NAME_WORLD
126- ) ) ;
127120 let mut id_list: Vec < i32 > = Vec :: with_capacity ( rows. len ( ) ) ;
128- let mut value_list: Vec < String > = Vec :: with_capacity ( rows. len ( ) ) ;
129121 let mut random_numbers: Vec < i32 > = Vec :: with_capacity ( rows. len ( ) ) ;
130- for ( i , row) in rows. iter ( ) . enumerate ( ) {
122+ for row in rows. iter ( ) {
131123 let new_random_number: i32 = get_random_id ( ) as i32 ;
132124 id_list. push ( row. id ) ;
133125 random_numbers. push ( new_random_number) ;
134- value_list. push ( format ! ( "WHEN ${} THEN ${}" , i * 2 + 1 , i * 2 + 2 ) ) ;
135126 query_res_list. push ( QueryRow :: new ( row. id , new_random_number) ) ;
136127 }
137- sql. push_str ( & value_list. join ( " " ) ) ;
138- let id_params: String = ( 0 ..rows. len ( ) )
139- . map ( |i| format ! ( "${}" , ( rows. len( ) * 2 + 1 ) + i) )
140- . collect :: < Vec < _ > > ( )
141- . join ( "," ) ;
142- sql. push_str ( & format ! (
143- " ELSE randomNumber END WHERE id IN ({})" ,
144- id_params
145- ) ) ;
146- ( sql, query_res_list, id_list, random_numbers)
128+ ( query_res_list, id_list, random_numbers)
147129}
148130
149131pub async fn init_db ( ) {
@@ -163,11 +145,8 @@ pub async fn random_world_row(db_pool: &DbPoolConnection) -> QueryRow {
163145}
164146
165147pub async fn query_world_row ( db_pool : & DbPoolConnection , id : Queries ) -> QueryRow {
166- let sql: String = format ! (
167- "SELECT id, randomNumber FROM {} WHERE id = {}" ,
168- TABLE_NAME_WORLD , id
169- ) ;
170- if let Ok ( rows) = query ( & sql) . fetch_one ( db_pool) . await {
148+ let sql: & str = "SELECT id, randomNumber FROM World WHERE id = $1" ;
149+ if let Ok ( rows) = query ( sql) . bind ( id) . fetch_one ( db_pool) . await {
171150 let random_number: i32 = rows. get ( KEY_RANDOM_NUMBER ) ;
172151 return QueryRow :: new ( id as i32 , random_number) ;
173152 }
@@ -176,15 +155,20 @@ pub async fn query_world_row(db_pool: &DbPoolConnection, id: Queries) -> QueryRo
176155
177156pub async fn update_world_rows ( limit : Queries ) -> Vec < QueryRow > {
178157 let db_pool: & DbPoolConnection = get_db_connection ( ) ;
179- let ( sql, data, id_list, random_numbers) = get_update_data ( limit) . await ;
180- let mut query_builder = query ( & sql) ;
181- for ( id, random_number) in id_list. iter ( ) . zip ( random_numbers. iter ( ) ) {
182- query_builder = query_builder. bind ( id) . bind ( random_number) ;
183- }
184- for id in & id_list {
185- query_builder = query_builder. bind ( id) ;
158+ let ( data, id_list, random_numbers) = get_update_data ( limit) . await ;
159+ let sql: & str = "UPDATE World SET randomNumber = $1 WHERE id = $2" ;
160+ let mut tasks: Vec < JoinHandle < _ > > = Vec :: with_capacity ( limit as usize ) ;
161+ for ( id, random_number) in id_list. into_iter ( ) . zip ( random_numbers. into_iter ( ) ) {
162+ let db_pool: Pool < Postgres > = db_pool. clone ( ) ;
163+ tasks. push ( spawn ( async move {
164+ query ( sql)
165+ . bind ( random_number)
166+ . bind ( id)
167+ . execute ( & db_pool)
168+ . await
169+ } ) ) ;
186170 }
187- let _ = query_builder . execute ( db_pool ) . await ;
171+ join_all ( tasks ) . await ;
188172 data
189173}
190174
@@ -196,14 +180,10 @@ pub async fn all_world_row() -> Vec<PgRow> {
196180}
197181
198182pub async fn get_some_row_id ( limit : Queries , db_pool : & DbPoolConnection ) -> Vec < QueryRow > {
199- let semaphore: Arc < Semaphore > = Arc :: new ( Semaphore :: new ( 32 ) ) ;
200183 let tasks: Vec < _ > = ( 0 ..limit)
201184 . map ( |_| {
202- let semaphore: Arc < Semaphore > = semaphore. clone ( ) ;
203185 let db_pool: Pool < Postgres > = db_pool. clone ( ) ;
204186 spawn ( async move {
205- let _permit: Result < OwnedSemaphorePermit , AcquireError > =
206- semaphore. acquire_owned ( ) . await ;
207187 let id: i32 = get_random_id ( ) ;
208188 query_world_row ( & db_pool, id) . await
209189 } )
0 commit comments