1
- use std:: { collections:: HashMap , fmt:: Write , future :: IntoFuture } ;
1
+ use std:: { collections:: HashMap , fmt:: Write } ;
2
2
3
- use xitca_postgres:: { statement:: Statement , AsyncLendingIterator , Postgres } ;
3
+ use xitca_postgres:: {
4
+ pipeline:: Pipeline , statement:: Statement , AsyncLendingIterator , SharedClient ,
5
+ } ;
4
6
use xitca_unsafe_collection:: no_hash:: NoHashBuilder ;
5
7
6
8
use super :: {
@@ -9,7 +11,7 @@ use super::{
9
11
} ;
10
12
11
13
pub struct Client {
12
- client : xitca_postgres :: Client ,
14
+ client : SharedClient ,
13
15
#[ cfg( not( feature = "pg-sync" ) ) ]
14
16
rng : std:: cell:: RefCell < Rand > ,
15
17
#[ cfg( feature = "pg-sync" ) ]
@@ -19,27 +21,14 @@ pub struct Client {
19
21
updates : HashMap < u16 , Statement , NoHashBuilder > ,
20
22
}
21
23
22
- impl Drop for Client {
23
- fn drop ( & mut self ) {
24
- drop ( self . fortune . clone ( ) . into_guarded ( & self . client ) ) ;
25
- drop ( self . world . clone ( ) . into_guarded ( & self . client ) ) ;
26
- for ( _, stmt) in std:: mem:: take ( & mut self . updates ) {
27
- drop ( stmt. into_guarded ( & self . client ) )
28
- }
29
- }
30
- }
31
-
32
24
pub async fn create ( ) -> HandleResult < Client > {
33
- let ( client, driver) = Postgres :: new ( DB_URL . to_string ( ) ) . connect ( ) . await ?;
34
-
35
- tokio:: spawn ( tokio:: task:: unconstrained ( driver. into_future ( ) ) ) ;
25
+ let mut client = SharedClient :: new ( DB_URL . to_string ( ) ) . await ?;
36
26
37
- let fortune = client. prepare ( "SELECT * FROM fortune" , & [ ] ) . await ?. leak ( ) ;
27
+ let fortune = client. prepare_cached ( "SELECT * FROM fortune" , & [ ] ) . await ?;
38
28
39
29
let world = client
40
- . prepare ( "SELECT * FROM world WHERE id=$1" , & [ ] )
41
- . await ?
42
- . leak ( ) ;
30
+ . prepare_cached ( "SELECT * FROM world WHERE id=$1" , & [ ] )
31
+ . await ?;
43
32
44
33
let mut updates = HashMap :: default ( ) ;
45
34
@@ -59,7 +48,7 @@ pub async fn create() -> HandleResult<Client> {
59
48
q. pop ( ) ;
60
49
q. push ( ')' ) ;
61
50
62
- let st = client. prepare ( & q, & [ ] ) . await ?. leak ( ) ;
51
+ let st = client. prepare_cached ( & q, & [ ] ) . await ?;
63
52
updates. insert ( num, st) ;
64
53
}
65
54
@@ -94,11 +83,11 @@ impl Client {
94
83
. try_next ( )
95
84
. await ?
96
85
. map ( |row| World :: new ( row. get_raw ( 0 ) , row. get_raw ( 1 ) ) )
97
- . ok_or_else ( || format ! ( "World does not exist" ) . into ( ) )
86
+ . ok_or_else ( || "World does not exist" . into ( ) )
98
87
}
99
88
100
89
pub async fn get_worlds ( & self , num : u16 ) -> HandleResult < Vec < World > > {
101
- let mut pipe = self . client . pipeline ( ) ;
90
+ let mut pipe = Pipeline :: new ( ) ;
102
91
103
92
{
104
93
let mut rng = self . borrow_rng_mut ( ) ;
@@ -108,7 +97,7 @@ impl Client {
108
97
let mut worlds = Vec :: new ( ) ;
109
98
worlds. reserve ( num as usize ) ;
110
99
111
- let mut res = pipe . run ( ) . await ?;
100
+ let mut res = self . client . pipeline ( pipe ) . await ?;
112
101
while let Some ( mut item) = res. try_next ( ) . await ? {
113
102
while let Some ( row) = item. try_next ( ) . await ? {
114
103
worlds. push ( World :: new ( row. get_raw ( 0 ) , row. get_raw ( 1 ) ) )
@@ -124,7 +113,7 @@ impl Client {
124
113
let mut params = Vec :: new ( ) ;
125
114
params. reserve ( len * 3 ) ;
126
115
127
- let mut pipe = self . client . pipeline ( ) ;
116
+ let mut pipe = Pipeline :: new ( ) ;
128
117
129
118
{
130
119
let mut rng = self . borrow_rng_mut ( ) ;
@@ -144,7 +133,7 @@ impl Client {
144
133
worlds. reserve ( len) ;
145
134
let mut r_ids = params. into_iter ( ) . skip ( 1 ) . step_by ( 2 ) ;
146
135
147
- let mut res = pipe . run ( ) . await ?;
136
+ let mut res = self . client . pipeline ( pipe ) . await ?;
148
137
while let Some ( mut item) = res. try_next ( ) . await ? {
149
138
while let Some ( row) = item. try_next ( ) . await ? {
150
139
let r_id = r_ids. next ( ) . unwrap ( ) ;
0 commit comments