@@ -302,8 +302,6 @@ pub struct General {
302
302
pub auth_query : Option < String > ,
303
303
pub auth_query_user : Option < String > ,
304
304
pub auth_query_password : Option < String > ,
305
-
306
- pub query_router_plugins : Option < Vec < String > > ,
307
305
}
308
306
309
307
impl General {
@@ -404,7 +402,6 @@ impl Default for General {
404
402
auth_query_user : None ,
405
403
auth_query_password : None ,
406
404
server_lifetime : 1000 * 3600 * 24 , // 24 hours,
407
- query_router_plugins : None ,
408
405
}
409
406
}
410
407
}
@@ -682,6 +679,55 @@ impl Default for Shard {
682
679
}
683
680
}
684
681
682
+ #[ derive( Serialize , Deserialize , Debug , Clone , PartialEq , Default ) ]
683
+ pub struct Plugins {
684
+ pub intercept : Option < Intercept > ,
685
+ pub table_access : Option < TableAccess > ,
686
+ pub query_logger : Option < QueryLogger > ,
687
+ }
688
+
689
+ #[ derive( Serialize , Deserialize , Debug , Clone , PartialEq , Default ) ]
690
+ pub struct Intercept {
691
+ pub enabled : bool ,
692
+ pub queries : BTreeMap < String , Query > ,
693
+ }
694
+
695
+ #[ derive( Serialize , Deserialize , Debug , Clone , PartialEq , Default ) ]
696
+ pub struct TableAccess {
697
+ pub enabled : bool ,
698
+ pub tables : Vec < String > ,
699
+ }
700
+
701
+ #[ derive( Serialize , Deserialize , Debug , Clone , PartialEq , Default ) ]
702
+ pub struct QueryLogger {
703
+ pub enabled : bool ,
704
+ }
705
+
706
+ impl Intercept {
707
+ pub fn substitute ( & mut self , db : & str , user : & str ) {
708
+ for ( _, query) in self . queries . iter_mut ( ) {
709
+ query. substitute ( db, user) ;
710
+ }
711
+ }
712
+ }
713
+
714
+ #[ derive( Serialize , Deserialize , Debug , Clone , PartialEq , Default ) ]
715
+ pub struct Query {
716
+ pub query : String ,
717
+ pub schema : Vec < Vec < String > > ,
718
+ pub result : Vec < Vec < String > > ,
719
+ }
720
+
721
+ impl Query {
722
+ pub fn substitute ( & mut self , db : & str , user : & str ) {
723
+ for col in self . result . iter_mut ( ) {
724
+ for i in 0 ..col. len ( ) {
725
+ col[ i] = col[ i] . replace ( "${USER}" , user) . replace ( "${DATABASE}" , db) ;
726
+ }
727
+ }
728
+ }
729
+ }
730
+
685
731
/// Configuration wrapper.
686
732
#[ derive( Serialize , Deserialize , Debug , Clone , PartialEq ) ]
687
733
pub struct Config {
@@ -700,6 +746,7 @@ pub struct Config {
700
746
pub path : String ,
701
747
702
748
pub general : General ,
749
+ pub plugins : Option < Plugins > ,
703
750
pub pools : HashMap < String , Pool > ,
704
751
}
705
752
@@ -737,6 +784,7 @@ impl Default for Config {
737
784
path : Self :: default_path ( ) ,
738
785
general : General :: default ( ) ,
739
786
pools : HashMap :: default ( ) ,
787
+ plugins : None ,
740
788
}
741
789
}
742
790
}
@@ -1128,25 +1176,26 @@ pub async fn parse(path: &str) -> Result<(), Error> {
1128
1176
1129
1177
pub async fn reload_config ( client_server_map : ClientServerMap ) -> Result < bool , Error > {
1130
1178
let old_config = get_config ( ) ;
1179
+
1131
1180
match parse ( & old_config. path ) . await {
1132
1181
Ok ( ( ) ) => ( ) ,
1133
1182
Err ( err) => {
1134
1183
error ! ( "Config reload error: {:?}" , err) ;
1135
1184
return Err ( Error :: BadConfig ) ;
1136
1185
}
1137
1186
} ;
1187
+
1138
1188
let new_config = get_config ( ) ;
1189
+
1139
1190
match CachedResolver :: from_config ( ) . await {
1140
1191
Ok ( _) => ( ) ,
1141
1192
Err ( err) => error ! ( "DNS cache reinitialization error: {:?}" , err) ,
1142
1193
} ;
1143
1194
1144
- if old_config. pools != new_config. pools {
1145
- info ! ( "Pool configuration changed" ) ;
1195
+ if old_config != new_config {
1196
+ info ! ( "Config changed, reloading " ) ;
1146
1197
ConnectionPool :: from_config ( client_server_map) . await ?;
1147
1198
Ok ( true )
1148
- } else if old_config != new_config {
1149
- Ok ( true )
1150
1199
} else {
1151
1200
Ok ( false )
1152
1201
}
0 commit comments