geoipdb 0.3.1 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.1
1
+ 0.4.1
data/ext/geoipdb/Makefile CHANGED
@@ -4,84 +4,67 @@ SHELL = /bin/sh
4
4
  #### Start of system configuration section. ####
5
5
 
6
6
  srcdir = .
7
- topdir = /Users/eugen/.rvm/rubies/ruby-1.9.2-p180/include/ruby-1.9.1
8
- hdrdir = /Users/eugen/.rvm/rubies/ruby-1.9.2-p180/include/ruby-1.9.1
9
- arch_hdrdir = /Users/eugen/.rvm/rubies/ruby-1.9.2-p180/include/ruby-1.9.1/$(arch)
10
- VPATH = $(srcdir):$(arch_hdrdir)/ruby:$(hdrdir)/ruby
11
- prefix = $(DESTDIR)/Users/eugen/.rvm/rubies/ruby-1.9.2-p180
12
- rubylibprefix = $(libdir)/$(RUBY_BASE_NAME)
7
+ topdir = /Users/eugen/.rvm/rubies/ree-1.8.7-2011.03/lib/ruby/1.8/i686-darwin10.7.0
8
+ hdrdir = $(topdir)
9
+ VPATH = $(srcdir):$(topdir):$(hdrdir)
13
10
  exec_prefix = $(prefix)
14
- vendorhdrdir = $(rubyhdrdir)/vendor_ruby
15
- sitehdrdir = $(rubyhdrdir)/site_ruby
16
- rubyhdrdir = $(includedir)/$(RUBY_BASE_NAME)-$(ruby_version)
17
- vendordir = $(rubylibprefix)/vendor_ruby
18
- sitedir = $(rubylibprefix)/site_ruby
19
- ridir = $(datarootdir)/$(RI_BASE_NAME)
11
+ prefix = $(DESTDIR)/Users/eugen/.rvm/rubies/ree-1.8.7-2011.03
12
+ sharedstatedir = $(prefix)/com
20
13
  mandir = $(datarootdir)/man
21
- localedir = $(datarootdir)/locale
22
- libdir = $(exec_prefix)/lib
23
14
  psdir = $(docdir)
24
- pdfdir = $(docdir)
25
- dvidir = $(docdir)
26
- htmldir = $(docdir)
27
- infodir = $(datarootdir)/info
28
- docdir = $(datarootdir)/doc/$(PACKAGE)
29
15
  oldincludedir = $(DESTDIR)/usr/include
16
+ localedir = $(datarootdir)/locale
17
+ bindir = $(exec_prefix)/bin
18
+ libexecdir = $(exec_prefix)/libexec
19
+ sitedir = $(libdir)/ruby/site_ruby
20
+ htmldir = $(docdir)
21
+ vendorarchdir = $(vendorlibdir)/$(sitearch)
30
22
  includedir = $(prefix)/include
31
- localstatedir = $(prefix)/var
32
- sharedstatedir = $(prefix)/com
23
+ infodir = $(datarootdir)/info
24
+ vendorlibdir = $(vendordir)/$(ruby_version)
33
25
  sysconfdir = $(prefix)/etc
34
- datadir = $(datarootdir)
35
- datarootdir = $(prefix)/share
36
- libexecdir = $(exec_prefix)/libexec
26
+ libdir = $(exec_prefix)/lib
37
27
  sbindir = $(exec_prefix)/sbin
38
- bindir = $(exec_prefix)/bin
39
- rubylibdir = $(rubylibprefix)/$(ruby_version)
28
+ rubylibdir = $(libdir)/ruby/$(ruby_version)
29
+ docdir = $(datarootdir)/doc/$(PACKAGE)
30
+ dvidir = $(docdir)
31
+ vendordir = $(libdir)/ruby/vendor_ruby
32
+ datarootdir = $(prefix)/share
33
+ pdfdir = $(docdir)
40
34
  archdir = $(rubylibdir)/$(arch)
41
- sitelibdir = $(sitedir)/$(ruby_version)
42
35
  sitearchdir = $(sitelibdir)/$(sitearch)
43
- vendorlibdir = $(vendordir)/$(ruby_version)
44
- vendorarchdir = $(vendorlibdir)/$(sitearch)
36
+ datadir = $(datarootdir)
37
+ localstatedir = $(prefix)/var
38
+ sitelibdir = $(sitedir)/$(ruby_version)
45
39
 
46
40
  CC = gcc
47
- CXX = g++
48
- LIBRUBY = $(LIBRUBY_SO)
41
+ LIBRUBY = $(LIBRUBY_A)
49
42
  LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a
50
- LIBRUBYARG_SHARED = -l$(RUBY_SO_NAME)
43
+ LIBRUBYARG_SHARED =
51
44
  LIBRUBYARG_STATIC = -l$(RUBY_SO_NAME)-static
52
- OUTFLAG = -o
53
- COUTFLAG = -o
54
45
 
55
46
  RUBY_EXTCONF_H =
56
- cflags = $(optflags) $(debugflags) $(warnflags)
57
- optflags = -O3
58
- debugflags = -ggdb
59
- warnflags = -Wextra -Wno-unused-parameter -Wno-parentheses -Wpointer-arith -Wwrite-strings -Wno-missing-field-initializers -Wshorten-64-to-32 -Wno-long-long
60
- CFLAGS = -fno-common $(cflags) -fno-common -pipe
61
- INCFLAGS = -I. -I$(arch_hdrdir) -I$(hdrdir)/ruby/backward -I$(hdrdir) -I$(srcdir)
47
+ CFLAGS = -fno-common -g -O2 -pipe -fno-common $(cflags)
48
+ INCFLAGS = $(PREINCFLAGS) -I. -I/opt/local/include -I$(topdir) -I$(hdrdir) -I$(srcdir)
62
49
  DEFS =
63
- CPPFLAGS = -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE $(DEFS) $(cppflags)
64
- CXXFLAGS = $(CFLAGS) $(cxxflags)
65
- ldflags = -L. -L/usr/local/lib
66
- dldflags = -Wl,-undefined,dynamic_lookup -Wl,-multiply_defined,suppress -Wl,-flat_namespace
67
- ARCH_FLAG =
68
- DLDFLAGS = $(ldflags) $(dldflags)
69
- LDSHARED = $(CC) -dynamic -bundle
70
- LDSHAREDXX = $(CXX) -dynamic -bundle
50
+ CPPFLAGS = -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE $(DEFS) $(cppflags)
51
+ CXXFLAGS = $(CFLAGS)
52
+ ldflags = -L.
53
+ dldflags =
54
+ archflag =
55
+ DLDFLAGS = $(ldflags) $(dldflags) $(archflag)
56
+ LDSHARED = cc -dynamic -bundle -undefined suppress -flat_namespace
71
57
  AR = ar
72
58
  EXEEXT =
73
59
 
74
- RUBY_BASE_NAME = ruby
75
60
  RUBY_INSTALL_NAME = ruby
76
- RUBY_SO_NAME = ruby.1.9.1
77
- arch = x86_64-darwin10.7.0
78
- sitearch = $(arch)
79
- ruby_version = 1.9.1
80
- ruby = /Users/eugen/.rvm/rubies/ruby-1.9.2-p180/bin/ruby
61
+ RUBY_SO_NAME = ruby
62
+ arch = i686-darwin10.7.0
63
+ sitearch = i686-darwin10.7.0
64
+ ruby_version = 1.8
65
+ ruby = /Users/eugen/.rvm/rubies/ree-1.8.7-2011.03/bin/ruby
81
66
  RUBY = $(ruby)
82
67
  RM = rm -f
83
- RM_RF = $(RUBY) -run -e rm -- -rf
84
- RMDIRS = $(RUBY) -run -e rmdir -- -p
85
68
  MAKEDIRS = mkdir -p
86
69
  INSTALL = /usr/bin/install -c
87
70
  INSTALL_PROG = $(INSTALL) -m 0755
@@ -98,13 +81,12 @@ DEFFILE =
98
81
 
99
82
  CLEANFILES = mkmf.log
100
83
  DISTCLEANFILES =
101
- DISTCLEANDIRS =
102
84
 
103
85
  extout =
104
86
  extout_prefix =
105
87
  target_prefix = /geoipdb
106
88
  LOCAL_LIBS =
107
- LIBS = $(LIBRUBYARG_SHARED) -lpthread -ldl -lobjc
89
+ LIBS = -L/opt/local/lib -ldl -lobjc
108
90
  SRCS = geoipdb.c ipdb.c
109
91
  OBJS = geoipdb.o ipdb.o
110
92
  TARGET = geoipdb
@@ -116,40 +98,28 @@ BINDIR = $(bindir)
116
98
  RUBYCOMMONDIR = $(sitedir)$(target_prefix)
117
99
  RUBYLIBDIR = $(sitelibdir)$(target_prefix)
118
100
  RUBYARCHDIR = $(sitearchdir)$(target_prefix)
119
- HDRDIR = $(rubyhdrdir)/ruby$(target_prefix)
120
- ARCHHDRDIR = $(rubyhdrdir)/$(arch)/ruby$(target_prefix)
121
101
 
122
102
  TARGET_SO = $(DLLIB)
123
- CLEANLIBS = $(TARGET).bundle
124
- CLEANOBJS = *.o *.bak
125
-
126
- all: $(DLLIB)
127
- static: $(STATIC_LIB)
128
- .PHONY: all install static install-so install-rb
129
- .PHONY: clean clean-so clean-rb
130
-
131
- clean-rb-default::
132
- clean-rb::
133
- clean-so::
134
- clean: clean-so clean-rb-default clean-rb
103
+ CLEANLIBS = $(TARGET).bundle $(TARGET).il? $(TARGET).tds $(TARGET).map
104
+ CLEANOBJS = *.o *.a *.s[ol] *.pdb *.exp *.bak
105
+
106
+ all: $(DLLIB)
107
+ static: $(STATIC_LIB)
108
+
109
+ clean:
135
110
  @-$(RM) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES)
136
111
 
137
- distclean-rb-default::
138
- distclean-rb::
139
- distclean-so::
140
- distclean: clean distclean-so distclean-rb-default distclean-rb
112
+ distclean: clean
141
113
  @-$(RM) Makefile $(RUBY_EXTCONF_H) conftest.* mkmf.log
142
114
  @-$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES)
143
- @-$(RMDIRS) $(DISTCLEANDIRS)
144
115
 
145
- realclean: distclean
116
+ realclean: distclean
146
117
  install: install-so install-rb
147
118
 
148
119
  install-so: $(RUBYARCHDIR)
149
120
  install-so: $(RUBYARCHDIR)/$(DLLIB)
150
121
  $(RUBYARCHDIR)/$(DLLIB): $(DLLIB)
151
- @-$(MAKEDIRS) $(@D)
152
- $(INSTALL_PROG) $(DLLIB) $(@D)
122
+ $(INSTALL_PROG) $(DLLIB) $(RUBYARCHDIR)
153
123
  install-rb: pre-install-rb install-rb-default
154
124
  install-rb-default: pre-install-rb-default
155
125
  pre-install-rb: Makefile
@@ -164,24 +134,24 @@ site-install-rb: install-rb
164
134
  .SUFFIXES: .c .m .cc .cxx .cpp .C .o
165
135
 
166
136
  .cc.o:
167
- $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $<
137
+ $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) -c $<
168
138
 
169
139
  .cxx.o:
170
- $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $<
140
+ $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) -c $<
171
141
 
172
142
  .cpp.o:
173
- $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $<
143
+ $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) -c $<
174
144
 
175
145
  .C.o:
176
- $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $<
146
+ $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) -c $<
177
147
 
178
148
  .c.o:
179
- $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $<
149
+ $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) -c $<
180
150
 
181
151
  $(DLLIB): $(OBJS) Makefile
182
- @-$(RM) $(@)
152
+ @-$(RM) $@
183
153
  $(LDSHARED) -o $@ $(OBJS) $(LIBPATH) $(DLDFLAGS) $(LOCAL_LIBS) $(LIBS)
184
154
 
185
155
 
186
156
 
187
- $(OBJS): $(hdrdir)/ruby.h $(hdrdir)/ruby/defines.h $(arch_hdrdir)/ruby/config.h
157
+ $(OBJS): ruby.h defines.h
@@ -1,7 +1,7 @@
1
+ #include "ruby.h"
1
2
  #include "ipdb.h"
2
3
 
3
- #include "ruby.h"
4
- /**
4
+ /**
5
5
  Ruby Wrapper
6
6
  */
7
7
 
@@ -28,8 +28,8 @@ void geoipdb_free(geoipdb *gi) {
28
28
  gi->db->ranges = NULL;
29
29
  }
30
30
  if(gi->db != NULL){
31
- printf("..freeing ipdb \n");
32
- free(gi->db);
31
+ printf("..freeing ipdb \n");
32
+ free(gi->db);
33
33
  }
34
34
  }
35
35
  }
@@ -37,20 +37,20 @@ void geoipdb_free(geoipdb *gi) {
37
37
 
38
38
  VALUE ipdb_init(VALUE self, VALUE cities_file_name, VALUE ranges_file_name, VALUE cache_file_name) {
39
39
  geoipdb *gi;
40
-
40
+
41
41
  Check_Type(cities_file_name, T_STRING);
42
42
  Check_Type(ranges_file_name, T_STRING);
43
43
  Check_Type(cache_file_name, T_STRING);
44
-
44
+
45
45
  char *cities_csv_file = RSTRING_PTR(cities_file_name);
46
46
  char *ranges_csv_file = RSTRING_PTR(ranges_file_name);
47
- char *cache_file = RSTRING_PTR(cache_file_name);
48
-
47
+ char *cache_file = RSTRING_PTR(cache_file_name);
48
+
49
49
  gi = ALLOC(geoipdb);
50
-
51
- gi->db= init_db(cities_csv_file, ranges_csv_file, cache_file);
52
-
53
-
50
+
51
+ gi->db= init_db(cities_csv_file, ranges_csv_file, cache_file);
52
+
53
+
54
54
  if(gi->db == NULL)
55
55
  {
56
56
  if(DEBUG)
@@ -62,51 +62,51 @@ VALUE ipdb_init(VALUE self, VALUE cities_file_name, VALUE ranges_file_name, VALU
62
62
  }else{
63
63
  if(DEBUG)
64
64
  printf("\nDB Init completed!\n");
65
- return(Data_Wrap_Struct(cIpDb, 0, geoipdb_free, gi));
65
+ return(Data_Wrap_Struct(cIpDb, 0, geoipdb_free, gi));
66
66
  }
67
67
  }
68
68
 
69
-
69
+
70
70
  VALUE build_ip_information_object(IpRange *range, City *city, char* isp) {
71
71
  VALUE CIpInformation;
72
-
72
+
73
73
  CIpInformation = rb_const_get(rb_cObject, rb_intern("IpInformation"));
74
-
74
+
75
75
  VALUE ip_information = rb_funcall(CIpInformation, rb_intern("new"), 0);
76
76
  rb_ivar_set(ip_information, rb_intern("@country_iso_code"), rb_str_new2(city->country_iso2) );
77
- rb_ivar_set(ip_information, rb_intern("@city_name"), rb_str_new2(city->name) );
78
- rb_ivar_set(ip_information, rb_intern("@city_code"), INT2FIX(city->city_code) );
77
+ rb_ivar_set(ip_information, rb_intern("@city_name"), rb_str_new2(city->name) );
78
+ rb_ivar_set(ip_information, rb_intern("@city_code"), INT2FIX(city->city_code) );
79
79
  rb_ivar_set(ip_information, rb_intern("@lng"), rb_float_new(city->lng) );
80
80
  rb_ivar_set(ip_information, rb_intern("@lat"), rb_float_new(city->lat) );
81
81
  rb_ivar_set(ip_information, rb_intern("@is_mobile"), range->is_mobile == 1 ? Qtrue : Qfalse );
82
- rb_ivar_set(ip_information, rb_intern("@isp_name"), isp == NULL ? Qnil : ID2SYM( rb_intern(isp) ) );
82
+ rb_ivar_set(ip_information, rb_intern("@isp_name"), isp == NULL ? Qnil : ID2SYM( rb_intern(isp) ) );
83
83
 
84
84
  return ip_information;
85
- }
85
+ }
86
86
 
87
87
  VALUE ipdb_information_for_ip(VALUE self, VALUE ip_string){
88
88
  char *ip = RSTRING_PTR(ip_string);
89
- geoipdb *gi;
90
-
89
+ geoipdb *gi;
90
+
91
91
  Data_Get_Struct(self, geoipdb, gi);
92
-
93
- IpRange* ip_range = find_range_for_ip(gi->db, ip);
94
-
92
+
93
+ IpRange* ip_range = find_range_for_ip(gi->db, ip);
94
+
95
95
  if(!ip_range)
96
- return Qnil;
97
-
96
+ return Qnil;
97
+
98
98
  City * city = find_city_for_ip_range(gi->db, ip_range);
99
99
  if(!city)
100
- return Qnil;
101
-
100
+ return Qnil;
101
+
102
102
  char* isp = find_isp_for_ip_range(gi->db, ip_range);
103
-
103
+
104
104
  return build_ip_information_object(ip_range, city, isp);
105
105
  }
106
106
 
107
107
  void Init_geoipdb(void)
108
- {
108
+ {
109
109
  cIpDb = rb_define_class( "GeoIpDb", rb_cObject);
110
- rb_define_singleton_method( cIpDb, "init", ipdb_init, 3);
111
- rb_define_method( cIpDb, "information_for_ip", ipdb_information_for_ip, 1);
110
+ rb_define_singleton_method( cIpDb, "init", ipdb_init, 3);
111
+ rb_define_method( cIpDb, "information_for_ip", ipdb_information_for_ip, 1);
112
112
  }
data/ext/geoipdb/ipdb.c CHANGED
@@ -63,12 +63,12 @@ const char country_iso3_codes[253][4] = { "--","ap","eu","and","are","afg","atg"
63
63
  "blm","maf"};
64
64
 
65
65
 
66
- void
66
+ void
67
67
  print_range(const IpRange* e){
68
- printf( "from: %lu, to:%lu ->City-idx: %i \n",e->from, e->to,e->city_index );
68
+ printf( "from: %lu, to:%lu ->City-idx: %i \n",e->from, e->to,e->city_index );
69
69
  }
70
70
 
71
- void
71
+ void
72
72
  print_ranges(IPDB * db){
73
73
  int i;
74
74
  for(i = 0; i < db->ranges_count; ++i)
@@ -77,16 +77,16 @@ print_ranges(IPDB * db){
77
77
  }
78
78
  }
79
79
 
80
- void
80
+ void
81
81
  print_city(const City * e){
82
82
  if(e == NULL)
83
83
  {
84
84
  return;
85
85
  }
86
- printf( "City: code:%i, name:%s, country: %s, lat: %10.7f, lng: %10.7f \n",e->city_code, e->name, e->country_iso3, e->lat, e->lng );
86
+ printf( "City: code:%i, name:%s, country: %s, lat: %10.7f, lng: %10.7f \n",e->city_code, e->name, e->country_iso3, e->lat, e->lng );
87
87
  }
88
88
 
89
- void
89
+ void
90
90
  print_cities(IPDB * db){
91
91
  int i;
92
92
  for(i = 0; i < db->cities_count; ++i)
@@ -100,10 +100,10 @@ print_cities(IPDB * db){
100
100
  void print_stats(IPDB * db){
101
101
  printf("DB STATS: \n");
102
102
  printf("\tCities: %i\n", db->cities_count);
103
- printf("\tRanges: %i\n", db->ranges_count);
103
+ printf("\tRanges: %i\n", db->ranges_count);
104
104
  }
105
105
 
106
- double
106
+ double
107
107
  get_time(struct timeval *tim){
108
108
  gettimeofday(tim, NULL);
109
109
  return tim->tv_sec+(tim->tv_usec/1000000.0);
@@ -141,7 +141,7 @@ ip_to_int(const char *addr){
141
141
  ipnum <<= 8;
142
142
  return ipnum + octet;
143
143
  }
144
-
144
+
145
145
 
146
146
  unsigned char con_type_to_int(char* con_type) {
147
147
  // possible values
@@ -156,13 +156,13 @@ unsigned char con_type_to_int(char* con_type) {
156
156
  // oc3
157
157
  // oc12
158
158
  // satellite
159
- // wireless
159
+ // wireless
160
160
  if(strlen(con_type) > 0 && (con_type[0] == 'm'))
161
161
  return 1;
162
162
  return 0;
163
163
  }
164
164
 
165
- // Function to compare
165
+ // Function to compare
166
166
  // - either two ip-ranges: i.e.: a(from...to) <=> b(from...to)
167
167
  // - or a ip(i.e. range without to) and an ip-range: i.e. a(from...NULL) <=> b(from...to); a(from...to) <=> b(from ... NULL)
168
168
  int compare_ranges(const void *fa, const void *fb) {
@@ -179,7 +179,7 @@ int compare_ranges(const void *fa, const void *fb) {
179
179
 
180
180
 
181
181
  const IpRange *a = (IpRange *) fa;
182
- const IpRange *b = (IpRange *) fb;
182
+ const IpRange *b = (IpRange *) fb;
183
183
 
184
184
  // printf("\tComparing: a:");
185
185
  // print_range(a);
@@ -218,7 +218,7 @@ int compare_ranges(const void *fa, const void *fb) {
218
218
  }
219
219
 
220
220
 
221
- int
221
+ int
222
222
  compare_cities(const void *a, const void *b){
223
223
  const City city_a = *(City*)a;
224
224
  const City city_b = * (City*) b;
@@ -230,26 +230,26 @@ void
230
230
  sort_cities(IPDB * db){
231
231
  if(DEBUG)
232
232
  printf("Sorting %i Cities in db...\n", db->cities_count);
233
-
233
+
234
234
  struct timeval tim;
235
- double t1 = get_time(&tim);
236
-
237
- qsort(db->cities,db->cities_count,sizeof(City), compare_cities);
235
+ double t1 = get_time(&tim);
236
+
237
+ qsort(db->cities,db->cities_count,sizeof(City), compare_cities);
238
238
  if(DEBUG)
239
- printf("\n Sorting cities needed %.6lf seconds\n", get_time(&tim)-t1);
239
+ printf("\n Sorting cities needed %.6lf seconds\n", get_time(&tim)-t1);
240
240
  }
241
241
 
242
242
 
243
- int // returns a city-inde
244
- city_index_by_code(IPDB * db, uint16 city_code){
243
+ int // returns a city-index
244
+ city_index_by_code(IPDB * db, int city_code){
245
245
  City *search, *result;
246
246
  search = malloc(sizeof(City));
247
247
  search->city_code = city_code;
248
248
  result = (City*) bsearch(search, db->cities, db->cities_count, sizeof(City), compare_cities);
249
-
249
+
250
250
  if(search != NULL)
251
251
  free(search);
252
-
252
+
253
253
  if(result == NULL)
254
254
  {
255
255
  if(DEBUG)
@@ -270,19 +270,19 @@ IpRange* find_range_for_ip(IPDB *db, char *ip) {
270
270
  IpRange* search;
271
271
  IpRange* result;
272
272
  search = (IpRange *)malloc(sizeof(IpRange));
273
-
273
+
274
274
  if(db == NULL)
275
275
  {
276
276
  printf("ERROR: DB ist NULL! ");
277
277
  return NULL;
278
278
  }
279
-
279
+
280
280
  if(db->ranges_count == 0)
281
281
  {
282
282
  printf("ERROR: DB has no Ranges Data. Can not search!\n");
283
283
  return NULL;
284
284
  }
285
-
285
+
286
286
  search->from = ip_to_int(ip);
287
287
  search->to=0;
288
288
  search->city_index = 0;
@@ -291,45 +291,45 @@ IpRange* find_range_for_ip(IPDB *db, char *ip) {
291
291
  result = (IpRange*)bsearch(search, db->ranges, db->ranges_count, sizeof(IpRange), compare_ranges);
292
292
  if(search != NULL)
293
293
  free(search);
294
-
294
+
295
295
  if(result == NULL)
296
- {
296
+ {
297
297
  if(DEBUG)
298
298
  printf("ERROR: Could not find the IP: %s! THIS SHOULD NOT HAPPEN!\n", ip);
299
299
  return NULL;
300
300
  } else {
301
301
  if(DEBUG) {
302
- printf("Found Range: \t");
303
- print_range(result);
304
- }
305
- return (IpRange*)result;
302
+ printf("Found Range: \t");
303
+ print_range(result);
304
+ }
305
+ return (IpRange*)result;
306
306
  }
307
307
  }
308
308
 
309
- City * find_city_for_ip_range(IPDB * db, IpRange* range)
309
+ City * find_city_for_ip_range(IPDB * db, IpRange* range)
310
310
  {
311
311
  if(!db || !range)
312
- return NULL;
313
-
312
+ return NULL;
313
+
314
314
  if(db->cities_count == 0)
315
315
  {
316
316
  if(DEBUG)
317
317
  printf("ERROR: DB has no City Data. Can not search!\n");
318
318
  return NULL;
319
319
  }
320
-
321
- if( range->city_index <= 0 || range->city_index >= db->cities_count )
320
+
321
+ if( range->city_index <= 0 || range->city_index >= db->cities_count )
322
322
  {
323
323
  if(DEBUG)
324
324
  printf("ERROR: Could not find city with index: %i - THIS SHOULD NOT HAPPEN!\n", range->city_index);
325
- }
326
-
325
+ }
326
+
327
327
  return &(db->cities[range->city_index]);
328
328
  }
329
329
 
330
330
  char* find_isp_for_ip_range(IPDB * db, IpRange* range)
331
331
  {
332
- if( range == NULL || range->isp_index < 0 || range->isp_index > MAX_ISPS_COUNT){
332
+ if( range == NULL || range->isp_index < 0){
333
333
  printf("Could not find isp for isp_index=%i", range->isp_index);
334
334
  return NULL;
335
335
  }
@@ -367,13 +367,13 @@ isp_index_by_name(IPDB * db, char* isp_name){
367
367
 
368
368
  // read ip-ranges from csv file, of format:
369
369
  // from_ip|to_ip|contype|city_code
370
- void
371
- read_ranges_csv(IPDB * db){
370
+ void
371
+ read_ranges_csv(IPDB * db){
372
372
  struct timeval tim;
373
373
  double t1 = get_time(&tim);
374
374
 
375
375
  db->ranges = malloc(sizeof(IpRange) * db->max_ranges_count);
376
-
376
+
377
377
  if(DEBUG)
378
378
  printf("Parsing RANGES-CSV-file: %s\n", db->ranges_csv_file);
379
379
  FILE * f = fopen(db->ranges_csv_file, "rt");
@@ -386,7 +386,7 @@ read_ranges_csv(IPDB * db){
386
386
  char line[256];
387
387
  char* from;
388
388
  char* to;
389
- char* city_code;
389
+ char* city_code;
390
390
  int city_index;
391
391
 
392
392
  char* con_type;
@@ -394,7 +394,7 @@ read_ranges_csv(IPDB * db){
394
394
  uint16 isp_index;
395
395
 
396
396
  int invalid_cities_count = 0;
397
-
397
+
398
398
  IpRange* entry;
399
399
  db->ranges_count = 0;
400
400
  while (fgets(line, sizeof(line) ,f) && db->ranges_count < db->max_ranges_count){
@@ -428,27 +428,27 @@ read_ranges_csv(IPDB * db){
428
428
  }else{
429
429
  entry = &(db->ranges[db->ranges_count]);
430
430
  entry->from = ip_to_int(from);
431
- entry->to = ip_to_int(to);
431
+ entry->to = ip_to_int(to);
432
432
  entry->is_mobile = con_type_to_int(con_type);
433
433
  entry->city_index = city_index;
434
434
  entry->isp_index = isp_index;
435
-
435
+
436
436
  // printf("from: %u,to: %u, city_code:%s, city_index: %i\n",entry->from,entry->to,city_code, entry->city_index);
437
437
  // printf("working record nr: %li\n", db->ranges_count);
438
438
  db->ranges_count++;
439
439
  }
440
- }
440
+ }
441
441
  if(invalid_cities_count)
442
442
  {
443
443
  printf("Found invalid cities: %i", invalid_cities_count);
444
444
  }
445
- printf("\n Parsing of %i records needed %.6lf seconds\n", db->ranges_count, get_time(&tim)-t1);
445
+ printf("\n Parsing of %i records needed %.6lf seconds\n", db->ranges_count, get_time(&tim)-t1);
446
446
  }
447
447
 
448
448
 
449
449
 
450
450
  //translate country iso3 to iso2
451
- char *
451
+ char *
452
452
  iso2_code(char* iso3){
453
453
  int i = 0;
454
454
  for( i = 0; i < num_countries; i++)
@@ -472,7 +472,7 @@ read_cities_csv(IPDB * db){
472
472
 
473
473
  db->cities_count = 0;
474
474
  db->cities = malloc(sizeof(City) * db->max_cities_count);
475
-
475
+
476
476
  if(DEBUG)
477
477
  printf("Parsing Cities-CSV-file: %s\n", db->cities_csv_file);
478
478
  FILE * f = fopen(db->cities_csv_file, "rt");
@@ -497,23 +497,23 @@ read_cities_csv(IPDB * db){
497
497
  printf("Worked lines: %i\n", i);
498
498
  }
499
499
  // printf("Line: %s", line);
500
- // COUNTRY,REGION,CITY-NAME,METRO-CODE,CITY-CODE,LATITUDE,LONGITUDE
500
+ // COUNTRY,REGION,CITY-NAME,METRO-CODE,CITY-CODE,LATITUDE,LONGITUDE
501
501
  country = strtok(line, CITIES_DELIM);
502
502
  region = strtok(NULL, CITIES_DELIM);
503
503
  name = strtok(NULL, CITIES_DELIM);
504
- metro_code = strtok(NULL, CITIES_DELIM);
504
+ metro_code = strtok(NULL, CITIES_DELIM);
505
505
  city_code = strtok(NULL, CITIES_DELIM);
506
506
  lat = strtok(NULL, CITIES_DELIM);
507
- lng = strtok(NULL, CITIES_DELIM);
508
-
507
+ lng = strtok(NULL, CITIES_DELIM);
508
+
509
509
  entry = &(db->cities[db->cities_count]);
510
-
510
+
511
511
  strncpy(entry->country_iso3, country, strlen(country));
512
512
 
513
- // entry->country_iso2 = iso2_code(entry->country_iso3);
513
+ // entry->country_iso2 = iso2_code(entry->country_iso3);
514
514
  strncpy(entry->country_iso2, iso2_code(country), 2);
515
515
  strncpy(entry->name, name, strlen(name));
516
-
516
+
517
517
  entry->city_code = atoi(city_code);
518
518
  entry->lat = atof(lat);
519
519
  entry->lng = atof(lng);
@@ -534,12 +534,12 @@ the layout goes like this:
534
534
  db->cities [sizeof(City)=24 x db->ranges_count Bytes]
535
535
  db->ranges [sizeof(IpRange)=24 x db->ranges_count Bytes]
536
536
  */
537
- void
537
+ void
538
538
  write_cache_file(IPDB * db){
539
539
  struct timeval tim;
540
540
  double t1 = get_time(&tim);
541
541
  int objects_written;
542
-
542
+
543
543
  FILE * f;
544
544
  f = fopen(db->cache_file_name, "w");
545
545
  if(f==NULL){
@@ -549,43 +549,43 @@ write_cache_file(IPDB * db){
549
549
  }
550
550
  if(DEBUG){
551
551
  printf("Dumping %i records to cache-file: %s\n\n", db->ranges_count, db->cache_file_name);
552
-
552
+
553
553
  //write the record length at file header
554
554
  printf("Writing DB-Header of length: %li\n",sizeof(db->ranges_count));
555
-
556
- printf("RecordLength: %li\n",sizeof(IpRange));
557
- printf("FieldLength: %li\n",sizeof(db->ranges[0].from));
555
+
556
+ printf("RecordLength: %li\n",sizeof(IpRange));
557
+ printf("FieldLength: %li\n",sizeof(db->ranges[0].from));
558
558
  }
559
559
  //write the header: i.e.: numbers of records
560
560
  fwrite(&(db->cities_count), sizeof(db->cities_count),1,f);
561
- fwrite(&(db->isps_count), sizeof(db->isps_count),1,f);
561
+ fwrite(&(db->isps_count), sizeof(db->isps_count),1,f);
562
562
  fwrite(&(db->ranges_count), sizeof(db->ranges_count),1,f);
563
-
563
+
564
564
  if(DEBUG)
565
- printf("Writing Contents with %i cities, a %li bytes each, should = %li \n", db->cities_count, sizeof(City), db->cities_count * sizeof(City));
565
+ printf("Writing Contents with %i cities, a %li bytes each, should = %li \n", db->cities_count, sizeof(City), db->cities_count * sizeof(City));
566
566
  //write the actual data: all the ranges-array-buffer:
567
567
  objects_written = fwrite(db->cities, sizeof(City), db->cities_count, f);
568
-
568
+
569
569
  if(DEBUG)
570
- printf("Writing Contents with %i isps, a %li bytes each, should = %li \n", db->isps_count, MAX_ISP_NAME_LENGTH, db->isps_count * MAX_ISP_NAME_LENGTH);
570
+ printf("Writing Contents with %i isps, a %i bytes each, should = %i \n", db->isps_count, MAX_ISP_NAME_LENGTH, db->isps_count * MAX_ISP_NAME_LENGTH);
571
571
  //write the actual data: all the ranges-array-buffer:
572
572
  objects_written += fwrite(db->isps, MAX_ISP_NAME_LENGTH, db->isps_count, f);
573
-
573
+
574
574
  if(DEBUG)
575
- printf("Writing Contents with %i ranges, a %li bytes each, should = %li \n", db->ranges_count, sizeof(IpRange), db->ranges_count * sizeof(IpRange));
575
+ printf("Writing Contents with %i ranges, a %li bytes each, should = %li \n", db->ranges_count, sizeof(IpRange), db->ranges_count * sizeof(IpRange));
576
576
  //write the actual data: all the ranges-array-buffer:
577
577
  objects_written += fwrite(db->ranges, sizeof(IpRange), db->ranges_count, f);
578
-
578
+
579
579
 
580
580
  fclose(f);
581
- if(DEBUG)
582
- printf("\n Writing CacheFile of %i objects needed %.6lf seconds\n", objects_written, get_time(&tim)-t1);
581
+ if(DEBUG)
582
+ printf("\n Writing CacheFile of %i objects needed %.6lf seconds\n", objects_written, get_time(&tim)-t1);
583
583
  }
584
584
 
585
- int
586
- read_cache_file(IPDB * db){
585
+ int
586
+ read_cache_file(IPDB * db){
587
587
  struct timeval tim;
588
- double t1 = get_time(&tim);
588
+ double t1 = get_time(&tim);
589
589
  FILE * f;
590
590
  f = fopen(db->cache_file_name, "r");
591
591
  if(f==NULL){
@@ -594,17 +594,17 @@ read_cache_file(IPDB * db){
594
594
  return 0;
595
595
  }
596
596
  int cities_header_read = fread(&(db->cities_count), sizeof(db->cities_count),1,f);
597
- int isps_header_read = fread(&(db->isps_count), sizeof(db->isps_count),1,f);
597
+ int isps_header_read = fread(&(db->isps_count), sizeof(db->isps_count),1,f);
598
598
  int ranges_header_read = fread(&(db->ranges_count), sizeof(db->ranges_count),1,f);
599
599
 
600
-
600
+
601
601
  if(cities_header_read == 0 || isps_header_read == 0 || ranges_header_read == 0 || db->cities_count == 0 || db->isps_count ==0 || db->ranges_count ==0)
602
602
  {
603
603
  printf("Could not read Cities-Header from Cache-File: %s", db->cache_file_name);
604
604
  return 0;
605
605
  }
606
- if(DEBUG)
607
- printf("Reading DB-Header from Cache-File: %s, with %i cities, %iisps and %i ranges\n",db->cache_file_name, db->cities_count, db->isps_count, db->ranges_count);
606
+ if(DEBUG)
607
+ printf("Reading DB-Header from Cache-File: %s, with %i cities, %iisps and %i ranges\n",db->cache_file_name, db->cities_count, db->isps_count, db->ranges_count);
608
608
 
609
609
  int objects_read = 0;
610
610
  if(DEBUG)
@@ -620,29 +620,29 @@ read_cache_file(IPDB * db){
620
620
  printf("Allocating: %lu for ranges-array \n", sizeof(IpRange)*(db->ranges_count));
621
621
  db->ranges = malloc(sizeof(IpRange) * db->ranges_count);
622
622
  objects_read += fread(db->ranges, sizeof(IpRange),db->ranges_count,f);
623
-
623
+
624
624
 
625
625
  fclose(f);
626
- if(DEBUG)
627
- printf("Reading cacheFile of %i objects needed %.6lf seconds\n", objects_read, get_time(&tim)-t1);
626
+ if(DEBUG)
627
+ printf("Reading cacheFile of %i objects needed %.6lf seconds\n", objects_read, get_time(&tim)-t1);
628
628
  return objects_read;
629
629
  }
630
630
 
631
- void
631
+ void
632
632
  benchmark_search(IPDB * db,int count){
633
633
  printf("(Naiv) benchmark of the City-Search-Function with %i counts \n", count);
634
- struct timeval tim;
634
+ struct timeval tim;
635
635
  double t1 = get_time(&tim);
636
636
  int i;
637
637
  City * city;
638
638
 
639
- for(i=0;i<count; i++){
639
+ for(i=0;i<count; i++){
640
640
  IpRange* range = find_range_for_ip(db,"278.50.47.0");
641
641
  City* city = find_city_for_ip_range(db,range);
642
642
  }
643
643
  double delta = get_time(&tim)-t1;
644
-
645
- printf("\n\nSearch: %.6lf seconds elapsed, i.e. %.6lf Ops/Second \n", delta, count / delta);
644
+
645
+ printf("\n\nSearch: %.6lf seconds elapsed, i.e. %.6lf Ops/Second \n", delta, count / delta);
646
646
  }
647
647
 
648
648
  IPDB * init_db(char * cities_csv_file, char * ranges_csv_file, char * cache_file_name){
@@ -660,18 +660,18 @@ IPDB * init_db(char * cities_csv_file, char * ranges_csv_file, char * cache_file
660
660
  db->max_cities_count = MAX_CITIES_COUNT;
661
661
  db->ranges_csv_file = ranges_csv_file;
662
662
  db->max_ranges_count = MAX_RANGES_COUNT;
663
-
663
+
664
664
  // db->isps = NULL;
665
- // db->isps = malloc(MAX_ISP_NAME_LENGTH * MAX_ISPS_COUNT);
665
+ // db->isps = malloc(MAX_ISP_NAME_LENGTH * MAX_ISPS_COUNT);
666
666
  db->isps_count = 0;
667
-
667
+
668
668
 
669
669
  if(USE_CACHE && read_cache_file(db) > 0){
670
670
  if(DEBUG)
671
671
  printf("Loaded DB from Cache-File with %i records \n", db->ranges_count);
672
672
  }else{
673
673
  if(DEBUG)
674
- printf("Initializing IPDB from CSV-file: %s \n", db->ranges_csv_file);
674
+ printf("Initializing IPDB from CSV-file: %s \n", db->ranges_csv_file);
675
675
  read_cities_csv(db);
676
676
  // print_cities(db);
677
677
  if(db->cities_count == 0)
@@ -684,10 +684,10 @@ IPDB * init_db(char * cities_csv_file, char * ranges_csv_file, char * cache_file
684
684
  if(db!=NULL && db->ranges_count > 0 && USE_CACHE)
685
685
  {
686
686
  if(DEBUG)
687
- printf("Got %i records from CSV-file, writing to cache...\n", db->ranges_count);
687
+ printf("Got %i records from CSV-file, writing to cache...\n", db->ranges_count);
688
688
  write_cache_file(db);
689
689
  }
690
690
  }
691
- return db;
691
+ return db;
692
692
  }
693
693
 
data/ext/geoipdb/ipdb.h CHANGED
@@ -13,18 +13,18 @@ typedef int int32;
13
13
 
14
14
  #ifdef RSTRING_PTR
15
15
  #else
16
- # define RSTRING_LEN(x) (RSTRING(x)->len)
17
- # define RSTRING_PTR(x) (RSTRING(x)->ptr)
16
+ # define RSTRING_LEN(x) (RSTRING(x)->len)
17
+ # define RSTRING_PTR(x) (RSTRING(x)->ptr)
18
18
  #endif
19
19
 
20
20
 
21
21
  #define RANGES_DELIM ",\n"
22
22
  #define CITIES_DELIM ",\n"
23
23
 
24
- #define MAX_CITIES_COUNT 100000 //Usually we have about 50 000 Cities
25
- #define MAX_RANGES_COUNT 10000000 //Usually we have about 6 Mio IP-Ranges
24
+ #define MAX_CITIES_COUNT 1000000 //Usually we have about 120 000 Cities
25
+ #define MAX_RANGES_COUNT 10000000 //Usually we have about 6 Mio IP-Ranges
26
26
 
27
- #define MAX_ISPS_COUNT 100000
27
+ #define MAX_ISPS_COUNT 65535
28
28
  #define MAX_ISP_NAME_LENGTH 100
29
29
 
30
30
  #define USE_CACHE 1
@@ -32,20 +32,20 @@ typedef int int32;
32
32
 
33
33
  typedef struct{
34
34
  unsigned long from;
35
- unsigned long to;
35
+ unsigned long to;
36
36
  unsigned char is_mobile;
37
- uint16 city_index; //index of the city in the cities-array
38
- int16 isp_index; //index of the isp in the isps-array
37
+ int city_index; //index of the city in the cities-array
38
+ int16 isp_index; //index of the isp in the isps-array
39
39
  } IpRange;
40
40
 
41
41
  typedef struct{
42
- uint16 city_code; //city codes are not larger than 2**16 = 65536
42
+ int city_code;
43
43
  char name[32];
44
44
  double lat;
45
45
  double lng;
46
-
46
+
47
47
  char country_iso3[4];
48
- char country_iso2[3];
48
+ char country_iso2[3];
49
49
  } City;
50
50
 
51
51
  typedef struct{
@@ -54,7 +54,7 @@ typedef struct{
54
54
  unsigned int ranges_count;
55
55
 
56
56
  char *cities_csv_file;
57
- unsigned int cities_count;
57
+ unsigned int cities_count;
58
58
  unsigned int max_cities_count;
59
59
 
60
60
  char *cache_file_name; // a binary file to store the whole db.....
@@ -62,27 +62,27 @@ typedef struct{
62
62
  City * cities;
63
63
 
64
64
  char isps[MAX_ISPS_COUNT][MAX_ISP_NAME_LENGTH]; // a fixed size array of strings should be enough here...do not expect the isps to grow dramatically..
65
- uint16 isps_count;
65
+ uint16 isps_count;
66
66
 
67
67
 
68
68
  } IPDB;
69
69
 
70
70
 
71
71
  // "publicly" visible functions
72
- IPDB *
72
+ IPDB *
73
73
  init_db(char * cities_csv_file, char * ranges_csv_file, char * cache_file_name);
74
74
 
75
75
 
76
- void
76
+ void
77
77
  print_city(const City * e);
78
78
 
79
- void
80
- benchmark_search(IPDB * db,int count);
79
+ void
80
+ benchmark_search(IPDB * db,int count);
81
81
 
82
82
  IpRange*
83
83
  find_range_for_ip(IPDB *db, char *ip);
84
84
 
85
- City*
85
+ City*
86
86
  find_city_for_ip_range(IPDB * db, IpRange* range);
87
87
 
88
88
  char*
data/geoipdb.gemspec CHANGED
@@ -4,14 +4,14 @@
4
4
  # -*- encoding: utf-8 -*-
5
5
 
6
6
  Gem::Specification.new do |s|
7
- s.name = %q{geoipdb}
8
- s.version = "0.3.1"
7
+ s.name = "geoipdb"
8
+ s.version = "0.4.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Eugen Martin", "Martin Karlsch"]
12
- s.date = %q{2011-06-14}
13
- s.description = %q{Returns a GeoLocation and additional information for given IP. Reads Data from CSV-Files and uses internal binary caching.}
14
- s.email = %q{eugeniusmartinus@googlemail.com}
12
+ s.date = "2011-11-25"
13
+ s.description = "Returns a GeoLocation and additional information for given IP. Reads Data from CSV-Files and uses internal binary caching."
14
+ s.email = "eugeniusmartinus@googlemail.com"
15
15
  s.extensions = ["ext/geoipdb/extconf.rb"]
16
16
  s.extra_rdoc_files = [
17
17
  "LICENSE.txt",
@@ -41,11 +41,11 @@ Gem::Specification.new do |s|
41
41
  "spec/spec_helper.rb",
42
42
  "test.rb"
43
43
  ]
44
- s.homepage = %q{http://github.com/madvertise/geoipdb}
44
+ s.homepage = "http://github.com/madvertise/geoipdb"
45
45
  s.licenses = ["MIT"]
46
46
  s.require_paths = ["lib", "ext"]
47
- s.rubygems_version = %q{1.5.3}
48
- s.summary = %q{Fast (>3 Mio queries/sec!!!) GeoIpDb implementation for Ruby using C-Extensions.}
47
+ s.rubygems_version = "1.8.10"
48
+ s.summary = "Fast (>3 Mio queries/sec!!!) GeoIpDb implementation for Ruby using C-Extensions."
49
49
  s.test_files = [
50
50
  "spec/geoipdb_spec.rb",
51
51
  "spec/spec_helper.rb"
@@ -1,4 +1,4 @@
1
-
1
+ asdf,as,dsa,g,asdf,g,as,d,ga,sd,f,as,dg,
2
2
 
3
3
 
4
4
  start_ip,end_ip,field 13,
@@ -12,7 +12,7 @@ start_ip,end_ip,field 13,
12
12
 
13
13
  asfdasdf asdf asfasdfasdf§$%&/
14
14
 
15
- 1, , , 7 ,.1.1.0,1.1.1.255,4,
15
+ 1, , , 7 ,.1.1.0,1.1.1.255,4,,asdf,f,as,df,ag,as,df,asd,
16
16
  1.1.2.0,1.2.2.255,5,
17
17
  1.2.3.0,1.2.3.255,5,
18
18
  1.2.4.0,1.3.255.255,2,
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: geoipdb
3
3
  version: !ruby/object:Gem::Version
4
- hash: 17
4
+ hash: 13
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 3
8
+ - 4
9
9
  - 1
10
- version: 0.3.1
10
+ version: 0.4.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Eugen Martin
@@ -16,11 +16,9 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2011-06-14 00:00:00 +02:00
20
- default_executable:
19
+ date: 2011-11-25 00:00:00 Z
21
20
  dependencies:
22
21
  - !ruby/object:Gem::Dependency
23
- name: rspec
24
22
  version_requirements: &id001 !ruby/object:Gem::Requirement
25
23
  none: false
26
24
  requirements:
@@ -32,11 +30,11 @@ dependencies:
32
30
  - 1
33
31
  - 0
34
32
  version: 2.1.0
33
+ requirement: *id001
35
34
  prerelease: false
35
+ name: rspec
36
36
  type: :development
37
- requirement: *id001
38
37
  - !ruby/object:Gem::Dependency
39
- name: bundler
40
38
  version_requirements: &id002 !ruby/object:Gem::Requirement
41
39
  none: false
42
40
  requirements:
@@ -48,11 +46,11 @@ dependencies:
48
46
  - 0
49
47
  - 0
50
48
  version: 1.0.0
49
+ requirement: *id002
51
50
  prerelease: false
51
+ name: bundler
52
52
  type: :development
53
- requirement: *id002
54
53
  - !ruby/object:Gem::Dependency
55
- name: jeweler
56
54
  version_requirements: &id003 !ruby/object:Gem::Requirement
57
55
  none: false
58
56
  requirements:
@@ -64,11 +62,11 @@ dependencies:
64
62
  - 5
65
63
  - 1
66
64
  version: 1.5.1
65
+ requirement: *id003
67
66
  prerelease: false
67
+ name: jeweler
68
68
  type: :development
69
- requirement: *id003
70
69
  - !ruby/object:Gem::Dependency
71
- name: rcov
72
70
  version_requirements: &id004 !ruby/object:Gem::Requirement
73
71
  none: false
74
72
  requirements:
@@ -78,9 +76,10 @@ dependencies:
78
76
  segments:
79
77
  - 0
80
78
  version: "0"
79
+ requirement: *id004
81
80
  prerelease: false
81
+ name: rcov
82
82
  type: :development
83
- requirement: *id004
84
83
  description: Returns a GeoLocation and additional information for given IP. Reads Data from CSV-Files and uses internal binary caching.
85
84
  email: eugeniusmartinus@googlemail.com
86
85
  executables: []
@@ -113,7 +112,6 @@ files:
113
112
  - spec/geoipdb_spec.rb
114
113
  - spec/spec_helper.rb
115
114
  - test.rb
116
- has_rdoc: true
117
115
  homepage: http://github.com/madvertise/geoipdb
118
116
  licenses:
119
117
  - MIT
@@ -144,7 +142,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
144
142
  requirements: []
145
143
 
146
144
  rubyforge_project:
147
- rubygems_version: 1.5.3
145
+ rubygems_version: 1.8.10
148
146
  signing_key:
149
147
  specification_version: 3
150
148
  summary: Fast (>3 Mio queries/sec!!!) GeoIpDb implementation for Ruby using C-Extensions.