1
1
use deadpool_postgres:: { Manager , ManagerConfig , Pool , RecyclingMethod } ;
2
2
use pyo3:: { pyclass, pymethods, PyAny , Python } ;
3
- use std:: { sync:: Arc , vec} ;
3
+ use std:: { str :: FromStr , sync:: Arc , vec} ;
4
4
use tokio_postgres:: { types:: ToSql , NoTls } ;
5
5
6
6
use crate :: {
@@ -16,6 +16,7 @@ use super::connection::Connection;
16
16
///
17
17
/// It is not exposed to python.
18
18
pub struct RustPSQLPool {
19
+ dsn : Option < String > ,
19
20
username : Option < String > ,
20
21
password : Option < String > ,
21
22
host : Option < String > ,
@@ -29,6 +30,7 @@ impl RustPSQLPool {
29
30
/// Create new `RustPSQLPool`.
30
31
#[ must_use]
31
32
pub fn new (
33
+ dsn : Option < String > ,
32
34
username : Option < String > ,
33
35
password : Option < String > ,
34
36
host : Option < String > ,
@@ -37,6 +39,7 @@ impl RustPSQLPool {
37
39
max_db_pool_size : Option < usize > ,
38
40
) -> Self {
39
41
RustPSQLPool {
42
+ dsn,
40
43
username,
41
44
password,
42
45
host,
@@ -115,6 +118,7 @@ impl RustPSQLPool {
115
118
/// `max_db_pool_size` is less than 2 or it's impossible to build db pool.
116
119
pub async fn inner_startup ( & self ) -> RustPSQLDriverPyResult < ( ) > {
117
120
let db_pool_arc = self . db_pool . clone ( ) ;
121
+ let dsn = self . dsn . clone ( ) ;
118
122
let password = self . password . clone ( ) ;
119
123
let username = self . username . clone ( ) ;
120
124
let db_host = self . host . clone ( ) ;
@@ -137,22 +141,26 @@ impl RustPSQLPool {
137
141
}
138
142
}
139
143
140
- let mut pg_config = tokio_postgres:: Config :: new ( ) ;
141
-
142
- if let ( Some ( password) , Some ( username) ) = ( password, username) {
143
- pg_config. password ( & password) ;
144
- pg_config. user ( & username) ;
145
- }
146
- if let Some ( db_host) = db_host {
147
- pg_config. host ( & db_host) ;
148
- }
144
+ let mut pg_config: tokio_postgres:: Config ;
145
+ if let Some ( dsn_string) = dsn {
146
+ pg_config = tokio_postgres:: Config :: from_str ( & dsn_string) ?;
147
+ } else {
148
+ pg_config = tokio_postgres:: Config :: new ( ) ;
149
+ if let ( Some ( password) , Some ( username) ) = ( password, username) {
150
+ pg_config. password ( & password) ;
151
+ pg_config. user ( & username) ;
152
+ }
153
+ if let Some ( db_host) = db_host {
154
+ pg_config. host ( & db_host) ;
155
+ }
149
156
150
- if let Some ( db_port) = db_port {
151
- pg_config. port ( db_port) ;
152
- }
157
+ if let Some ( db_port) = db_port {
158
+ pg_config. port ( db_port) ;
159
+ }
153
160
154
- if let Some ( db_name) = db_name {
155
- pg_config. dbname ( & db_name) ;
161
+ if let Some ( db_name) = db_name {
162
+ pg_config. dbname ( & db_name) ;
163
+ }
156
164
}
157
165
158
166
let mgr_config = ManagerConfig {
@@ -180,6 +188,7 @@ impl PSQLPool {
180
188
#[ new]
181
189
#[ must_use]
182
190
pub fn new (
191
+ dsn : Option < String > ,
183
192
username : Option < String > ,
184
193
password : Option < String > ,
185
194
host : Option < String > ,
@@ -189,6 +198,7 @@ impl PSQLPool {
189
198
) -> Self {
190
199
PSQLPool {
191
200
rust_psql_pool : Arc :: new ( tokio:: sync:: RwLock :: new ( RustPSQLPool {
201
+ dsn,
192
202
username,
193
203
password,
194
204
host,
0 commit comments