From c78ba4827df1f33ba66c18103ac0496cf62c8f2f Mon Sep 17 00:00:00 2001 From: lionsoul2014 Date: Wed, 3 Dec 2025 13:36:49 +0800 Subject: [PATCH] service config --- binding/golang/service/config.go | 136 ++++++++++++++++++++++++ binding/golang/service/searcher_pool.go | 14 +++ 2 files changed, 150 insertions(+) create mode 100644 binding/golang/service/config.go create mode 100644 binding/golang/service/searcher_pool.go diff --git a/binding/golang/service/config.go b/binding/golang/service/config.go new file mode 100644 index 0000000..825a9dd --- /dev/null +++ b/binding/golang/service/config.go @@ -0,0 +1,136 @@ +// 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. + +// --- +// Ip2Region service config +// +// @Author Lion +// @Date 2025/12/03 + +package service + +import ( + "fmt" + "os" + + "github.com/lionsoul2014/ip2region/binding/golang/xdb" +) + +const ( + NoCache = 0 + VIndexCache = 1 + BufferCache = 2 +) + +type Config struct { + cachePolicy int + ipVersion *xdb.Version + + // xdb file path + xdbPath string + header *xdb.Header + + // buffers + vIndex []byte + cBuffer []byte + + searchers int +} + +func NewV4Config(cachePolicy int, xdbPath string, searchers int) (*Config, error) { + return newConfig(cachePolicy, xdb.IPv4, xdbPath, searchers) +} + +func NewV6Config(cachePolicy int, xdbPath string, searchers int) (*Config, error) { + return newConfig(cachePolicy, xdb.IPv4, xdbPath, searchers) +} + +func newConfig(cachePolicy int, ipVersion *xdb.Version, xdbPath string, searchers int) (*Config, error) { + if searchers < 1 { + return nil, fmt.Errorf("searchers=%d, > 0 expected", searchers) + } + + // open the xdb binary file + handle, err := os.OpenFile(xdbPath, os.O_RDONLY, 0600) + if err != nil { + return nil, err + } + + // 1, verify the xdb + err = xdb.Verify(handle) + if err != nil { + return nil, err + } + + // 2, load the header + header, err := xdb.LoadHeader(handle) + if err != nil { + return nil, err + } + + // verify the ip version + xIpVersion, err := xdb.VersionFromHeader(header) + if err != nil { + return nil, err + } + + if xIpVersion.Id != ipVersion.Id { + return nil, fmt.Errorf("ip verison not match: xdb file %s with ip version=%s, as %s expected", xdbPath, xIpVersion.Name, ipVersion.Name) + } + + // 3, check and load the vector index buffer + var vIndex []byte = nil + if cachePolicy == VIndexCache { + vIndex, err = xdb.LoadVectorIndex(handle) + if err != nil { + return nil, err + } + } + + // 4, check and load the content buffer + var cBuffer []byte = nil + if cachePolicy == BufferCache { + cBuffer, err = xdb.LoadContent(handle) + if err != nil { + return nil, err + } + } + + return &Config{ + cachePolicy: cachePolicy, + ipVersion: ipVersion, + + xdbPath: xdbPath, + header: header, + + vIndex: vIndex, + cBuffer: cBuffer, + + searchers: searchers, + }, nil +} + +func (c *Config) CachePolicy() int { + return c.cachePolicy +} + +func (c *Config) IPVersion() *xdb.Version { + return c.ipVersion +} + +func (c *Config) Header() *xdb.Header { + return c.header +} + +func (c *Config) VIndex() []byte { + return c.vIndex +} + +func (c *Config) CBuffer() []byte { + return c.cBuffer +} + +func (c *Config) Searchers() int { + return c.searchers +} diff --git a/binding/golang/service/searcher_pool.go b/binding/golang/service/searcher_pool.go new file mode 100644 index 0000000..d1414f2 --- /dev/null +++ b/binding/golang/service/searcher_pool.go @@ -0,0 +1,14 @@ +// 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. + +// --- +// ip2region searcher pool +// +// @Author Lion +// @Date 2025/12/03 + +package service + +type SearcherPool struct { +}