Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feature: add mysql unix socket support #1366

Merged
merged 1 commit into from Mar 19, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
11 changes: 7 additions & 4 deletions drivers/interface.go
Expand Up @@ -22,10 +22,13 @@ const (
ConfigConcurrency = "concurrency"
ConfigForeignKeys = "foreign-keys"

ConfigUser = "user"
ConfigPass = "pass"
ConfigHost = "host"
ConfigPort = "port"
ConfigUser = "user"
ConfigPass = "pass"
ConfigHost = "host"
ConfigPort = "port"

ConfigUnixSocket = "unix-socket"

ConfigDBName = "dbname"
ConfigSSLMode = "sslmode"

Expand Down
36 changes: 32 additions & 4 deletions drivers/sqlboiler-mysql/driver/mysql.go
Expand Up @@ -80,7 +80,11 @@ func (m *MySQLDriver) Assemble(config drivers.Config) (dbinfo *drivers.DBInfo, e
dbname := config.MustString(drivers.ConfigDBName)
host := config.MustString(drivers.ConfigHost)
port := config.DefaultInt(drivers.ConfigPort, 3306)
sslmode := config.DefaultString(drivers.ConfigSSLMode, "true")
unixSocket := config.DefaultString(drivers.ConfigUnixSocket, "")
// mysql ssl mode
// see https://dev.mysql.com/doc/refman/5.7/en/connection-options.html#option_general_ssl-mode
// could be one of PREFERRED, REQUIRED, VERIFY_CA, VERIFY_IDENTITY
sslMode := config.DefaultString(drivers.ConfigSSLMode, "true")

schema := dbname
whitelist, _ := config.StringSlice(drivers.ConfigWhitelist)
Expand All @@ -96,7 +100,13 @@ func (m *MySQLDriver) Assemble(config drivers.Config) (dbinfo *drivers.DBInfo, e

m.addEnumTypes, _ = config[drivers.ConfigAddEnumTypes].(bool)
m.enumNullPrefix = strmangle.TitleCase(config.DefaultString(drivers.ConfigEnumNullPrefix, "Null"))
m.connStr = MySQLBuildQueryString(user, pass, dbname, host, port, sslmode)

if unixSocket != "" {
m.connStr = MySQLBuildQueryStringUnixSocket(user, pass, dbname, unixSocket, sslMode)
} else {
m.connStr = MySQLBuildQueryString(user, pass, dbname, host, port, sslMode)
}

m.configForeignKeys = config.MustForeignKeys(drivers.ConfigForeignKeys)
m.conn, err = sql.Open("mysql", m.connStr)
if err != nil {
Expand Down Expand Up @@ -128,8 +138,26 @@ func (m *MySQLDriver) Assemble(config drivers.Config) (dbinfo *drivers.DBInfo, e
return dbinfo, err
}

func MySQLBuildQueryStringUnixSocket(user, pass, dbname, unixSocket string, sslMode string) string {
config := mysql.NewConfig()

config.User = user
if len(pass) != 0 {
config.Passwd = pass
}
config.DBName = dbname
config.Net = "unix"
config.Addr = unixSocket
config.TLSConfig = sslMode

// MySQL is a bad, and by default reads date/datetime into a []byte
// instead of a time.Time. Tell it to stop being a bad.
config.ParseTime = true
return config.FormatDSN()
}

// MySQLBuildQueryString builds a query string for MySQL.
func MySQLBuildQueryString(user, pass, dbname, host string, port int, sslmode string) string {
func MySQLBuildQueryString(user, pass, dbname, host string, port int, sslMode string) string {
config := mysql.NewConfig()

config.User = user
Expand All @@ -143,7 +171,7 @@ func MySQLBuildQueryString(user, pass, dbname, host string, port int, sslmode st
port = 3306
}
config.Addr += ":" + strconv.Itoa(port)
config.TLSConfig = sslmode
config.TLSConfig = sslMode

// MySQL is a bad, and by default reads date/datetime into a []byte
// instead of a time.Time. Tell it to stop being a bad.
Expand Down