@@ -55,11 +55,15 @@ pub struct HandlerFactory {
5555}
5656
5757impl HandlerFactory {
58- pub fn new ( session_context : Arc < SessionContext > , auth_manager : Arc < AuthManager > ) -> Self {
58+ pub fn new (
59+ session_context : Arc < SessionContext > ,
60+ auth_manager : Arc < AuthManager > ,
61+ query_hooks : Vec < Arc < dyn QueryHook > > ,
62+ ) -> Self {
5963 let session_service = Arc :: new ( DfSessionService :: new (
6064 session_context,
6165 auth_manager. clone ( ) ,
62- None ,
66+ query_hooks ,
6367 ) ) ;
6468 HandlerFactory { session_service }
6569 }
@@ -100,14 +104,14 @@ pub struct DfSessionService {
100104 parser : Arc < Parser > ,
101105 timezone : Arc < Mutex < String > > ,
102106 auth_manager : Arc < AuthManager > ,
103- query_hook : Option < Arc < dyn QueryHook > > ,
107+ query_hooks : Vec < Arc < dyn QueryHook > > ,
104108}
105109
106110impl DfSessionService {
107111 pub fn new (
108112 session_context : Arc < SessionContext > ,
109113 auth_manager : Arc < AuthManager > ,
110- query_hook : Option < Arc < dyn QueryHook > > ,
114+ query_hooks : Vec < Arc < dyn QueryHook > > ,
111115 ) -> DfSessionService {
112116 let parser = Arc :: new ( Parser {
113117 session_context : session_context. clone ( ) ,
@@ -118,7 +122,7 @@ impl DfSessionService {
118122 parser,
119123 timezone : Arc :: new ( Mutex :: new ( "UTC" . to_string ( ) ) ) ,
120124 auth_manager,
121- query_hook ,
125+ query_hooks ,
122126 }
123127 }
124128
@@ -484,8 +488,8 @@ impl SimpleQueryHandler for DfSessionService {
484488 self . check_query_permission ( client, & query) . await ?;
485489 }
486490
487- // Call query hook with the parsed statement
488- if let Some ( hook) = & self . query_hook {
491+ // Call query hooks with the parsed statement
492+ for hook in & self . query_hooks {
489493 let wrapped_statement = Statement :: Statement ( Box :: new ( statement. clone ( ) ) ) ;
490494 if let Some ( result) = hook
491495 . handle_query ( & wrapped_statement, & self . session_context , client)
@@ -637,8 +641,8 @@ impl ExtendedQueryHandler for DfSessionService {
637641 . to_string ( ) ;
638642 log:: debug!( "Received execute extended query: {query}" ) ; // Log for debugging
639643
640- // Check query hook first
641- if let Some ( hook) = & self . query_hook {
644+ // Check query hooks first
645+ for hook in & self . query_hooks {
642646 // Parse the SQL to get the Statement for the hook
643647 let sql = & portal. statement . statement . 0 ;
644648 let statements = self
@@ -961,7 +965,7 @@ mod tests {
961965 async fn test_statement_timeout_set_and_show ( ) {
962966 let session_context = Arc :: new ( SessionContext :: new ( ) ) ;
963967 let auth_manager = Arc :: new ( AuthManager :: new ( ) ) ;
964- let service = DfSessionService :: new ( session_context, auth_manager) ;
968+ let service = DfSessionService :: new ( session_context, auth_manager, vec ! [ ] ) ;
965969 let mut client = MockClient :: new ( ) ;
966970
967971 // Test setting timeout to 5000ms
@@ -987,7 +991,7 @@ mod tests {
987991 async fn test_statement_timeout_disable ( ) {
988992 let session_context = Arc :: new ( SessionContext :: new ( ) ) ;
989993 let auth_manager = Arc :: new ( AuthManager :: new ( ) ) ;
990- let service = DfSessionService :: new ( session_context, auth_manager) ;
994+ let service = DfSessionService :: new ( session_context, auth_manager, vec ! [ ] ) ;
991995 let mut client = MockClient :: new ( ) ;
992996
993997 // Set timeout first
0 commit comments