db-migrator.go

Форк
0
101 строка · 2.5 Кб
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 action
10

11
import (
12
	"fmt"
13

14
	"github.com/raoptimus/db-migrator.go/internal/args"
15
	"github.com/raoptimus/db-migrator.go/internal/console"
16
	"github.com/raoptimus/db-migrator.go/internal/dal/entity"
17
	"github.com/urfave/cli/v2"
18
)
19

20
type Redo struct {
21
	service         MigrationService
22
	fileNameBuilder FileNameBuilder
23
	interactive     bool
24
}
25

26
func NewRedo(
27
	service MigrationService,
28
	fileNameBuilder FileNameBuilder,
29
	interactive bool,
30
) *Redo {
31
	return &Redo{
32
		service:         service,
33
		fileNameBuilder: fileNameBuilder,
34
		interactive:     interactive,
35
	}
36
}
37

38
func (r *Redo) Run(ctx *cli.Context) error {
39
	limit, err := args.ParseStepStringOrDefault(ctx.Args().Get(0), minLimit)
40
	if err != nil {
41
		return err
42
	}
43

44
	migrations, err := r.service.Migrations(ctx.Context, limit)
45
	if err != nil {
46
		return err
47
	}
48

49
	migrationsCount := migrations.Len()
50
	if migrationsCount == 0 {
51
		console.SuccessLn("No migration has been done before.")
52
		return nil
53
	}
54

55
	console.Warnf(
56
		"Total %d %s to be redone: \n",
57
		migrationsCount,
58
		console.NumberPlural(migrationsCount, "migration", "migrations"),
59
	)
60

61
	printMigrations(migrations, false)
62

63
	question := fmt.Sprintf("Redo the above %d %s?",
64
		migrationsCount, console.NumberPlural(migrationsCount, "migration", "migrations"),
65
	)
66
	if r.interactive && !console.Confirm(question) {
67
		return nil
68
	}
69

70
	reversedMigrations := make(entity.Migrations, 0, migrationsCount)
71
	for i := range migrations {
72
		migration := &migrations[i]
73
		fileName, safely := r.fileNameBuilder.Down(migration.Version, false)
74

75
		if err := r.service.RevertFile(ctx.Context, migration, fileName, safely); err != nil {
76
			console.ErrorLn("Migration failed. The rest of the migrations are canceled.")
77
			return err
78
		}
79

80
		reversedMigrations = append(reversedMigrations, migrations[i])
81
	}
82

83
	for i := migrationsCount - 1; i >= 0; i-- {
84
		migration := &reversedMigrations[i]
85
		fileName, safely := r.fileNameBuilder.Up(migration.Version, false)
86

87
		if err := r.service.ApplyFile(ctx.Context, migration, fileName, safely); err != nil {
88
			console.ErrorLn("Migration failed. The rest of the migrations are canceled.\n")
89
			return err
90
		}
91
	}
92

93
	console.Warnf(
94
		"%d %s redone.",
95
		migrationsCount,
96
		console.NumberPlural(migrationsCount, migrationWas, migrationsWere),
97
	)
98
	console.SuccessLn("Migration redone successfully.\n")
99

100
	return nil
101
}
102

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

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

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

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