@@ -28,6 +28,7 @@ type Reader struct {
2828 Metadata Metadata
2929 ipv4Start uint
3030 ipv4StartBitDepth int
31+ nodeOffsetMult uint
3132}
3233
3334// Metadata holds the metadata decoded from the MaxMind DB file. In particular
@@ -90,11 +91,12 @@ func FromBytes(buffer []byte) (*Reader, error) {
9091 }
9192
9293 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 ,
98100 }
99101
100102 reader .setIPv4Start ()
@@ -112,7 +114,7 @@ func (r *Reader) setIPv4Start() {
112114 node := uint (0 )
113115 i := 0
114116 for ; i < 96 && node < nodeCount ; i ++ {
115- node = r .nodeReader .readLeft (r . nodeOffset ( node ) )
117+ node = r .nodeReader .readLeft (node * r . nodeOffsetMult )
116118 }
117119 r .ipv4Start = node
118120 r .ipv4StartBitDepth = i
@@ -251,7 +253,7 @@ func (r *Reader) lookupPointer(ip net.IP) (uint, int, net.IP, error) {
251253 for ; i < bitCount && node < nodeCount ; i ++ {
252254 bit := uint (1 ) & (uint (ip [i >> 3 ]) >> (7 - (i % 8 )))
253255
254- offset := r . nodeOffset ( node )
256+ offset := node * r . nodeOffsetMult
255257 if bit == 0 {
256258 node = r .nodeReader .readLeft (offset )
257259 } else {
@@ -268,10 +270,6 @@ func (r *Reader) lookupPointer(ip net.IP) (uint, int, net.IP, error) {
268270 return 0 , int (i ), ip , newInvalidDatabaseError ("invalid node in search tree" )
269271}
270272
271- func (r * Reader ) nodeOffset (node uint ) uint {
272- return node * r .Metadata .RecordSize / 4
273- }
274-
275273func (r * Reader ) retrieveData (pointer uint , result interface {}) error {
276274 offset , err := r .resolveDataPointer (pointer )
277275 if err != nil {
0 commit comments