From b8d9ded81e63b22a1fdd6be4c37afd488e51d686 Mon Sep 17 00:00:00 2001 From: Fluffy-Bean Date: Tue, 7 May 2024 12:47:44 +0100 Subject: [PATCH] Split migrate and downgrade commands Rename Pending to GetPending --- cmd/cmd.go | 9 +++-- cmd/database.go | 21 +++++++++-- cmd/run.go | 2 +- database/migrator.go | 84 +++++++++++++++++++++++++------------------- 4 files changed, 73 insertions(+), 43 deletions(-) diff --git a/cmd/cmd.go b/cmd/cmd.go index 1c5c726..9d260f3 100644 --- a/cmd/cmd.go +++ b/cmd/cmd.go @@ -16,15 +16,18 @@ func Parse() { run(os.Args[2:]) case "migrate": migrate(os.Args[2:]) + case "downgrade": + downgrade(os.Args[2:]) case "status": status(os.Args[2:]) case "-h": fallthrough case "-help": fmt.Println("Available commands are:") - fmt.Println(" run: starts the server") - fmt.Println(" migrate: migrates database") - fmt.Println(" status: checks if there are pending migrations") + fmt.Println(" run: starts the server") + fmt.Println(" migrate: migrates database") + fmt.Println(" downgrade: undoes database migrations") + fmt.Println(" status: checks if there are pending migrations") fmt.Println("\nTo specific usages, run commandName -h") default: fmt.Println("Use -h or -help for usage") diff --git a/cmd/database.go b/cmd/database.go index d5784c5..73f3c7d 100644 --- a/cmd/database.go +++ b/cmd/database.go @@ -11,7 +11,6 @@ import ( func migrate(flags []string) { cmd := flag.NewFlagSet("migrate", flag.ExitOnError) - downgrade := cmd.Bool("downgrade", false, "Downgrade Database") confirm := cmd.Bool("y", false, "Skip questioning") err := cmd.Parse(flags) @@ -20,7 +19,25 @@ func migrate(flags []string) { os.Exit(1) } - err = db.Migrate(*downgrade, *confirm) + err = db.Migrate(*confirm) + if err != nil { + fmt.Println(err) + os.Exit(1) + } +} + +func downgrade(flags []string) { + cmd := flag.NewFlagSet("migrate", flag.ExitOnError) + + confirm := cmd.Bool("y", false, "Skip questioning") + + err := cmd.Parse(flags) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + + err = db.Downgrade(*confirm) if err != nil { fmt.Println(err) os.Exit(1) diff --git a/cmd/run.go b/cmd/run.go index ec009a6..b3a521a 100644 --- a/cmd/run.go +++ b/cmd/run.go @@ -23,7 +23,7 @@ func run(flags []string) { } if !*skip { - pending, err := db.Pending() + pending, err := db.GetPending() if err != nil { fmt.Println(err) os.Exit(1) diff --git a/database/migrator.go b/database/migrator.go index 043a46f..ff0102a 100644 --- a/database/migrator.go +++ b/database/migrator.go @@ -17,73 +17,83 @@ var migrations = migrate.EmbedFileSystemMigrationSource{ Root: "migrations", } -func Migrate(downgrade, confirm bool) error { - var direction = migrate.Down - if !downgrade { - direction = migrate.Up - } +func Migrate(confirm bool) error { + var direction = migrate.Up - var pending int - if !downgrade { - n, _, err := migrate.PlanMigration(Conn, "sqlite3", migrations, migrate.Up, 0) - if err != nil { - return err - } - pending = len(n) - } else { - n, err := migrate.GetMigrationRecords(Conn, "sqlite3") - if err != nil { - return err - } - pending = len(n) + pending, _, err := migrate.PlanMigration(Conn, "sqlite3", migrations, migrate.Up, 0) + if err != nil { + return err } - - if pending == 0 { + if len(pending) == 0 { fmt.Println("Nothing to change") os.Exit(0) } if !confirm { - if downgrade { - fmt.Printf("Downgrade %d migrations? [Y/n] ", pending) - } else { - fmt.Printf("Apply %d pending migrations? [Y/n] ", pending) - } + fmt.Printf("Apply %d pending migration(s)? [Y/n] ", len(pending)) reader := bufio.NewReader(os.Stdin) - input, _ := reader.ReadString('\n') - // Format input + input, _ := reader.ReadString('\n') input = strings.TrimSpace(input) input = strings.ToLower(input) if !strings.HasPrefix(input, "y") && input != "" { - fmt.Println("Canceling migration") + fmt.Printf("Canceling %d migration(s)\n", len(pending)) os.Exit(0) } } - n, err := migrate.Exec(Conn, "sqlite3", migrations, direction) + changes, err := migrate.Exec(Conn, "sqlite3", migrations, direction) if err != nil { return err } - if downgrade { - fmt.Printf("Downgraded %d migrations!\n", n) - } else { - fmt.Printf("Applied %d migrations!\n", n) + fmt.Printf("Applied %d migration(s)!\n", changes) + return nil +} + +func Downgrade(confirm bool) error { + var direction = migrate.Down + + pending, err := migrate.GetMigrationRecords(Conn, "sqlite3") + if err != nil { + return err } + if len(pending) == 0 { + fmt.Println("Nothing to change") + os.Exit(0) + } + + if !confirm { + fmt.Printf("Undo %d migration(s)? [Y/n] ", len(pending)) + + reader := bufio.NewReader(os.Stdin) + + input, _ := reader.ReadString('\n') + input = strings.TrimSpace(input) + input = strings.ToLower(input) + + if !strings.HasPrefix(input, "y") && input != "" { + fmt.Printf("Canceling %d downgrade(s)\n", len(pending)) + os.Exit(0) + } + } + + changes, err := migrate.Exec(Conn, "sqlite3", migrations, direction) + if err != nil { + return err + } + + fmt.Printf("Undone %d migration(s)!\n", changes) return nil } func Status() error { - // Get the list of applied migrations applied, err := migrate.GetMigrationRecords(Conn, "sqlite3") if err != nil { return err } - - // Get the list of migrations that are yet to be applied pending, _, err := migrate.PlanMigration(Conn, "sqlite3", migrations, migrate.Up, 0) if err != nil { return err @@ -104,7 +114,7 @@ func Status() error { return nil } -func Pending() (bool, error) { +func GetPending() (bool, error) { planned, _, err := migrate.PlanMigration(Conn, "sqlite3", migrations, migrate.Up, 0) if err != nil { return false, err