64 lines
1.5 KiB
Go
64 lines
1.5 KiB
Go
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)
|
|
}
|