package main import ( "context" "encoding/json" "flag" "log/slog" "os" "os/signal" "path/filepath" "git.sunturtle.xyz/zephyr/horse/umadump/ism" ) func main() { var ( uri, journalMode string fs []string trainer int64 logLevel slog.Level ) flag.StringVar(&uri, "db", "idle_single_mode.sqlite3", "output database `URI` or filename") flag.StringVar(&journalMode, "journal", "memory", "journal `mode` to apply to database connections") flag.Int64Var(&trainer, "t", 0, "trainer `ID` to associate with the data") flag.TextVar(&logLevel, "log", slog.LevelInfo, "log `level`") flag.Func("d", "`dir`ectory containing idle single mode dumps to load (repeatable)", func(s string) error { es, err := os.ReadDir(s) for _, e := range es { if e.IsDir() { continue } fs = append(fs, filepath.Join(s, e.Name())) } return err }) flag.Parse() fs = append(fs, flag.Args()...) ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt) go func() { <-ctx.Done() stop() }() log := slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{Level: logLevel})) db := opendb(uri, journalMode) ok := 0 for _, n := range fs { log := log.With(slog.String("file", n)) log.Info("begin") f, err := os.Open(n) if err != nil { log.Error("open", slog.Any("err", err)) continue } var career ism.WorkIdleSingleMode d := json.NewDecoder(f) d.DisallowUnknownFields() log.Debug("decode") if err := d.Decode(&career); err != nil { log.Error("load", slog.Any("err", err)) continue } log.Debug("insert") err = insert(ctx, db, log, &career, trainer) if err != nil { log.Error("insert", slog.Any("err", err)) continue } ok++ } slog.Info("done", slog.Int("careers", ok)) }