@@ -302,8 +302,6 @@ pub struct General {
302302 pub auth_query : Option < String > ,
303303 pub auth_query_user : Option < String > ,
304304 pub auth_query_password : Option < String > ,
305-
306- pub query_router_plugins : Option < Vec < String > > ,
307305}
308306
309307impl General {
@@ -404,7 +402,6 @@ impl Default for General {
404402 auth_query_user : None ,
405403 auth_query_password : None ,
406404 server_lifetime : 1000 * 3600 * 24 , // 24 hours,
407- query_router_plugins : None ,
408405 }
409406 }
410407}
@@ -682,6 +679,55 @@ impl Default for Shard {
682679 }
683680}
684681
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+
685731/// Configuration wrapper.
686732#[ derive( Serialize , Deserialize , Debug , Clone , PartialEq ) ]
687733pub struct Config {
@@ -700,6 +746,7 @@ pub struct Config {
700746 pub path : String ,
701747
702748 pub general : General ,
749+ pub plugins : Option < Plugins > ,
703750 pub pools : HashMap < String , Pool > ,
704751}
705752
@@ -737,6 +784,7 @@ impl Default for Config {
737784 path : Self :: default_path ( ) ,
738785 general : General :: default ( ) ,
739786 pools : HashMap :: default ( ) ,
787+ plugins : None ,
740788 }
741789 }
742790}
@@ -1128,25 +1176,26 @@ pub async fn parse(path: &str) -> Result<(), Error> {
11281176
11291177pub async fn reload_config ( client_server_map : ClientServerMap ) -> Result < bool , Error > {
11301178 let old_config = get_config ( ) ;
1179+
11311180 match parse ( & old_config. path ) . await {
11321181 Ok ( ( ) ) => ( ) ,
11331182 Err ( err) => {
11341183 error ! ( "Config reload error: {:?}" , err) ;
11351184 return Err ( Error :: BadConfig ) ;
11361185 }
11371186 } ;
1187+
11381188 let new_config = get_config ( ) ;
1189+
11391190 match CachedResolver :: from_config ( ) . await {
11401191 Ok ( _) => ( ) ,
11411192 Err ( err) => error ! ( "DNS cache reinitialization error: {:?}" , err) ,
11421193 } ;
11431194
1144- if old_config. pools != new_config. pools {
1145- info ! ( "Pool configuration changed" ) ;
1195+ if old_config != new_config {
1196+ info ! ( "Config changed, reloading " ) ;
11461197 ConnectionPool :: from_config ( client_server_map) . await ?;
11471198 Ok ( true )
1148- } else if old_config != new_config {
1149- Ok ( true )
11501199 } else {
11511200 Ok ( false )
11521201 }
0 commit comments