migrate/cli/commands.go

173 lines
3.7 KiB
Go
Raw Normal View History

package main
import (
"errors"
"fmt"
"github.com/golang-migrate/migrate"
_ "github.com/golang-migrate/migrate/database/stub" // TODO remove again
_ "github.com/golang-migrate/migrate/source/file"
2017-06-10 20:03:17 +08:00
"os"
"path/filepath"
"strconv"
"strings"
"time"
)
func nextSeq(matches []string, dir string, seqDigits int) (string, error) {
if seqDigits <= 0 {
return "", errors.New("Digits must be positive")
}
nextSeq := 1
if len(matches) > 0 {
filename := matches[len(matches)-1]
matchSeqStr := strings.TrimPrefix(filename, dir)
idx := strings.Index(matchSeqStr, "_")
if idx < 1 { // Using 1 instead of 0 since there should be at least 1 digit
return "", errors.New("Malformed migration filename: " + filename)
}
matchSeqStr = matchSeqStr[0:idx]
var err error
nextSeq, err = strconv.Atoi(matchSeqStr)
if err != nil {
return "", err
}
nextSeq++
}
if nextSeq <= 0 {
return "", errors.New("Next sequence number must be positive")
}
nextSeqStr := strconv.Itoa(nextSeq)
if len(nextSeqStr) > seqDigits {
return "", fmt.Errorf("Next sequence number %s too large. At most %d digits are allowed", nextSeqStr, seqDigits)
}
padding := seqDigits - len(nextSeqStr)
if padding > 0 {
nextSeqStr = strings.Repeat("0", padding) + nextSeqStr
}
return nextSeqStr, nil
}
func createCmd(dir string, timestamp int64, format string, name string, ext string, seq bool, seqDigits int) {
var base string
if seq && len(format) > 0 {
log.fatalErr(errors.New("The seq and format options are mutually exclusive"))
}
if seq {
if seqDigits <= 0 {
log.fatalErr(errors.New("Digits must be positive"))
}
matches, err := filepath.Glob(dir + "*" + ext)
if err != nil {
log.fatalErr(err)
}
nextSeqStr, err := nextSeq(matches, dir, seqDigits)
if err != nil {
log.fatalErr(err)
}
base = fmt.Sprintf("%v%v_%v.", dir, nextSeqStr, name)
} else {
if len(format) > 0 {
t := time.Unix(timestamp, 0)
version := t.Format(format)
base = fmt.Sprintf("%v%v_%v.", dir, version, name)
} else {
log.Println("Time format not specified")
base = fmt.Sprintf("%v%v_%v.", dir, timestamp, name)
}
}
2017-06-10 20:03:17 +08:00
os.MkdirAll(dir, os.ModePerm)
createFile(base + "up" + ext)
createFile(base + "down" + ext)
}
/*else if datetime {
now := time.Now();
year, month, day := now.Date();
var m = int(month);
hr, min, sec := now.Clock();
base = fmt.Sprintf("%04d%02d%02d%02d%02d%02d_%v.",year,m,day, hr, min, sec, name)
} */
2017-06-10 20:03:17 +08:00
func createFile(fname string) {
if _, err := os.Create(fname); err != nil {
log.fatalErr(err)
}
2017-06-10 20:03:17 +08:00
}
func gotoCmd(m *migrate.Migrate, v uint) {
if err := m.Migrate(v); err != nil {
2017-03-12 12:33:13 -07:00
if err != migrate.ErrNoChange {
log.fatalErr(err)
} else {
log.Println(err)
}
}
}
func upCmd(m *migrate.Migrate, limit int) {
if limit >= 0 {
if err := m.Steps(limit); err != nil {
2017-03-12 12:33:13 -07:00
if err != migrate.ErrNoChange {
log.fatalErr(err)
} else {
log.Println(err)
}
}
} else {
if err := m.Up(); err != nil {
2017-03-12 12:33:13 -07:00
if err != migrate.ErrNoChange {
log.fatalErr(err)
} else {
log.Println(err)
}
}
}
}
func downCmd(m *migrate.Migrate, limit int) {
if limit >= 0 {
if err := m.Steps(-limit); err != nil {
2017-03-12 12:33:13 -07:00
if err != migrate.ErrNoChange {
log.fatalErr(err)
} else {
log.Println(err)
}
}
} else {
if err := m.Down(); err != nil {
2017-03-12 12:33:13 -07:00
if err != migrate.ErrNoChange {
log.fatalErr(err)
} else {
log.Println(err)
}
}
}
}
func dropCmd(m *migrate.Migrate) {
if err := m.Drop(); err != nil {
log.fatalErr(err)
}
}
2017-02-19 16:06:11 -08:00
func forceCmd(m *migrate.Migrate, v int) {
2017-02-19 15:15:00 -08:00
if err := m.Force(v); err != nil {
log.fatalErr(err)
}
}
func versionCmd(m *migrate.Migrate) {
2017-02-19 15:15:00 -08:00
v, dirty, err := m.Version()
if err != nil {
log.fatalErr(err)
}
2017-02-19 15:15:00 -08:00
if dirty {
log.Printf("%v (dirty)\n", v)
} else {
log.Println(v)
}
}