74 lines
1.7 KiB
Go
74 lines
1.7 KiB
Go
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))
|
|
}
|