IP geolocation library

db4
Slava Pestov 2008-05-05 18:07:18 -05:00
parent bcb6a47ec7
commit 7bba8871a3
4 changed files with 49 additions and 0 deletions

1
extra/geo-ip/authors.txt Normal file
View File

@ -0,0 +1 @@
Slava Pestov

View File

@ -0,0 +1,46 @@
USING: kernel sequences io.files io.launcher io.encodings.ascii
io.streams.string http.client sequences.lib combinators
math.parser math.vectors math.intervals interval-maps memoize
csv accessors assocs strings math splitting ;
IN: geo-ip
: db-path "IpToCountry.csv" temp-file ;
: db-url "http://software77.net/cgi-bin/ip-country/geo-ip.pl?action=download" ;
: download-db ( -- path )
db-path dup exists? [
db-url over ".gz" append download-to
{ "gunzip" } over ".gz" append (normalize-path) suffix try-process
] unless ;
TUPLE: ip-entry from to registry assigned city cntry country ;
: parse-ip-entry ( row -- ip-entry )
7 firstn {
[ string>number ]
[ string>number ]
[ ]
[ ]
[ ]
[ ]
[ ]
} spread ip-entry boa ;
MEMO: ip-db ( -- seq )
download-db ascii file-lines
[ "#" head? not ] filter "\n" join <string-reader> csv
[ parse-ip-entry ] map ;
MEMO: ip-intervals ( -- interval-map )
ip-db [ [ [ from>> ] [ to>> ] bi [a,b] ] keep ] { } map>assoc
<interval-map> ;
GENERIC: lookup-ip ( ip -- ip-entry )
M: string lookup-ip
"." split [ string>number ] map
{ HEX: 1000000 HEX: 10000 HEX: 100 1 } v.
lookup-ip ;
M: integer lookup-ip ip-intervals interval-at ;

1
extra/geo-ip/summary.txt Normal file
View File

@ -0,0 +1 @@
IP address geolocation using database from http://software77.net/cgi-bin/ip-country/

1
extra/geo-ip/tags.txt Normal file
View File

@ -0,0 +1 @@
enterprise