11use std:: { cell:: RefCell , fmt:: Write as FmtWrite } ;
22
3+ use futures:: stream:: { futures_unordered:: FuturesUnordered , StreamExt } ;
34use nanorand:: { Rng , WyRand } ;
45use ntex:: util:: { BufMut , Bytes , BytesMut } ;
56use smallvec:: SmallVec ;
67use tokio_postgres:: types:: ToSql ;
7- use tokio_postgres:: { connect, Client , Statement } ;
8+ use tokio_postgres:: { connect, Client , Row , Statement } ;
89use yarte:: { ywrite_html, Serialize } ;
910
1011use super :: utils;
@@ -82,7 +83,7 @@ impl PgConnection {
8283 let row = self . cl . query_one ( & self . world , & [ & random_id] ) . await . unwrap ( ) ;
8384
8485 let mut body = self . buf . borrow_mut ( ) ;
85- utils:: reserve ( & mut body) ;
86+ utils:: reserve ( & mut body, 256 ) ;
8687 World {
8788 id : row. get ( 0 ) ,
8889 randomnumber : row. get ( 1 ) ,
@@ -91,25 +92,28 @@ impl PgConnection {
9192 body. split ( ) . freeze ( )
9293 }
9394
95+ async fn get_one_world ( & self , id : i32 ) -> Row {
96+ self . cl . query_one ( & self . world , & [ & id] ) . await . unwrap ( )
97+ }
98+
9499 pub async fn get_worlds ( & self , num : usize ) -> Bytes {
95100 let mut rng = self . rng . clone ( ) ;
96- let mut queries = SmallVec :: < [ _ ; 32 ] > :: new ( ) ;
101+ let mut queries = FuturesUnordered :: new ( ) ;
97102 ( 0 ..num) . for_each ( |_| {
98103 let w_id = ( rng. generate :: < u32 > ( ) % 10_000 + 1 ) as i32 ;
99- queries. push ( self . cl . query_one ( & self . world , & [ & w_id] ) ) ;
104+ queries. push ( self . get_one_world ( w_id) )
100105 } ) ;
101106
102107 let mut worlds = SmallVec :: < [ _ ; 32 ] > :: new ( ) ;
103- for fut in queries {
104- let row = fut. await . unwrap ( ) ;
108+ while let Some ( row) = queries. next ( ) . await {
105109 worlds. push ( World {
106110 id : row. get ( 0 ) ,
107111 randomnumber : row. get ( 1 ) ,
108112 } )
109113 }
110114
111115 let mut body = self . buf . borrow_mut ( ) ;
112- utils:: reserve ( & mut body) ;
116+ utils:: reserve ( & mut body, 8 * 1024 ) ;
113117 body. put_u8 ( b'[' ) ;
114118 worlds. iter ( ) . for_each ( |w| {
115119 w. to_bytes_mut ( & mut * body) ;
@@ -121,16 +125,15 @@ impl PgConnection {
121125 }
122126
123127 pub async fn update ( & self , num : usize ) -> Bytes {
124- let mut rng = nanorand :: tls_rng ( ) ;
125- let mut queries = SmallVec :: < [ _ ; 32 ] > :: new ( ) ;
128+ let mut rng = self . rng . clone ( ) ;
129+ let mut queries = FuturesUnordered :: new ( ) ;
126130 ( 0 ..num) . for_each ( |_| {
127131 let w_id = ( rng. generate :: < u32 > ( ) % 10_000 + 1 ) as i32 ;
128- queries. push ( self . cl . query_one ( & self . world , & [ & w_id] ) ) ;
132+ queries. push ( self . get_one_world ( w_id) )
129133 } ) ;
130134
131135 let mut worlds = SmallVec :: < [ _ ; 32 ] > :: new ( ) ;
132- for fut in queries. into_iter ( ) {
133- let row = fut. await . unwrap ( ) ;
136+ while let Some ( row) = queries. next ( ) . await {
134137 worlds. push ( World {
135138 id : row. get ( 0 ) ,
136139 randomnumber : ( rng. generate :: < u32 > ( ) % 10_000 + 1 ) as i32 ,
@@ -148,7 +151,7 @@ impl PgConnection {
148151 let _ = self . cl . query ( & self . updates [ num - 1 ] , & params) . await ;
149152
150153 let mut body = self . buf . borrow_mut ( ) ;
151- utils:: reserve ( & mut body) ;
154+ utils:: reserve ( & mut body, 8 * 1024 ) ;
152155 body. put_u8 ( b'[' ) ;
153156 worlds. iter ( ) . for_each ( |w| {
154157 w. to_bytes_mut ( & mut * body) ;
@@ -174,7 +177,7 @@ impl PgConnection {
174177 fortunes. sort_by ( |it, next| it. message . cmp ( next. message ) ) ;
175178
176179 let mut body = std:: mem:: replace ( & mut * self . buf . borrow_mut ( ) , BytesMut :: new ( ) ) ;
177- utils:: reserve ( & mut body) ;
180+ utils:: reserve ( & mut body, 8 * 1024 ) ;
178181 ywrite_html ! ( body, "{{> fortune }}" ) ;
179182 let result = body. split ( ) . freeze ( ) ;
180183 let _ = std:: mem:: replace ( & mut * self . buf . borrow_mut ( ) , body) ;
0 commit comments