@@ -695,6 +695,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, get_updated_connect_flags)(MYSQLND_CONN_DATA *
695
695
/* {{{ mysqlnd_conn_data::connect_handshake */
696
696
static enum_func_status
697
697
MYSQLND_METHOD (mysqlnd_conn_data , connect_handshake )(MYSQLND_CONN_DATA * conn ,
698
+ const MYSQLND_CSTRING * const scheme ,
698
699
const MYSQLND_CSTRING * const username ,
699
700
const MYSQLND_CSTRING * const password ,
700
701
const MYSQLND_CSTRING * const database ,
@@ -704,7 +705,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, connect_handshake)(MYSQLND_CONN_DATA * conn,
704
705
size_t client_flags = mysql_flags ;
705
706
DBG_ENTER ("mysqlnd_conn_data::connect_handshake" );
706
707
707
- if (FAIL == conn -> net -> data -> m .connect_ex (conn -> net , conn -> scheme , conn -> persistent , conn -> stats , conn -> error_info )) {
708
+ if (FAIL == conn -> net -> data -> m .connect_ex (conn -> net , * scheme , conn -> persistent , conn -> stats , conn -> error_info )) {
708
709
DBG_RETURN (FAIL );
709
710
} else {
710
711
struct st_mysqlnd_protocol_command * command = conn -> command_factory (COM_HANDSHAKE , conn , username , password , database , client_flags );
@@ -717,6 +718,42 @@ MYSQLND_METHOD(mysqlnd_conn_data, connect_handshake)(MYSQLND_CONN_DATA * conn,
717
718
}
718
719
/* }}} */
719
720
721
+ /* {{{ mysqlnd_conn_data::connect */
722
+ static MYSQLND_STRING
723
+ MYSQLND_METHOD (mysqlnd_conn_data , get_scheme )(MYSQLND_CONN_DATA * conn , MYSQLND_CSTRING hostname , MYSQLND_CSTRING socket_or_pipe , unsigned int port , zend_bool * unix_socket , zend_bool * named_pipe )
724
+ {
725
+ MYSQLND_STRING transport ;
726
+ DBG_ENTER ("mysqlnd_conn_data::get_scheme" );
727
+ #ifndef PHP_WIN32
728
+ if (hostname .l == sizeof ("localhost" ) - 1 && !strncasecmp (hostname .s , "localhost" , hostname .l )) {
729
+ DBG_INF_FMT ("socket=%s" , socket_or_pipe .s ? socket_or_pipe .s :"n/a" );
730
+ if (!socket_or_pipe .s ) {
731
+ socket_or_pipe .s = "/tmp/mysql.sock" ;
732
+ socket_or_pipe .l = strlen (socket_or_pipe .s );
733
+ }
734
+ transport .l = mnd_sprintf (& transport .s , 0 , "unix://%s" , socket_or_pipe .s );
735
+ * unix_socket = TRUE;
736
+ #else
737
+ if (hostname .l == sizeof ("." ) - 1 && hostname .s [0 ] == '.' ) {
738
+ /* named pipe in socket */
739
+ if (!socket_or_pipe .s ) {
740
+ socket_or_pipe .s = "\\\\.\\pipe\\MySQL" ;
741
+ socket_or_pipe .l = strlen (socket_or_pipe .s );
742
+ }
743
+ transport .l = mnd_sprintf (& transport .s , 0 , "pipe://%s" , socket_or_pipe .s );
744
+ * named_pipe = TRUE;
745
+ #endif
746
+ } else {
747
+ if (!port ) {
748
+ port = 3306 ;
749
+ }
750
+ transport .l = mnd_sprintf (& transport .s , 0 , "tcp://%s:%u" , hostname .s , port );
751
+ }
752
+ DBG_INF_FMT ("transport=%s" , transport .s ? transport .s :"OOM" );
753
+ DBG_RETURN (transport );
754
+ }
755
+ /* }}} */
756
+
720
757
721
758
/* {{{ mysqlnd_conn_data::connect */
722
759
static enum_func_status
@@ -737,6 +774,9 @@ MYSQLND_METHOD(mysqlnd_conn_data, connect)(MYSQLND_CONN_DATA * conn,
737
774
zend_bool saved_compression = FALSE;
738
775
zend_bool local_tx_started = FALSE;
739
776
MYSQLND_NET * net = conn -> net ;
777
+ MYSQLND_STRING transport = { NULL , 0 };
778
+ // char * transport = NULL;
779
+ // int transport_len;
740
780
741
781
DBG_ENTER ("mysqlnd_conn_data::connect" );
742
782
DBG_INF_FMT ("conn=%p" , conn );
@@ -803,53 +843,13 @@ MYSQLND_METHOD(mysqlnd_conn_data, connect)(MYSQLND_CONN_DATA * conn,
803
843
mysql_flags |= CLIENT_CONNECT_WITH_DB ;
804
844
}
805
845
806
- {
807
- char * transport = NULL ;
808
- int transport_len ;
809
- #ifndef PHP_WIN32
810
- if (hostname .l == sizeof ("localhost" ) - 1 && !strncasecmp (hostname .s , "localhost" , hostname .l )) {
811
- DBG_INF_FMT ("socket=%s" , socket_or_pipe .s ? socket_or_pipe .s :"n/a" );
812
- if (!socket_or_pipe .s ) {
813
- socket_or_pipe .s = "/tmp/mysql.sock" ;
814
- socket_or_pipe .l = strlen (socket_or_pipe .s );
815
- }
816
- transport_len = mnd_sprintf (& transport , 0 , "unix://%s" , socket_or_pipe .s );
817
- unix_socket = TRUE;
818
- #else
819
- if (hostname .l == sizeof ("." ) - 1 && hostname .s [0 ] == '.' ) {
820
- /* named pipe in socket */
821
- if (!socket_or_pipe .s ) {
822
- socket_or_pipe .s = "\\\\.\\pipe\\MySQL" ;
823
- socket_or_pipe .l = strlen (socket_or_pipe .s );
824
- }
825
- transport_len = mnd_sprintf (& transport , 0 , "pipe://%s" , socket_or_pipe .s );
826
- named_pipe = TRUE;
827
- #endif
828
- } else {
829
- if (!port ) {
830
- port = 3306 ;
831
- }
832
- transport_len = mnd_sprintf (& transport , 0 , "tcp://%s:%u" , hostname .s , port );
833
- }
834
- if (!transport ) {
835
- SET_OOM_ERROR (conn -> error_info );
836
- goto err ; /* OOM */
837
- }
838
- DBG_INF_FMT ("transport=%s conn->scheme=%s" , transport , conn -> scheme .s );
839
- conn -> scheme .s = mnd_pestrndup (transport , transport_len , conn -> persistent );
840
- conn -> scheme .l = transport_len ;
841
- mnd_sprintf_free (transport );
842
- transport = NULL ;
843
- if (!conn -> scheme .s ) {
844
- goto err ; /* OOM */
845
- }
846
- }
846
+ transport = conn -> m -> get_scheme (conn , hostname , socket_or_pipe , port , & unix_socket , & named_pipe );
847
847
848
848
mysql_flags = conn -> m -> get_updated_connect_flags (conn , mysql_flags );
849
849
850
850
{
851
-
852
- if (FAIL == conn -> m -> connect_handshake (conn , & username , & password , & database , mysql_flags )) {
851
+ const MYSQLND_CSTRING scheme = { transport . s , transport . l };
852
+ if (FAIL == conn -> m -> connect_handshake (conn , & scheme , & username , & password , & database , mysql_flags )) {
853
853
goto err ;
854
854
}
855
855
}
@@ -867,6 +867,18 @@ MYSQLND_METHOD(mysqlnd_conn_data, connect)(MYSQLND_CONN_DATA * conn,
867
867
*/
868
868
net -> data -> compressed = mysql_flags & CLIENT_COMPRESS ? TRUE:FALSE;
869
869
870
+
871
+ conn -> scheme .s = mnd_pestrndup (transport .s , transport .l , conn -> persistent );
872
+ conn -> scheme .l = transport .l ;
873
+ if (transport .s ) {
874
+ mnd_sprintf_free (transport .s );
875
+ transport .s = NULL ;
876
+ }
877
+
878
+ if (!conn -> scheme .s ) {
879
+ goto err ; /* OOM */
880
+ }
881
+
870
882
conn -> user_len = username .l ;
871
883
conn -> user = mnd_pestrndup (username .s , conn -> user_len , conn -> persistent );
872
884
conn -> passwd = mnd_pestrndup (password .s , password .l , conn -> persistent );
@@ -952,6 +964,10 @@ MYSQLND_METHOD(mysqlnd_conn_data, connect)(MYSQLND_CONN_DATA * conn,
952
964
DBG_RETURN (PASS );
953
965
}
954
966
err :
967
+ if (transport .s ) {
968
+ mnd_sprintf_free (transport .s );
969
+ transport .s = NULL ;
970
+ }
955
971
956
972
DBG_ERR_FMT ("[%u] %.128s (trying to connect via %s)" , conn -> error_info -> error_no , conn -> error_info -> error , conn -> scheme .s );
957
973
if (!conn -> error_info -> error_no ) {
@@ -2810,7 +2826,9 @@ MYSQLND_CLASS_METHODS_START(mysqlnd_conn_data)
2810
2826
MYSQLND_METHOD (mysqlnd_conn_data , set_client_option_2d ),
2811
2827
2812
2828
MYSQLND_METHOD (mysqlnd_conn_data , negotiate_client_api_capabilities ),
2813
- MYSQLND_METHOD (mysqlnd_conn_data , get_client_api_capabilities )
2829
+ MYSQLND_METHOD (mysqlnd_conn_data , get_client_api_capabilities ),
2830
+
2831
+ MYSQLND_METHOD (mysqlnd_conn_data , get_scheme )
2814
2832
MYSQLND_CLASS_METHODS_END ;
2815
2833
2816
2834
0 commit comments