@@ -28,6 +28,7 @@ type Reader struct {
28
28
Metadata Metadata
29
29
ipv4Start uint
30
30
ipv4StartBitDepth int
31
+ nodeOffsetMult uint
31
32
}
32
33
33
34
// Metadata holds the metadata decoded from the MaxMind DB file. In particular
@@ -90,11 +91,12 @@ func FromBytes(buffer []byte) (*Reader, error) {
90
91
}
91
92
92
93
reader := & Reader {
93
- buffer : buffer ,
94
- nodeReader : nodeReader ,
95
- decoder : d ,
96
- Metadata : metadata ,
97
- ipv4Start : 0 ,
94
+ buffer : buffer ,
95
+ nodeReader : nodeReader ,
96
+ decoder : d ,
97
+ Metadata : metadata ,
98
+ ipv4Start : 0 ,
99
+ nodeOffsetMult : metadata .RecordSize / 4 ,
98
100
}
99
101
100
102
reader .setIPv4Start ()
@@ -112,7 +114,7 @@ func (r *Reader) setIPv4Start() {
112
114
node := uint (0 )
113
115
i := 0
114
116
for ; i < 96 && node < nodeCount ; i ++ {
115
- node = r .nodeReader .readLeft (r . nodeOffset ( node ) )
117
+ node = r .nodeReader .readLeft (node * r . nodeOffsetMult )
116
118
}
117
119
r .ipv4Start = node
118
120
r .ipv4StartBitDepth = i
@@ -251,7 +253,7 @@ func (r *Reader) lookupPointer(ip net.IP) (uint, int, net.IP, error) {
251
253
for ; i < bitCount && node < nodeCount ; i ++ {
252
254
bit := uint (1 ) & (uint (ip [i >> 3 ]) >> (7 - (i % 8 )))
253
255
254
- offset := r . nodeOffset ( node )
256
+ offset := node * r . nodeOffsetMult
255
257
if bit == 0 {
256
258
node = r .nodeReader .readLeft (offset )
257
259
} else {
@@ -268,10 +270,6 @@ func (r *Reader) lookupPointer(ip net.IP) (uint, int, net.IP, error) {
268
270
return 0 , int (i ), ip , newInvalidDatabaseError ("invalid node in search tree" )
269
271
}
270
272
271
- func (r * Reader ) nodeOffset (node uint ) uint {
272
- return node * r .Metadata .RecordSize / 4
273
- }
274
-
275
273
func (r * Reader ) retrieveData (pointer uint , result interface {}) error {
276
274
offset , err := r .resolveDataPointer (pointer )
277
275
if err != nil {
0 commit comments