geoip2_c 0.3.3 → 0.3.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (107) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ubuntu.yml +33 -0
  3. data/.github/workflows/windows.yml +52 -0
  4. data/README.md +3 -9
  5. data/docker-compose.yml +7 -0
  6. data/dockerfiles/Dockerfile-ruby2.7 +8 -0
  7. data/ext/geoip2/extconf.rb +11 -4
  8. data/ext/geoip2/geoip2.c +58 -15
  9. data/ext/geoip2/libmaxminddb/t/libtap/.gitignore +13 -0
  10. data/ext/geoip2/libmaxminddb/t/libtap/.travis.yml +13 -0
  11. data/ext/geoip2/libmaxminddb/t/libtap/COPYING +165 -0
  12. data/ext/geoip2/libmaxminddb/t/libtap/INSTALL +41 -0
  13. data/ext/geoip2/libmaxminddb/t/libtap/Makefile +72 -0
  14. data/ext/geoip2/libmaxminddb/t/libtap/Makefile.win +37 -0
  15. data/ext/geoip2/libmaxminddb/t/libtap/README.md +268 -0
  16. data/ext/geoip2/libmaxminddb/t/libtap/t/cmp_mem.c +20 -0
  17. data/ext/geoip2/libmaxminddb/t/libtap/t/cmp_mem.expected +28 -0
  18. data/ext/geoip2/libmaxminddb/t/libtap/t/cmpok.c +16 -0
  19. data/ext/geoip2/libmaxminddb/t/libtap/t/cmpok.expected +37 -0
  20. data/ext/geoip2/libmaxminddb/t/libtap/t/diag.c +10 -0
  21. data/ext/geoip2/libmaxminddb/t/libtap/t/diag.expected +2 -0
  22. data/ext/geoip2/libmaxminddb/t/libtap/t/diesok.c +14 -0
  23. data/ext/geoip2/libmaxminddb/t/libtap/t/diesok.expected +6 -0
  24. data/ext/geoip2/libmaxminddb/t/libtap/t/is.c +24 -0
  25. data/ext/geoip2/libmaxminddb/t/libtap/t/is.expected +58 -0
  26. data/ext/geoip2/libmaxminddb/t/libtap/t/like.c +10 -0
  27. data/ext/geoip2/libmaxminddb/t/libtap/t/like.expected +4 -0
  28. data/ext/geoip2/libmaxminddb/t/libtap/t/simple.c +31 -0
  29. data/ext/geoip2/libmaxminddb/t/libtap/t/simple.expected +32 -0
  30. data/ext/geoip2/libmaxminddb/t/libtap/t/skip.c +23 -0
  31. data/ext/geoip2/libmaxminddb/t/libtap/t/skip.expected +9 -0
  32. data/ext/geoip2/libmaxminddb/t/libtap/t/synopsis.c +13 -0
  33. data/ext/geoip2/libmaxminddb/t/libtap/t/synopsis.expected +9 -0
  34. data/ext/geoip2/libmaxminddb/t/libtap/t/test.c +28 -0
  35. data/ext/geoip2/libmaxminddb/t/libtap/t/todo.c +17 -0
  36. data/ext/geoip2/libmaxminddb/t/libtap/t/todo.expected +11 -0
  37. data/ext/geoip2/libmaxminddb/t/libtap/tap.c +354 -0
  38. data/ext/geoip2/libmaxminddb/t/libtap/tap.h +115 -0
  39. data/ext/geoip2/libmaxminddb/t/maxmind-db/.gitattributes +1 -0
  40. data/ext/geoip2/libmaxminddb/t/maxmind-db/.gitconfig +2 -0
  41. data/ext/geoip2/libmaxminddb/t/maxmind-db/.gitignore +2 -0
  42. data/ext/geoip2/libmaxminddb/t/maxmind-db/.perltidyallrc +11 -0
  43. data/ext/geoip2/libmaxminddb/t/maxmind-db/.tidyallrc +7 -0
  44. data/ext/geoip2/libmaxminddb/t/maxmind-db/LICENSE +4 -0
  45. data/ext/geoip2/libmaxminddb/t/maxmind-db/MaxMind-DB-spec.md +558 -0
  46. data/ext/geoip2/libmaxminddb/t/maxmind-db/README.md +4 -0
  47. data/ext/geoip2/libmaxminddb/t/maxmind-db/bad-data/README.md +7 -0
  48. data/ext/geoip2/libmaxminddb/t/maxmind-db/bad-data/libmaxminddb/libmaxminddb-offset-integer-overflow.mmdb +0 -0
  49. data/ext/geoip2/libmaxminddb/t/maxmind-db/bad-data/maxminddb-golang/cyclic-data-structure.mmdb +0 -0
  50. data/ext/geoip2/libmaxminddb/t/maxmind-db/bad-data/maxminddb-golang/invalid-bytes-length.mmdb +1 -0
  51. data/ext/geoip2/libmaxminddb/t/maxmind-db/bad-data/maxminddb-golang/invalid-data-record-offset.mmdb +0 -0
  52. data/ext/geoip2/libmaxminddb/t/maxmind-db/bad-data/maxminddb-golang/invalid-map-key-length.mmdb +0 -0
  53. data/ext/geoip2/libmaxminddb/t/maxmind-db/bad-data/maxminddb-golang/invalid-string-length.mmdb +1 -0
  54. data/ext/geoip2/libmaxminddb/t/maxmind-db/bad-data/maxminddb-golang/metadata-is-an-uint128.mmdb +1 -0
  55. data/ext/geoip2/libmaxminddb/t/maxmind-db/bad-data/maxminddb-golang/unexpected-bytes.mmdb +0 -0
  56. data/ext/geoip2/libmaxminddb/t/maxmind-db/perltidyrc +12 -0
  57. data/ext/geoip2/libmaxminddb/t/maxmind-db/source-data/GeoIP2-Anonymous-IP-Test.json +32 -0
  58. data/ext/geoip2/libmaxminddb/t/maxmind-db/source-data/GeoIP2-City-Test.json +12616 -0
  59. data/ext/geoip2/libmaxminddb/t/maxmind-db/source-data/GeoIP2-Connection-Type-Test.json +102 -0
  60. data/ext/geoip2/libmaxminddb/t/maxmind-db/source-data/GeoIP2-Country-Test.json +10975 -0
  61. data/ext/geoip2/libmaxminddb/t/maxmind-db/source-data/GeoIP2-DensityIncome-Test.json +14 -0
  62. data/ext/geoip2/libmaxminddb/t/maxmind-db/source-data/GeoIP2-Domain-Test.json +452 -0
  63. data/ext/geoip2/libmaxminddb/t/maxmind-db/source-data/GeoIP2-Enterprise-Test.json +666 -0
  64. data/ext/geoip2/libmaxminddb/t/maxmind-db/source-data/GeoIP2-ISP-Test.json +12585 -0
  65. data/ext/geoip2/libmaxminddb/t/maxmind-db/source-data/GeoIP2-Precision-Enterprise-Test.json +1035 -0
  66. data/ext/geoip2/libmaxminddb/t/maxmind-db/source-data/GeoLite2-ASN-Test.json +37 -0
  67. data/ext/geoip2/libmaxminddb/t/maxmind-db/source-data/README +13 -0
  68. data/ext/geoip2/libmaxminddb/t/maxmind-db/test-data/GeoIP2-Anonymous-IP-Test.mmdb +0 -0
  69. data/ext/geoip2/libmaxminddb/t/maxmind-db/test-data/GeoIP2-City-Test-Broken-Double-Format.mmdb +0 -0
  70. data/ext/geoip2/libmaxminddb/t/maxmind-db/test-data/GeoIP2-City-Test-Invalid-Node-Count.mmdb +0 -0
  71. data/ext/geoip2/libmaxminddb/t/maxmind-db/test-data/GeoIP2-City-Test.mmdb +0 -0
  72. data/ext/geoip2/libmaxminddb/t/maxmind-db/test-data/GeoIP2-Connection-Type-Test.mmdb +0 -0
  73. data/ext/geoip2/libmaxminddb/t/maxmind-db/test-data/GeoIP2-Country-Test.mmdb +0 -0
  74. data/ext/geoip2/libmaxminddb/t/maxmind-db/test-data/GeoIP2-DensityIncome-Test.mmdb +0 -0
  75. data/ext/geoip2/libmaxminddb/t/maxmind-db/test-data/GeoIP2-Domain-Test.mmdb +0 -0
  76. data/ext/geoip2/libmaxminddb/t/maxmind-db/test-data/GeoIP2-Enterprise-Test.mmdb +0 -0
  77. data/ext/geoip2/libmaxminddb/t/maxmind-db/test-data/GeoIP2-ISP-Test.mmdb +0 -0
  78. data/ext/geoip2/libmaxminddb/t/maxmind-db/test-data/GeoIP2-Precision-Enterprise-Test.mmdb +0 -0
  79. data/ext/geoip2/libmaxminddb/t/maxmind-db/test-data/GeoLite2-ASN-Test.mmdb +0 -0
  80. data/ext/geoip2/libmaxminddb/t/maxmind-db/test-data/MaxMind-DB-no-ipv4-search-tree.mmdb +0 -0
  81. data/ext/geoip2/libmaxminddb/t/maxmind-db/test-data/MaxMind-DB-string-value-entries.mmdb +0 -0
  82. data/ext/geoip2/libmaxminddb/t/maxmind-db/test-data/MaxMind-DB-test-broken-pointers-24.mmdb +0 -0
  83. data/ext/geoip2/libmaxminddb/t/maxmind-db/test-data/MaxMind-DB-test-broken-search-tree-24.mmdb +0 -0
  84. data/ext/geoip2/libmaxminddb/t/maxmind-db/test-data/MaxMind-DB-test-decoder.mmdb +0 -0
  85. data/ext/geoip2/libmaxminddb/t/maxmind-db/test-data/MaxMind-DB-test-ipv4-24.mmdb +0 -0
  86. data/ext/geoip2/libmaxminddb/t/maxmind-db/test-data/MaxMind-DB-test-ipv4-28.mmdb +0 -0
  87. data/ext/geoip2/libmaxminddb/t/maxmind-db/test-data/MaxMind-DB-test-ipv4-32.mmdb +0 -0
  88. data/ext/geoip2/libmaxminddb/t/maxmind-db/test-data/MaxMind-DB-test-ipv6-24.mmdb +0 -0
  89. data/ext/geoip2/libmaxminddb/t/maxmind-db/test-data/MaxMind-DB-test-ipv6-28.mmdb +0 -0
  90. data/ext/geoip2/libmaxminddb/t/maxmind-db/test-data/MaxMind-DB-test-ipv6-32.mmdb +0 -0
  91. data/ext/geoip2/libmaxminddb/t/maxmind-db/test-data/MaxMind-DB-test-metadata-pointers.mmdb +0 -0
  92. data/ext/geoip2/libmaxminddb/t/maxmind-db/test-data/MaxMind-DB-test-mixed-24.mmdb +0 -0
  93. data/ext/geoip2/libmaxminddb/t/maxmind-db/test-data/MaxMind-DB-test-mixed-28.mmdb +0 -0
  94. data/ext/geoip2/libmaxminddb/t/maxmind-db/test-data/MaxMind-DB-test-mixed-32.mmdb +0 -0
  95. data/ext/geoip2/libmaxminddb/t/maxmind-db/test-data/MaxMind-DB-test-nested.mmdb +0 -0
  96. data/ext/geoip2/libmaxminddb/t/maxmind-db/test-data/README.md +26 -0
  97. data/ext/geoip2/libmaxminddb/t/maxmind-db/test-data/maps-with-pointers.raw +0 -0
  98. data/ext/geoip2/libmaxminddb/t/maxmind-db/test-data/write-test-data.pl +614 -0
  99. data/ext/geoip2/libmaxminddb/t/maxmind-db/tidyall.ini +5 -0
  100. data/geoip2_c.gemspec +2 -3
  101. data/lib/geoip2/database.rb +4 -0
  102. data/lib/geoip2/version.rb +1 -1
  103. metadata +108 -18
  104. data/.travis.yml +0 -30
  105. data/Appraisals +0 -7
  106. data/gemfiles/ruby_2.1.gemfile +0 -7
  107. data/gemfiles/ruby_2.2.gemfile +0 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fa4074dbeab86f3881d576390460438107cd9d3d156d1a3da9813b2f5dc1f890
4
- data.tar.gz: 94a44a7f48e4b69742c659b473b60baad893df2cf938db6e49d7ee7388a6fbe4
3
+ metadata.gz: abed5426ff2b76c33f8fbfd79a591b86fe2dc5a6aeea1a73723e37763537271f
4
+ data.tar.gz: e77eb5aa947623d9be2fa2f2161081145d50e57f75f516cb775b0757965aff83
5
5
  SHA512:
6
- metadata.gz: 2a338f192553f75914d5c5bfe72c26be5aea555df7c6416406751521f35445d36c06c99c0ea3aa58f11b9f635dc8f4e8f85a5ac2b03f402be8c9295d655ff41b
7
- data.tar.gz: 758c468308389d460bdf3633afb824079188ce3ecc4cc05e2f76365c3adcbd3cbf158d6129cade3627177dda6f238b2e29d5b77bed044f2493b6587fcb577941
6
+ metadata.gz: 36b58ccb36e05a271a2806ec0ab53f9a4445175cb24a39916f2e674b2373f0f82275946a327b925567e63de06c64ddfd462376a3dec056649c6559b95d50faa7
7
+ data.tar.gz: f3deafdd7c89751ee468d950506dee5395381ef810cbe7683d4043973e1a7ad547e24e04f61925a51ff99526d116908da790b708c41a5c1f8378b200f1f82608
@@ -0,0 +1,33 @@
1
+ name: ubuntu
2
+
3
+ on:
4
+ - push
5
+ - pull_request
6
+
7
+ jobs:
8
+ build:
9
+ runs-on: ubuntu-latest
10
+ strategy:
11
+ matrix:
12
+ ruby:
13
+ - "3.2"
14
+ - "3.1"
15
+ - "3.0"
16
+ steps:
17
+ - uses: actions/checkout@v3
18
+ with:
19
+ submodules: true
20
+ - name: Setup ruby
21
+ uses: ruby/setup-ruby@v1
22
+ with:
23
+ ruby-version: ${{ matrix.ruby }}
24
+ bundler: latest
25
+ bundler-cache: true
26
+ - name: Install dependencies
27
+ run: |
28
+ sudo apt-get update
29
+ sudo apt-get install -y -qq build-essential automake autoconf libtool
30
+ - name: Build
31
+ run: bundle exec rake compile
32
+ - name: Run test
33
+ run: bundle exec rake test
@@ -0,0 +1,52 @@
1
+ name: windows
2
+
3
+ on:
4
+ - push
5
+ - pull_request
6
+
7
+ jobs:
8
+ build:
9
+ runs-on: windows-latest
10
+ strategy:
11
+ matrix:
12
+ ruby:
13
+ - "3.2"
14
+ - "3.1"
15
+ include:
16
+ - ruby: "3.0.3"
17
+ # On Ruby 3.0, we need to use fiddle 1.0.8 or later to retrieve correct
18
+ # error code. In addition, we have to specify the path of fiddle by RUBYLIB
19
+ # because RubyInstaller loads Ruby's bundled fiddle before initializing gem.
20
+ # See also:
21
+ # * https://github.com/ruby/fiddle/issues/72
22
+ # * https://bugs.ruby-lang.org/issues/17813
23
+ # * https://github.com/oneclick/rubyinstaller2/blob/8225034c22152d8195bc0aabc42a956c79d6c712/lib/ruby_installer/build/dll_directory.rb
24
+ ruby-lib-opt: RUBYLIB=%RUNNER_TOOL_CACHE%/Ruby/3.0.3/x64/lib/ruby/gems/3.0.0/gems/fiddle-1.1.0/lib
25
+ steps:
26
+ - uses: actions/checkout@v3
27
+ with:
28
+ submodules: true
29
+ - name: Install dependencies
30
+ run: |
31
+ ridk enable
32
+ pacman -Sy --noconfirm mingw-w64-x86_64-libmaxminddb
33
+ - name: Setup ruby
34
+ uses: ruby/setup-ruby@v1
35
+ with:
36
+ ruby-version: ${{ matrix.ruby }}
37
+ bundler: latest
38
+ bundler-cache: true
39
+ - name: Check Ruby version
40
+ run: |
41
+ ruby -v
42
+ - name: Add Fiddle 1.1.0
43
+ if: ${{ matrix.ruby == "3.0.3" }}
44
+ run: gem install fiddle --version 1.1.0
45
+ - name: Build
46
+ run: |
47
+ ridk enable
48
+ bundle exec rake compile
49
+ - name: Run test
50
+ run: |
51
+ ridk enable
52
+ bundle exec rake test
data/README.md CHANGED
@@ -5,15 +5,9 @@ This gem provides binding of [libmaxminddb](http://maxmind.github.io/libmaxmindd
5
5
  This binding does not traverse all elements in lookup result by default.
6
6
  So you can get the element you want fast such as city name, country name or etc.
7
7
 
8
- ## Requirements
8
+ ## Supported Ruby versions
9
9
 
10
- * Ruby 2.3 or later
11
-
12
- NOTE:
13
-
14
- This library uses `Hash#dig` and `Array#dig`.
15
- If you want to use this library with Ruby2.1 or Ruby2.2, you can install a gem which adds support `#dig` method.
16
- But I don't want to add extra dependency to this library, so I decided not to add extra dependency to support old Ruby versions.
10
+ See [workflows](https://github.com/fluent-plugins-nursery/geoip2_c/blob/master/.github/workflows/ubuntu.yml)
17
11
 
18
12
  ## Build requirements
19
13
 
@@ -68,7 +62,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
68
62
 
69
63
  ## Contributing
70
64
 
71
- Bug reports and pull requests are welcome on GitHub at https://github.com/okkez/geoip2_c.
65
+ Bug reports and pull requests are welcome on GitHub at https://github.com/fluent-plugins-nursery/geoip2_c.
72
66
 
73
67
  ## License
74
68
 
data/docker-compose.yml CHANGED
@@ -1,5 +1,12 @@
1
1
  version: "3"
2
2
  services:
3
+ test-ruby2.7:
4
+ build:
5
+ context: .
6
+ dockerfile: dockerfiles/Dockerfile-ruby2.7
7
+ command: tail -f /dev/null
8
+ environment:
9
+ - BUNDLE_GEMFILE=Gemfile
3
10
  test-ruby2.6:
4
11
  build:
5
12
  context: .
@@ -0,0 +1,8 @@
1
+ FROM ruby:2.7-alpine
2
+
3
+ ENV BUNDLE_GEMFILE=$BUNDLE_GEMFILE
4
+
5
+ RUN apk --no-cache --update add build-base autoconf automake libtool ruby-dev libc6-compat git
6
+
7
+ WORKDIR /app
8
+ COPY . .
@@ -5,12 +5,19 @@ libdir = RbConfig::CONFIG["libdir"]
5
5
  includedir = RbConfig::CONFIG["includedir"]
6
6
 
7
7
  maxminddb_dir = File.expand_path(File.join(__dir__, "libmaxminddb"))
8
+ gem_root = File.expand_path('..', __dir__)
9
+
10
+ if !File.directory?(maxminddb_dir) ||
11
+ # '.', '..', and possibly '.git' from a failed checkout:
12
+ Dir.entries(maxminddb_dir).size <= 3
13
+ Dir.chdir(gem_root) { system('git submodule update --init') } or fail 'Could not fetch maxminddb'
14
+ end
8
15
 
9
16
  Dir.chdir(maxminddb_dir) do
10
- system("./bootstrap")
11
- system({ "CFLAGS" => "-fPIC" }, "./configure", "--disable-shared", "--disable-tests")
12
- system("make", "clean")
13
- system("make")
17
+ system("./bootstrap") or fail "Couldn't run maxminddb `bootstrap`"
18
+ system({ "CFLAGS" => "-fPIC" }, "./configure", "--disable-shared", "--disable-tests") or fail "Couldn't run maxminddb `configure`"
19
+ system("make", "clean") or fail "Couldn't run maxminddb `make clean`"
20
+ system("make") or fail "Couldn't run maxminddb `make`"
14
21
  end
15
22
 
16
23
  header_dirs = [includedir, "#{maxminddb_dir}/include"]
data/ext/geoip2/geoip2.c CHANGED
@@ -15,10 +15,11 @@ static void mmdb_free(void *mmdb);
15
15
  static MMDB_lookup_result_s mmdb_lookup(MMDB_s *mmdb, const char *ip_str, bool cleanup);
16
16
  static VALUE mmdb_entry_data_decode(MMDB_entry_data_s *entry_data);
17
17
  static VALUE mmdb_guard_parse_entry_data_list(VALUE ptr);
18
- static MMDB_entry_data_list_s *mmdb_parse_entry_data_list(MMDB_entry_data_list_s *data_list, VALUE *obj);
18
+ static MMDB_entry_data_list_s *mmdb_parse_entry_data_list(MMDB_entry_data_list_s *data_list, bool symbolize_keys, VALUE *obj);
19
19
 
20
20
  static VALUE rb_geoip2_db_alloc(VALUE klass);
21
- static VALUE rb_geoip2_db_initialize(VALUE self, VALUE path);
21
+ static VALUE rb_geoip2_db_initialize(int argc, VALUE* argv, VALUE self);
22
+
22
23
  static VALUE rb_geoip2_db_close(VALUE self);
23
24
  static VALUE rb_geoip2_db_lookup(VALUE self, VALUE ip);
24
25
 
@@ -27,6 +28,11 @@ static VALUE rb_geoip2_lr_initialize(VALUE self);
27
28
  static VALUE rb_geoip2_lr_get_value(int argc, VALUE *argv, VALUE self);
28
29
  static VALUE rb_geoip2_lr_to_h(VALUE self);
29
30
 
31
+ typedef struct {
32
+ struct MMDB_entry_data_list_s* data_list;
33
+ bool symbolize_keys;
34
+ } ParseRequest;
35
+
30
36
  static const rb_data_type_t rb_mmdb_type = {
31
37
  "geoip2/mmdb", {
32
38
  0, mmdb_free, 0,
@@ -157,19 +163,36 @@ mmdb_entry_data_decode(MMDB_entry_data_s *entry_data)
157
163
  }
158
164
  }
159
165
 
166
+ static VALUE
167
+ mmdb_entry_data_decode_key(MMDB_entry_data_s *entry_data, bool symbolize_strings)
168
+ {
169
+ if (entry_data->type != MMDB_DATA_TYPE_UTF8_STRING) {
170
+ rb_raise(rb_eGeoIP2Error, "Unexpected key type: %d", entry_data->type);
171
+ }
172
+ if (symbolize_strings) {
173
+ return ID2SYM(rb_intern3(entry_data->utf8_string,
174
+ entry_data->data_size,
175
+ rb_utf8_encoding()));
176
+ } else {
177
+ return rb_enc_str_new(entry_data->utf8_string,
178
+ entry_data->data_size,
179
+ rb_utf8_encoding());
180
+ }
181
+ }
182
+
160
183
  static VALUE
161
184
  mmdb_guard_parse_entry_data_list(VALUE ptr)
162
185
  {
163
- MMDB_entry_data_list_s *data_list =
164
- (struct MMDB_entry_data_list_s *)ptr;
186
+ MMDB_entry_data_list_s *data_list = ((ParseRequest *)ptr)->data_list;
187
+ bool symbolize_keys = ((ParseRequest *)ptr)->symbolize_keys;
165
188
  VALUE obj;
166
189
 
167
- mmdb_parse_entry_data_list(data_list, &obj);
190
+ mmdb_parse_entry_data_list(data_list, symbolize_keys, &obj);
168
191
  return obj;
169
192
  }
170
193
 
171
194
  static MMDB_entry_data_list_s *
172
- mmdb_parse_entry_data_list(MMDB_entry_data_list_s *data_list, VALUE *obj)
195
+ mmdb_parse_entry_data_list(MMDB_entry_data_list_s *data_list, bool symbolize_keys, VALUE *obj)
173
196
  {
174
197
  switch (data_list->entry_data.type) {
175
198
  case MMDB_DATA_TYPE_MAP:
@@ -179,9 +202,9 @@ mmdb_parse_entry_data_list(MMDB_entry_data_list_s *data_list, VALUE *obj)
179
202
  for (data_list = data_list->next; data_size && data_list; data_size--) {
180
203
  VALUE key;
181
204
  VALUE val;
182
- key = mmdb_entry_data_decode(&data_list->entry_data);
205
+ key = mmdb_entry_data_decode_key(&data_list->entry_data, symbolize_keys);
183
206
  data_list = data_list->next;
184
- data_list = mmdb_parse_entry_data_list(data_list, &val);
207
+ data_list = mmdb_parse_entry_data_list(data_list, symbolize_keys, &val);
185
208
  rb_hash_aset(hash, key, val);
186
209
  }
187
210
  *obj = hash;
@@ -193,7 +216,7 @@ mmdb_parse_entry_data_list(MMDB_entry_data_list_s *data_list, VALUE *obj)
193
216
  VALUE array = rb_ary_new();
194
217
  for (data_list = data_list->next; data_size && data_list; data_size--) {
195
218
  VALUE val;
196
- data_list = mmdb_parse_entry_data_list(data_list, &val);
219
+ data_list = mmdb_parse_entry_data_list(data_list, symbolize_keys, &val);
197
220
  rb_ary_push(array, val);
198
221
  }
199
222
  *obj = array;
@@ -233,7 +256,7 @@ rb_geoip2_db_alloc(VALUE klass)
233
256
  }
234
257
 
235
258
  static VALUE
236
- rb_geoip2_db_initialize(VALUE self, VALUE path)
259
+ rb_geoip2_db_open_mmdb(VALUE self, VALUE path)
237
260
  {
238
261
  char *db_path;
239
262
  MMDB_s *mmdb;
@@ -288,6 +311,9 @@ rb_geoip2_db_lookup(VALUE self, VALUE ip)
288
311
  result_ptr->found_entry = result.found_entry;
289
312
  result_ptr->entry = result.entry;
290
313
  result_ptr->netmask = result.netmask;
314
+
315
+ rb_iv_set(obj, "@symbolize_keys", rb_iv_get(self, "@symbolize_keys"));
316
+
291
317
  return obj;
292
318
  }
293
319
 
@@ -382,8 +408,9 @@ rb_geoip2_lr_get_value(int argc, VALUE *argv, VALUE self)
382
408
  VALUE array = rb_ary_new();
383
409
  VALUE hash;
384
410
  VALUE val;
411
+ bool symbolize_keys = RTEST(rb_iv_get(self, "@symbolize_keys"));
385
412
  for (int j = 0; path[j] != NULL; j++) {
386
- rb_ary_push(array, rb_str_new_cstr(path[j]));
413
+ rb_ary_push(array, symbolize_keys ? ID2SYM(rb_intern(path[j])) : rb_str_new_cstr(path[j]));
387
414
  }
388
415
  hash = rb_funcall(self, rb_intern("to_h"), 0);
389
416
  val = rb_apply(hash, rb_intern("dig"), array);
@@ -395,6 +422,19 @@ rb_geoip2_lr_get_value(int argc, VALUE *argv, VALUE self)
395
422
  return mmdb_entry_data_decode(&entry_data);
396
423
  }
397
424
 
425
+ static VALUE
426
+ rb_geoip2_lr_netmask(VALUE self)
427
+ {
428
+ MMDB_lookup_result_s *result = NULL;
429
+
430
+ TypedData_Get_Struct(self,
431
+ struct MMDB_lookup_result_s,
432
+ &rb_lookup_result_type,
433
+ result);
434
+
435
+ return UINT2NUM(result->netmask);
436
+ }
437
+
398
438
  static VALUE
399
439
  rb_geoip2_lr_to_h(VALUE self)
400
440
  {
@@ -421,7 +461,9 @@ rb_geoip2_lr_to_h(VALUE self)
421
461
  rb_raise(rb_eGeoIP2Error, "%s", MMDB_strerror(status));
422
462
  }
423
463
 
424
- hash = rb_protect(mmdb_guard_parse_entry_data_list, (VALUE)entry_data_list, &exception);
464
+ ParseRequest parse_request = { entry_data_list, RTEST(rb_iv_get(self, "@symbolize_keys")) };
465
+
466
+ hash = rb_protect(mmdb_guard_parse_entry_data_list, (VALUE)&parse_request, &exception);
425
467
  MMDB_free_entry_data_list(entry_data_list);
426
468
 
427
469
  if (exception != 0) {
@@ -437,17 +479,18 @@ void
437
479
  Init_geoip2(void)
438
480
  {
439
481
  rb_mGeoIP2 = rb_define_module("GeoIP2");
440
- rb_cGeoIP2Database = rb_define_class_under(rb_mGeoIP2, "Database", rb_cData);
441
- rb_cGeoIP2LookupResult = rb_define_class_under(rb_mGeoIP2, "LookupResult", rb_cData);
482
+ rb_cGeoIP2Database = rb_define_class_under(rb_mGeoIP2, "Database", rb_cObject);
483
+ rb_cGeoIP2LookupResult = rb_define_class_under(rb_mGeoIP2, "LookupResult", rb_cObject);
442
484
  rb_eGeoIP2Error = rb_define_class_under(rb_mGeoIP2, "Error", rb_eStandardError);
443
485
 
444
486
  rb_define_alloc_func(rb_cGeoIP2Database, rb_geoip2_db_alloc);
445
- rb_define_method(rb_cGeoIP2Database, "initialize", rb_geoip2_db_initialize, 1);
487
+ rb_define_method(rb_cGeoIP2Database, "open_mmdb", rb_geoip2_db_open_mmdb, 1);
446
488
  rb_define_method(rb_cGeoIP2Database, "close", rb_geoip2_db_close, 0);
447
489
  rb_define_method(rb_cGeoIP2Database, "lookup", rb_geoip2_db_lookup, 1);
448
490
 
449
491
  rb_define_alloc_func(rb_cGeoIP2LookupResult, rb_geoip2_lr_alloc);
450
492
  rb_define_method(rb_cGeoIP2LookupResult, "initialize", rb_geoip2_lr_initialize, 0);
451
493
  rb_define_method(rb_cGeoIP2LookupResult, "get_value", rb_geoip2_lr_get_value, -1);
494
+ rb_define_method(rb_cGeoIP2LookupResult, "netmask", rb_geoip2_lr_netmask, 0);
452
495
  rb_define_method(rb_cGeoIP2LookupResult, "to_h", rb_geoip2_lr_to_h, 0);
453
496
  }
@@ -0,0 +1,13 @@
1
+ /t/*
2
+ !/t/*.*
3
+ /t/*.exe
4
+ /t/*.got
5
+ *.a
6
+ *.lo
7
+ *.o
8
+ *.so
9
+ *.pc
10
+ usr/
11
+ *.sw?
12
+ /.deps
13
+ /.dirstamp
@@ -0,0 +1,13 @@
1
+ language: c
2
+
3
+ compiler:
4
+ - gcc
5
+ - clang
6
+
7
+ before_install: sudo apt-get install -y libtest-differences-perl
8
+
9
+ install: make CC=$CC install
10
+
11
+ script: make CC=$CC test
12
+
13
+ after_script: make uninstall
@@ -0,0 +1,165 @@
1
+ GNU LESSER GENERAL PUBLIC LICENSE
2
+ Version 3, 29 June 2007
3
+
4
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
5
+ Everyone is permitted to copy and distribute verbatim copies
6
+ of this license document, but changing it is not allowed.
7
+
8
+
9
+ This version of the GNU Lesser General Public License incorporates
10
+ the terms and conditions of version 3 of the GNU General Public
11
+ License, supplemented by the additional permissions listed below.
12
+
13
+ 0. Additional Definitions.
14
+
15
+ As used herein, "this License" refers to version 3 of the GNU Lesser
16
+ General Public License, and the "GNU GPL" refers to version 3 of the GNU
17
+ General Public License.
18
+
19
+ "The Library" refers to a covered work governed by this License,
20
+ other than an Application or a Combined Work as defined below.
21
+
22
+ An "Application" is any work that makes use of an interface provided
23
+ by the Library, but which is not otherwise based on the Library.
24
+ Defining a subclass of a class defined by the Library is deemed a mode
25
+ of using an interface provided by the Library.
26
+
27
+ A "Combined Work" is a work produced by combining or linking an
28
+ Application with the Library. The particular version of the Library
29
+ with which the Combined Work was made is also called the "Linked
30
+ Version".
31
+
32
+ The "Minimal Corresponding Source" for a Combined Work means the
33
+ Corresponding Source for the Combined Work, excluding any source code
34
+ for portions of the Combined Work that, considered in isolation, are
35
+ based on the Application, and not on the Linked Version.
36
+
37
+ The "Corresponding Application Code" for a Combined Work means the
38
+ object code and/or source code for the Application, including any data
39
+ and utility programs needed for reproducing the Combined Work from the
40
+ Application, but excluding the System Libraries of the Combined Work.
41
+
42
+ 1. Exception to Section 3 of the GNU GPL.
43
+
44
+ You may convey a covered work under sections 3 and 4 of this License
45
+ without being bound by section 3 of the GNU GPL.
46
+
47
+ 2. Conveying Modified Versions.
48
+
49
+ If you modify a copy of the Library, and, in your modifications, a
50
+ facility refers to a function or data to be supplied by an Application
51
+ that uses the facility (other than as an argument passed when the
52
+ facility is invoked), then you may convey a copy of the modified
53
+ version:
54
+
55
+ a) under this License, provided that you make a good faith effort to
56
+ ensure that, in the event an Application does not supply the
57
+ function or data, the facility still operates, and performs
58
+ whatever part of its purpose remains meaningful, or
59
+
60
+ b) under the GNU GPL, with none of the additional permissions of
61
+ this License applicable to that copy.
62
+
63
+ 3. Object Code Incorporating Material from Library Header Files.
64
+
65
+ The object code form of an Application may incorporate material from
66
+ a header file that is part of the Library. You may convey such object
67
+ code under terms of your choice, provided that, if the incorporated
68
+ material is not limited to numerical parameters, data structure
69
+ layouts and accessors, or small macros, inline functions and templates
70
+ (ten or fewer lines in length), you do both of the following:
71
+
72
+ a) Give prominent notice with each copy of the object code that the
73
+ Library is used in it and that the Library and its use are
74
+ covered by this License.
75
+
76
+ b) Accompany the object code with a copy of the GNU GPL and this license
77
+ document.
78
+
79
+ 4. Combined Works.
80
+
81
+ You may convey a Combined Work under terms of your choice that,
82
+ taken together, effectively do not restrict modification of the
83
+ portions of the Library contained in the Combined Work and reverse
84
+ engineering for debugging such modifications, if you also do each of
85
+ the following:
86
+
87
+ a) Give prominent notice with each copy of the Combined Work that
88
+ the Library is used in it and that the Library and its use are
89
+ covered by this License.
90
+
91
+ b) Accompany the Combined Work with a copy of the GNU GPL and this license
92
+ document.
93
+
94
+ c) For a Combined Work that displays copyright notices during
95
+ execution, include the copyright notice for the Library among
96
+ these notices, as well as a reference directing the user to the
97
+ copies of the GNU GPL and this license document.
98
+
99
+ d) Do one of the following:
100
+
101
+ 0) Convey the Minimal Corresponding Source under the terms of this
102
+ License, and the Corresponding Application Code in a form
103
+ suitable for, and under terms that permit, the user to
104
+ recombine or relink the Application with a modified version of
105
+ the Linked Version to produce a modified Combined Work, in the
106
+ manner specified by section 6 of the GNU GPL for conveying
107
+ Corresponding Source.
108
+
109
+ 1) Use a suitable shared library mechanism for linking with the
110
+ Library. A suitable mechanism is one that (a) uses at run time
111
+ a copy of the Library already present on the user's computer
112
+ system, and (b) will operate properly with a modified version
113
+ of the Library that is interface-compatible with the Linked
114
+ Version.
115
+
116
+ e) Provide Installation Information, but only if you would otherwise
117
+ be required to provide such information under section 6 of the
118
+ GNU GPL, and only to the extent that such information is
119
+ necessary to install and execute a modified version of the
120
+ Combined Work produced by recombining or relinking the
121
+ Application with a modified version of the Linked Version. (If
122
+ you use option 4d0, the Installation Information must accompany
123
+ the Minimal Corresponding Source and Corresponding Application
124
+ Code. If you use option 4d1, you must provide the Installation
125
+ Information in the manner specified by section 6 of the GNU GPL
126
+ for conveying Corresponding Source.)
127
+
128
+ 5. Combined Libraries.
129
+
130
+ You may place library facilities that are a work based on the
131
+ Library side by side in a single library together with other library
132
+ facilities that are not Applications and are not covered by this
133
+ License, and convey such a combined library under terms of your
134
+ choice, if you do both of the following:
135
+
136
+ a) Accompany the combined library with a copy of the same work based
137
+ on the Library, uncombined with any other library facilities,
138
+ conveyed under the terms of this License.
139
+
140
+ b) Give prominent notice with the combined library that part of it
141
+ is a work based on the Library, and explaining where to find the
142
+ accompanying uncombined form of the same work.
143
+
144
+ 6. Revised Versions of the GNU Lesser General Public License.
145
+
146
+ The Free Software Foundation may publish revised and/or new versions
147
+ of the GNU Lesser General Public License from time to time. Such new
148
+ versions will be similar in spirit to the present version, but may
149
+ differ in detail to address new problems or concerns.
150
+
151
+ Each version is given a distinguishing version number. If the
152
+ Library as you received it specifies that a certain numbered version
153
+ of the GNU Lesser General Public License "or any later version"
154
+ applies to it, you have the option of following the terms and
155
+ conditions either of that published version or of any later version
156
+ published by the Free Software Foundation. If the Library as you
157
+ received it does not specify a version number of the GNU Lesser
158
+ General Public License, you may choose any version of the GNU Lesser
159
+ General Public License ever published by the Free Software Foundation.
160
+
161
+ If the Library as you received it specifies that a proxy can decide
162
+ whether future versions of the GNU Lesser General Public License shall
163
+ apply, that proxy's public statement of acceptance of any version is
164
+ permanent authorization for you to choose that version for the
165
+ Library.
@@ -0,0 +1,41 @@
1
+ To install libtap on a Unix-like system:
2
+
3
+ $ make
4
+ $ make check
5
+ $ make install
6
+
7
+ To compile with gcc -ansi, run:
8
+
9
+ $ ANSI=1 make
10
+
11
+ To install to a different directory than /usr/local, supply the
12
+ PREFIX variable to make:
13
+
14
+ $ PREFIX=/usr make install
15
+
16
+ On Windows, the library can be created by first setting up the
17
+ correct development environment variables. Usually this is done by
18
+ running vcvars32.bat included in the Visual Studio distribution.
19
+ You should also install gnu make which can be found at
20
+ http://gnuwin32.sourceforge.net/packages/make.htm. Once this is
21
+ done, you should be able to run the following:
22
+
23
+ > make -f Makefile.win
24
+
25
+ If you want to use it directly in another project, you can copy tap.c
26
+ and tap.h there and it shouldn't have a problem compiling.
27
+
28
+ $ ls
29
+ tap.c tap.h test.c
30
+ $ cat test.c
31
+ #include "tap.h"
32
+ int main () {
33
+ plan(1);
34
+ ok(50 + 5, "foo %s", "bar");
35
+ done_testing();
36
+ }
37
+ $ gcc test.c tap.c
38
+ $ a.out
39
+ 1..1
40
+ ok 1 - foo bar
41
+
@@ -0,0 +1,72 @@
1
+ CC ?= gcc
2
+ CFLAGS += -Wall -I. -fPIC
3
+ PREFIX ?= $(DESTDIR)/usr/local
4
+ TESTS = $(patsubst %.c, %, $(wildcard t/*.c))
5
+
6
+ ifdef ANSI
7
+ # -D_BSD_SOURCE for MAP_ANONYMOUS
8
+ CFLAGS += -ansi -D_BSD_SOURCE
9
+ LDLIBS += -lbsd-compat
10
+ endif
11
+
12
+ %:
13
+ $(CC) $(LDFLAGS) $(TARGET_ARCH) $(filter %.o %.a %.so, $^) $(LDLIBS) -o $@
14
+
15
+ %.o:
16
+ $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c $(filter %.c, $^) $(LDLIBS) -o $@
17
+
18
+ %.a:
19
+ $(AR) rcs $@ $(filter %.o, $^)
20
+
21
+ %.so:
22
+ $(CC) -shared $(LDFLAGS) $(TARGET_ARCH) $(filter %.o, $^) $(LDLIBS) -o $@
23
+
24
+ all: libtap.a libtap.so tap.pc tests
25
+
26
+ tap.pc:
27
+ @echo generating tap.pc
28
+ @echo 'prefix='$(PREFIX) > tap.pc
29
+ @echo 'exec_prefix=$${prefix}' >> tap.pc
30
+ @echo 'libdir=$${prefix}/lib' >> tap.pc
31
+ @echo 'includedir=$${prefix}/include' >> tap.pc
32
+ @echo '' >> tap.pc
33
+ @echo 'Name: libtap' >> tap.pc
34
+ @echo 'Description: Write tests in C' >> tap.pc
35
+ @echo 'Version: 0.1.0' >> tap.pc
36
+ @echo 'URL: https://github.com/zorgnax/libtap' >> tap.pc
37
+ @echo 'Libs: -L$${libdir} -ltap' >> tap.pc
38
+ @echo 'Cflags: -I$${includedir}' >> tap.pc
39
+
40
+ libtap.a: tap.o
41
+
42
+ libtap.so: tap.o
43
+
44
+ tap.o: tap.c tap.h
45
+
46
+ tests: $(TESTS)
47
+
48
+ $(TESTS): %: %.o libtap.a
49
+
50
+ $(patsubst %, %.o, $(TESTS)): %.o: %.c tap.h
51
+
52
+ clean:
53
+ rm -rf *.o t/*.o tap.pc libtap.a libtap.so $(TESTS)
54
+
55
+ install: libtap.a tap.h libtap.so tap.pc
56
+ mkdir -p $(PREFIX)/lib $(PREFIX)/include $(PREFIX)/lib/pkgconfig
57
+ install -c libtap.a $(PREFIX)/lib
58
+ install -c libtap.so $(PREFIX)/lib
59
+ install -c tap.pc $(PREFIX)/lib/pkgconfig
60
+ install -c tap.h $(PREFIX)/include
61
+
62
+ uninstall:
63
+ rm $(PREFIX)/lib/libtap.a $(PREFIX)/lib/libtap.so $(PREFIX)/include/tap.h
64
+
65
+ dist:
66
+ rm libtap.zip
67
+ zip -r libtap *
68
+
69
+ check test: all
70
+ ./t/test
71
+
72
+ .PHONY: all clean install uninstall dist check test tests