lmdb 0.7.3 → 0.8.0

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 (47) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +12 -4
  3. data/Rakefile +48 -0
  4. data/ext/lmdb_ext/extconf.rb +29 -10
  5. data/ext/lmdb_ext/lmdb_ext.c +1389 -908
  6. data/ext/lmdb_ext/lmdb_ext.h +36 -19
  7. data/lib/lmdb/database.rb +2 -1
  8. data/lib/lmdb/version.rb +1 -1
  9. data/lmdb.gemspec +4 -1
  10. data/spec/gc_torture_spec.rb +162 -0
  11. data/spec/helper.rb +3 -3
  12. data/spec/lmdb_spec.rb +152 -136
  13. data/spec/pseudo_transactions_spec.rb +237 -0
  14. data/vendor/liblmdb/VERSION +1 -0
  15. data/vendor/{libraries/liblmdb → liblmdb}/lmdb.h +18 -63
  16. data/vendor/{libraries/liblmdb → liblmdb}/mdb.c +583 -1480
  17. data/vendor/{libraries/liblmdb → liblmdb}/midl.c +0 -62
  18. data/vendor/{libraries/liblmdb → liblmdb}/midl.h +4 -16
  19. metadata +11 -34
  20. data/CONTRIBUTORS +0 -8
  21. data/behaviour.org +0 -35
  22. data/ext/lmdb_ext/prototypes.sh +0 -4
  23. data/vendor/libraries/liblmdb/.gitignore +0 -24
  24. data/vendor/libraries/liblmdb/COPYRIGHT +0 -20
  25. data/vendor/libraries/liblmdb/Doxyfile +0 -1631
  26. data/vendor/libraries/liblmdb/LICENSE +0 -47
  27. data/vendor/libraries/liblmdb/Makefile +0 -118
  28. data/vendor/libraries/liblmdb/intro.doc +0 -192
  29. data/vendor/libraries/liblmdb/mdb_copy.1 +0 -61
  30. data/vendor/libraries/liblmdb/mdb_copy.c +0 -84
  31. data/vendor/libraries/liblmdb/mdb_drop.1 +0 -40
  32. data/vendor/libraries/liblmdb/mdb_drop.c +0 -135
  33. data/vendor/libraries/liblmdb/mdb_dump.1 +0 -81
  34. data/vendor/libraries/liblmdb/mdb_dump.c +0 -319
  35. data/vendor/libraries/liblmdb/mdb_load.1 +0 -84
  36. data/vendor/libraries/liblmdb/mdb_load.c +0 -492
  37. data/vendor/libraries/liblmdb/mdb_stat.1 +0 -70
  38. data/vendor/libraries/liblmdb/mdb_stat.c +0 -264
  39. data/vendor/libraries/liblmdb/mtest.c +0 -177
  40. data/vendor/libraries/liblmdb/mtest2.c +0 -124
  41. data/vendor/libraries/liblmdb/mtest3.c +0 -133
  42. data/vendor/libraries/liblmdb/mtest4.c +0 -168
  43. data/vendor/libraries/liblmdb/mtest5.c +0 -135
  44. data/vendor/libraries/liblmdb/mtest6.c +0 -141
  45. data/vendor/libraries/liblmdb/sample-bdb.txt +0 -73
  46. data/vendor/libraries/liblmdb/sample-mdb.txt +0 -62
  47. data/vendor/libraries/liblmdb/tooltag +0 -27
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ec26115e9cc3611f3305c308a5a26959e0f2ff6438c191968a562c85808fb6ed
4
- data.tar.gz: 866b32d018335fa61dbefdc30234c976573a307ad11ae31c260a902cba6812e8
3
+ metadata.gz: 5673437b11f0c87befc6f0003aaa1c25f8c20ec3270147396d45c8af38fb0a78
4
+ data.tar.gz: 407eadc211c71c38cc8d1e4523f2639abb964e187452635af7b603ce5e3eb565
5
5
  SHA512:
6
- metadata.gz: '0356608ed8065cb4065a752fff8e4aa657fc29c38630e45d278c7edcad4fd211f8129e87eba2e323f2f72a8751b6a43ead97501ece2c8a504cfc9eb0e3b0174c'
7
- data.tar.gz: 7f1e02c62e406c108bd7db8875cf528c2ec43cca0beb2ab1ae6380a71b3054b74b66beddd98404e3de93de0928d9221aca9e73c6b309caa5734a0ef78d2d1313
6
+ metadata.gz: '0596fdb966d1373d03a739901ca441fb3df42b7257566b07a8ee513c1b30ea7b9b8fcfa1ae6f5a1efcbae7a5b91c7983f6d83fc1e6ffa6d63fba6c9572623c39'
7
+ data.tar.gz: cbfd03a44df15275c6bf66d10501e5d86d6a6bf3bee949588ae7d9b89cd9e03bf57ddb7f3502f56d7128ddf500658d502ea0436bc4868c455a0d139c7525a74c
data/README.md CHANGED
@@ -1,13 +1,21 @@
1
1
  # LMDB
2
2
 
3
- Ruby bindings for the amazing [OpenLDAP's Lightning Memory-Mapped Database (LMDB)](https://www.symas.com/lmdb/).
3
+ These are Ruby bindings [OpenLDAP's excellent Lightning Memory-Mapped
4
+ Database (LMDB)](https://www.symas.com/lmdb/).
4
5
 
5
6
  ## Installation
6
7
 
7
- Install via rubygems:
8
+ Install via [RubyGems](https://rubygems.org/gems/lmdb/):
8
9
 
9
- ```ruby
10
- gem install lmdb
10
+ ```bash
11
+ $ gem install lmdb
12
+ ```
13
+
14
+ If you want to force the bundled LMDB over your system version
15
+ (assuming one is present, along with headers):
16
+
17
+ ```bash
18
+ $ gem install lmdb -- --vendor-lmdb
11
19
  ```
12
20
 
13
21
  ## Links
data/Rakefile CHANGED
@@ -76,3 +76,51 @@ namespace :release do
76
76
  abort "#{tag} exists; update version!" unless `git tag -l #{tag}`.empty?
77
77
  end
78
78
  end
79
+
80
+ # all this business is to download actual releases of lmdb instead of using
81
+ # git submodules
82
+
83
+ require 'open-uri'
84
+ require 'json'
85
+ require 'fileutils'
86
+ require 'rubygems/package'
87
+ require 'zlib'
88
+
89
+ LMDB_VENDOR_DIR = File.expand_path('vendor/liblmdb', __dir__)
90
+ LMDB_NEEDED = %w[mdb.c midl.c lmdb.h midl.h].freeze
91
+
92
+ namespace :lmdb do
93
+ desc 'Fetch the latest LMDB C source into vendor/liblmdb'
94
+ task :fetch do
95
+ tags_url = 'https://api.github.com/repos/LMDB/lmdb/tags?per_page=20'
96
+ headers = { 'User-Agent' => 'rb-lmdb-gem-fetch' }
97
+
98
+ tags = JSON.parse(URI.open(tags_url, headers).read)
99
+ # warn tags.inspect
100
+ # Tags are like "LMDB_0_9_32" — pick the highest numeric one
101
+ tag = tags
102
+ .map { |t| t['name'] }
103
+ .select { |n| n.match?(/\ALMDB_\d+[_.]\d+[_.]\d+\z/) }
104
+ .max_by { |n| n.scan(/\d+/).map(&:to_i) }
105
+
106
+ abort 'Could not determine latest LMDB tag' unless tag
107
+ puts "Fetching LMDB #{tag}..."
108
+
109
+ tarball_url = "https://github.com/LMDB/lmdb/archive/refs/tags/#{tag}.tar.gz"
110
+ FileUtils.mkdir_p(LMDB_VENDOR_DIR)
111
+
112
+ # Stream the tarball, extract only the liblmdb source files we need
113
+ URI.open(tarball_url, headers) do |gz|
114
+ Gem::Package::TarReader.new(Zlib::GzipReader.new(gz)).each do |entry|
115
+ base = File.basename(entry.full_name)
116
+ next unless entry.file? && LMDB_NEEDED.include?(base)
117
+ dest = File.join(LMDB_VENDOR_DIR, base)
118
+ File.write(dest, entry.read)
119
+ puts " -> #{dest}"
120
+ end
121
+ end
122
+
123
+ File.write(File.join(LMDB_VENDOR_DIR, 'VERSION'), "#{tag}\n")
124
+ puts "Done. LMDB #{tag} vendored in #{LMDB_VENDOR_DIR}."
125
+ end
126
+ end
@@ -3,18 +3,35 @@ require 'mkmf'
3
3
  $CFLAGS << ' -std=c99 -Wall -g '
4
4
  $CFLAGS << ' -fdeclspec' if /darwin/.match? RUBY_PLATFORM
5
5
 
6
- # Embed lmdb if we cannot find it
7
- if enable_config("bundled-lmdb", false) || !(find_header('lmdb.h') && have_library('lmdb', 'mdb_env_create'))
8
- lmdbpath = "../../vendor/libraries/liblmdb"
9
- $INCFLAGS << " -I$(srcdir)/#{lmdbpath}"
10
- $VPATH ||= []
11
- $VPATH << "$(srcdir)/#{lmdbpath}"
12
- # XXX this is a sketchy, sketchy way to do this
13
- $srcs = Dir.glob("#{$srcdir}/{#{lmdbpath}/{mdb,midl}.c,*.c}").map do |n|
14
- File.basename(n)
15
- end
6
+ dir_config('lmdb')
7
+
8
+ # --vendor flag: skip system lmdb and always build from vendored source
9
+ vendor_forced = arg_config('--vendor-lmdb', false)
10
+
11
+ have_system_lmdb = false
12
+
13
+ unless vendor_forced
14
+ have_system_lmdb =
15
+ have_header('lmdb.h') && have_library('lmdb', 'mdb_env_create')
16
16
  end
17
17
 
18
+ unless have_system_lmdb
19
+ vendor_dir = File.expand_path('../../vendor/liblmdb', __dir__)
20
+ abort <<~MSG unless File.exist?(File.join(vendor_dir, 'mdb.c'))
21
+ Could not find system lmdb and no vendored source found.
22
+ Run `rake lmdb:fetch` to download the LMDB C source, then retry.
23
+ MSG
24
+
25
+ warn "Building from vendored LMDB source in #{vendor_dir}"
26
+ $INCFLAGS << " -I#{vendor_dir}"
27
+ $srcs = Dir[File.join(__dir__, '*.c')] +
28
+ [File.join(vendor_dir, 'mdb.c'),
29
+ File.join(vendor_dir, 'midl.c')]
30
+ $VPATH << vendor_dir
31
+ end
32
+
33
+
34
+
18
35
  have_header 'limits.h'
19
36
  have_header 'string.h'
20
37
  have_header 'stdlib.h'
@@ -23,8 +40,10 @@ have_header 'sys/types.h'
23
40
  have_header 'assert.h'
24
41
 
25
42
  have_header 'ruby.h'
43
+
26
44
  have_func 'rb_funcall_passing_block'
27
45
  have_func 'rb_thread_call_without_gvl2'
46
+ have_func 'rb_gc_mark_movable'
28
47
 
29
48
  create_header
30
49