From 0cdcc4512258097e6c7b0cbb1fbdfeddb8ee28f0 Mon Sep 17 00:00:00 2001 From: Vojtech Vitek Date: Wed, 6 Mar 2019 01:06:31 -0500 Subject: [PATCH] Move the MySQL normalize DNS function dependency to cmd/ --- cmd/goose/driver_mysql.go | 27 ++++++++++++++++++++++++++- cmd/goose/driver_no_mysql.go | 12 ++++++++++++ cmd/goose/main.go | 8 +------- db.go | 23 +---------------------- 4 files changed, 40 insertions(+), 30 deletions(-) create mode 100644 cmd/goose/driver_no_mysql.go diff --git a/cmd/goose/driver_mysql.go b/cmd/goose/driver_mysql.go index f916732..d5071f8 100644 --- a/cmd/goose/driver_mysql.go +++ b/cmd/goose/driver_mysql.go @@ -1,8 +1,33 @@ -// +build !no_mysql +// +build mysql package main import ( + "log" + + "github.com/go-sql-driver/mysql" + _ "github.com/go-sql-driver/mysql" _ "github.com/ziutek/mymysql/godrv" ) + +// normalizeMySQLDSN parses the dsn used with the mysql driver to always have +// the parameter `parseTime` set to true. This allows internal goose logic +// to assume that DATETIME/DATE/TIMESTAMP can be scanned into the time.Time +// type. +func normalizeDBString(str string) string { + var err error + str, err = normalizeMySQLDSN(dns string) + if err != nil { + log.Fatalf("failed to normalize MySQL connection string: %v", err) + } +} + +func normalizeMySQLDSN(dns string) (string, error) { + config, err := mysql.ParseDSN(dsn) + if err != nil { + return "", err + } + config.ParseTime = true + return config.FormatDSN(), nil +} diff --git a/cmd/goose/driver_no_mysql.go b/cmd/goose/driver_no_mysql.go new file mode 100644 index 0000000..2ed6346 --- /dev/null +++ b/cmd/goose/driver_no_mysql.go @@ -0,0 +1,12 @@ +// +build !mysql + +package main + +import ( + _ "github.com/go-sql-driver/mysql" + _ "github.com/ziutek/mymysql/godrv" +) + +func normalizeDBString(str string) string { + return str +} diff --git a/cmd/goose/main.go b/cmd/goose/main.go index bd9469b..48f07bd 100644 --- a/cmd/goose/main.go +++ b/cmd/goose/main.go @@ -55,13 +55,7 @@ func main() { driver, dbstring, command := args[0], args[1], args[2] - switch dbstring { - case "": - log.Fatalf("-dbstring=%q not supported\n", dbstring) - default: - } - - db, err := goose.OpenDBWithDriver(driver, dbstring) + db, err := goose.OpenDBWithDriver(driver, normalizeDBString(dbstring)) if err != nil { log.Fatalf("-dbstring=%q: %v\n", dbstring, err) } diff --git a/db.go b/db.go index c4f03c6..b61f886 100644 --- a/db.go +++ b/db.go @@ -3,8 +3,6 @@ package goose import ( "database/sql" "fmt" - - "github.com/go-sql-driver/mysql" ) // OpenDBWithDriver creates a connection a database, and modifies goose @@ -22,28 +20,9 @@ func OpenDBWithDriver(driver string, dbstring string) (*sql.DB, error) { } switch driver { - case "postgres", "sqlite3": + case "postgres", "sqlite3", "mysql": return sql.Open(driver, dbstring) - case "mysql": - dsn, err := normalizeMySQLDSN(dbstring) - if err != nil { - return nil, err - } - return sql.Open(driver, dsn) default: return nil, fmt.Errorf("unsupported driver %s", driver) } } - -// normalizeMySQLDSN parses the dsn used with the mysql driver to always have -// the parameter `parseTime` set to true. This allows internal goose logic -// to assume that DATETIME/DATE/TIMESTAMP can be scanned into the time.Time -// type. -func normalizeMySQLDSN(dsn string) (string, error) { - config, err := mysql.ParseDSN(dsn) - if err != nil { - return "", err - } - config.ParseTime = true - return config.FormatDSN(), nil -}