|
4 | 4 | import java.io.IOException; |
5 | 5 | import java.net.InetAddress; |
6 | 6 | import java.nio.ByteBuffer; |
7 | | -import java.util.Arrays; |
8 | 7 |
|
9 | 8 | import com.fasterxml.jackson.databind.JsonNode; |
10 | 9 |
|
@@ -107,12 +106,9 @@ long findAddressInTree(InetAddress address) throws MaxMindDbException { |
107 | 106 | for (int i = 0; i < rawAddress.length * 8; i++) { |
108 | 107 | int b = 0xFF & rawAddress[i / 8]; |
109 | 108 | int bit = 1 & (b >> 7 - (i % 8)); |
110 | | - long[] nodes = this.readNode(nodeNum); |
111 | | - |
112 | | - long record = nodes[bit]; |
| 109 | + long record = this.readNode(nodeNum, bit); |
113 | 110 |
|
114 | 111 | if (this.DEBUG) { |
115 | | - Log.debug("Nodes", Arrays.toString(nodes)); |
116 | 112 | Log.debug("Bit #", i); |
117 | 113 | Log.debug("Bit value", bit); |
118 | 114 | Log.debug("Record", bit == 1 ? "right" : "left"); |
@@ -144,35 +140,28 @@ long record = nodes[bit]; |
144 | 140 | throw new MaxMindDbException("Something bad happened"); |
145 | 141 | } |
146 | 142 |
|
147 | | - private long[] readNode(long nodeNumber) throws MaxMindDbException { |
| 143 | + private long readNode(long nodeNumber, int index) throws MaxMindDbException { |
148 | 144 | ByteBuffer buffer = this.threadBuffer.get(); |
149 | | - buffer.position((int) nodeNumber * this.metadata.nodeByteSize); |
150 | | - |
151 | | - byte[] bytes = Decoder.getByteArray(buffer, this.metadata.nodeByteSize); |
152 | | - |
153 | | - if (this.DEBUG) { |
154 | | - Log.debug("Node bytes", bytes); |
155 | | - } |
156 | | - return this.splitNodeIntoRecords(bytes); |
157 | | - } |
| 145 | + int baseOffset = (int) nodeNumber * this.metadata.nodeByteSize; |
| 146 | + buffer.position(baseOffset); |
158 | 147 |
|
159 | | - private long[] splitNodeIntoRecords(byte[] bytes) throws MaxMindDbException { |
160 | | - long[] nodes = new long[2]; |
161 | 148 | switch (this.metadata.recordSize) { |
162 | 149 | case 24: |
163 | | - nodes[0] = Decoder.decodeLong(Arrays.copyOfRange(bytes, 0, 3)); |
164 | | - nodes[1] = Decoder.decodeLong(Arrays.copyOfRange(bytes, 3, 6)); |
165 | | - return nodes; |
| 150 | + buffer.position(baseOffset + index * 3); |
| 151 | + return Decoder.decodeLong(buffer, 0, 3); |
166 | 152 | case 28: |
167 | | - nodes[0] = Decoder.decodeLong(Arrays.copyOfRange(bytes, 0, 3)); |
168 | | - nodes[1] = Decoder.decodeLong(Arrays.copyOfRange(bytes, 4, 7)); |
169 | | - nodes[0] = ((0xF0 & bytes[3]) << 20) | nodes[0]; |
170 | | - nodes[1] = ((0x0F & bytes[3]) << 24) | nodes[1]; |
171 | | - return nodes; |
| 153 | + long middle = buffer.get(baseOffset + 3); |
| 154 | + |
| 155 | + if (index == 0) { |
| 156 | + middle = (0xF0 & middle) >>> 4; |
| 157 | + } else { |
| 158 | + middle = 0x0F & middle; |
| 159 | + } |
| 160 | + buffer.position(baseOffset + index * 4); |
| 161 | + return Decoder.decodeLong(buffer, middle, 3); |
172 | 162 | case 32: |
173 | | - nodes[0] = Decoder.decodeLong(Arrays.copyOfRange(bytes, 0, 4)); |
174 | | - nodes[1] = Decoder.decodeLong(Arrays.copyOfRange(bytes, 4, 8)); |
175 | | - return nodes; |
| 163 | + buffer.position(baseOffset + index * 4); |
| 164 | + return Decoder.decodeLong(buffer, 0, 4); |
176 | 165 | default: |
177 | 166 | throw new MaxMindDbException("Unknown record size: " |
178 | 167 | + this.metadata.recordSize); |
|
0 commit comments