-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmigration.go
101 lines (82 loc) · 1.53 KB
/
migration.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
90
91
92
93
94
95
96
97
98
99
100
101
package migo
import (
"os"
"github.com/walkline/migo/sqlscanner"
)
type Connection interface {
Exec(sql string, values ...interface{}) error
LoadVersions() ([]string, error)
SetVersion(v string) error
Tx() (Transaction, error)
}
type Transaction interface {
Exec(sql string, values ...interface{}) error
Commit() error
Rollback() error
}
type Migration interface {
SetConnection(c Connection)
Version() Version
SetVersion(v *Version)
Up() error
Down() error
}
type SQLMigration struct {
c Connection
v Version
UpFile *os.File
DownFile *os.File
}
func (m *SQLMigration) SetConnection(c Connection) {
m.c = c
}
func (m *SQLMigration) Up() error {
defer m.UpFile.Close()
defer m.DownFile.Close()
tx, err := m.c.Tx()
if err != nil {
return err
}
scanner := sqlscanner.NewSQLScanner(m.UpFile)
query := ""
for scanner.Next(&query) {
err := tx.Exec(query)
if err != nil {
tx.Rollback()
return err
}
}
if scanner.Error != nil {
tx.Rollback()
return err
}
return tx.Commit()
}
func (m *SQLMigration) Down() error {
defer m.UpFile.Close()
defer m.DownFile.Close()
tx, err := m.c.Tx()
if err != nil {
return err
}
scanner := sqlscanner.NewSQLScanner(m.DownFile)
query := ""
for scanner.Next(&query) {
err := m.c.Exec(query)
if err != nil {
tx.Rollback()
return err
}
}
if scanner.Error != nil {
tx.Rollback()
return err
}
return tx.Commit()
}
func (m *SQLMigration) Version() Version {
return m.v
}
func (m *SQLMigration) SetVersion(v *Version) {
m.v = *v
}