@@ -80,7 +80,11 @@ func (m *MySQLDriver) Assemble(config drivers.Config) (dbinfo *drivers.DBInfo, e
8080 dbname := config .MustString (drivers .ConfigDBName )
8181 host := config .MustString (drivers .ConfigHost )
8282 port := config .DefaultInt (drivers .ConfigPort , 3306 )
83- sslmode := config .DefaultString (drivers .ConfigSSLMode , "true" )
83+ unixSocket := config .DefaultString (drivers .ConfigUnixSocket , "" )
84+ // mysql ssl mode
85+ // see https://dev.mysql.com/doc/refman/5.7/en/connection-options.html#option_general_ssl-mode
86+ // could be one of PREFERRED, REQUIRED, VERIFY_CA, VERIFY_IDENTITY
87+ sslMode := config .DefaultString (drivers .ConfigSSLMode , "true" )
8488
8589 schema := dbname
8690 whitelist , _ := config .StringSlice (drivers .ConfigWhitelist )
@@ -96,7 +100,13 @@ func (m *MySQLDriver) Assemble(config drivers.Config) (dbinfo *drivers.DBInfo, e
96100
97101 m .addEnumTypes , _ = config [drivers .ConfigAddEnumTypes ].(bool )
98102 m .enumNullPrefix = strmangle .TitleCase (config .DefaultString (drivers .ConfigEnumNullPrefix , "Null" ))
99- m .connStr = MySQLBuildQueryString (user , pass , dbname , host , port , sslmode )
103+
104+ if unixSocket != "" {
105+ m .connStr = MySQLBuildQueryStringUnixSocket (user , pass , dbname , unixSocket , sslMode )
106+ } else {
107+ m .connStr = MySQLBuildQueryString (user , pass , dbname , host , port , sslMode )
108+ }
109+
100110 m .configForeignKeys = config .MustForeignKeys (drivers .ConfigForeignKeys )
101111 m .conn , err = sql .Open ("mysql" , m .connStr )
102112 if err != nil {
@@ -128,8 +138,26 @@ func (m *MySQLDriver) Assemble(config drivers.Config) (dbinfo *drivers.DBInfo, e
128138 return dbinfo , err
129139}
130140
141+ func MySQLBuildQueryStringUnixSocket (user , pass , dbname , unixSocket string , sslMode string ) string {
142+ config := mysql .NewConfig ()
143+
144+ config .User = user
145+ if len (pass ) != 0 {
146+ config .Passwd = pass
147+ }
148+ config .DBName = dbname
149+ config .Net = "unix"
150+ config .Addr = unixSocket
151+ config .TLSConfig = sslMode
152+
153+ // MySQL is a bad, and by default reads date/datetime into a []byte
154+ // instead of a time.Time. Tell it to stop being a bad.
155+ config .ParseTime = true
156+ return config .FormatDSN ()
157+ }
158+
131159// MySQLBuildQueryString builds a query string for MySQL.
132- func MySQLBuildQueryString (user , pass , dbname , host string , port int , sslmode string ) string {
160+ func MySQLBuildQueryString (user , pass , dbname , host string , port int , sslMode string ) string {
133161 config := mysql .NewConfig ()
134162
135163 config .User = user
@@ -143,7 +171,7 @@ func MySQLBuildQueryString(user, pass, dbname, host string, port int, sslmode st
143171 port = 3306
144172 }
145173 config .Addr += ":" + strconv .Itoa (port )
146- config .TLSConfig = sslmode
174+ config .TLSConfig = sslMode
147175
148176 // MySQL is a bad, and by default reads date/datetime into a []byte
149177 // instead of a time.Time. Tell it to stop being a bad.
0 commit comments