ip2country 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/bin/ip2c.updatedb +23 -0
- data/lib/ip2country/country.rb +18 -0
- data/lib/ip2country/ip2country.db +0 -0
- data/lib/ip2country.rb +32 -0
- metadata +58 -0
data/bin/ip2c.updatedb
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
require 'sqlite3'
|
|
4
|
+
require 'fileutils'
|
|
5
|
+
require 'csv'
|
|
6
|
+
|
|
7
|
+
puts 'Removing old database if exists...'
|
|
8
|
+
FileUtils.rm(ARGV[1]) if File.exist?(ARGV[1])
|
|
9
|
+
|
|
10
|
+
puts "Creating new database..."
|
|
11
|
+
db = SQLite3::Database.new(ARGV[1])
|
|
12
|
+
db.execute('CREATE TABLE ip2country (ip_from INTEGER, ip_to INTEGER, country_code2 TEXT, country_code3 TEXT, country_name TEXT)')
|
|
13
|
+
|
|
14
|
+
puts 'Inserting values into database... (may take a while)'
|
|
15
|
+
CSV.foreach(ARGV[0]) do |row|
|
|
16
|
+
from, to, cc, ccc, name = row
|
|
17
|
+
cc = SQLite3::Database.quote(cc)
|
|
18
|
+
ccc = SQLite3::Database.quote(ccc)
|
|
19
|
+
name = SQLite3::Database.quote(name)
|
|
20
|
+
db.execute("INSERT INTO ip2country VALUES (#{from}, #{to}, '#{cc}', '#{ccc}', '#{name}')")
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
puts 'Done'
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
class IP2Country
|
|
2
|
+
# IP2Country represents a country of a matching IP returned by IP2Country#lookup.
|
|
3
|
+
class Country
|
|
4
|
+
attr_reader :cc, :ccc, :name
|
|
5
|
+
|
|
6
|
+
def initialize(cc, ccc, name)
|
|
7
|
+
@cc = cc.to_s
|
|
8
|
+
@ccc = ccc.to_s
|
|
9
|
+
@name = name.to_s
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
alias code2 cc
|
|
13
|
+
alias code3 ccc
|
|
14
|
+
alias country_code2 cc
|
|
15
|
+
alias country_code3 ccc
|
|
16
|
+
alias country_name name
|
|
17
|
+
end
|
|
18
|
+
end
|
|
Binary file
|
data/lib/ip2country.rb
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
require 'sqlite3'
|
|
2
|
+
require 'ip2country/country'
|
|
3
|
+
|
|
4
|
+
# IP2Country is used to lookup a host IP from a specified user ip2country database
|
|
5
|
+
# and determine their regional location.
|
|
6
|
+
class IP2Country
|
|
7
|
+
# Initialize IP2Country instance using a specified database. If no database is
|
|
8
|
+
# provided, then it will attempt to use the default one packaged with this
|
|
9
|
+
# library.
|
|
10
|
+
def initialize(database = "#{File.dirname(__FILE__)}/ip2country/ip2country.db")
|
|
11
|
+
@db_file = File.expand_path(database.to_s)
|
|
12
|
+
@db = SQLite3::Database.open(@db_file)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Lookup a host IP to figure out their region. If successful, an IP2Country::Country
|
|
16
|
+
# instance will be returned, else nil.
|
|
17
|
+
def lookup(ip)
|
|
18
|
+
long = ip2long(ip)
|
|
19
|
+
result = @db.execute("SELECT country_code2, country_code3, country_name FROM ip2country WHERE ip_from <= #{long} AND ip_to >= #{long}")[0]
|
|
20
|
+
Country.new(*result) if result
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
private
|
|
24
|
+
|
|
25
|
+
# Some code I took from Ruby's mailing list to convert the IP to a long. I
|
|
26
|
+
# believe the original author of this method is Florian Frank.
|
|
27
|
+
def ip2long(ip)
|
|
28
|
+
long = 0
|
|
29
|
+
ip.split(/\./).reverse.each_with_index { |x,i| long += x.to_i << (i * 8) }
|
|
30
|
+
long
|
|
31
|
+
end
|
|
32
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
rubygems_version: 0.9.0
|
|
3
|
+
specification_version: 1
|
|
4
|
+
name: ip2country
|
|
5
|
+
version: !ruby/object:Gem::Version
|
|
6
|
+
version: 0.0.1
|
|
7
|
+
date: 2007-05-01 00:00:00 +09:00
|
|
8
|
+
summary: IP2Country library for Ruby
|
|
9
|
+
require_paths:
|
|
10
|
+
- lib
|
|
11
|
+
email: shugotenshi@gmail.com
|
|
12
|
+
homepage:
|
|
13
|
+
rubyforge_project:
|
|
14
|
+
description:
|
|
15
|
+
autorequire: ip2country
|
|
16
|
+
default_executable:
|
|
17
|
+
bindir: bin
|
|
18
|
+
has_rdoc: true
|
|
19
|
+
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
|
20
|
+
requirements:
|
|
21
|
+
- - ">"
|
|
22
|
+
- !ruby/object:Gem::Version
|
|
23
|
+
version: 0.0.0
|
|
24
|
+
version:
|
|
25
|
+
platform: ruby
|
|
26
|
+
signing_key:
|
|
27
|
+
cert_chain:
|
|
28
|
+
post_install_message:
|
|
29
|
+
authors:
|
|
30
|
+
- Matthew Harris
|
|
31
|
+
files:
|
|
32
|
+
- lib/ip2country.rb
|
|
33
|
+
- lib/ip2country
|
|
34
|
+
- lib/ip2country/country.rb
|
|
35
|
+
- lib/ip2country/ip2country.db
|
|
36
|
+
- bin/ip2c.updatedb
|
|
37
|
+
test_files: []
|
|
38
|
+
|
|
39
|
+
rdoc_options: []
|
|
40
|
+
|
|
41
|
+
extra_rdoc_files: []
|
|
42
|
+
|
|
43
|
+
executables:
|
|
44
|
+
- ip2c.updatedb
|
|
45
|
+
extensions: []
|
|
46
|
+
|
|
47
|
+
requirements: []
|
|
48
|
+
|
|
49
|
+
dependencies:
|
|
50
|
+
- !ruby/object:Gem::Dependency
|
|
51
|
+
name: sqlite3-ruby
|
|
52
|
+
version_requirement:
|
|
53
|
+
version_requirements: !ruby/object:Gem::Version::Requirement
|
|
54
|
+
requirements:
|
|
55
|
+
- - ">"
|
|
56
|
+
- !ruby/object:Gem::Version
|
|
57
|
+
version: 0.0.0
|
|
58
|
+
version:
|