2017-05-04 20:58:23 -07:00
|
|
|
package dbmate
|
2015-12-01 09:43:35 -08:00
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"database/sql"
|
|
|
|
|
"fmt"
|
|
|
|
|
"net/url"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// Driver provides top level database functions
|
|
|
|
|
type Driver interface {
|
|
|
|
|
Open(*url.URL) (*sql.DB, error)
|
|
|
|
|
DatabaseExists(*url.URL) (bool, error)
|
|
|
|
|
CreateDatabase(*url.URL) error
|
|
|
|
|
DropDatabase(*url.URL) error
|
|
|
|
|
CreateMigrationsTable(*sql.DB) error
|
|
|
|
|
SelectMigrations(*sql.DB, int) (map[string]bool, error)
|
|
|
|
|
InsertMigration(Transaction, string) error
|
|
|
|
|
DeleteMigration(Transaction, string) error
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Transaction can represent a database or open transaction
|
|
|
|
|
type Transaction interface {
|
|
|
|
|
Exec(query string, args ...interface{}) (sql.Result, error)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// GetDriver loads a database driver by name
|
|
|
|
|
func GetDriver(name string) (Driver, error) {
|
|
|
|
|
switch name {
|
|
|
|
|
case "mysql":
|
|
|
|
|
return MySQLDriver{}, nil
|
2015-12-01 11:38:31 -08:00
|
|
|
case "postgres", "postgresql":
|
2015-12-01 09:43:35 -08:00
|
|
|
return PostgresDriver{}, nil
|
2015-12-01 11:38:31 -08:00
|
|
|
case "sqlite", "sqlite3":
|
|
|
|
|
return SQLiteDriver{}, nil
|
2015-12-01 09:43:35 -08:00
|
|
|
default:
|
2017-05-04 20:58:23 -07:00
|
|
|
return nil, fmt.Errorf("unknown driver: %s", name)
|
2015-12-01 09:43:35 -08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// GetDriverOpen is a shortcut for GetDriver(u.Scheme).Open(u)
|
|
|
|
|
func GetDriverOpen(u *url.URL) (*sql.DB, error) {
|
|
|
|
|
drv, err := GetDriver(u.Scheme)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return drv.Open(u)
|
|
|
|
|
}
|