db-migrator.go
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
9package migrator10
11import (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
22type (23DBService struct {24options *Options25fileNameBuilder FileNameBuilder
26migrationServiceFunc func() (*service.Migration, error)27
28conn *connection.Connection29repo *repository.Repository30}31Options struct {32DSN string33Directory string34TableName string35ClusterName string36Compact bool37Interactive bool38MaxSQLOutputLength int39}40)
41
42func New(options *Options) *DBService {43fb := builder.NewFileName(iohelp.StdFile, options.Directory)44dbs := &DBService{45options: options,46fileNameBuilder: fb,47}48dbs.migrationServiceFunc = dbs.migrationService49return dbs50}
51
52func (s *DBService) Create() *action.Create {53return action.NewCreate(54timex.StdTime,55iohelp.StdFile,56console.Std,57s.fileNameBuilder,58s.options.Directory,59)60}
61
62func (s *DBService) Upgrade() (*action.Upgrade, error) {63serv, err := s.migrationServiceFunc()64if err != nil {65return nil, err66}67
68return action.NewUpgrade(69console.Std,70serv,71s.fileNameBuilder,72s.options.Interactive,73), nil74}
75
76func (s *DBService) Downgrade() (*action.Downgrade, error) {77serv, err := s.migrationServiceFunc()78if err != nil {79return nil, err80}81return action.NewDowngrade(serv, s.fileNameBuilder, s.options.Interactive), nil82}
83
84func (s *DBService) To() (*action.To, error) {85serv, err := s.migrationServiceFunc()86if err != nil {87return nil, err88}89return action.NewTo(serv, s.fileNameBuilder, s.options.Interactive), nil90}
91
92func (s *DBService) History() (*action.History, error) {93serv, err := s.migrationServiceFunc()94if err != nil {95return nil, err96}97return action.NewHistory(serv), nil98}
99
100func (s *DBService) HistoryNew() (*action.HistoryNew, error) {101serv, err := s.migrationServiceFunc()102if err != nil {103return nil, err104}105return action.NewHistoryNew(serv), nil106}
107
108func (s *DBService) Redo() (*action.Redo, error) {109serv, err := s.migrationServiceFunc()110if err != nil {111return nil, err112}113return action.NewRedo(serv, s.fileNameBuilder, s.options.Interactive), nil114}
115
116func (s *DBService) migrationService() (*service.Migration, error) {117if s.conn == nil {118conn, err := connection.New(s.options.DSN)119if err != nil {120return nil, err121}122s.conn = conn123}124
125if s.repo == nil {126repo, err := repository.New(127s.conn,128&repository.Options{129TableName: s.options.TableName,130ClusterName: s.options.ClusterName,131},132)133if err != nil {134return nil, err135}136s.repo = repo137}138
139return service.NewMigration(140&service.Options{141MaxSQLOutputLength: s.options.MaxSQLOutputLength,142Directory: s.options.Directory,143Compact: s.options.Compact,144},145console.Std,146iohelp.StdFile,147s.repo,148), nil149}
150