@@ -31,7 +31,6 @@ import (
3131 "database/sql/driver"
3232 "fmt"
3333 "net/url"
34- "strings"
3534 "sync/atomic"
3635
3736 "github.com/XSAM/otelsql"
@@ -67,35 +66,25 @@ func (uo *URLOpener) OpenMySQLURL(ctx context.Context, u *url.URL) (*sql.DB, err
6766 if u .Host == "" {
6867 return nil , fmt .Errorf ("open Azure database: empty endpoint" )
6968 }
70- password , _ := u .User .Password ()
69+ cfg , err := cdkmysql .ConfigFromURL (u )
70+ if err != nil {
71+ return nil , fmt .Errorf ("open Azure MySQL: %v" , err )
72+ }
7173 c := & connector {
72- addr : u .Host ,
73- user : u .User .Username (),
74- password : password ,
75- dbName : strings .TrimPrefix (u .Path , "/" ),
76- // Make a copy of TraceOpts to avoid caller modifying.
77- traceOpts : append ([]otelsql.Option (nil ), uo .TraceOpts ... ),
78- provider : source ,
79-
80- sem : make (chan struct {}, 1 ),
81- ready : make (chan struct {}),
74+ cfg : cfg ,
75+ provider : source ,
76+ sem : make (chan struct {}, 1 ),
77+ ready : make (chan struct {}),
8278 }
8379 c .sem <- struct {}{}
84- return sql .OpenDB (c ), nil
80+ return otelsql .OpenDB (c , uo . TraceOpts ... ), nil
8581}
8682
8783type connector struct {
88- addr string
89- user string
90- password string
91- dbName string
92- traceOpts []otelsql.Option
93-
9484 sem chan struct {} // receive to acquire, send to release
9585 provider CertPoolProvider // provides the CA certificate pool
96-
97- ready chan struct {} // closed after writing dsn
98- dsn string
86+ ready chan struct {} // closed after fetching certs successfully
87+ cfg * mysql.Config
9988}
10089
10190func (c * connector ) Connect (ctx context.Context ) (driver.Conn , error ) {
@@ -116,29 +105,23 @@ func (c *connector) Connect(ctx context.Context) (driver.Conn, error) {
116105 c .sem <- struct {}{} // release
117106 return nil , fmt .Errorf ("connect Azure MySql: register TLS: %v" , err )
118107 }
119- cfg := & mysql.Config {
120- Net : "tcp" ,
121- Addr : c .addr ,
122- User : c .user ,
123- Passwd : c .password ,
124- TLSConfig : tlsConfigName ,
125- AllowCleartextPasswords : true ,
126- AllowNativePasswords : true ,
127- DBName : c .dbName ,
128- }
129- c .dsn = cfg .FormatDSN ()
108+ c .cfg .TLSConfig = tlsConfigName
130109 close (c .ready )
131110 // Don't release sem: make it block forever, so this case won't be run again.
132111 case <- c .ready :
133112 // Already succeeded.
134113 case <- ctx .Done ():
135114 return nil , fmt .Errorf ("connect Azure MySql: waiting for certificates: %v" , ctx .Err ())
136115 }
137- return c .Driver ().Open (c .dsn )
116+ inner , err := mysql .NewConnector (c .cfg )
117+ if err != nil {
118+ return nil , fmt .Errorf ("connect Azure MySql: create connector: %v" , err )
119+ }
120+ return inner .Connect (ctx )
138121}
139122
140123func (c * connector ) Driver () driver.Driver {
141- return otelsql . WrapDriver ( mysql.MySQLDriver {}, c . traceOpts ... )
124+ return mysql.MySQLDriver {}
142125}
143126
144127var tlsConfigCounter uint32
0 commit comments