From 845b5e00f87b14d635fc8d531c05f4c1df208fbc Mon Sep 17 00:00:00 2001
From: IP2Location <support@ip2location.com>
Date: Thu, 27 May 2021 07:21:39 +0800
Subject: [PATCH] Updated perl scrript to generate latest BIN format.
---
data/ip-country.pl | 70 +++++++++++++++++++++++++++++-----------------
1 file changed, 44 insertions(+), 26 deletions(-)
diff --git a/data/ip-country.pl b/data/ip-country.pl
index ed5add7..b7df799 100755
--- a/data/ip-country.pl
+++ b/data/ip-country.pl
@@ -23,7 +23,7 @@ sub csv2bin_ipv4 {
my @sorted_country;
print STDOUT "$ipv4_infilename to $ipv4_outfilename conversion started (can take some time).\n";
-
+
open IN, "<$ipv4_infilename" or die "Error open $ipv4_infilename";
my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = stat($ipv4_infilename);
@@ -45,12 +45,12 @@ sub csv2bin_ipv4 {
$ipv4_count++;
}
close IN;
-
+
$country{"-"}{"-"}++;
$ipv4_count++;
-
+
my $addr = $ipv4_base + $ipv4_count * $longsize * $columnsize;
-
+
@sorted_country = sort keys(%country);
foreach my $co (@sorted_country) {
$country{$co}{"ADDR"} = $addr;
@@ -58,10 +58,10 @@ sub csv2bin_ipv4 {
}
my ($second, $minute, $hour, $day, $month, $year, $weekday, $dayofyear, $isdst) = gmtime($mtime);
-
+
open OUT, ">$ipv4_outfilename" or die "Error writing $ipv4_outfilename";
binmode(OUT);
-
+
print OUT pack("C", $dbtype);
print OUT pack("C", $columnsize);
print OUT pack("C", $year - 100);
@@ -73,22 +73,31 @@ sub csv2bin_ipv4 {
print OUT pack("V", $ipv6_base + 1);
print OUT pack("V", $ipv4_index_base + 1);
print OUT pack("V", $ipv6_index_base + 1);
-
- foreach my $i (29 .. 63) {
+
+ # added product code and types 14/08/2020
+ print OUT pack("C", 1); # legacy:0 ip2location:1 ip2proxy:2
+ print OUT pack("C", 2); # legacy:0 commercial:1 lite:2
+
+ # bytes 31-34 will be append file size at later state
+ foreach my $i (31 .. 34) {
print OUT pack("C", 0);
}
-
+
+ foreach my $i (35 .. 63) {
+ print OUT pack("C", 0);
+ }
+
foreach my $c (sort {$a <=> $b} keys(%ipv4_index_row_min)) {
print OUT pack("V", $ipv4_index_row_min{$c});
print OUT pack("V", $ipv4_index_row_max{$c});
}
-
+
my $p = tell(OUT);
if ($p != 524352) {
print STDERR "$ipv4_outfilename Index Out of Range\b";
die;
}
-
+
open IN, "<$ipv4_infilename" or die;
while (<IN>) {
chomp($_);
@@ -99,10 +108,10 @@ sub csv2bin_ipv4 {
print OUT pack("V", $country{$array[2]}{"ADDR"});
}
close IN;
-
+
print OUT pack("V", 4294967295);
print OUT pack("V", $country{"-"}{"ADDR"});
-
+
foreach my $co (@sorted_country) {
print OUT pack("C", length($co));
print OUT $co;
@@ -117,9 +126,9 @@ sub csv2bin_ipv4 {
print OUT $country{$co}{"LONG"};
}
close OUT;
-
+
print STDOUT "$ipv4_infilename to $ipv4_outfilename conversion done.\n";
-
+
}
@@ -174,7 +183,7 @@ sub csv2bin_ipv6 {
$ipv4_count++;
}
close IN;
-
+
open IN, "<$ipv6_infilename" or die "Error open $ipv6_infilename";
($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = stat($ipv4_infilename);
@@ -205,7 +214,7 @@ sub csv2bin_ipv6 {
$ipv6_base = $ipv4_base + $ipv4_count * $longsize * $columnsize;
my $addr = $ipv6_base + $ipv6_count * $longsize * ($columnsize + 3); #IPv6 address range is 4 bytes vs 1 byte in IPv4
-
+
@sorted_country = sort keys(%country);
foreach my $co (@sorted_country) {
$country{$co}{"ADDR"} = $addr;
@@ -216,7 +225,7 @@ sub csv2bin_ipv6 {
open OUT, ">$ipv6_outfilename" or die "Error writing $ipv6_outfilename";
binmode(OUT); #binary mode
-
+
print OUT pack("C", $dbtype);
print OUT pack("C", $columnsize);
print OUT pack("C", $year - 100);
@@ -229,7 +238,16 @@ sub csv2bin_ipv6 {
print OUT pack("V", $ipv4_index_base + 1);
print OUT pack("V", $ipv6_index_base + 1);
- foreach my $i (29 .. 63) {
+ # added product code and types 14/08/2020
+ print OUT pack("C", 1); # legacy:0 ip2location:1 ip2proxy:2
+ print OUT pack("C", 2); # legacy:0 commercial:1 lite:2
+
+ # bytes 31-34 will be append file size at later state
+ foreach my $i (31 .. 34) {
+ print OUT pack("C", 0);
+ }
+
+ foreach my $i (35 .. 63) {
print OUT pack("C", 0);
}
@@ -242,13 +260,13 @@ sub csv2bin_ipv6 {
print OUT pack("V", $ipv6_index_row_min{$c});
print OUT pack("V", $ipv6_index_row_max{$c});
}
-
+
my $p = tell(OUT);
if ($p != 1048640) {
print STDERR "$ipv6_outfilename $p Index Out of Range\b";
die;
}
-
+
open IN, "<$ipv4_infilename" or die;
while (<IN>) {
chomp($_);
@@ -262,10 +280,10 @@ sub csv2bin_ipv6 {
print OUT pack("V", $country{$array[2]}{"ADDR"});
}
close IN;
-
+
print OUT pack("V", 4294967295);
print OUT pack("V", $country{"-"}{"ADDR"});
-
+
# export IPv6 range
open IN, "<$ipv6_infilename" or die;
while (<IN>) {
@@ -274,10 +292,10 @@ sub csv2bin_ipv6 {
print OUT pack("V", $country{$array[2]}{"ADDR"});
}
close IN;
-
+
print OUT &int2bytes("340282366920938463463374607431768211455");
print OUT pack("V", $country{"-"}{"ADDR"});
-
+
foreach my $co (@sorted_country) {
print OUT pack("C", length($co));
print OUT $co;
@@ -291,7 +309,7 @@ sub csv2bin_ipv6 {
print OUT pack("C", length($country{$co}{"LONG"}));
print OUT $country{$co}{"LONG"};
}
- close OUT;
+ close OUT;
print STDOUT "$ipv6_infilename + $ipv4_infilename to $ipv6_outfilename conversion done.\n";
}