@@ -74,11 +74,11 @@ where
74
74
}
75
75
"PAUSE" => {
76
76
trace ! ( "PAUSE" ) ;
77
- pause ( stream, query_parts[ 1 ] ) . await
77
+ pause ( stream, query_parts) . await
78
78
}
79
79
"RESUME" => {
80
80
trace ! ( "RESUME" ) ;
81
- resume ( stream, query_parts[ 1 ] ) . await
81
+ resume ( stream, query_parts) . await
82
82
}
83
83
"SHUTDOWN" => {
84
84
trace ! ( "SHUTDOWN" ) ;
@@ -797,96 +797,128 @@ where
797
797
}
798
798
799
799
/// Pause a pool. It won't pass any more queries to the backends.
800
- async fn pause < T > ( stream : & mut T , query : & str ) -> Result < ( ) , Error >
800
+ async fn pause < T > ( stream : & mut T , tokens : Vec < & str > ) -> Result < ( ) , Error >
801
801
where
802
802
T : tokio:: io:: AsyncWrite + std:: marker:: Unpin ,
803
803
{
804
- let parts: Vec < & str > = query. split ( "," ) . map ( |part| part. trim ( ) ) . collect ( ) ;
805
-
806
- if parts. len ( ) != 2 {
807
- error_response (
808
- stream,
809
- "PAUSE requires a database and a user, e.g. PAUSE my_db,my_user" ,
810
- )
811
- . await
812
- } else {
813
- let database = parts[ 0 ] ;
814
- let user = parts[ 1 ] ;
815
-
816
- match get_pool ( database, user) {
817
- Some ( pool) => {
818
- pool. pause ( ) ;
804
+ let parts: Vec < & str > = match tokens. len ( ) == 2 {
805
+ true => tokens[ 1 ] . split ( "," ) . map ( |part| part. trim ( ) ) . collect ( ) ,
806
+ false => Vec :: new ( ) ,
807
+ } ;
819
808
820
- let mut res = BytesMut :: new ( ) ;
809
+ match parts. len ( ) {
810
+ 0 => {
811
+ for ( _, pool) in get_all_pools ( ) {
812
+ pool. pause ( ) ;
813
+ }
821
814
822
- res. put ( command_complete ( & format ! ( "PAUSE {},{}" , database , user ) ) ) ;
815
+ let mut res = BytesMut :: new ( ) ;
823
816
824
- // ReadyForQuery
825
- res. put_u8 ( b'Z' ) ;
826
- res. put_i32 ( 5 ) ;
827
- res. put_u8 ( b'I' ) ;
817
+ res. put ( command_complete ( "PAUSE" ) ) ;
828
818
829
- write_all_half ( stream, & res) . await
830
- }
819
+ // ReadyForQuery
820
+ res. put_u8 ( b'Z' ) ;
821
+ res. put_i32 ( 5 ) ;
822
+ res. put_u8 ( b'I' ) ;
831
823
832
- None => {
833
- error_response (
834
- stream,
835
- & format ! (
836
- "No pool configured for database: {}, user: {}" ,
837
- database, user
838
- ) ,
839
- )
840
- . await
824
+ write_all_half ( stream, & res) . await
825
+ }
826
+ 2 => {
827
+ let database = parts[ 0 ] ;
828
+ let user = parts[ 1 ] ;
829
+
830
+ match get_pool ( database, user) {
831
+ Some ( pool) => {
832
+ pool. pause ( ) ;
833
+
834
+ let mut res = BytesMut :: new ( ) ;
835
+
836
+ res. put ( command_complete ( & format ! ( "PAUSE {},{}" , database, user) ) ) ;
837
+
838
+ // ReadyForQuery
839
+ res. put_u8 ( b'Z' ) ;
840
+ res. put_i32 ( 5 ) ;
841
+ res. put_u8 ( b'I' ) ;
842
+
843
+ write_all_half ( stream, & res) . await
844
+ }
845
+
846
+ None => {
847
+ error_response (
848
+ stream,
849
+ & format ! (
850
+ "No pool configured for database: {}, user: {}" ,
851
+ database, user
852
+ ) ,
853
+ )
854
+ . await
855
+ }
841
856
}
842
857
}
858
+ _ => error_response ( stream, "usage: PAUSE [db, user]" ) . await ,
843
859
}
844
860
}
845
861
846
862
/// Resume a pool. Queries are allowed again.
847
- async fn resume < T > ( stream : & mut T , query : & str ) -> Result < ( ) , Error >
863
+ async fn resume < T > ( stream : & mut T , tokens : Vec < & str > ) -> Result < ( ) , Error >
848
864
where
849
865
T : tokio:: io:: AsyncWrite + std:: marker:: Unpin ,
850
866
{
851
- let parts: Vec < & str > = query. split ( "," ) . map ( |part| part. trim ( ) ) . collect ( ) ;
852
-
853
- if parts. len ( ) != 2 {
854
- error_response (
855
- stream,
856
- "RESUME requires a database and a user, e.g. RESUME my_db,my_user" ,
857
- )
858
- . await
859
- } else {
860
- let database = parts[ 0 ] ;
861
- let user = parts[ 1 ] ;
862
-
863
- match get_pool ( database, user) {
864
- Some ( pool) => {
865
- pool. resume ( ) ;
867
+ let parts: Vec < & str > = match tokens. len ( ) == 2 {
868
+ true => tokens[ 1 ] . split ( "," ) . map ( |part| part. trim ( ) ) . collect ( ) ,
869
+ false => Vec :: new ( ) ,
870
+ } ;
866
871
867
- let mut res = BytesMut :: new ( ) ;
872
+ match parts. len ( ) {
873
+ 0 => {
874
+ for ( _, pool) in get_all_pools ( ) {
875
+ pool. resume ( ) ;
876
+ }
868
877
869
- res. put ( command_complete ( & format ! ( "RESUME {},{}" , database , user ) ) ) ;
878
+ let mut res = BytesMut :: new ( ) ;
870
879
871
- // ReadyForQuery
872
- res. put_u8 ( b'Z' ) ;
873
- res. put_i32 ( 5 ) ;
874
- res. put_u8 ( b'I' ) ;
880
+ res. put ( command_complete ( "RESUME" ) ) ;
875
881
876
- write_all_half ( stream, & res) . await
877
- }
882
+ // ReadyForQuery
883
+ res. put_u8 ( b'Z' ) ;
884
+ res. put_i32 ( 5 ) ;
885
+ res. put_u8 ( b'I' ) ;
878
886
879
- None => {
880
- error_response (
881
- stream,
882
- & format ! (
883
- "No pool configured for database: {}, user: {}" ,
884
- database, user
885
- ) ,
886
- )
887
- . await
887
+ write_all_half ( stream, & res) . await
888
+ }
889
+ 2 => {
890
+ let database = parts[ 0 ] ;
891
+ let user = parts[ 1 ] ;
892
+
893
+ match get_pool ( database, user) {
894
+ Some ( pool) => {
895
+ pool. resume ( ) ;
896
+
897
+ let mut res = BytesMut :: new ( ) ;
898
+
899
+ res. put ( command_complete ( & format ! ( "RESUME {},{}" , database, user) ) ) ;
900
+
901
+ // ReadyForQuery
902
+ res. put_u8 ( b'Z' ) ;
903
+ res. put_i32 ( 5 ) ;
904
+ res. put_u8 ( b'I' ) ;
905
+
906
+ write_all_half ( stream, & res) . await
907
+ }
908
+
909
+ None => {
910
+ error_response (
911
+ stream,
912
+ & format ! (
913
+ "No pool configured for database: {}, user: {}" ,
914
+ database, user
915
+ ) ,
916
+ )
917
+ . await
918
+ }
888
919
}
889
920
}
921
+ _ => error_response ( stream, "usage: RESUME [db, user]" ) . await ,
890
922
}
891
923
}
892
924
0 commit comments