Skip to content

Commit 7c6a5e1

Browse files
committed
Share traverseTree
1 parent ae8ca1c commit 7c6a5e1

File tree

2 files changed

+51
-54
lines changed

2 files changed

+51
-54
lines changed

src/main/java/com/maxmind/db/Reader.java

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -169,21 +169,16 @@ int getIpv4Start() {
169169
*/
170170
public <T> DatabaseRecord<T> getRecord(InetAddress ipAddress, Class<T> cls)
171171
throws IOException {
172-
ByteBuffer buffer = this.getBufferHolder().get();
173172

174173
byte[] rawAddress = ipAddress.getAddress();
175174

176-
int bitLength = rawAddress.length * 8;
177-
int record = this.startNode(bitLength);
178-
int nodeCount = this.metadata.getNodeCount();
175+
int[] traverseResult = traverseTree(rawAddress, rawAddress.length * 8);
179176

180-
int pl = 0;
181-
for (; pl < bitLength && record < nodeCount; pl++) {
182-
int b = 0xFF & rawAddress[pl / 8];
183-
int bit = 1 & (b >> 7 - (pl % 8));
184-
record = this.readNode(buffer, record, bit);
185-
}
177+
int pl = traverseResult[1];
178+
int record = traverseResult[0];
186179

180+
int nodeCount = this.metadata.getNodeCount();
181+
ByteBuffer buffer = this.getBufferHolder().get();
187182
T dataRecord = null;
188183
if (record > nodeCount) {
189184
// record is a data pointer
@@ -317,7 +312,7 @@ public <T> Networks<T> networksWithin(
317312
prefixLength += 96;
318313
}
319314

320-
int[] traverseResult = this.traverseTree(ipBytes, 0, prefixLength);
315+
int[] traverseResult = this.traverseTree(ipBytes, prefixLength);
321316
int node = traverseResult[0];
322317
int prefix = traverseResult[1];
323318

@@ -335,22 +330,24 @@ public <T> Networks<T> networksWithin(
335330
* @param bitCount The prefix.
336331
* @return int[]
337332
*/
338-
private int[] traverseTree(byte[] ip, int node, int bitCount)
333+
private int[] traverseTree(byte[] ip, int bitCount)
339334
throws ClosedDatabaseException, InvalidDatabaseException {
340-
int nodeCount = this.metadata.getNodeCount();
341-
int i = 0;
342-
343335
ByteBuffer buffer = this.getBufferHolder().get();
336+
int bitLength = ip.length * 8;
337+
int record = this.startNode(bitLength);
338+
int nodeCount = this.metadata.getNodeCount();
344339

345-
for (; i < bitCount && node < nodeCount; i++) {
346-
int bit = 1 & (ip[i >> 3] >> (7 - (i % 8)));
340+
int i = 0;
341+
for (; i < bitCount && record < nodeCount; i++) {
342+
int b = 0xFF & ip[i / 8];
343+
int bit = 1 & (b >> 7 - (i % 8));
347344

348345
// bit:0 -> left record.
349346
// bit:1 -> right record.
350-
node = this.readNode(buffer, node, bit);
347+
record = this.readNode(buffer, record, bit);
351348
}
352349

353-
return new int[]{node, i};
350+
return new int[]{record, i};
354351
}
355352

356353
int readNode(ByteBuffer buffer, int nodeNumber, int index)

src/test/java/com/maxmind/db/ReaderTest.java

Lines changed: 35 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -290,41 +290,41 @@ public networkTest(String network, int prefix,String database, String[] expecte
290290
"2002:101:120:0:0:0:0:0/48",
291291
}
292292
),
293-
// new networkTest(
294-
// "::",
295-
// 0,
296-
// "mixed",
297-
// new String[]{
298-
// "1.1.1.1/32",
299-
// "1.1.1.2/31",
300-
// "1.1.1.4/30",
301-
// "1.1.1.8/29",
302-
// "1.1.1.16/28",
303-
// "1.1.1.32/32",
304-
// "0:0:0:0:0:1:ffff:ffff/128",
305-
// "0:0:0:0:0:2:0:0/122",
306-
// "0:0:0:0:0:2:0:40/124",
307-
// "0:0:0:0:0:2:0:50/125",
308-
// "0:0:0:0:0:2:0:58/127",
309-
// },
310-
// true
311-
// ),
312-
// new networkTest(
313-
// "1.1.1.16",
314-
// 28,
315-
// "mixed",
316-
// new String[]{
317-
// "1.1.1.16/28"
318-
// }
319-
// ),
320-
// new networkTest(
321-
// "1.1.1.4",
322-
// 30,
323-
// "ipv4",
324-
// new String[]{
325-
// "1.1.1.4/30"
326-
// }
327-
// )
293+
new networkTest(
294+
"::",
295+
0,
296+
"mixed",
297+
new String[]{
298+
"1.1.1.1/32",
299+
"1.1.1.2/31",
300+
"1.1.1.4/30",
301+
"1.1.1.8/29",
302+
"1.1.1.16/28",
303+
"1.1.1.32/32",
304+
"0:0:0:0:0:1:ffff:ffff/128",
305+
"0:0:0:0:0:2:0:0/122",
306+
"0:0:0:0:0:2:0:40/124",
307+
"0:0:0:0:0:2:0:50/125",
308+
"0:0:0:0:0:2:0:58/127",
309+
},
310+
true
311+
),
312+
new networkTest(
313+
"1.1.1.16",
314+
28,
315+
"mixed",
316+
new String[]{
317+
"1.1.1.16/28"
318+
}
319+
),
320+
new networkTest(
321+
"1.1.1.4",
322+
30,
323+
"ipv4",
324+
new String[]{
325+
"1.1.1.4/30"
326+
}
327+
)
328328
};
329329

330330
@Test

0 commit comments

Comments
 (0)