add version flag for source ip editor

This commit is contained in:
lion 2025-09-05 09:51:18 +08:00
parent 33beaf96c9
commit 9cbcca588a
2 changed files with 32 additions and 6 deletions

View File

@ -202,6 +202,7 @@ func genDb() {
return
} else if v, err := xdb.VersionFromName(ipVersion); err != nil {
slog.Error("failed to parse version name", "error", err)
return
} else {
version = v
}
@ -412,6 +413,7 @@ func testBench() {
return
} else if v, err := xdb.VersionFromName(ipVersion); err != nil {
slog.Error("failed to parse version name", "error", err)
return
} else {
version = v
}
@ -476,11 +478,13 @@ func testBench() {
func edit() {
var err error
var srcFile = ""
var srcFile, ipVersion = "", ""
var fErr = iterateFlags(func(key string, val string) error {
switch key {
case "src":
srcFile = val
case "version":
ipVersion = val
default:
return fmt.Errorf("undefined option '%s=%s'\n", key, val)
}
@ -494,10 +498,23 @@ func edit() {
if srcFile == "" {
fmt.Printf("%s edit [command options]\n", os.Args[0])
fmt.Printf("options:\n")
fmt.Printf(" --src string source ip text file path\n")
fmt.Printf(" --src string source ip text file path\n")
fmt.Printf(" --version string IP version, options: ipv4/ipv6, specify this flag so you don't get confused \n")
return
}
// check and define the IP version
var version *xdb.Version = nil
if len(ipVersion) < 2 {
slog.Error("please specify the ip version with flag --version, ipv4 or ipv6 ?")
return
} else if v, err := xdb.VersionFromName(ipVersion); err != nil {
slog.Error("failed to parse version name", "error", err)
return
} else {
version = v
}
rExp, err := regexp.Compile("\\s+")
if err != nil {
fmt.Printf("failed to compile regexp: %s\n", err)
@ -506,7 +523,7 @@ func edit() {
fmt.Printf("init the editor from source @ `%s` ... \n", srcFile)
var tStart = time.Now()
editor, err := xdb.NewEditor(srcFile)
editor, err := xdb.NewEditor(version, srcFile)
if err != nil {
fmt.Printf("failed to init editor: %s", err)
return

View File

@ -14,6 +14,8 @@ import (
)
type Editor struct {
verison *Version
// source ip file
srcPath string
srcHandle *os.File
@ -23,7 +25,7 @@ type Editor struct {
segments *list.List
}
func NewEditor(srcFile string) (*Editor, error) {
func NewEditor(version *Version, srcFile string) (*Editor, error) {
// check the src and dst file
srcPath, err := filepath.Abs(srcFile)
if err != nil {
@ -36,6 +38,7 @@ func NewEditor(srcFile string) (*Editor, error) {
}
e := &Editor{
verison: version,
srcPath: srcPath,
srcHandle: srcHandle,
toSave: false,
@ -57,6 +60,11 @@ func (e *Editor) loadSegments() error {
var iErr = IterateSegments(e.srcHandle, func(l string) {
// do nothing here
}, func(seg *Segment) error {
// version check
if len(seg.StartIP) != e.verison.Bytes {
return fmt.Errorf("invalid ip segment(%s expected)", e.verison.Name)
}
// check the continuity of the data segment
if err := seg.AfterCheck(last); err != nil {
return err
@ -270,8 +278,9 @@ func (e *Editor) Save() error {
continue
}
var l = s.String()
_, err = dstHandle.WriteString(fmt.Sprintf("%s\n", l))
// var l = s.String()
// _, err = dstHandle.WriteString(fmt.Sprintf("%s\n", l))
_, err = fmt.Fprintln(dstHandle, s.String())
if err != nil {
return err
}