geoip-c 0.5.6 → 0.6.3

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.
Files changed (4) hide show
  1. data/README.md +29 -18
  2. data/Rakefile +2 -2
  3. data/geoip.c +133 -35
  4. metadata +2 -1
data/README.md CHANGED
@@ -67,34 +67,35 @@ Install
67
67
  Some variation of the following should work.
68
68
 
69
69
  1. Install the GeoCity C library. You can get it from
70
- [maxmind](http://www.maxmind.com/app/c).
70
+ [MaxMind](http://www.maxmind.com/app/c).
71
71
  For example, I like to install mine in `/opt/GeoIP`, so I do this:
72
72
 
73
- tar -zxvf GeoIP-1.4.3.tar.gz
73
+ tar -zxvf GeoIP-1.4.3.tar.gz
74
+ cd GeoIP-1.4.3
75
+ ./configure --prefix=/opt/GeoIP
76
+ make && sudo make install
74
77
 
75
- cd GeoIP-1.4.3
78
+ On Mac OS X, you can install using MacPorts:
76
79
 
77
- ./configure --prefix=/opt/GeoIP
80
+ sudo port install libgeoip
78
81
 
79
- make && sudo make install
80
-
81
- NOTE: for Intel Mac OS X platforms, try the following:
82
-
83
- env ARCHFLAGS="-arch i386" ./configure --prefix=/opt/GeoIP
84
-
85
- env ARCHFLAGS="-arch i386" make
82
+ 2. Now install the `geoip` gem
86
83
 
87
- sudo env ARCHFLAGS="-arch i386" make install
84
+ gem install mtodd-geoip -s http://gems.github.com/ -- --with-geoip-dir=/opt/GeoIP
88
85
 
89
- 2. Now install the `geoip` gem
86
+ Alternatively, if you installed libgeoip using MacPorts:
90
87
 
91
- gem install mtodd-geoip -s http://gems.github.com/ -- --with-geoip-dir=/opt/GeoIP
88
+ env ARCHFLAGS="-arch x86_64" gem install geoip-c -- --with-opt-dir=/opt/local
92
89
 
93
90
  3. Download the GeoLite City database file in binary format at http://www.maxmind.com/app/geolitecity
94
91
  Maybe this [direct link](http://www.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz) will work.
95
92
  I put this file in
96
93
 
97
- /opt/GeoIP/share/GeoIP/GeoLiteCity.dat
94
+ /opt/GeoIP/share/GeoIP/GeoLiteCity.dat
95
+
96
+ If you installed libgeoip using MacPorts then put it in:
97
+
98
+ /opt/local/share/GeoIP/GeoLiteCity.dat
98
99
 
99
100
  If you are a paying customer, you will download the files required below:
100
101
 
@@ -111,11 +112,11 @@ Hints
111
112
 
112
113
  1. Might need to set
113
114
 
114
- export ARCHFLAGS="-arch i386"
115
+ export ARCHFLAGS="-arch i386"
115
116
 
116
- to be able to compile the gem.
117
+ to be able to compile the gem.
117
118
 
118
- Example:
119
+ Example:
119
120
 
120
121
  env ARCHFLAGS="-arch i386" gem install mtodd-geoip -s http://gems.github.com/ -- --with-geoip-dir=/opt/GeoIP
121
122
 
@@ -130,6 +131,16 @@ This iteration of the library is based on the hard work of Ryah Dahl (ry@tinyclo
130
131
  [rdocs](http://geoip-city.rubyforge.org/)
131
132
  [git repo](https://github.com/ry/geoip-city/tree)
132
133
 
134
+ Thanks
135
+ ------
136
+
137
+ Special appreciation and thanks belongs to Ry Dahl for his initial work on this library.
138
+
139
+ Many thanks to our contributors:
140
+
141
+ * Charles Brian Quinn
142
+ * Michael Sheakoski
143
+
133
144
  License
134
145
  -------
135
146
  Copyright (C) 2007--2009 Ryah Dahl (ry@tinyclouds.org), Matt Todd (mtodd@highgroove.com)
data/Rakefile CHANGED
@@ -22,9 +22,9 @@ end
22
22
 
23
23
  spec = Gem::Specification.new do |s|
24
24
  s.name = 'geoip-c'
25
- s.version = "0.5.6"
25
+ s.version = "0.6.3"
26
26
 
27
- s.authors = ['Ryah Dahl', 'Matt Todd', 'Charles Brian Quinn']
27
+ s.authors = ['Ryah Dahl', 'Matt Todd', 'Charles Brian Quinn', 'Michael Sheakoski']
28
28
  s.email = 'mtodd@highgroove.com'
29
29
 
30
30
  s.summary = "A Binding to the GeoIP C library"
data/geoip.c CHANGED
@@ -12,6 +12,9 @@
12
12
  static VALUE mGeoIP;
13
13
  static VALUE mGeoIP_City;
14
14
  static VALUE mGeoIP_Organization;
15
+ static VALUE mGeoIP_ISP;
16
+ static VALUE mGeoIP_NetSpeed;
17
+ static VALUE mGeoIP_Domain;
15
18
  static VALUE rb_geoip_memory;
16
19
  static VALUE rb_geoip_filesystem;
17
20
  static VALUE rb_geoip_index;
@@ -56,15 +59,27 @@ static VALUE rb_geoip_database_new(VALUE mGeoIP_Database_Class, int argc, VALUE
56
59
  if(gi = GeoIP_open(STR2CSTR(filename), flag)) {
57
60
  database = Data_Wrap_Struct(mGeoIP_Database_Class, 0, GeoIP_delete, gi);
58
61
  rb_obj_call_init(database, 0, 0);
59
- } else {
62
+ } else {
60
63
  rb_sys_fail("Problem opening database");
61
64
  }
62
65
  return database;
63
66
  }
64
67
 
68
+ /* Generic, single-value look up method */
69
+ static VALUE generic_single_value_lookup_response(char *key, char *value)
70
+ {
71
+ VALUE result = rb_hash_new();
72
+ if(value) {
73
+ rb_hash_sset(result, key, rb_str_new2(value));
74
+ return result;
75
+ } else {
76
+ return Qnil;
77
+ }
78
+ }
79
+
65
80
  /* GeoIP::City ***************************************************************/
66
81
 
67
- VALUE rb_city_record_to_hash(GeoIPRecord *record)
82
+ VALUE rb_city_record_to_hash(GeoIPRecord *record)
68
83
  {
69
84
  VALUE hash = rb_hash_new();
70
85
 
@@ -88,20 +103,20 @@ VALUE rb_city_record_to_hash(GeoIPRecord *record)
88
103
  rb_hash_sset(hash, "dma_code", INT2NUM(record->dma_code));
89
104
  if(record->area_code)
90
105
  rb_hash_sset(hash, "area_code", INT2NUM(record->area_code));
91
-
106
+
92
107
  return hash;
93
108
  }
94
109
 
95
- /* The first argument is the filename of the GeoIPCity.dat file
110
+ /* The first argument is the filename of the GeoIPCity.dat file
96
111
  * load_option = :standard, :index, or :memory. default :memory
97
112
  * check_cache = true or false. default false
98
- *
113
+ *
99
114
  * filesystem: read database from filesystem, uses least memory.
100
- *
115
+ *
101
116
  * index: the most frequently accessed index portion of the database,
102
117
  * resulting in faster lookups than :filesystem, but less memory usage than
103
118
  * :memory.
104
- *
119
+ *
105
120
  * memory: load database into memory, faster performance but uses more
106
121
  * memory.
107
122
  */
@@ -112,18 +127,18 @@ static VALUE rb_geoip_city_new(int argc, VALUE *argv, VALUE self)
112
127
 
113
128
  /* Pass this function an IP address as a string, it will return a hash
114
129
  * containing all the information that the database knows about the IP
115
- * db.look_up('24.24.24.24')
116
- * => {:city=>"Ithaca", :latitude=>42.4277992248535,
117
- * :country_code=>"US", :longitude=>-76.4981994628906,
118
- * :country_code3=>"USA", :dma_code=>555,
119
- * :country_name=>"United States", :area_code=>607,
120
- * :region=>"NY"}
121
- */
130
+ * db.look_up('24.24.24.24')
131
+ * => {:city=>"Ithaca", :latitude=>42.4277992248535,
132
+ * :country_code=>"US", :longitude=>-76.4981994628906,
133
+ * :country_code3=>"USA", :dma_code=>555,
134
+ * :country_name=>"United States", :area_code=>607,
135
+ * :region=>"NY"}
136
+ */
122
137
  VALUE rb_geoip_city_look_up(VALUE self, VALUE addr) {
123
138
  GeoIP *gi;
124
139
  GeoIPRecord *record = NULL;
125
- VALUE hash = Qnil;
126
-
140
+ VALUE hash = Qnil;
141
+
127
142
  Check_Type(addr, T_STRING);
128
143
  Data_Get_Struct(self, GeoIP, gi);
129
144
  if(record = GeoIP_record_by_addr(gi, STR2CSTR(addr))) {
@@ -140,7 +155,7 @@ VALUE rb_geoip_city_look_up(VALUE self, VALUE addr) {
140
155
  * * :memory - load the data into memory, fastest (default)
141
156
  * * :filesystem - look up from filesystem, least memory intensive
142
157
  * * :index - stores in memory most recent queries
143
- *
158
+ *
144
159
  */
145
160
  static VALUE rb_geoip_org_new(int argc, VALUE *argv, VALUE self)
146
161
  {
@@ -154,25 +169,96 @@ static VALUE rb_geoip_org_new(int argc, VALUE *argv, VALUE self)
154
169
  */
155
170
  VALUE rb_geoip_org_look_up(VALUE self, VALUE addr) {
156
171
  GeoIP *gi;
157
- VALUE hash = rb_hash_new();
158
- char * name = NULL;
159
-
160
172
  Check_Type(addr, T_STRING);
161
173
  Data_Get_Struct(self, GeoIP, gi);
162
- if(name = GeoIP_name_by_addr(gi, STR2CSTR(addr))) {
163
- rb_hash_sset(hash, "name", rb_str_new2(name));
164
- free(name);
165
- }
166
- return hash;
174
+ return generic_single_value_lookup_response("name", GeoIP_name_by_addr(gi, STR2CSTR(addr)));
175
+ }
176
+
177
+ /* GeoIP::ISP *******************************************************/
178
+
179
+ /* GeoIP::ISP.new('/path/to/GeoIPISP.dat', load_option)
180
+ * load_option can be:
181
+ * * :memory - load the data into memory, fastest (default)
182
+ * * :filesystem - look up from filesystem, least memory intensive
183
+ * * :index - stores in memory most recent queries
184
+ *
185
+ */
186
+ static VALUE rb_geoip_isp_new(int argc, VALUE *argv, VALUE self)
187
+ {
188
+ return rb_geoip_database_new(mGeoIP_ISP, argc, argv, self);
189
+ }
190
+
191
+ /* Pass this function an IP address as a string, it will return a hash
192
+ * containing all the information that the database knows about the IP:
193
+ * db.look_up('24.24.24.24')
194
+ * => {:isp => "Road Runner"}
195
+ */
196
+ VALUE rb_geoip_isp_look_up(VALUE self, VALUE addr) {
197
+ GeoIP *gi;
198
+ Check_Type(addr, T_STRING);
199
+ Data_Get_Struct(self, GeoIP, gi);
200
+ return generic_single_value_lookup_response("isp", GeoIP_name_by_addr(gi, STR2CSTR(addr)));
201
+ }
202
+
203
+ /* GeoIP::NetSpeed *******************************************************/
204
+
205
+ /* GeoIP::NetSpeed.new('/path/to/GeoIPNetSpeed.dat', load_option)
206
+ * load_option can be:
207
+ * * :memory - load the data into memory, fastest (default)
208
+ * * :filesystem - look up from filesystem, least memory intensive
209
+ * * :index - stores in memory most recent queries
210
+ *
211
+ */
212
+ static VALUE rb_geoip_netspeed_new(int argc, VALUE *argv, VALUE self)
213
+ {
214
+ return rb_geoip_database_new(mGeoIP_NetSpeed, argc, argv, self);
215
+ }
216
+
217
+ /* Pass this function an IP address as a string, it will return a hash
218
+ * containing all the information that the database knows about the IP:
219
+ * db.look_up('24.24.24.24')
220
+ * => {:netspeed => "Cable/DSL"}
221
+ */
222
+ VALUE rb_geoip_netspeed_look_up(VALUE self, VALUE addr) {
223
+ GeoIP *gi;
224
+ Check_Type(addr, T_STRING);
225
+ Data_Get_Struct(self, GeoIP, gi);
226
+ return generic_single_value_lookup_response("netspeed", GeoIP_name_by_addr(gi, STR2CSTR(addr)));
227
+ }
228
+
229
+ /* GeoIP::Domain *******************************************************/
230
+
231
+ /* GeoIP::Domain.new('/path/to/GeoIPDomain.dat', load_option)
232
+ * load_option can be:
233
+ * * :memory - load the data into memory, fastest (default)
234
+ * * :filesystem - look up from filesystem, least memory intensive
235
+ * * :index - stores in memory most recent queries
236
+ *
237
+ */
238
+ static VALUE rb_geoip_domain_new(int argc, VALUE *argv, VALUE self)
239
+ {
240
+ return rb_geoip_database_new(mGeoIP_Domain, argc, argv, self);
241
+ }
242
+
243
+ /* Pass this function an IP address as a string, it will return a hash
244
+ * containing all the information that the database knows about the IP:
245
+ * db.look_up('24.24.24.24')
246
+ * => {:domain => "rr.com"}
247
+ */
248
+ VALUE rb_geoip_domain_look_up(VALUE self, VALUE addr) {
249
+ GeoIP *gi;
250
+ Check_Type(addr, T_STRING);
251
+ Data_Get_Struct(self, GeoIP, gi);
252
+ return generic_single_value_lookup_response("domain", GeoIP_name_by_addr(gi, STR2CSTR(addr)));
167
253
  }
168
254
 
169
255
  /* GeoIP *********************************************************************/
170
256
 
171
257
  /* Returns the numeric form of an IP address.
172
- *
258
+ *
173
259
  * For example:
174
260
  * 24.24.24.24 => 404232216
175
- *
261
+ *
176
262
  * This is used in order to be able to perform searches in CSV versions of the
177
263
  * data files or in SQL records if the data has been put there.
178
264
  */
@@ -253,18 +339,30 @@ void Init_geoip()
253
339
  {
254
340
  mGeoIP = rb_define_module("GeoIP");
255
341
 
256
- rb_geoip_memory = ID2SYM(rb_intern("memory"));
257
- rb_geoip_filesystem = ID2SYM(rb_intern("filesystem"));
258
- rb_geoip_index = ID2SYM(rb_intern("index"));
342
+ rb_geoip_memory = ID2SYM(rb_intern("memory"));
343
+ rb_geoip_filesystem = ID2SYM(rb_intern("filesystem"));
344
+ rb_geoip_index = ID2SYM(rb_intern("index"));
259
345
 
260
346
  mGeoIP_City = rb_define_class_under(mGeoIP, "City", rb_cObject);
261
347
  rb_define_singleton_method(mGeoIP_City, "new", rb_geoip_city_new, -1);
262
- rb_define_method(mGeoIP_City, "look_up", rb_geoip_city_look_up, 1);
263
-
348
+ rb_define_method( mGeoIP_City, "look_up", rb_geoip_city_look_up, 1);
349
+
264
350
  mGeoIP_Organization = rb_define_class_under(mGeoIP, "Organization", rb_cObject);
265
- rb_define_singleton_method( mGeoIP_Organization, "new", rb_geoip_org_new, -1);
266
- rb_define_method( mGeoIP_Organization, "look_up", rb_geoip_org_look_up, 1);
267
-
351
+ rb_define_singleton_method(mGeoIP_Organization, "new", rb_geoip_org_new, -1);
352
+ rb_define_method( mGeoIP_Organization, "look_up", rb_geoip_org_look_up, 1);
353
+
354
+ mGeoIP_ISP = rb_define_class_under(mGeoIP, "ISP", rb_cObject);
355
+ rb_define_singleton_method(mGeoIP_ISP, "new", rb_geoip_isp_new, -1);
356
+ rb_define_method( mGeoIP_ISP, "look_up", rb_geoip_isp_look_up, 1);
357
+
358
+ mGeoIP_NetSpeed = rb_define_class_under(mGeoIP, "NetSpeed", rb_cObject);
359
+ rb_define_singleton_method(mGeoIP_NetSpeed, "new", rb_geoip_netspeed_new, -1);
360
+ rb_define_method( mGeoIP_NetSpeed, "look_up", rb_geoip_netspeed_look_up, 1);
361
+
362
+ mGeoIP_Domain = rb_define_class_under(mGeoIP, "Domain", rb_cObject);
363
+ rb_define_singleton_method(mGeoIP_Domain, "new", rb_geoip_domain_new, -1);
364
+ rb_define_method( mGeoIP_Domain, "look_up", rb_geoip_domain_look_up, 1);
365
+
268
366
  rb_define_singleton_method(mGeoIP, "addr_to_num", rb_geoip_addr_to_num, 1);
269
367
  rb_define_singleton_method(mGeoIP, "num_to_addr", rb_geoip_num_to_addr, 1);
270
368
  }
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: geoip-c
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.6
4
+ version: 0.6.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryah Dahl
8
8
  - Matt Todd
9
9
  - Charles Brian Quinn
10
+ - Michael Sheakoski
10
11
  autorequire:
11
12
  bindir: bin
12
13
  cert_chain: []