1
- use std:: { cell:: RefCell , fmt:: Write as FmtWrite } ;
1
+ #![ allow( clippy:: uninit_vec) ]
2
+ use std:: { borrow:: Cow , cell:: RefCell , fmt:: Write as FmtWrite } ;
2
3
3
- use futures:: stream:: { futures_unordered:: FuturesUnordered , StreamExt } ;
4
4
use nanorand:: { Rng , WyRand } ;
5
5
use ntex:: util:: { BufMut , Bytes , BytesMut } ;
6
6
use smallvec:: SmallVec ;
7
7
use tokio_postgres:: types:: ToSql ;
8
- use tokio_postgres:: { connect, Client , Row , Statement } ;
8
+ use tokio_postgres:: { connect, Client , Statement } ;
9
9
use yarte:: { ywrite_html, Serialize } ;
10
10
11
11
use super :: utils;
@@ -17,9 +17,9 @@ pub struct World {
17
17
}
18
18
19
19
#[ derive( Serialize , Debug ) ]
20
- pub struct Fortune < ' a > {
20
+ pub struct Fortune {
21
21
pub id : i32 ,
22
- pub message : & ' a str ,
22
+ pub message : Cow < ' static , str > ,
23
23
}
24
24
25
25
/// Postgres interface
@@ -60,10 +60,7 @@ impl PgConnection {
60
60
q. push ( ')' ) ;
61
61
updates. push ( cl. prepare ( & q) . await . unwrap ( ) ) ;
62
62
}
63
- let world = cl
64
- . prepare ( "SELECT id, randomnumber FROM world WHERE id=$1" )
65
- . await
66
- . unwrap ( ) ;
63
+ let world = cl. prepare ( "SELECT * FROM world WHERE id=$1" ) . await . unwrap ( ) ;
67
64
68
65
PgConnection {
69
66
cl,
@@ -83,7 +80,7 @@ impl PgConnection {
83
80
let row = self . cl . query_one ( & self . world , & [ & random_id] ) . await . unwrap ( ) ;
84
81
85
82
let mut body = self . buf . borrow_mut ( ) ;
86
- utils:: reserve ( & mut body, 256 ) ;
83
+ utils:: reserve ( & mut body, 8 * 1024 ) ;
87
84
World {
88
85
id : row. get ( 0 ) ,
89
86
randomnumber : row. get ( 1 ) ,
@@ -92,20 +89,17 @@ impl PgConnection {
92
89
body. split ( ) . freeze ( )
93
90
}
94
91
95
- async fn get_one_world ( & self , id : i32 ) -> Row {
96
- self . cl . query_one ( & self . world , & [ & id] ) . await . unwrap ( )
97
- }
98
-
99
92
pub async fn get_worlds ( & self , num : usize ) -> Bytes {
100
93
let mut rng = self . rng . clone ( ) ;
101
- let mut queries = FuturesUnordered :: new ( ) ;
94
+ let mut queries = SmallVec :: < [ _ ; 32 ] > :: new ( ) ;
102
95
( 0 ..num) . for_each ( |_| {
103
96
let w_id = ( rng. generate :: < u32 > ( ) % 10_000 + 1 ) as i32 ;
104
- queries. push ( self . get_one_world ( w_id) )
97
+ queries. push ( self . cl . query_one ( & self . world , & [ & w_id] ) ) ;
105
98
} ) ;
106
99
107
100
let mut worlds = SmallVec :: < [ _ ; 32 ] > :: new ( ) ;
108
- while let Some ( row) = queries. next ( ) . await {
101
+ for fut in queries {
102
+ let row = fut. await . unwrap ( ) ;
109
103
worlds. push ( World {
110
104
id : row. get ( 0 ) ,
111
105
randomnumber : row. get ( 1 ) ,
@@ -126,14 +120,15 @@ impl PgConnection {
126
120
127
121
pub async fn update ( & self , num : usize ) -> Bytes {
128
122
let mut rng = self . rng . clone ( ) ;
129
- let mut queries = FuturesUnordered :: new ( ) ;
123
+ let mut queries = SmallVec :: < [ _ ; 32 ] > :: new ( ) ;
130
124
( 0 ..num) . for_each ( |_| {
131
125
let w_id = ( rng. generate :: < u32 > ( ) % 10_000 + 1 ) as i32 ;
132
- queries. push ( self . get_one_world ( w_id) )
126
+ queries. push ( self . cl . query_one ( & self . world , & [ & w_id] ) ) ;
133
127
} ) ;
134
128
135
129
let mut worlds = SmallVec :: < [ _ ; 32 ] > :: new ( ) ;
136
- while let Some ( row) = queries. next ( ) . await {
130
+ for fut in queries. into_iter ( ) {
131
+ let row = fut. await . unwrap ( ) ;
137
132
worlds. push ( World {
138
133
id : row. get ( 0 ) ,
139
134
randomnumber : ( rng. generate :: < u32 > ( ) % 10_000 + 1 ) as i32 ,
@@ -163,18 +158,22 @@ impl PgConnection {
163
158
}
164
159
165
160
pub async fn tell_fortune ( & self ) -> Bytes {
166
- let rows = self . cl . query_raw ( & self . fortune , & [ ] ) . await . unwrap ( ) ;
161
+ let fut = self . cl . query_raw ( & self . fortune , & [ ] ) ;
167
162
168
- let mut fortunes = Vec :: with_capacity ( rows . len ( ) + 1 ) ;
169
- fortunes. push ( Fortune {
163
+ let rows = fut . await . unwrap ( ) ;
164
+ let mut fortunes: SmallVec < [ _ ; 32 ] > = smallvec :: smallvec! [ Fortune {
170
165
id: 0 ,
171
- message : "Additional fortune added at request time." ,
172
- } ) ;
173
- fortunes. extend ( rows. iter ( ) . map ( |row| Fortune {
174
- id : row. get ( 0 ) ,
175
- message : row. get ( 1 ) ,
176
- } ) ) ;
177
- fortunes. sort_by ( |it, next| it. message . cmp ( next. message ) ) ;
166
+ message: Cow :: Borrowed ( "Additional fortune added at request time." ) ,
167
+ } ] ;
168
+
169
+ for row in rows {
170
+ fortunes. push ( Fortune {
171
+ id : row. get ( 0 ) ,
172
+ message : Cow :: Owned ( row. get ( 1 ) ) ,
173
+ } ) ;
174
+ }
175
+
176
+ fortunes. sort_by ( |it, next| it. message . cmp ( & next. message ) ) ;
178
177
179
178
let mut body = std:: mem:: replace ( & mut * self . buf . borrow_mut ( ) , BytesMut :: new ( ) ) ;
180
179
utils:: reserve ( & mut body, 8 * 1024 ) ;
0 commit comments