github.skymusic.top/amacneil/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  }