Skip to content
This repository has been archived by the owner on Jun 28, 2018. It is now read-only.

Don't load in all drivers by default #40 #43

Merged
merged 1 commit into from
Nov 11, 2015
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
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,9 @@ See GoDoc here: http://godoc.org/github.com/mattes/migrate/migrate
```go
import "github.com/mattes/migrate/migrate"

// Import any required drivers so that they are registered and available
import _ "github.com/mattes/migrate/drivers/mysql"

// use synchronous versions of migration functions ...
allErrors, ok := migrate.UpSync("driver://url", "./path")
if !ok {
Expand Down
5 changes: 5 additions & 0 deletions driver/bash/bash.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
package bash

import (
"github.com/mattes/migrate/driver/registry"
"github.com/mattes/migrate/file"
_ "github.com/mattes/migrate/migrate/direction"
)
Expand Down Expand Up @@ -30,3 +31,7 @@ func (driver *Driver) Migrate(f file.File, pipe chan interface{}) {
func (driver *Driver) Version() (uint64, error) {
return uint64(0), nil
}

func init() {
registry.RegisterDriver("bash", Driver{})
}
5 changes: 5 additions & 0 deletions driver/cassandra/cassandra.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ package cassandra
import (
"fmt"
"github.com/gocql/gocql"
"github.com/mattes/migrate/driver/registry"
"github.com/mattes/migrate/file"
"github.com/mattes/migrate/migrate/direction"
"net/url"
Expand Down Expand Up @@ -153,3 +154,7 @@ func (driver *Driver) Version() (uint64, error) {
err := driver.session.Query("SELECT version FROM "+tableName+" WHERE versionRow = ?", versionRow).Scan(&version)
return uint64(version) - 1, err
}

func init() {
registry.RegisterDriver("cassandra", Driver{})
}
50 changes: 11 additions & 39 deletions driver/driver.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,9 @@ import (
"errors"
"fmt"
neturl "net/url" // alias to allow `url string` func signature in New
"reflect"

"github.com/mattes/migrate/driver/bash"
"github.com/mattes/migrate/driver/cassandra"
"github.com/mattes/migrate/driver/mysql"
"github.com/mattes/migrate/driver/postgres"
"github.com/mattes/migrate/driver/sqlite3"
"github.com/mattes/migrate/driver/registry"
"github.com/mattes/migrate/file"
)

Expand Down Expand Up @@ -47,51 +44,26 @@ func New(url string) (Driver, error) {
return nil, err
}

switch u.Scheme {
case "postgres":
d := &postgres.Driver{}
verifyFilenameExtension("postgres", d)
if err := d.Initialize(url); err != nil {
return nil, err
}
return d, nil

case "mysql":
d := &mysql.Driver{}
verifyFilenameExtension("mysql", d)
if err := d.Initialize(url); err != nil {
driver := registry.GetDriver(u.Scheme)
if driver != nil {
blankDriver := reflect.New(reflect.TypeOf(driver)).Interface()
d, ok := blankDriver.(Driver)
if !ok {
err := errors.New(fmt.Sprintf("Driver '%s' does not implement the Driver interface"))
return nil, err
}
return d, nil

case "bash":
d := &bash.Driver{}
verifyFilenameExtension("bash", d)
verifyFilenameExtension(u.Scheme, d)
if err := d.Initialize(url); err != nil {
return nil, err
}
return d, nil

case "cassandra":
d := &cassandra.Driver{}
verifyFilenameExtension("cassanda", d)
if err := d.Initialize(url); err != nil {
return nil, err
}
return d, nil
case "sqlite3":
d := &sqlite3.Driver{}
verifyFilenameExtension("sqlite3", d)
if err := d.Initialize(url); err != nil {
return nil, err
}
return d, nil
default:
} else {
return nil, errors.New(fmt.Sprintf("Driver '%s' not found.", u.Scheme))
}
}

// verifyFilenameExtension panics if the drivers filename extension
// verifyFilenameExtension panics if the driver's filename extension
// is not correct or empty.
func verifyFilenameExtension(driverName string, d Driver) {
f := d.FilenameExtension()
Expand Down
5 changes: 5 additions & 0 deletions driver/mysql/mysql.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"errors"
"fmt"
"github.com/go-sql-driver/mysql"
"github.com/mattes/migrate/driver/registry"
"github.com/mattes/migrate/file"
"github.com/mattes/migrate/migrate/direction"
"regexp"
Expand Down Expand Up @@ -177,3 +178,7 @@ func (driver *Driver) Version() (uint64, error) {
return version, nil
}
}

func init() {
registry.RegisterDriver("mysql", Driver{})
}
5 changes: 5 additions & 0 deletions driver/postgres/postgres.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"errors"
"fmt"
"github.com/lib/pq"
"github.com/mattes/migrate/driver/registry"
"github.com/mattes/migrate/file"
"github.com/mattes/migrate/migrate/direction"
"strconv"
Expand Down Expand Up @@ -119,3 +120,7 @@ func (driver *Driver) Version() (uint64, error) {
return version, nil
}
}

func init() {
registry.RegisterDriver("postgres", Driver{})
}
20 changes: 20 additions & 0 deletions driver/registry/registry.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
// Package registry maintains a map of imported and available drivers
package registry

var driverRegistry map[string]interface{}

// Registers a driver so it can be created from its name. Drivers should
// call this from an init() function so that they registers themselvse on
// import
func RegisterDriver(name string, driver interface{}) {
driverRegistry[name] = driver
}

// Retrieves a registered driver by name
func GetDriver(name string) interface{} {
return driverRegistry[name]
}

func init() {
driverRegistry = make(map[string]interface{})
}
5 changes: 5 additions & 0 deletions driver/sqlite3/sqlite3.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"database/sql"
"errors"
"fmt"
"github.com/mattes/migrate/driver/registry"
"github.com/mattes/migrate/file"
"github.com/mattes/migrate/migrate/direction"
"github.com/mattn/go-sqlite3"
Expand Down Expand Up @@ -123,3 +124,7 @@ func (driver *Driver) Version() (uint64, error) {
return version, nil
}
}

func init() {
registry.RegisterDriver("sqlite3", Driver{})
}
2 changes: 2 additions & 0 deletions migrate/migrate_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ package migrate
import (
"io/ioutil"
"testing"
// Ensure imports for each driver we wish to test
_ "github.com/mattes/migrate/driver/postgres"
)

// Add Driver URLs here to test basic Up, Down, .. functions.
Expand Down