@@ -2,7 +2,9 @@ use crate::config::{Host, TargetSessionAttrs};
22use crate :: connect_raw:: connect_raw;
33use crate :: connect_socket:: connect_socket;
44use crate :: tls:: { MakeTlsConnect , TlsConnect } ;
5- use crate :: { Client , Config , Connection , Error , Socket } ;
5+ use crate :: { Client , Config , Connection , Error , SimpleQueryMessage , Socket } ;
6+ use futures:: TryStreamExt ;
7+ use std:: io;
68
79pub async fn connect < T > (
810 mut tls : T ,
@@ -50,10 +52,27 @@ where
5052 T : TlsConnect < Socket > ,
5153{
5254 let socket = connect_socket ( idx, config) . await ?;
53- let ( client, connection) = connect_raw ( socket, tls, config, Some ( idx) ) . await ?;
55+ let ( mut client, connection) = connect_raw ( socket, tls, config, Some ( idx) ) . await ?;
5456
5557 if let TargetSessionAttrs :: ReadWrite = config. target_session_attrs {
56- unimplemented ! ( )
58+ let mut rows = client. simple_query ( "SHOW transaction_read_only" ) ;
59+
60+ loop {
61+ match rows. try_next ( ) . await ? {
62+ Some ( SimpleQueryMessage :: Row ( row) ) => {
63+ if row. try_get ( 0 ) ? == Some ( "on" ) {
64+ return Err ( Error :: connect ( io:: Error :: new (
65+ io:: ErrorKind :: PermissionDenied ,
66+ "database does not allow writes" ,
67+ ) ) ) ;
68+ } else {
69+ break ;
70+ }
71+ }
72+ Some ( _) => { }
73+ None => return Err ( Error :: unexpected_message ( ) ) ,
74+ }
75+ }
5776 }
5877
5978 Ok ( ( client, connection) )
0 commit comments