Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Ip2region
提交
0957b419
I
Ip2region
项目概览
int
/
Ip2region
上一次同步 11 个月
通知
19
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
I
Ip2region
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
0957b419
编写于
12月 02, 2022
作者:
L
Lion
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
load segments while editor init
上级
b7650f76
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
148 addition
and
72 deletion
+148
-72
binding/golang/go.mod
binding/golang/go.mod
+2
-0
binding/golang/go.sum
binding/golang/go.sum
+2
-0
maker/golang/main.go
maker/golang/main.go
+15
-33
maker/golang/xdb/editor.go
maker/golang/xdb/editor.go
+78
-7
maker/golang/xdb/maker.go
maker/golang/xdb/maker.go
+9
-32
maker/golang/xdb/util.go
maker/golang/xdb/util.go
+42
-0
未找到文件。
binding/golang/go.mod
浏览文件 @
0957b419
...
...
@@ -3,3 +3,5 @@ module github.com/lionsoul2014/ip2region/binding/golang
go 1.17
require github.com/mitchellh/go-homedir v1.1.0
require github.com/yookoala/realpath v1.0.0 // indirect
binding/golang/go.sum
浏览文件 @
0957b419
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
github.com/yookoala/realpath v1.0.0 h1:7OA9pj4FZd+oZDsyvXWQvjn5oBdcHRTV44PpdMSuImQ=
github.com/yookoala/realpath v1.0.0/go.mod h1:gJJMA9wuX7AcqLy1+ffPatSCySA1FQ2S8Ya9AIoYBpE=
maker/golang/main.go
浏览文件 @
0957b419
...
...
@@ -246,55 +246,35 @@ func testBench() {
}
var
count
,
errCount
,
tStart
=
0
,
0
,
time
.
Now
()
var
scanner
=
bufio
.
NewScanner
(
handle
)
scanner
.
Split
(
bufio
.
ScanLines
)
for
scanner
.
Scan
()
{
var
l
=
strings
.
TrimSpace
(
strings
.
TrimSuffix
(
scanner
.
Text
(),
"
\n
"
))
var
ps
=
strings
.
SplitN
(
l
,
"|"
,
3
)
if
len
(
ps
)
!=
3
{
fmt
.
Printf
(
"invalid ip segment line `%s`
\n
"
,
l
)
return
}
sip
,
err
:=
xdb
.
CheckIP
(
ps
[
0
])
if
err
!=
nil
{
fmt
.
Printf
(
"check start ip `%s`: %s
\n
"
,
ps
[
0
],
err
)
return
}
eip
,
err
:=
xdb
.
CheckIP
(
ps
[
1
])
if
err
!=
nil
{
fmt
.
Printf
(
"check end ip `%s`: %s
\n
"
,
ps
[
1
],
err
)
return
}
if
sip
>
eip
{
fmt
.
Printf
(
"start ip(%s) should not be greater than end ip(%s)
\n
"
,
ps
[
0
],
ps
[
1
])
return
}
var
iErr
=
xdb
.
IterateSegments
(
handle
,
nil
,
func
(
sip
uint32
,
eip
uint32
,
region
*
string
)
error
{
var
s
=
*
region
var
l
=
fmt
.
Sprintf
(
"%d|%d|%s"
,
sip
,
eip
,
s
)
fmt
.
Printf
(
"try to bench segment: `%s`
\n
"
,
l
)
mip
:=
xdb
.
MidIP
(
sip
,
eip
)
for
_
,
ip
:=
range
[]
uint32
{
sip
,
xdb
.
MidIP
(
sip
,
mip
),
mip
,
xdb
.
MidIP
(
mip
,
eip
),
eip
}
{
fmt
.
Printf
(
"|-try to bench ip '%s' ... "
,
xdb
.
Long2IP
(
ip
))
r
egion
,
_
,
err
:=
searcher
.
Search
(
ip
)
r
,
_
,
err
:=
searcher
.
Search
(
ip
)
if
err
!=
nil
{
fmt
.
Printf
(
"failed to search ip '%s': %s
\n
"
,
xdb
.
Long2IP
(
ip
),
err
)
return
return
fmt
.
Errorf
(
"failed to search ip '%s': %s
\n
"
,
xdb
.
Long2IP
(
ip
),
err
)
}
// check the region info
count
++
if
r
egion
!=
ps
[
2
]
{
if
r
!=
s
{
errCount
++
fmt
.
Printf
(
" --[Failed] (%s != %s)
\n
"
,
r
egion
,
ps
[
2
]
)
fmt
.
Printf
(
" --[Failed] (%s != %s)
\n
"
,
r
,
s
)
if
ignoreError
==
false
{
return
return
fmt
.
Errorf
(
""
)
}
}
else
{
fmt
.
Printf
(
" --[Ok]
\n
"
)
}
}
return
nil
})
if
iErr
!=
nil
{
fmt
.
Printf
(
"%s"
,
err
)
return
}
fmt
.
Printf
(
"Bench finished, {count: %d, failed: %d, took: %s}
\n
"
,
count
,
errCount
,
time
.
Since
(
tStart
))
...
...
@@ -381,6 +361,8 @@ func edit() {
continue
}
fmt
.
Printf
(
"PutFile(%s): Ok
\n
"
,
file
)
}
else
if
len
(
cmd
)
>
0
{
help
()
}
}
}
...
...
maker/golang/xdb/editor.go
浏览文件 @
0957b419
...
...
@@ -6,31 +6,102 @@
package
xdb
import
"container/list"
import
(
"container/list"
"fmt"
"os"
"path/filepath"
"time"
)
type
Editor
struct
{
// source ip file
src
File
string
dst
File
string
src
Handle
*
os
.
File
dst
Handle
*
os
.
File
// region info
region
map
[
int
]
string
// @Note: 2^32 items at most
region
map
[
uint32
]
string
rIndex
uint32
// segments list
segments
*
list
.
List
}
func
NewEditor
(
srcFile
string
,
dstFile
string
)
(
*
Editor
,
error
)
{
// check the src and dst file
srcPath
,
err
:=
filepath
.
Abs
(
srcFile
)
if
err
!=
nil
{
return
nil
,
err
}
dstPath
,
err
:=
filepath
.
Abs
(
dstFile
)
if
err
!=
nil
{
return
nil
,
err
}
if
srcPath
==
dstPath
{
return
nil
,
fmt
.
Errorf
(
"src_path(%s) = dst_path(%s)"
,
srcFile
,
dstFile
)
}
srcHandle
,
err
:=
os
.
OpenFile
(
srcPath
,
os
.
O_RDONLY
,
0600
)
if
err
!=
nil
{
return
nil
,
err
}
dstHandle
,
err
:=
os
.
OpenFile
(
dstPath
,
os
.
O_CREATE
|
os
.
O_RDWR
,
0644
)
if
err
!=
nil
{
return
nil
,
err
}
e
:=
&
Editor
{
src
File
:
srcFi
le
,
dst
File
:
dstFi
le
,
src
Handle
:
srcHand
le
,
dst
Handle
:
dstHand
le
,
region
:
map
[
int
]
string
{},
region
:
map
[
uint32
]
string
{},
rIndex
:
uint32
(
0
),
segments
:
list
.
New
(),
}
// load the segments
if
err
=
e
.
loadSegments
();
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"failed load segments: %s"
,
err
)
}
return
e
,
nil
}
// Load all the segments from the source file
func
(
e
*
Editor
)
loadSegments
()
error
{
var
last
*
Segment
=
nil
var
tStart
=
time
.
Now
()
var
err
=
IterateSegments
(
e
.
srcHandle
,
nil
,
func
(
sip
uint32
,
eip
uint32
,
region
*
string
)
error
{
var
str
=
*
region
var
seg
=
&
Segment
{
StartIP
:
sip
,
EndIP
:
eip
,
Region
:
str
,
}
// check the continuity of the data segment
if
last
!=
nil
{
if
last
.
EndIP
+
1
!=
seg
.
StartIP
{
return
fmt
.
Errorf
(
"discontinuous data segment: last.eip+1(%d) != seg.sip(%d, %s)"
,
sip
,
eip
,
str
)
}
}
last
=
seg
return
nil
})
if
err
!=
nil
{
return
fmt
.
Errorf
(
"failed to load segments: %s"
,
err
)
}
fmt
.
Printf
(
"all segments loaded, length: %d, elapsed: %s
\n
"
,
e
.
segments
.
Len
(),
time
.
Since
(
tStart
))
return
nil
}
func
(
e
*
Editor
)
Put
(
ip
string
)
error
{
return
nil
}
...
...
maker/golang/xdb/maker.go
浏览文件 @
0957b419
...
...
@@ -50,12 +50,10 @@
package
xdb
import
(
"bufio"
"encoding/binary"
"fmt"
"log"
"os"
"strings"
"time"
)
...
...
@@ -140,50 +138,29 @@ func (m *Maker) loadSegments() error {
var
last
*
Segment
=
nil
var
tStart
=
time
.
Now
()
var
scanner
=
bufio
.
NewScanner
(
m
.
srcHandle
)
scanner
.
Split
(
bufio
.
ScanLines
)
for
scanner
.
Scan
()
{
var
l
=
strings
.
TrimSpace
(
strings
.
TrimSuffix
(
scanner
.
Text
(),
"
\n
"
))
var
err
=
IterateSegments
(
m
.
srcHandle
,
func
(
l
string
)
{
log
.
Printf
(
"load segment: `%s`"
,
l
)
var
ps
=
strings
.
SplitN
(
l
,
"|"
,
3
)
if
len
(
ps
)
!=
3
{
return
fmt
.
Errorf
(
"invalid ip segment line `%s`"
,
l
)
}
sip
,
err
:=
CheckIP
(
ps
[
0
])
if
err
!=
nil
{
return
fmt
.
Errorf
(
"check start ip `%s`: %s"
,
ps
[
0
],
err
)
}
eip
,
err
:=
CheckIP
(
ps
[
1
])
if
err
!=
nil
{
return
fmt
.
Errorf
(
"check end ip `%s`: %s"
,
ps
[
1
],
err
)
}
if
sip
>
eip
{
return
fmt
.
Errorf
(
"start ip(%s) should not be greater than end ip(%s)"
,
ps
[
0
],
ps
[
1
])
}
if
len
(
ps
[
2
])
<
1
{
return
fmt
.
Errorf
(
"empty region info in segment line `%s`"
,
l
)
}
},
func
(
sip
uint32
,
eip
uint32
,
region
*
string
)
error
{
var
str
=
*
region
var
seg
=
&
Segment
{
StartIP
:
sip
,
EndIP
:
eip
,
Region
:
ps
[
2
]
,
Region
:
str
,
}
// check the continuity of the data segment
if
last
!=
nil
{
if
last
.
EndIP
+
1
!=
seg
.
StartIP
{
return
fmt
.
Errorf
(
"discontinuous data segment: last.eip+1(%d) != seg.sip(%d, %s)"
,
sip
,
eip
,
ps
[
0
]
)
return
fmt
.
Errorf
(
"discontinuous data segment: last.eip+1(%d) != seg.sip(%d, %s)"
,
sip
,
eip
,
str
)
}
}
m
.
segments
=
append
(
m
.
segments
,
seg
)
last
=
seg
return
nil
})
if
err
!=
nil
{
return
fmt
.
Errorf
(
"failed to load segments: %s"
,
err
)
}
log
.
Printf
(
"all segments loaded, length: %d, elapsed: %s"
,
len
(
m
.
segments
),
time
.
Since
(
tStart
))
...
...
maker/golang/xdb/util.go
浏览文件 @
0957b419
...
...
@@ -5,7 +5,9 @@
package
xdb
import
(
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
...
...
@@ -45,6 +47,46 @@ func MidIP(sip uint32, eip uint32) uint32 {
return
uint32
((
uint64
(
sip
)
+
uint64
(
eip
))
>>
1
)
}
func
IterateSegments
(
handle
*
os
.
File
,
before
func
(
l
string
),
cb
func
(
sip
uint32
,
eip
uint32
,
region
*
string
)
error
)
error
{
var
scanner
=
bufio
.
NewScanner
(
handle
)
scanner
.
Split
(
bufio
.
ScanLines
)
for
scanner
.
Scan
()
{
var
l
=
strings
.
TrimSpace
(
strings
.
TrimSuffix
(
scanner
.
Text
(),
"
\n
"
))
if
before
!=
nil
{
before
(
l
)
}
var
ps
=
strings
.
SplitN
(
l
,
"|"
,
3
)
if
len
(
ps
)
!=
3
{
return
fmt
.
Errorf
(
"invalid ip segment line `%s`"
,
l
)
}
sip
,
err
:=
CheckIP
(
ps
[
0
])
if
err
!=
nil
{
return
fmt
.
Errorf
(
"check start ip `%s`: %s"
,
ps
[
0
],
err
)
}
eip
,
err
:=
CheckIP
(
ps
[
1
])
if
err
!=
nil
{
return
fmt
.
Errorf
(
"check end ip `%s`: %s"
,
ps
[
1
],
err
)
}
if
sip
>
eip
{
return
fmt
.
Errorf
(
"start ip(%s) should not be greater than end ip(%s)"
,
ps
[
0
],
ps
[
1
])
}
if
len
(
ps
[
2
])
<
1
{
return
fmt
.
Errorf
(
"empty region info in segment line `%s`"
,
l
)
}
if
err
=
cb
(
sip
,
eip
,
&
ps
[
2
]);
err
!=
nil
{
return
err
}
}
return
nil
}
func
CheckSegments
(
segList
[]
*
Segment
)
error
{
var
last
*
Segment
for
_
,
seg
:=
range
segList
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录