@@ -72,6 +72,21 @@ pub enum LoadBalanceHosts {
72
72
Random ,
73
73
}
74
74
75
+ /// Replication mode configuration.
76
+ ///
77
+ /// It is recommended that you use a PostgreSQL server patch version
78
+ /// of at least: 14.0, 13.2, 12.6, 11.11, 10.16, 9.6.21, or
79
+ /// 9.5.25. Earlier patch levels have a bug that doesn't properly
80
+ /// handle pipelined requests after streaming has stopped.
81
+ #[ derive( Debug , Copy , Clone , PartialEq , Eq ) ]
82
+ #[ non_exhaustive]
83
+ pub enum ReplicationMode {
84
+ /// Physical replication.
85
+ Physical ,
86
+ /// Logical replication.
87
+ Logical ,
88
+ }
89
+
75
90
/// A host specification.
76
91
#[ derive( Debug , Clone , PartialEq , Eq ) ]
77
92
pub enum Host {
@@ -209,6 +224,7 @@ pub struct Config {
209
224
pub ( crate ) target_session_attrs : TargetSessionAttrs ,
210
225
pub ( crate ) channel_binding : ChannelBinding ,
211
226
pub ( crate ) load_balance_hosts : LoadBalanceHosts ,
227
+ pub ( crate ) replication_mode : Option < ReplicationMode > ,
212
228
}
213
229
214
230
impl Default for Config {
@@ -242,6 +258,7 @@ impl Config {
242
258
target_session_attrs : TargetSessionAttrs :: Any ,
243
259
channel_binding : ChannelBinding :: Prefer ,
244
260
load_balance_hosts : LoadBalanceHosts :: Disable ,
261
+ replication_mode : None ,
245
262
}
246
263
}
247
264
@@ -524,6 +541,22 @@ impl Config {
524
541
self . load_balance_hosts
525
542
}
526
543
544
+ /// Set replication mode.
545
+ ///
546
+ /// It is recommended that you use a PostgreSQL server patch version
547
+ /// of at least: 14.0, 13.2, 12.6, 11.11, 10.16, 9.6.21, or
548
+ /// 9.5.25. Earlier patch levels have a bug that doesn't properly
549
+ /// handle pipelined requests after streaming has stopped.
550
+ pub fn replication_mode ( & mut self , replication_mode : ReplicationMode ) -> & mut Config {
551
+ self . replication_mode = Some ( replication_mode) ;
552
+ self
553
+ }
554
+
555
+ /// Get replication mode.
556
+ pub fn get_replication_mode ( & self ) -> Option < ReplicationMode > {
557
+ self . replication_mode
558
+ }
559
+
527
560
fn param ( & mut self , key : & str , value : & str ) -> Result < ( ) , Error > {
528
561
match key {
529
562
"user" => {
@@ -660,6 +693,17 @@ impl Config {
660
693
} ;
661
694
self . load_balance_hosts ( load_balance_hosts) ;
662
695
}
696
+ "replication" => {
697
+ let mode = match value {
698
+ "off" => None ,
699
+ "true" => Some ( ReplicationMode :: Physical ) ,
700
+ "database" => Some ( ReplicationMode :: Logical ) ,
701
+ _ => return Err ( Error :: config_parse ( Box :: new ( InvalidValue ( "replication" ) ) ) ) ,
702
+ } ;
703
+ if let Some ( mode) = mode {
704
+ self . replication_mode ( mode) ;
705
+ }
706
+ }
663
707
key => {
664
708
return Err ( Error :: config_parse ( Box :: new ( UnknownOption (
665
709
key. to_string ( ) ,
@@ -744,6 +788,7 @@ impl fmt::Debug for Config {
744
788
config_dbg
745
789
. field ( "target_session_attrs" , & self . target_session_attrs )
746
790
. field ( "channel_binding" , & self . channel_binding )
791
+ . field ( "replication" , & self . replication_mode )
747
792
. finish ( )
748
793
}
749
794
}
0 commit comments