/
model.go
92 lines (76 loc) · 1.8 KB
/
model.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
package migrator
import (
"crypto/md5"
"fmt"
"os"
"path/filepath"
"strings"
"time"
)
type Config struct {
Table string
StatementTimeout string
FileMask string
}
func NewDefaultConfig() Config {
return Config{
Table: "public.pgMigrations",
StatementTimeout: "5s",
FileMask: `\d{4}-\d{2}-\d{2}-\S+.sql`,
}
}
type PgMigration struct {
tableName struct{} `pg:"?migrationTable,alias:t,discard_unknown_columns"` //nolint:all
ID int `pg:"id,pk"`
Filename string `pg:"filename,use_zero"`
StartedAt time.Time `pg:"startedAt,use_zero"`
FinishedAt *time.Time `pg:"finishedAt"`
Transactional bool `pg:"transactional,use_zero"`
Md5sum string `pg:"md5sum,use_zero"`
Md5sumLocal string `pg:"-"`
}
type Migration struct {
Filename string
Data []byte
Md5Sum string
Transactional bool
}
func (m *Migration) ToDB() *PgMigration {
return &PgMigration{
Filename: m.Filename,
Transactional: m.Transactional,
Md5sum: m.Md5Sum,
}
}
func NewMigration(rootDir, filename string) (Migration, error) {
f, err := os.ReadFile(filepath.Join(rootDir, filename))
if err != nil {
return Migration{Filename: filename}, err
}
m := Migration{
Filename: filename,
Data: f,
Md5Sum: fmt.Sprintf("%x", md5.Sum(f)),
Transactional: !strings.HasSuffix(filename, "NONTR.sql"),
}
return m, nil
}
type Migrations []Migration
func (mm Migrations) FirstNonTransactional() (*Migration, bool) {
for _, m := range mm {
if !m.Transactional {
return &m, true
}
}
return nil, false
}
func (mm Migrations) ToDB() []PgMigration {
if len(mm) == 0 {
return nil
}
out := make([]PgMigration, 0, len(mm))
for _, m := range mm {
out = append(out, *m.ToDB())
}
return out
}