-
Notifications
You must be signed in to change notification settings - Fork 0
/
migration_sql.go
123 lines (104 loc) · 4.33 KB
/
migration_sql.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
// Package migration_sql
package migration_sql
import (
"strings"
kitModuleCfg "github.com/webnice/kit/v3/module/cfg"
kitModuleCfgReg "github.com/webnice/kit/v3/module/cfg/reg"
kitModuleDbSql "github.com/webnice/kit/v3/module/db/sql"
kitTypes "github.com/webnice/kit/v3/types"
kitTypesDb "github.com/webnice/kit/v3/types/db"
)
// Структура объекта компоненты.
type impl struct {
cfg kitModuleCfg.Interface
databaseSql *kitTypesDb.DatabaseSqlConfiguration
}
// Регистрация компоненты в приложении.
func init() { kitModuleCfgReg.Registration(newComponent()) }
// Конструктор объекта компоненты.
func newComponent() kitTypes.Component {
var m8s = &impl{
cfg: kitModuleCfg.Get(),
databaseSql: new(kitTypesDb.DatabaseSqlConfiguration),
}
m8s.registrationConfigurationError(m8s.cfg.Gist().ConfigurationRegistration(m8s.databaseSql))
return m8s
}
// Ссылка на менеджер логирования, для удобного использования внутри компоненты или модуля.
func (m8s *impl) log() kitTypes.Logger { return m8s.cfg.Log() }
// Обработка ошибки регистрации конфигурации.
func (m8s *impl) registrationConfigurationError(err error) {
if err == nil {
return
}
switch eto := err.(type) {
case kitModuleCfg.Err:
m8s.cfg.Gist().ErrorAppend(eto)
default:
m8s.cfg.Gist().ErrorAppend(m8s.cfg.Errors().ConfigurationApplicationObject(0, eto))
}
}
// Preferences Функция возвращает настройки компоненты.
func (m8s *impl) Preferences() kitTypes.ComponentPreferences {
const (
cEnvironment = `(?mi)application/component/environment$`
cInterrupt = `(?mi)application/component/interrupt$`
cConfiguration = `(?mi)application/component/configuration$`
cLogging = `(?mi)application/component/logg.*`
cLoggerConsole = `(?mi)application/component/logger_console$`
cPidfile = `(?mi)application/component/pidfile$`
cBootstrap = `(?mi)application/component/bootstrap$`
)
return kitTypes.ComponentPreferences{
After: []string{cConfiguration, cLoggerConsole, cLogging, cPidfile, cInterrupt, cEnvironment},
Require: []string{cPidfile},
Before: []string{cBootstrap},
}
}
// Initiate Функция инициализации компонента и подготовки компонента к запуску.
func (m8s *impl) Initiate() (err error) {
var (
elm interface{}
ok bool
c *kitTypesDb.DatabaseSqlConfiguration
)
if m8s.isSkip() {
return
}
// Загрузка конфигурации базы данных, сохранённой в конфигурации приложения.
if elm, err = m8s.cfg.ConfigurationByObject(m8s.databaseSql); err != nil {
return
}
// Приведение пустого интерфейса к типу данных.
if c, ok = elm.(*kitTypesDb.DatabaseSqlConfiguration); ok {
// Исправление пути к миграции на абсолютный путь, исправление по адресу, поэтому все кто запросят
// конфигурацию базы данных, получат исправленный вариант.
m8s.cfg.Gist().AbsolutePathAndUpdate(&c.SqlDB.Migration)
// Обновление локальной копии конфигурации, так как после работы yaml библиотеки может слетать адрес.
m8s.databaseSql = c
}
return
}
// Do Выполнение компонента приложения.
func (m8s *impl) Do() (levelDone bool, levelExit bool, err error) {
if m8s.isSkip() {
return
}
if err = kitModuleDbSql.Get().MigrationUp(); err != nil {
levelDone, levelExit = true, true
}
return
}
// Finalize Функция вызывается перед завершением компонента и приложения в целом.
func (m8s *impl) Finalize() (err error) { return }
func (m8s *impl) isSkip() (ret bool) {
const cmdVersion, cmdConfig = `version`, `config`
// Для стандартной команды версии приложения миграцию не запускаем.
switch {
case m8s.cfg.Command() == cmdVersion:
ret = true
case strings.HasPrefix(m8s.cfg.Command(), cmdConfig):
ret = true
}
return
}