package main import ( "context" "log" "os" "strconv" "time" "geoip-rest/internal/userprogram" ) const defaultDumpTimeout = 5 * time.Minute func main() { logger := log.New(os.Stdout, "[dump] ", log.LstdFlags) mysqlCfg, err := userprogram.NewMySQLConfigFromEnv() if err != nil { log.Fatalf("config error: %v", err) } updateDir := userprogram.DefaultUpdateDir if val := os.Getenv("USER_PROGRAM_UPDATE_DIR"); val != "" { updateDir = val } target, err := userprogram.ParseTargetDate(os.Getenv("USER_PROGRAM_TARGET_DATE")) if err != nil { log.Fatalf("target date error: %v", err) } startID := int64(0) if val := os.Getenv("USER_PROGRAM_START_ID"); val != "" { parsed, parseErr := strconv.ParseInt(val, 10, 64) if parseErr != nil { log.Fatalf("invalid USER_PROGRAM_START_ID: %v", parseErr) } startID = parsed } ctx, cancel := context.WithTimeout(context.Background(), defaultDumpTimeout) defer cancel() dumper, err := userprogram.NewDumper(mysqlCfg, updateDir) if err != nil { log.Fatalf("init dumper failed: %v", err) } defer dumper.Close() endID, err := dumper.MaxIDUntil(ctx, target) if err != nil { log.Fatalf("determine end id failed: %v", err) } if endID <= startID { logger.Printf("no rows to dump (start_id=%d end_id=%d)", startID, endID) return } outPath, err := dumper.DumpRange(ctx, startID, endID, target) if err != nil { log.Fatalf("dump failed: %v", err) } logger.Printf("dumped ids (%d, %d] to %s", startID, endID, outPath) }