59 lines
1.4 KiB
Go
59 lines
1.4 KiB
Go
package main
|
|||
|
|
|
||
|
|
import (
|
||
|
|
"context"
|
||
|
|
"errors"
|
||
|
|
"flag"
|
||
|
|
"fmt"
|
||
|
|
"io"
|
||
|
|
"log"
|
||
|
|
"os"
|
||
|
|
|
||
|
|
"cmbuyer/admin/internal/migrations"
|
||
|
|
"cmbuyer/admin/internal/storage/sqlite"
|
||
|
|
)
|
||
|
|
|
||
|
|
func main() {
|
||
|
|
if err := run(context.Background(), os.Args[1:], os.Stderr); err != nil {
|
||
|
|
log.Print(err)
|
||
|
|
os.Exit(1)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func run(ctx context.Context, args []string, stderr io.Writer) error {
|
||
|
|
flags := flag.NewFlagSet("migrate", flag.ContinueOnError)
|
||
|
|
flags.SetOutput(stderr)
|
||
|
|
databaseSource := flags.String("database", "", "SQLite data source")
|
||
|
|
migrationDirectory := flags.String("dir", "migrations", "migration directory")
|
||
|
|
|
||
|
|
if err := flags.Parse(args); err != nil {
|
||
|
|
return err
|
||
|
|
}
|
||
|
|
if *databaseSource == "" {
|
||
|
|
return errors.New("-database is required")
|
||
|
|
}
|
||
|
|
if flags.NArg() != 1 {
|
||
|
|
return fmt.Errorf("usage: migrate -database <sqlite-data-source> [-dir <migration-directory>] <up|down|status>")
|
||
|
|
}
|
||
|
|
command := flags.Arg(0)
|
||
|
|
if command != "up" && command != "down" && command != "status" {
|
||
|
|
return fmt.Errorf("unsupported migration command %q", command)
|
||
|
|
}
|
||
|
|
|
||
|
|
database, err := sqlite.Open(*databaseSource)
|
||
|
|
if err != nil {
|
||
|
|
return fmt.Errorf("open SQLite database: %w", err)
|
||
|
|
}
|
||
|
|
defer func() {
|
||
|
|
if err := database.Close(); err != nil {
|
||
|
|
log.Printf("close SQLite database: %v", err)
|
||
|
|
}
|
||
|
|
}()
|
||
|
|
|
||
|
|
if err := migrations.Run(ctx, database, *migrationDirectory, command); err != nil {
|
||
|
|
return fmt.Errorf("run migrations: %w", err)
|
||
|
|
}
|
||
|
|
|
||
|
|
return nil
|
||
|
|
}
|