github.com/bingtel/dbmate@v1.4.1/pkg/dbmate/driver.go (about) 1 package dbmate 2 3 import ( 4 "database/sql" 5 "fmt" 6 "net/url" 7 ) 8 9 // Driver provides top level database functions 10 type Driver interface { 11 Open(*url.URL) (*sql.DB, error) 12 DatabaseExists(*url.URL) (bool, error) 13 CreateDatabase(*url.URL) error 14 DropDatabase(*url.URL) error 15 DumpSchema(*url.URL, *sql.DB) ([]byte, error) 16 CreateMigrationsTable(*sql.DB) error 17 SelectMigrations(*sql.DB, int) (map[string]bool, error) 18 InsertMigration(Transaction, string) error 19 DeleteMigration(Transaction, string) error 20 Ping(*url.URL) error 21 } 22 23 var drivers = map[string]Driver{} 24 25 // RegisterDriver registers a driver for a URL scheme 26 func RegisterDriver(drv Driver, scheme string) { 27 drivers[scheme] = drv 28 } 29 30 // Transaction can represent a database or open transaction 31 type Transaction interface { 32 Exec(query string, args ...interface{}) (sql.Result, error) 33 } 34 35 // GetDriver loads a database driver by name 36 func GetDriver(name string) (Driver, error) { 37 if val, ok := drivers[name]; ok { 38 return val, nil 39 } 40 41 return nil, fmt.Errorf("unsupported driver: %s", name) 42 } 43 44 // GetDriverOpen is a shortcut for GetDriver(u.Scheme).Open(u) 45 func GetDriverOpen(u *url.URL) (*sql.DB, error) { 46 drv, err := GetDriver(u.Scheme) 47 if err != nil { 48 return nil, err 49 } 50 51 return drv.Open(u) 52 }