2017-01-25 13:46:43 +01:00
|
|
|
package datastore
|
|
|
|
|
|
|
|
import (
|
2018-04-25 13:45:21 +02:00
|
|
|
"errors"
|
2017-01-25 13:46:43 +01:00
|
|
|
"fmt"
|
|
|
|
_ "github.com/go-sql-driver/mysql" // mysql driver
|
2018-04-25 13:05:29 +02:00
|
|
|
"github.com/jmoiron/sqlx"
|
|
|
|
_ "github.com/lib/pq" // postgresql driver
|
2017-01-25 15:17:24 +01:00
|
|
|
"github.com/rubenv/sql-migrate"
|
|
|
|
"log"
|
2017-01-25 13:46:43 +01:00
|
|
|
)
|
|
|
|
|
2018-04-25 13:05:29 +02:00
|
|
|
var dbx *sqlx.DB
|
|
|
|
|
2018-04-25 13:45:21 +02:00
|
|
|
// ErrNoResults is returned when a query yielded 0 results
|
2018-04-27 17:32:16 +02:00
|
|
|
var ErrNoResults = errors.New("datastore: query returned 0 results")
|
2018-04-25 13:45:21 +02:00
|
|
|
|
2018-04-25 13:05:29 +02:00
|
|
|
// Init creates a database connection pool (using sqlx)
|
|
|
|
func Init(driver string, host string, name string, user string, password string) *sqlx.DB {
|
|
|
|
dbx = New(driver, getDSN(driver, host, name, user, password))
|
2017-01-25 13:46:43 +01:00
|
|
|
|
2017-01-25 15:17:24 +01:00
|
|
|
// run migrations
|
|
|
|
runMigrations(driver)
|
|
|
|
|
2018-04-25 13:05:29 +02:00
|
|
|
return dbx
|
2017-01-25 13:46:43 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// New creates a new database pool
|
2018-04-25 13:05:29 +02:00
|
|
|
func New(driver string, dsn string) *sqlx.DB {
|
|
|
|
dbx := sqlx.MustConnect(driver, dsn)
|
|
|
|
return dbx
|
2017-01-25 13:46:43 +01:00
|
|
|
}
|
|
|
|
|
2018-04-25 13:05:29 +02:00
|
|
|
func getDSN(driver string, host string, name string, user string, password string) string {
|
2018-04-30 16:11:47 +02:00
|
|
|
var dsn string
|
2017-01-25 13:46:43 +01:00
|
|
|
|
2017-01-25 15:17:24 +01:00
|
|
|
switch driver {
|
|
|
|
case "postgres":
|
2018-04-30 16:11:47 +02:00
|
|
|
dsn = fmt.Sprintf("host=%s user=%s password=%s dbname=%s", host, user, password, name)
|
2017-01-25 15:17:24 +01:00
|
|
|
case "mysql":
|
2018-04-30 16:11:47 +02:00
|
|
|
dsn = fmt.Sprintf("%s:%s@%s/%s?parseTime=true", user, password, host, name)
|
2017-01-25 13:46:43 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
return dsn
|
|
|
|
}
|
2017-01-25 15:17:24 +01:00
|
|
|
|
|
|
|
func runMigrations(driver string) {
|
|
|
|
migrations := migrate.FileMigrationSource{
|
2018-04-25 13:05:29 +02:00
|
|
|
Dir: "pkg/datastore/migrations", // TODO: Move to bindata
|
2017-01-25 15:17:24 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
migrate.SetTable("migrations")
|
2017-01-25 20:01:02 +01:00
|
|
|
|
2018-04-25 13:05:29 +02:00
|
|
|
n, err := migrate.Exec(dbx.DB, driver, migrations, migrate.Up)
|
2017-01-25 16:19:07 +01:00
|
|
|
|
2017-01-25 15:17:24 +01:00
|
|
|
if err != nil {
|
|
|
|
log.Fatal("Database migrations failed: ", err)
|
|
|
|
}
|
|
|
|
|
2017-01-25 16:19:07 +01:00
|
|
|
if n > 0 {
|
|
|
|
log.Printf("Applied %d database migrations!\n", n)
|
|
|
|
}
|
2017-01-25 15:17:24 +01:00
|
|
|
}
|