package main
import (
"database/sql"
"fmt"
"github.com/golang-migrate/migrate/v4"
"github.com/golang-migrate/migrate/v4/database/sqlite"
_ "github.com/golang-migrate/migrate/v4/source/file"
_ "github.com/mattn/go-sqlite3"
"github.com/pkg/errors"
"github.com/spf13/cobra"
)
var rootCmd = &cobra.Command{
Use: "allredlib",
Short: "allredlib - a CLI for managing and running a home library",
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("try running one of my subcommands")
},
}
var migrateUp = &cobra.Command{
Use: "migrate-up",
Short: "add all the migrations",
RunE: func(cmd *cobra.Command, args []string) error {
files, err := cmd.Flags().GetString("files")
if err != nil {
return errors.Wrap(err, "could not get files arg")
}
if files == "" {
return fmt.Errorf("Expected files to be defined, but it was not")
}
connection, err := cmd.Flags().GetString("connection")
if err != nil {
return errors.Wrap(err, "could not get connection arg")
}
if connection == "" {
return fmt.Errorf("Expected connection to be defined, but it was not")
}
db, err := sql.Open("sqlite3", connection+"?_pragma=foreign_keys(1)")
if err != nil {
return errors.Wrap(err, "failed to connect to DB")
}
driver, err := sqlite.WithInstance(db, &sqlite.Config{})
m, err := migrate.NewWithDatabaseInstance(
fmt.Sprintf("file:///%s", files),
"postgres", driver)
if err != nil {
return errors.Wrap(err, "failed to connect to DB")
}
err = m.Up()
if err != nil {
if errors.Is(err, migrate.ErrNoChange) {
fmt.Println("nothing to migrate")
return nil
}
return err
}
fmt.Println("migrated up")
return nil
},
}
var migrateDown = &cobra.Command{
Use: "migrate-down",
Short: "remove all the migrations",
RunE: func(cmd *cobra.Command, args []string) error {
files, err := cmd.Flags().GetString("files")
if err != nil {
return errors.Wrap(err, "could not get files arg")
}
if files == "" {
return fmt.Errorf("Expected files to be defined, but it was not")
}
connection, err := cmd.Flags().GetString("connection")
if err != nil {
return errors.Wrap(err, "could not get connection arg")
}
if connection == "" {
return fmt.Errorf("Expected connection to be defined, but it was not")
}
db, err := sql.Open("sqlite3", connection)
if err != nil {
return errors.Wrap(err, "failed to connect to DB")
}
driver, err := sqlite.WithInstance(db, &sqlite.Config{})
m, err := migrate.NewWithDatabaseInstance(
fmt.Sprintf("file:///%s", files),
"postgres", driver)
if err != nil {
return errors.Wrap(err, "failed to connect to DB 2")
}
err = m.Down()
if err != nil {
if errors.Is(err, migrate.ErrNoChange) {
fmt.Println("nothing to migrate")
return nil
}
return err
}
fmt.Println("migrated down")
return nil
},
}
func init() {
migrateUp.Flags().String("files", "", "path to migration files")
migrateUp.Flags().String("connection", "", "connection to DB")
rootCmd.AddCommand(migrateUp)
migrateDown.Flags().String("files", "", "path to migration files")
migrateDown.Flags().String("connection", "", "connection to DB")
rootCmd.AddCommand(migrateDown)
}
func main() {
rootCmd.Execute()
}