Skip to content

Commit 89a3ff6

Browse files
committed
Update RollbackAll func
1 parent eb49b7d commit 89a3ff6

File tree

1 file changed

+17
-51
lines changed

1 file changed

+17
-51
lines changed

pkg/dbmate/db.go

Lines changed: 17 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -442,65 +442,31 @@ func (db *DB) MigrateNext() error {
442442

443443
// RollbackAll rolls back every applied migration (latest-first) until none remain
444444
func (db *DB) RollbackAll() error {
445-
drv, err := db.Driver()
446-
if err != nil {
447-
return err
448-
}
449-
450-
sqlDB, err := db.openDatabaseForMigration(drv)
451-
if err != nil {
452-
return err
453-
}
454-
defer dbutil.MustClose(sqlDB)
455-
456445
migrations, err := db.FindMigrations()
457446
if err != nil {
458447
return err
459448
}
460-
461-
applied := make([]*Migration, 0, len(migrations))
449+
var appliedVersions []string
462450
for i := len(migrations) - 1; i >= 0; i-- {
463451
if migrations[i].Applied {
464-
applied = append(applied, &migrations[i])
452+
appliedVersions = append(appliedVersions, migrations[i].Version)
465453
}
466454
}
467-
if len(applied) == 0 {
455+
if len(appliedVersions) == 0 {
468456
return ErrNoRollback
469457
}
458+
origAuto := db.AutoDumpSchema
459+
db.AutoDumpSchema = false
460+
defer func() { db.AutoDumpSchema = origAuto }()
470461

471-
for _, mig := range applied {
472-
fmt.Fprintf(db.Log, "Rolling back: %s\n", mig.FileName)
473-
start := time.Now()
474-
parsed, err := mig.Parse()
475-
if err != nil {
476-
return err
477-
}
478-
execMigration := func(tx dbutil.Transaction) error {
479-
result, err := tx.Exec(parsed.Down)
480-
if err != nil {
481-
return drv.QueryError(parsed.Down, err)
482-
} else if db.Verbose {
483-
db.printVerbose(result)
484-
}
485-
return drv.DeleteMigration(tx, mig.Version)
486-
}
487-
if parsed.DownOptions.Transaction() {
488-
err = doTransaction(sqlDB, execMigration)
489-
} else {
490-
err = execMigration(sqlDB)
491-
}
492-
elapsed := time.Since(start)
493-
fmt.Fprintf(db.Log, "Rolled back: %s in %s\n", mig.FileName, elapsed)
494-
495-
if err != nil {
462+
for _, v := range appliedVersions {
463+
if err := db.RollbackOnly(migrations, v); err != nil {
496464
return err
497465
}
498466
}
499-
500-
if db.AutoDumpSchema {
467+
if origAuto {
501468
_ = db.DumpSchema()
502469
}
503-
504470
return nil
505471
}
506472

@@ -656,7 +622,7 @@ func (db *DB) MigrateOnly(migrations []Migration, version string) error {
656622
if err != nil {
657623
return err
658624
}
659-
exec := func(tx dbutil.Transaction) error {
625+
execMigration := func(tx dbutil.Transaction) error {
660626
res, err := tx.Exec(parsed.Up)
661627
if err != nil {
662628
return drv.QueryError(parsed.Up, err)
@@ -667,9 +633,9 @@ func (db *DB) MigrateOnly(migrations []Migration, version string) error {
667633
}
668634

669635
if parsed.UpOptions.Transaction() {
670-
err = doTransaction(sqlDB, exec)
636+
err = doTransaction(sqlDB, execMigration)
671637
} else {
672-
err = exec(sqlDB)
638+
err = execMigration(sqlDB)
673639
}
674640

675641
fmt.Fprintf(db.Log, "Applied: %s in %s\n", target.FileName, time.Since(start))
@@ -716,20 +682,20 @@ func (db *DB) RollbackOnly(migrations []Migration, version string) error {
716682
if err != nil {
717683
return err
718684
}
719-
exec := func(tx dbutil.Transaction) error {
720-
res, err := tx.Exec(parsed.Down)
685+
execMigration := func(tx dbutil.Transaction) error {
686+
result, err := tx.Exec(parsed.Down)
721687
if err != nil {
722688
return drv.QueryError(parsed.Down, err)
723689
} else if db.Verbose {
724-
db.printVerbose(res)
690+
db.printVerbose(result)
725691
}
726692
return drv.DeleteMigration(tx, target.Version)
727693
}
728694

729695
if parsed.DownOptions.Transaction() {
730-
err = doTransaction(sqlDB, exec)
696+
err = doTransaction(sqlDB, execMigration)
731697
} else {
732-
err = exec(sqlDB)
698+
err = execMigration(sqlDB)
733699
}
734700

735701
fmt.Fprintf(db.Log, "Rolled back: %s in %s\n", target.FileName, time.Since(start))

0 commit comments

Comments
 (0)