This repository has been archived by the owner on May 4, 2019. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmigrations.go
89 lines (70 loc) · 1.85 KB
/
migrations.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
package main
import (
"database/sql"
"io/ioutil"
"log"
"path/filepath"
"regexp"
"strconv"
"github.com/GuiaBolso/darwin"
"gopkg.in/yaml.v2"
)
const migrationsDir = "migrations"
type migrationSource struct {
Script string
}
var fileNameRegexp = regexp.MustCompile("^([0-9]+)_(.+)\\.yaml$")
func loadMigrations(db *sql.DB) ([]darwin.Migration, error) {
filePaths, globErr := filepath.Glob(filepath.Join(migrationsDir, "[0-9]*.yaml"))
if nil != globErr {
return nil, globErr
}
migrations := make([]darwin.Migration, 0, len(filePaths))
for _, fullFileName := range filePaths {
fileName := filepath.Base(fullFileName)
matches := fileNameRegexp.FindStringSubmatch(fileName)
versionStr := matches[1]
description := matches[2]
version, _ := strconv.ParseFloat(versionStr, 10)
yamlData, readErr := ioutil.ReadFile(fullFileName)
if nil != readErr {
return nil, readErr
}
var source migrationSource
if err := yaml.Unmarshal(yamlData, &source); nil != err {
return nil, err
}
migrations = append(migrations, darwin.Migration{
Version: version,
Description: description,
Script: source.Script,
})
}
return migrations, nil
}
func logMigration(infoChan <-chan darwin.MigrationInfo) {
log.Printf("Migration is started")
for info := range infoChan {
if nil == info.Error {
log.Printf(
`Migration %f "%s" is %s`,
info.Migration.Version,
info.Migration.Description,
info.Status,
)
} else {
log.Printf("Migration error: %v", info.Error)
}
}
log.Printf("Migration is ended")
}
func appleMigrations(db *sql.DB) error {
migrations, loadErr := loadMigrations(db)
if nil != loadErr {
return loadErr
}
driver := darwin.NewGenericDriver(db, darwin.PostgresDialect{})
infoChan := make(chan darwin.MigrationInfo)
go logMigration(infoChan)
return darwin.Migrate(driver, migrations, infoChan)
}