From 9cb3bbcb0728ee78f8432052ad7bbc2506e9641f Mon Sep 17 00:00:00 2001 From: Lion Date: Sat, 18 Jun 2022 19:36:45 +0800 Subject: [PATCH] add load header func --- binding/golang/xdb/util.go | 30 ++++++++++++++++++++++++++++++ binding/golang/xdb/util_test.go | 11 +++++++++++ 2 files changed, 41 insertions(+) diff --git a/binding/golang/xdb/util.go b/binding/golang/xdb/util.go index ddc8688..8cde3df 100644 --- a/binding/golang/xdb/util.go +++ b/binding/golang/xdb/util.go @@ -89,6 +89,36 @@ func LoadVectorIndexFromFile(dbFile string) ([][]*VectorIndexBlock, error) { return LoadVectorIndex(handle) } +// LoadHeader load the header info from the specified handle +func LoadHeader(handle *os.File) ([]byte, error) { + _, err := handle.Seek(0, 0) + if err != nil { + return nil, fmt.Errorf("seek to the header: %w", err) + } + + var buff = make([]byte, HeaderInfoLength) + rLen, err := handle.Read(buff) + if err != nil { + return nil, err + } + + if rLen != len(buff) { + return nil, fmt.Errorf("incomplete read: readed bytes should be %d", len(buff)) + } + + return buff, nil +} + +// LoadHeaderFromFile load header info from the specified db file path +func LoadHeaderFromFile(dbFile string) ([]byte, error) { + handle, err := os.OpenFile(dbFile, os.O_RDONLY, 0600) + if err != nil { + return nil, fmt.Errorf("open xdb file `%s`: %w", dbFile, err) + } + + return LoadHeader(handle) +} + // LoadContent load the whole xdb content from the specified file handle func LoadContent(handle *os.File) ([]byte, error) { // get file size diff --git a/binding/golang/xdb/util_test.go b/binding/golang/xdb/util_test.go index beb1553..a8ea453 100644 --- a/binding/golang/xdb/util_test.go +++ b/binding/golang/xdb/util_test.go @@ -23,6 +23,17 @@ func TestLoadContent(t *testing.T) { buff, err := LoadContentFromFile("../../../data/ip2region.xdb") if err != nil { fmt.Printf("failed to load xdb content: %s\n", err) + return + } + + fmt.Printf("buff length: %d\n", len(buff)) +} + +func TestLoadHeader(t *testing.T) { + buff, err := LoadHeaderFromFile("../../../data/ip2region.xdb") + if err != nil { + fmt.Printf("failed to load xdb header info: %s\n", err) + return } fmt.Printf("buff length: %d\n", len(buff))