db-migrator.go

Форк
0
149 строк · 3.4 Кб
1
/**
2
 * This file is part of the raoptimus/db-migrator.go library
3
 *
4
 * @copyright Copyright (c) Evgeniy Urvantsev
5
 * @license https://github.com/raoptimus/db-migrator.go/blob/master/LICENSE.md
6
 * @link https://github.com/raoptimus/db-migrator.go
7
 */
8

9
package migrator
10

11
import (
12
	"github.com/raoptimus/db-migrator.go/internal/action"
13
	"github.com/raoptimus/db-migrator.go/internal/builder"
14
	"github.com/raoptimus/db-migrator.go/internal/dal/connection"
15
	"github.com/raoptimus/db-migrator.go/internal/dal/repository"
16
	"github.com/raoptimus/db-migrator.go/internal/service"
17
	"github.com/raoptimus/db-migrator.go/pkg/console"
18
	"github.com/raoptimus/db-migrator.go/pkg/iohelp"
19
	"github.com/raoptimus/db-migrator.go/pkg/timex"
20
)
21

22
type (
23
	DBService struct {
24
		options              *Options
25
		fileNameBuilder      FileNameBuilder
26
		migrationServiceFunc func() (*service.Migration, error)
27

28
		conn *connection.Connection
29
		repo *repository.Repository
30
	}
31
	Options struct {
32
		DSN                string
33
		Directory          string
34
		TableName          string
35
		ClusterName        string
36
		Compact            bool
37
		Interactive        bool
38
		MaxSQLOutputLength int
39
	}
40
)
41

42
func New(options *Options) *DBService {
43
	fb := builder.NewFileName(iohelp.StdFile, options.Directory)
44
	dbs := &DBService{
45
		options:         options,
46
		fileNameBuilder: fb,
47
	}
48
	dbs.migrationServiceFunc = dbs.migrationService
49
	return dbs
50
}
51

52
func (s *DBService) Create() *action.Create {
53
	return action.NewCreate(
54
		timex.StdTime,
55
		iohelp.StdFile,
56
		console.Std,
57
		s.fileNameBuilder,
58
		s.options.Directory,
59
	)
60
}
61

62
func (s *DBService) Upgrade() (*action.Upgrade, error) {
63
	serv, err := s.migrationServiceFunc()
64
	if err != nil {
65
		return nil, err
66
	}
67

68
	return action.NewUpgrade(
69
		console.Std,
70
		serv,
71
		s.fileNameBuilder,
72
		s.options.Interactive,
73
	), nil
74
}
75

76
func (s *DBService) Downgrade() (*action.Downgrade, error) {
77
	serv, err := s.migrationServiceFunc()
78
	if err != nil {
79
		return nil, err
80
	}
81
	return action.NewDowngrade(serv, s.fileNameBuilder, s.options.Interactive), nil
82
}
83

84
func (s *DBService) To() (*action.To, error) {
85
	serv, err := s.migrationServiceFunc()
86
	if err != nil {
87
		return nil, err
88
	}
89
	return action.NewTo(serv, s.fileNameBuilder, s.options.Interactive), nil
90
}
91

92
func (s *DBService) History() (*action.History, error) {
93
	serv, err := s.migrationServiceFunc()
94
	if err != nil {
95
		return nil, err
96
	}
97
	return action.NewHistory(serv), nil
98
}
99

100
func (s *DBService) HistoryNew() (*action.HistoryNew, error) {
101
	serv, err := s.migrationServiceFunc()
102
	if err != nil {
103
		return nil, err
104
	}
105
	return action.NewHistoryNew(serv), nil
106
}
107

108
func (s *DBService) Redo() (*action.Redo, error) {
109
	serv, err := s.migrationServiceFunc()
110
	if err != nil {
111
		return nil, err
112
	}
113
	return action.NewRedo(serv, s.fileNameBuilder, s.options.Interactive), nil
114
}
115

116
func (s *DBService) migrationService() (*service.Migration, error) {
117
	if s.conn == nil {
118
		conn, err := connection.New(s.options.DSN)
119
		if err != nil {
120
			return nil, err
121
		}
122
		s.conn = conn
123
	}
124

125
	if s.repo == nil {
126
		repo, err := repository.New(
127
			s.conn,
128
			&repository.Options{
129
				TableName:   s.options.TableName,
130
				ClusterName: s.options.ClusterName,
131
			},
132
		)
133
		if err != nil {
134
			return nil, err
135
		}
136
		s.repo = repo
137
	}
138

139
	return service.NewMigration(
140
		&service.Options{
141
			MaxSQLOutputLength: s.options.MaxSQLOutputLength,
142
			Directory:          s.options.Directory,
143
			Compact:            s.options.Compact,
144
		},
145
		console.Std,
146
		iohelp.StdFile,
147
		s.repo,
148
	), nil
149
}
150

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.