1
1
use std:: { cell:: RefCell , fmt:: Write as FmtWrite } ;
2
2
3
+ use futures:: stream:: { futures_unordered:: FuturesUnordered , StreamExt } ;
3
4
use nanorand:: { Rng , WyRand } ;
4
5
use ntex:: util:: { BufMut , Bytes , BytesMut } ;
5
6
use smallvec:: SmallVec ;
6
7
use tokio_postgres:: types:: ToSql ;
7
- use tokio_postgres:: { connect, Client , Statement } ;
8
+ use tokio_postgres:: { connect, Client , Row , Statement } ;
8
9
use yarte:: { ywrite_html, Serialize } ;
9
10
10
11
use super :: utils;
@@ -82,7 +83,7 @@ impl PgConnection {
82
83
let row = self . cl . query_one ( & self . world , & [ & random_id] ) . await . unwrap ( ) ;
83
84
84
85
let mut body = self . buf . borrow_mut ( ) ;
85
- utils:: reserve ( & mut body) ;
86
+ utils:: reserve ( & mut body, 256 ) ;
86
87
World {
87
88
id : row. get ( 0 ) ,
88
89
randomnumber : row. get ( 1 ) ,
@@ -91,25 +92,28 @@ impl PgConnection {
91
92
body. split ( ) . freeze ( )
92
93
}
93
94
95
+ async fn get_one_world ( & self , id : i32 ) -> Row {
96
+ self . cl . query_one ( & self . world , & [ & id] ) . await . unwrap ( )
97
+ }
98
+
94
99
pub async fn get_worlds ( & self , num : usize ) -> Bytes {
95
100
let mut rng = self . rng . clone ( ) ;
96
- let mut queries = SmallVec :: < [ _ ; 32 ] > :: new ( ) ;
101
+ let mut queries = FuturesUnordered :: new ( ) ;
97
102
( 0 ..num) . for_each ( |_| {
98
103
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) )
100
105
} ) ;
101
106
102
107
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 {
105
109
worlds. push ( World {
106
110
id : row. get ( 0 ) ,
107
111
randomnumber : row. get ( 1 ) ,
108
112
} )
109
113
}
110
114
111
115
let mut body = self . buf . borrow_mut ( ) ;
112
- utils:: reserve ( & mut body) ;
116
+ utils:: reserve ( & mut body, 8 * 1024 ) ;
113
117
body. put_u8 ( b'[' ) ;
114
118
worlds. iter ( ) . for_each ( |w| {
115
119
w. to_bytes_mut ( & mut * body) ;
@@ -121,16 +125,15 @@ impl PgConnection {
121
125
}
122
126
123
127
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 ( ) ;
126
130
( 0 ..num) . for_each ( |_| {
127
131
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) )
129
133
} ) ;
130
134
131
135
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 {
134
137
worlds. push ( World {
135
138
id : row. get ( 0 ) ,
136
139
randomnumber : ( rng. generate :: < u32 > ( ) % 10_000 + 1 ) as i32 ,
@@ -148,7 +151,7 @@ impl PgConnection {
148
151
let _ = self . cl . query ( & self . updates [ num - 1 ] , & params) . await ;
149
152
150
153
let mut body = self . buf . borrow_mut ( ) ;
151
- utils:: reserve ( & mut body) ;
154
+ utils:: reserve ( & mut body, 8 * 1024 ) ;
152
155
body. put_u8 ( b'[' ) ;
153
156
worlds. iter ( ) . for_each ( |w| {
154
157
w. to_bytes_mut ( & mut * body) ;
@@ -174,7 +177,7 @@ impl PgConnection {
174
177
fortunes. sort_by ( |it, next| it. message . cmp ( next. message ) ) ;
175
178
176
179
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 ) ;
178
181
ywrite_html ! ( body, "{{> fortune }}" ) ;
179
182
let result = body. split ( ) . freeze ( ) ;
180
183
let _ = std:: mem:: replace ( & mut * self . buf . borrow_mut ( ) , body) ;
0 commit comments