geoip-c 0.7.0 → 0.7.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/Rakefile +1 -1
- data/extconf.rb +4 -0
- data/geoip.c +27 -7
- data/test.rb +17 -9
- metadata +17 -5
data/Rakefile
CHANGED
data/extconf.rb
CHANGED
@@ -2,6 +2,10 @@ require 'mkmf'
|
|
2
2
|
|
3
3
|
dir_config("geoip")
|
4
4
|
|
5
|
+
unless have_func('iconv_open', 'iconv.h') or have_library('iconv', 'iconv_open', 'iconv.h')
|
6
|
+
abort "you must have iconv library installed!"
|
7
|
+
end
|
8
|
+
|
5
9
|
if have_library('GeoIP', 'GeoIP_record_by_ipnum') and have_header('GeoIPCity.h')
|
6
10
|
create_makefile('geoip')
|
7
11
|
else
|
data/geoip.c
CHANGED
@@ -8,6 +8,7 @@
|
|
8
8
|
#include <ruby.h>
|
9
9
|
#include <GeoIP.h>
|
10
10
|
#include <GeoIPCity.h>
|
11
|
+
#include "iconv.h"
|
11
12
|
|
12
13
|
static VALUE mGeoIP;
|
13
14
|
static VALUE mGeoIP_City;
|
@@ -25,6 +26,25 @@ void rb_hash_sset(VALUE hash, const char *str, VALUE v) {
|
|
25
26
|
rb_hash_aset(hash, ID2SYM(rb_intern(str)), v);
|
26
27
|
}
|
27
28
|
|
29
|
+
/* pulled from http://blog.inventic.eu/?p=238 and
|
30
|
+
https://github.com/Vagabond/erlang-iconv/blob/master/c_src/iconv_drv.c */
|
31
|
+
static VALUE encode_to_utf8_and_return_rb_str(char *value) {
|
32
|
+
char dst[BUFSIZ];
|
33
|
+
size_t srclen = strlen(value);
|
34
|
+
size_t dstlen = srclen * 2;
|
35
|
+
|
36
|
+
char * pIn = value;
|
37
|
+
char * pOut = ( char*)dst;
|
38
|
+
|
39
|
+
iconv_t cd = iconv_open("UTF-8","ISO-8859-1");
|
40
|
+
iconv(cd, &pIn, &srclen, &pOut, &dstlen);
|
41
|
+
iconv_close(cd);
|
42
|
+
|
43
|
+
*(pOut++) = 0; /* ensure we null terminate */
|
44
|
+
|
45
|
+
return rb_str_new2(dst);
|
46
|
+
}
|
47
|
+
|
28
48
|
int check_load_option(VALUE load_option) {
|
29
49
|
if(load_option == rb_geoip_memory) {
|
30
50
|
return GEOIP_MEMORY_CACHE;
|
@@ -71,7 +91,7 @@ static VALUE generic_single_value_lookup_response(char *key, char *value)
|
|
71
91
|
{
|
72
92
|
VALUE result = rb_hash_new();
|
73
93
|
if(value) {
|
74
|
-
rb_hash_sset(result, key,
|
94
|
+
rb_hash_sset(result, key, encode_to_utf8_and_return_rb_str(value));
|
75
95
|
return result;
|
76
96
|
} else {
|
77
97
|
return Qnil;
|
@@ -85,17 +105,17 @@ VALUE rb_city_record_to_hash(GeoIPRecord *record)
|
|
85
105
|
VALUE hash = rb_hash_new();
|
86
106
|
|
87
107
|
if(record->country_code)
|
88
|
-
rb_hash_sset(hash, "country_code",
|
108
|
+
rb_hash_sset(hash, "country_code", encode_to_utf8_and_return_rb_str(record->country_code));
|
89
109
|
if(record->country_code3)
|
90
|
-
rb_hash_sset(hash, "country_code3",
|
110
|
+
rb_hash_sset(hash, "country_code3", encode_to_utf8_and_return_rb_str(record->country_code3));
|
91
111
|
if(record->country_name)
|
92
|
-
rb_hash_sset(hash, "country_name",
|
112
|
+
rb_hash_sset(hash, "country_name", encode_to_utf8_and_return_rb_str(record->country_name));
|
93
113
|
if(record->region)
|
94
|
-
rb_hash_sset(hash, "region",
|
114
|
+
rb_hash_sset(hash, "region", encode_to_utf8_and_return_rb_str(record->region));
|
95
115
|
if(record->city)
|
96
|
-
rb_hash_sset(hash, "city",
|
116
|
+
rb_hash_sset(hash, "city", encode_to_utf8_and_return_rb_str(record->city));
|
97
117
|
if(record->postal_code)
|
98
|
-
rb_hash_sset(hash, "postal_code",
|
118
|
+
rb_hash_sset(hash, "postal_code", encode_to_utf8_and_return_rb_str(record->postal_code));
|
99
119
|
if(record->latitude)
|
100
120
|
rb_hash_sset(hash, "latitude", rb_float_new((double)record->latitude));
|
101
121
|
if(record->longitude)
|
data/test.rb
CHANGED
@@ -4,6 +4,9 @@ require 'rubygems'
|
|
4
4
|
# require 'ruby-debug'
|
5
5
|
# Debugger.start
|
6
6
|
|
7
|
+
CITY_DB = ENV.fetch("CITY", '/usr/local/GeoIP/share/GeoIP/GeoLiteCity.dat')
|
8
|
+
ORG_DB = ENV.fetch("ORG", '/usr/local/GeoIP/share/GeoIP/GeoIPOrg.dat')
|
9
|
+
|
7
10
|
class Test::Unit::TestCase
|
8
11
|
|
9
12
|
def assert_look_up(db, addr, field, value)
|
@@ -69,7 +72,7 @@ class GeoIPCityTest < Test::Unit::TestCase
|
|
69
72
|
|
70
73
|
def setup
|
71
74
|
## Change me!
|
72
|
-
@dbfile =
|
75
|
+
@dbfile = CITY_DB
|
73
76
|
end
|
74
77
|
|
75
78
|
def test_construction_default
|
@@ -82,43 +85,48 @@ class GeoIPCityTest < Test::Unit::TestCase
|
|
82
85
|
h = db.look_up('24.24.24.24')
|
83
86
|
#debugger
|
84
87
|
assert_kind_of Hash, h
|
85
|
-
assert_equal '
|
88
|
+
assert_equal 'New York', h[:city]
|
86
89
|
assert_equal 'United States', h[:country_name]
|
87
90
|
end
|
88
91
|
|
89
92
|
def test_construction_index
|
90
93
|
db = GeoIP::City.new(@dbfile, :index)
|
91
|
-
assert_look_up(db, '24.24.24.24', :city, '
|
94
|
+
assert_look_up(db, '24.24.24.24', :city, 'New York')
|
92
95
|
end
|
93
96
|
|
94
97
|
def test_construction_filesystem
|
95
98
|
db = GeoIP::City.new(@dbfile, :filesystem)
|
96
|
-
assert_look_up(db, '24.24.24.24', :city, '
|
99
|
+
assert_look_up(db, '24.24.24.24', :city, 'New York')
|
97
100
|
end
|
98
101
|
|
99
102
|
def test_construction_memory
|
100
103
|
db = GeoIP::City.new(@dbfile, :memory)
|
101
|
-
assert_look_up(db, '24.24.24.24', :city, '
|
104
|
+
assert_look_up(db, '24.24.24.24', :city, 'New York')
|
102
105
|
end
|
103
106
|
|
104
107
|
def test_construction_filesystem_check
|
105
108
|
db = GeoIP::City.new(@dbfile, :filesystem, true)
|
106
|
-
assert_look_up(db, '24.24.24.24', :city, '
|
109
|
+
assert_look_up(db, '24.24.24.24', :city, 'New York')
|
107
110
|
end
|
108
111
|
|
109
112
|
def test_bad_db_file
|
110
113
|
assert_raises Errno::ENOENT do
|
111
|
-
GeoIP::City.new('/
|
114
|
+
GeoIP::City.new('/supposed-to-fail')
|
112
115
|
end
|
113
116
|
end
|
114
117
|
|
118
|
+
def test_character_encoding_converted_to_utf8_first
|
119
|
+
db = GeoIP::City.new(@dbfile, :filesystem, true)
|
120
|
+
assert_look_up(db, '201.85.50.148', :city, 'São Paulo')
|
121
|
+
end
|
122
|
+
|
115
123
|
end
|
116
124
|
|
117
125
|
class GeoIPOrgTest < Test::Unit::TestCase
|
118
126
|
|
119
127
|
def setup
|
120
128
|
## Change me!
|
121
|
-
@dbfile =
|
129
|
+
@dbfile = ORG_DB
|
122
130
|
end
|
123
131
|
|
124
132
|
def test_construction_default
|
@@ -155,7 +163,7 @@ class GeoIPOrgTest < Test::Unit::TestCase
|
|
155
163
|
|
156
164
|
def test_bad_db_file
|
157
165
|
assert_raises Errno::ENOENT do
|
158
|
-
GeoIP::Organization.new('/
|
166
|
+
GeoIP::Organization.new('/supposed-to-fail')
|
159
167
|
end
|
160
168
|
end
|
161
169
|
|
metadata
CHANGED
@@ -1,7 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: geoip-c
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
hash: 1
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 7
|
9
|
+
- 1
|
10
|
+
version: 0.7.1
|
5
11
|
platform: ruby
|
6
12
|
authors:
|
7
13
|
- Ryah Dahl
|
@@ -13,7 +19,7 @@ autorequire:
|
|
13
19
|
bindir: bin
|
14
20
|
cert_chain: []
|
15
21
|
|
16
|
-
date:
|
22
|
+
date: 2011-03-08 00:00:00 -05:00
|
17
23
|
default_executable:
|
18
24
|
dependencies: []
|
19
25
|
|
@@ -41,21 +47,27 @@ rdoc_options: []
|
|
41
47
|
require_paths:
|
42
48
|
- .
|
43
49
|
required_ruby_version: !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
44
51
|
requirements:
|
45
52
|
- - ">="
|
46
53
|
- !ruby/object:Gem::Version
|
54
|
+
hash: 3
|
55
|
+
segments:
|
56
|
+
- 0
|
47
57
|
version: "0"
|
48
|
-
version:
|
49
58
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
59
|
+
none: false
|
50
60
|
requirements:
|
51
61
|
- - ">="
|
52
62
|
- !ruby/object:Gem::Version
|
63
|
+
hash: 3
|
64
|
+
segments:
|
65
|
+
- 0
|
53
66
|
version: "0"
|
54
|
-
version:
|
55
67
|
requirements: []
|
56
68
|
|
57
69
|
rubyforge_project:
|
58
|
-
rubygems_version: 1.
|
70
|
+
rubygems_version: 1.4.2
|
59
71
|
signing_key:
|
60
72
|
specification_version: 3
|
61
73
|
summary: A Binding to the GeoIP C library
|