main.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. package main
  2. import (
  3. "context"
  4. "database/sql"
  5. "flag"
  6. "fmt"
  7. "net/url"
  8. "os"
  9. "path/filepath"
  10. "git.aetherial.dev/aeth/keiji/pkg/storage"
  11. _ "github.com/mattn/go-sqlite3"
  12. )
  13. func run(args []string) error {
  14. flags := flag.NewFlagSet("keiji-migrate", flag.ContinueOnError)
  15. dbPath := flags.String("db", "", "existing SQLite database file")
  16. media := flags.String("media-dir", "", "directory containing UUID media files")
  17. category := flags.String("legacy-category", "", "category for all rows if category column is missing")
  18. offline := flags.Bool("offline", false, "confirm application and other writers are stopped")
  19. backup := flags.Bool("backup-confirmed", false, "confirm a verified backup exists")
  20. if err := flags.Parse(args); err != nil {
  21. return err
  22. }
  23. if flags.NArg() != 0 || *dbPath == "" || *media == "" || *category == "" || !*offline || !*backup {
  24. return fmt.Errorf("required: -db, -media-dir, -legacy-category, -offline, and -backup-confirmed")
  25. }
  26. abs, err := filepath.Abs(*dbPath)
  27. if err != nil {
  28. return err
  29. }
  30. uri := (&url.URL{Scheme: "file", Path: abs, RawQuery: "mode=rw&_busy_timeout=5000&_txlock=immediate"}).String()
  31. db, err := sql.Open("sqlite3", uri)
  32. if err != nil {
  33. return err
  34. }
  35. defer db.Close()
  36. report, err := storage.MigrateLegacyImages(context.Background(), db, *media, *category)
  37. if err != nil {
  38. return err
  39. }
  40. fmt.Printf("Migration committed: examined=%d updated=%d unknown=%d\n", report.Examined, report.Updated, report.Unknown)
  41. return nil
  42. }
  43. func main() {
  44. if err := run(os.Args[1:]); err != nil {
  45. fmt.Fprintln(os.Stderr, err)
  46. os.Exit(1)
  47. }
  48. }