ip2region_private/maker/golang/cmd/process.go

123 lines
3.3 KiB
Go

// Copyright 2022 The Ip2Region Authors. All rights reserved.
// Use of this source code is governed by a Apache2.0-style
// license that can be found in the LICENSE file.
package cmd
import (
"fmt"
"log/slog"
"os"
"strconv"
"time"
"github.com/lionsoul2014/ip2region/maker/golang/xdb"
)
// source data process, sort, de-duplicate, merge
func Process(sCmd string) {
var err error
var srcFile, dstFile = "", ""
var fieldList, logLevel = "", ""
var clearBasedIndex = -1
var clearValueEqual, clearValueExcept = "", ""
var fErr = IterateFlags(func(key string, val string) error {
switch key {
case "src":
srcFile = val
case "dst":
dstFile = val
case "field-list":
fieldList = val
case "clear-based-index":
num, err := strconv.Atoi(val)
if err != nil {
return fmt.Errorf("invalid clear-based-index '%s=%s', integer expected", key, val)
}
clearBasedIndex = num
case "clear-value-equal":
clearValueEqual = val
case "clear-value-except":
clearValueExcept = val
case "log-level":
logLevel = val
default:
return fmt.Errorf("undefined option '%s=%s'", key, val)
}
return nil
})
if fErr != nil {
fmt.Printf("failed to parse flags: %s", fErr)
return
}
if srcFile == "" || dstFile == "" {
fmt.Printf("%s %s [command options]\n", os.Args[0], sCmd)
fmt.Printf("options:\n")
fmt.Printf(" --src string source ip text file path\n")
fmt.Printf(" --dst string target ip text file path\n")
fmt.Printf(" --field-list string field index list imploded with ',' eg: 0,1,2,3-6,7\n")
fmt.Printf(" --clear-based-index integer clear based index eg: 3\n")
fmt.Printf(" --clear-value-equal string clear value equal to the specified one\n")
fmt.Printf(" --clear-value-except string clear value except the specified one\n")
fmt.Printf(" --log-level string set the log level, options: debug/info/warn/error\n")
return
}
if clearBasedIndex > -1 {
if len(clearValueEqual) > 0 && len(clearValueExcept) > 0 {
fmt.Print("Only one can be specified besides clear-value-equal and clear-value-except")
return
}
if len(clearValueEqual) == 0 && len(clearValueExcept) == 0 {
fmt.Print("At least one must be specified for clear-value-equal and clear-value-except")
return
}
}
// check and apply the log level
err = ApplyLogLevel(logLevel)
if err != nil {
slog.Error("failed to apply log level", "error", err)
return
}
fields, err := GetFilterFields(fieldList)
if err != nil {
slog.Error("failed to get filter fields", "error", err)
return
}
// make the binary file
tStart := time.Now()
processor, err := xdb.NewProcessor(srcFile, dstFile, fields, clearBasedIndex, clearValueEqual, clearValueExcept)
if err != nil {
fmt.Printf("failed to create %s\n", err)
return
}
err = processor.Init()
if err != nil {
fmt.Printf("failed Init: %s\n", err)
return
}
slog.Info("Processing", "src", srcFile, "dst", dstFile, "fields", fields, "clearBasedIndex",
clearBasedIndex, "clearValueEqual", clearValueEqual, "clearValueExcept", clearValueExcept, "logLevel", logLevel)
err = processor.Start()
if err != nil {
fmt.Printf("failed Start: %s\n", err)
return
}
err = processor.End()
if err != nil {
fmt.Printf("failed End: %s\n", err)
}
slog.Info("processor done", "elapsed", time.Since(tStart))
}