From 9cbcca588a9159ebe8e93b384e6742e77864c7a9 Mon Sep 17 00:00:00 2001 From: lion Date: Fri, 5 Sep 2025 09:51:18 +0800 Subject: [PATCH] add version flag for source ip editor --- maker/golang/main.go | 23 ++++++++++++++++++++--- maker/golang/xdb/editor.go | 15 ++++++++++++--- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/maker/golang/main.go b/maker/golang/main.go index fde765c..142c55f 100644 --- a/maker/golang/main.go +++ b/maker/golang/main.go @@ -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 diff --git a/maker/golang/xdb/editor.go b/maker/golang/xdb/editor.go index 7258fc5..8dd9622 100644 --- a/maker/golang/xdb/editor.go +++ b/maker/golang/xdb/editor.go @@ -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 }