-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathmigrate.go
134 lines (112 loc) · 2.66 KB
/
migrate.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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
// Copyright 2018 Sergey Novichkov. All rights reserved.
// For the full copyright and license information, please view the LICENSE
// file that was distributed with this source code.
package migrate
import (
"github.com/gozix/di"
"github.com/gozix/glue/v3"
gzSQL "github.com/gozix/sql/v3"
gzZap "github.com/gozix/zap/v3"
"github.com/gozix/sql-migrate/v3/internal/command"
)
type (
// Bundle implements the glue.Bundle interface.
Bundle struct {
path string
table string
schema string
dialect string
connection string
ignoreUnknown bool
}
// Option interface.
Option interface {
apply(b *Bundle)
}
// optionFunc wraps a func so it satisfies the Option interface.
optionFunc func(b *Bundle)
)
// BundleName is default definition name.
const BundleName = "sql-migrate"
// Bundle implements glue.Bundle interface.
var _ glue.Bundle = (*Bundle)(nil)
// Connection option.
func Connection(value string) Option {
return optionFunc(func(b *Bundle) {
b.connection = value
})
}
// Dialect option.
func Dialect(value string) Option {
return optionFunc(func(b *Bundle) {
b.dialect = value
})
}
// Path option.
func Path(value string) Option {
return optionFunc(func(b *Bundle) {
b.path = value
})
}
// Table option.
func Table(value string) Option {
return optionFunc(func(b *Bundle) {
b.table = value
})
}
// Schema option.
func Schema(value string) Option {
return optionFunc(func(b *Bundle) {
b.schema = value
})
}
// IgnoreUnknown option
func IgnoreUnknown(value bool) Option {
return optionFunc(func(b *Bundle) {
b.ignoreUnknown = value
})
}
// NewBundle create bundle instance.
func NewBundle(options ...Option) (b *Bundle) {
b = &Bundle{
path: "migrations",
table: "migration",
connection: gzSQL.DEFAULT,
}
for _, option := range options {
option.apply(b)
}
return b
}
// Name implements the glue.Bundle interface.
func (b *Bundle) Name() string {
return BundleName
}
// Build implements the glue.Bundle interface.
func (b *Bundle) Build(builder di.Builder) error {
var tag = "cli.cmd.migrate.subcommand"
return builder.Apply(
di.Provide(
command.NewMigrateConstructor(b.path, b.table, b.schema, b.dialect, b.connection, b.ignoreUnknown),
di.Constraint(0, di.WithTags(tag)),
glue.AsCliCommand(),
),
di.Provide(command.NewMigrateDown, di.Tags{{
Name: tag,
}}),
di.Provide(command.NewMigrateUp, di.Tags{{
Name: tag,
}}),
)
}
// DependsOn implements the glue.DependsOn interface.
func (b *Bundle) DependsOn() []string {
return []string{
gzSQL.BundleName,
gzZap.BundleName,
}
}
// apply implements Option.
func (f optionFunc) apply(bundle *Bundle) {
f(bundle)
}