@@ -21,7 +21,6 @@ import (
21
21
)
22
22
23
23
import (
24
- "github.com/golang-migrate/migrate/v4"
25
24
"github.com/golang-migrate/migrate/v4/database"
26
25
)
27
26
@@ -98,43 +97,35 @@ func WithInstance(instance *sql.DB, config *Config) (database.Driver, error) {
98
97
return mx , nil
99
98
}
100
99
101
- // urlToMySQLConfig takes a net/url URL and returns a go-sql-driver/mysql Config.
102
- // Manually sets username and password to avoid net/url from url-encoding the reserved URL characters
103
- func urlToMySQLConfig (u nurl.URL ) (* mysql.Config , error ) {
104
- origUserInfo := u .User
105
- u .User = nil
106
-
107
- c , err := mysql .ParseDSN (strings .TrimPrefix (u .String (), "mysql://" ))
100
+ func urlToMySQLConfig (url string ) (* mysql.Config , error ) {
101
+ config , err := mysql .ParseDSN (strings .TrimPrefix (url , "mysql://" ))
108
102
if err != nil {
109
103
return nil , err
110
104
}
111
- if origUserInfo != nil {
112
- c .User = origUserInfo .Username ()
113
- if p , ok := origUserInfo .Password (); ok {
114
- c .Passwd = p
115
- }
116
- }
117
- return c , nil
118
- }
119
105
120
- func (m * Mysql ) Open (url string ) (database.Driver , error ) {
121
- purl , err := nurl .Parse (url )
106
+ config .MultiStatements = true
107
+
108
+ // Keep backwards compatibility from when we used net/url.Parse() to parse the DSN.
109
+ // net/url.Parse() would automatically unescape it for us.
110
+ // See: https://play.golang.org/p/q9j1io-YICQ
111
+ user , err := nurl .QueryUnescape (config .User )
122
112
if err != nil {
123
113
return nil , err
124
114
}
115
+ config .User = user
125
116
126
- q := purl . Query ( )
127
- q . Set ( "multiStatements" , "true" )
128
- purl . RawQuery = q . Encode ()
129
-
130
- migrationsTable := purl . Query (). Get ( "x-migrations-table" )
117
+ password , err := nurl . QueryUnescape ( config . Passwd )
118
+ if err != nil {
119
+ return nil , err
120
+ }
121
+ config . Passwd = password
131
122
132
123
// use custom TLS?
133
- ctls := purl . Query (). Get ( "tls" )
124
+ ctls := config . TLSConfig
134
125
if len (ctls ) > 0 {
135
126
if _ , isBool := readBool (ctls ); ! isBool && strings .ToLower (ctls ) != "skip-verify" {
136
127
rootCertPool := x509 .NewCertPool ()
137
- pem , err := ioutil .ReadFile (purl . Query (). Get ( "x-tls-ca" ) )
128
+ pem , err := ioutil .ReadFile (config . Params [ "x-tls-ca" ] )
138
129
if err != nil {
139
130
return nil , err
140
131
}
@@ -144,7 +135,7 @@ func (m *Mysql) Open(url string) (database.Driver, error) {
144
135
}
145
136
146
137
clientCert := make ([]tls.Certificate , 0 , 1 )
147
- if ccert , ckey := purl . Query (). Get ( "x-tls-cert" ), purl . Query (). Get ( "x-tls-key" ) ; ccert != "" || ckey != "" {
138
+ if ccert , ckey := config . Params [ "x-tls-cert" ], config . Params [ "x-tls-key" ] ; ccert != "" || ckey != "" {
148
139
if ccert == "" || ckey == "" {
149
140
return nil , ErrTLSCertKeyConfig
150
141
}
@@ -156,8 +147,8 @@ func (m *Mysql) Open(url string) (database.Driver, error) {
156
147
}
157
148
158
149
insecureSkipVerify := false
159
- if len (purl . Query (). Get ( "x-tls-insecure-skip-verify" ) ) > 0 {
160
- x , err := strconv .ParseBool (purl . Query (). Get ( "x-tls-insecure-skip-verify" ) )
150
+ if len (config . Params [ "x-tls-insecure-skip-verify" ] ) > 0 {
151
+ x , err := strconv .ParseBool (config . Params [ "x-tls-insecure-skip-verify" ] )
161
152
if err != nil {
162
153
return nil , err
163
154
}
@@ -175,18 +166,23 @@ func (m *Mysql) Open(url string) (database.Driver, error) {
175
166
}
176
167
}
177
168
178
- c , err := urlToMySQLConfig (* migrate .FilterCustomQuery (purl ))
169
+ return config , nil
170
+ }
171
+
172
+ func (m * Mysql ) Open (url string ) (database.Driver , error ) {
173
+ config , err := urlToMySQLConfig (url )
179
174
if err != nil {
180
175
return nil , err
181
176
}
182
- db , err := sql .Open ("mysql" , c .FormatDSN ())
177
+
178
+ db , err := sql .Open ("mysql" , config .FormatDSN ())
183
179
if err != nil {
184
180
return nil , err
185
181
}
186
182
187
183
mx , err := WithInstance (db , & Config {
188
- DatabaseName : purl . Path ,
189
- MigrationsTable : migrationsTable ,
184
+ DatabaseName : config . DBName ,
185
+ MigrationsTable : config . Params [ "x-migrations-table" ] ,
190
186
})
191
187
if err != nil {
192
188
return nil , err
0 commit comments