tdb 0.5.0 → 0.6.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/.wrongdoc.yml +4 -2
- data/COPYING +497 -160
- data/GIT-VERSION-GEN +1 -1
- data/GNUmakefile +2 -151
- data/HACKING +1 -1
- data/Hash_Functions +17 -6
- data/LICENSE +2 -3
- data/README +4 -4
- data/Rakefile +0 -36
- data/TODO +0 -2
- data/ext/tdb/extconf.rb +1 -0
- data/ext/tdb/hash_functions.c +6 -0
- data/ext/tdb/murmur3.c +230 -0
- data/ext/tdb/rbtdb.h +4 -0
- data/ext/tdb/siphash24.c +328 -0
- data/ext/tdb/tdb.c +71 -56
- data/pkg.mk +175 -0
- data/tdb.gemspec +2 -6
- data/test/test_tdb.rb +24 -2
- data/test/test_tdb_hash_functions.rb +30 -0
- data/test/test_tdb_mt.rb +1 -0
- metadata +47 -58
data/pkg.mk
ADDED
@@ -0,0 +1,175 @@
|
|
1
|
+
RUBY = ruby
|
2
|
+
RAKE = rake
|
3
|
+
RSYNC = rsync
|
4
|
+
WRONGDOC = wrongdoc
|
5
|
+
|
6
|
+
GIT-VERSION-FILE: .FORCE-GIT-VERSION-FILE
|
7
|
+
@./GIT-VERSION-GEN
|
8
|
+
-include GIT-VERSION-FILE
|
9
|
+
-include local.mk
|
10
|
+
DLEXT := $(shell $(RUBY) -rrbconfig -e 'puts RbConfig::CONFIG["DLEXT"]')
|
11
|
+
RUBY_VERSION := $(shell $(RUBY) -e 'puts RUBY_VERSION')
|
12
|
+
RUBY_ENGINE := $(shell $(RUBY) -e 'puts((RUBY_ENGINE rescue "ruby"))')
|
13
|
+
lib := lib
|
14
|
+
|
15
|
+
ifeq ($(shell test -f script/isolate_for_tests && echo t),t)
|
16
|
+
isolate_libs := tmp/isolate/$(RUBY_ENGINE)-$(RUBY_VERSION)/isolate.mk
|
17
|
+
$(isolate_libs): script/isolate_for_tests
|
18
|
+
@$(RUBY) script/isolate_for_tests
|
19
|
+
-include $(isolate_libs)
|
20
|
+
lib := $(lib):$(ISOLATE_LIBS)
|
21
|
+
endif
|
22
|
+
|
23
|
+
ext := $(firstword $(wildcard ext/*))
|
24
|
+
ifneq ($(ext),)
|
25
|
+
ext_pfx := tmp/ext/$(RUBY_ENGINE)-$(RUBY_VERSION)
|
26
|
+
ext_h := $(wildcard $(ext)/*/*.h $(ext)/*.h)
|
27
|
+
ext_src := $(wildcard $(ext)/*.c $(ext_h))
|
28
|
+
ext_pfx_src := $(addprefix $(ext_pfx)/,$(ext_src))
|
29
|
+
ext_d := $(ext_pfx)/$(ext)/.d
|
30
|
+
$(ext)/extconf.rb: $(wildcard $(ext)/*.h)
|
31
|
+
@>> $@
|
32
|
+
$(ext_d):
|
33
|
+
@mkdir -p $(@D)
|
34
|
+
@> $@
|
35
|
+
$(ext_pfx)/$(ext)/%: $(ext)/% $(ext_d)
|
36
|
+
install -m 644 $< $@
|
37
|
+
$(ext_pfx)/$(ext)/Makefile: $(ext)/extconf.rb $(ext_d) $(ext_h)
|
38
|
+
$(RM) -f $(@D)/*.o
|
39
|
+
cd $(@D) && $(RUBY) $(CURDIR)/$(ext)/extconf.rb
|
40
|
+
ext_sfx := _ext.$(DLEXT)
|
41
|
+
ext_dl := $(ext_pfx)/$(ext)/$(notdir $(ext)_ext.$(DLEXT))
|
42
|
+
$(ext_dl): $(ext_src) $(ext_pfx_src) $(ext_pfx)/$(ext)/Makefile
|
43
|
+
@echo $^ == $@
|
44
|
+
$(MAKE) -C $(@D)
|
45
|
+
lib := $(lib):$(ext_pfx)/$(ext)
|
46
|
+
build: $(ext_dl)
|
47
|
+
else
|
48
|
+
build:
|
49
|
+
endif
|
50
|
+
|
51
|
+
pkg_extra += GIT-VERSION-FILE NEWS ChangeLog LATEST
|
52
|
+
ChangeLog: GIT-VERSION-FILE .wrongdoc.yml
|
53
|
+
$(WRONGDOC) prepare
|
54
|
+
NEWS LATEST: ChangeLog
|
55
|
+
|
56
|
+
manifest:
|
57
|
+
$(RM) .manifest
|
58
|
+
$(MAKE) .manifest
|
59
|
+
|
60
|
+
.manifest: $(pkg_extra)
|
61
|
+
(git ls-files && for i in $@ $(pkg_extra); do echo $$i; done) | \
|
62
|
+
LC_ALL=C sort > $@+
|
63
|
+
cmp $@+ $@ || mv $@+ $@
|
64
|
+
$(RM) $@+
|
65
|
+
|
66
|
+
doc:: .document .wrongdoc.yml $(pkg_extra)
|
67
|
+
-find lib -type f -name '*.rbc' -exec rm -f '{}' ';'
|
68
|
+
-find ext -type f -name '*.rbc' -exec rm -f '{}' ';'
|
69
|
+
$(RM) -r doc
|
70
|
+
$(WRONGDOC) all
|
71
|
+
install -m644 COPYING doc/COPYING
|
72
|
+
install -m644 $(shell LC_ALL=C grep '^[A-Z]' .document) doc/
|
73
|
+
|
74
|
+
ifneq ($(VERSION),)
|
75
|
+
pkggem := pkg/$(rfpackage)-$(VERSION).gem
|
76
|
+
pkgtgz := pkg/$(rfpackage)-$(VERSION).tgz
|
77
|
+
release_notes := release_notes-$(VERSION)
|
78
|
+
release_changes := release_changes-$(VERSION)
|
79
|
+
|
80
|
+
release-notes: $(release_notes)
|
81
|
+
release-changes: $(release_changes)
|
82
|
+
$(release_changes):
|
83
|
+
$(WRONGDOC) release_changes > $@+
|
84
|
+
$(VISUAL) $@+ && test -s $@+ && mv $@+ $@
|
85
|
+
$(release_notes):
|
86
|
+
$(WRONGDOC) release_notes > $@+
|
87
|
+
$(VISUAL) $@+ && test -s $@+ && mv $@+ $@
|
88
|
+
|
89
|
+
# ensures we're actually on the tagged $(VERSION), only used for release
|
90
|
+
verify:
|
91
|
+
test x"$(shell umask)" = x0022
|
92
|
+
git rev-parse --verify refs/tags/v$(VERSION)^{}
|
93
|
+
git diff-index --quiet HEAD^0
|
94
|
+
test $$(git rev-parse --verify HEAD^0) = \
|
95
|
+
$$(git rev-parse --verify refs/tags/v$(VERSION)^{})
|
96
|
+
|
97
|
+
fix-perms:
|
98
|
+
-git ls-tree -r HEAD | awk '/^100644 / {print $$NF}' | xargs chmod 644
|
99
|
+
-git ls-tree -r HEAD | awk '/^100755 / {print $$NF}' | xargs chmod 755
|
100
|
+
|
101
|
+
gem: $(pkggem)
|
102
|
+
|
103
|
+
install-gem: $(pkggem)
|
104
|
+
gem install $(CURDIR)/$<
|
105
|
+
|
106
|
+
$(pkggem): manifest fix-perms
|
107
|
+
gem build $(rfpackage).gemspec
|
108
|
+
mkdir -p pkg
|
109
|
+
mv $(@F) $@
|
110
|
+
|
111
|
+
$(pkgtgz): distdir = $(basename $@)
|
112
|
+
$(pkgtgz): HEAD = v$(VERSION)
|
113
|
+
$(pkgtgz): manifest fix-perms
|
114
|
+
@test -n "$(distdir)"
|
115
|
+
$(RM) -r $(distdir)
|
116
|
+
mkdir -p $(distdir)
|
117
|
+
tar cf - $$(cat .manifest) | (cd $(distdir) && tar xf -)
|
118
|
+
cd pkg && tar cf - $(basename $(@F)) | gzip -9 > $(@F)+
|
119
|
+
mv $@+ $@
|
120
|
+
|
121
|
+
package: $(pkgtgz) $(pkggem)
|
122
|
+
|
123
|
+
test-release:: verify package $(release_notes) $(release_changes)
|
124
|
+
# make tgz release on RubyForge
|
125
|
+
@echo rubyforge add_release -f \
|
126
|
+
-n $(release_notes) -a $(release_changes) \
|
127
|
+
$(rfproject) $(rfpackage) $(VERSION) $(pkgtgz)
|
128
|
+
@echo gem push $(pkggem)
|
129
|
+
@echo rubyforge add_file \
|
130
|
+
$(rfproject) $(rfpackage) $(VERSION) $(pkggem)
|
131
|
+
release:: verify package $(release_notes) $(release_changes)
|
132
|
+
# make tgz release on RubyForge
|
133
|
+
rubyforge add_release -f -n $(release_notes) -a $(release_changes) \
|
134
|
+
$(rfproject) $(rfpackage) $(VERSION) $(pkgtgz)
|
135
|
+
# push gem to RubyGems.org
|
136
|
+
gem push $(pkggem)
|
137
|
+
# in case of gem downloads from RubyForge releases page
|
138
|
+
rubyforge add_file \
|
139
|
+
$(rfproject) $(rfpackage) $(VERSION) $(pkggem)
|
140
|
+
else
|
141
|
+
gem install-gem: GIT-VERSION-FILE
|
142
|
+
$(MAKE) $@ VERSION=$(GIT_VERSION)
|
143
|
+
endif
|
144
|
+
|
145
|
+
all:: test
|
146
|
+
test_units := $(wildcard test/test_*.rb)
|
147
|
+
test: test-unit
|
148
|
+
test-unit: $(test_units)
|
149
|
+
$(test_units): build
|
150
|
+
$(RUBY) -I $(lib) $@ $(RUBY_TEST_OPTS)
|
151
|
+
|
152
|
+
# this requires GNU coreutils variants
|
153
|
+
ifneq ($(RSYNC_DEST),)
|
154
|
+
publish_doc:
|
155
|
+
-git set-file-times
|
156
|
+
$(MAKE) doc
|
157
|
+
find doc/images -type f | \
|
158
|
+
TZ=UTC xargs touch -d '1970-01-01 00:00:06' doc/rdoc.css
|
159
|
+
$(MAKE) doc_gz
|
160
|
+
$(RSYNC) -av doc/ $(RSYNC_DEST)/
|
161
|
+
git ls-files | xargs touch
|
162
|
+
endif
|
163
|
+
|
164
|
+
# Create gzip variants of the same timestamp as the original so nginx
|
165
|
+
# "gzip_static on" can serve the gzipped versions directly.
|
166
|
+
doc_gz: docs = $(shell find doc -type f ! -regex '^.*\.\(gif\|jpg\|png\|gz\)$$')
|
167
|
+
doc_gz:
|
168
|
+
for i in $(docs); do \
|
169
|
+
gzip --rsyncable -9 < $$i > $$i.gz; touch -r $$i $$i.gz; done
|
170
|
+
check-warnings:
|
171
|
+
@(for i in $$(git ls-files '*.rb'| grep -v '^setup\.rb$$'); \
|
172
|
+
do $(RUBY) -d -W2 -c $$i; done) | grep -v '^Syntax OK$$' || :
|
173
|
+
|
174
|
+
.PHONY: all .FORCE-GIT-VERSION-FILE doc test $(test_units) manifest
|
175
|
+
.PHONY: check-warnings
|
data/tdb.gemspec
CHANGED
@@ -7,21 +7,17 @@ name, summary, title = readme_metadata
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = %q{tdb}
|
9
9
|
s.version = ENV["VERSION"].dup
|
10
|
-
|
11
10
|
s.homepage = 'http://bogomips.org/ruby-tdb/'
|
12
11
|
s.authors = ["Ruby tdb hackers"]
|
13
|
-
s.date = Time.now.utc.strftime('%Y-%m-%d')
|
14
12
|
s.description = readme_description
|
15
13
|
s.email = %q{ruby.tdb@librelist.org}
|
16
14
|
s.extra_rdoc_files = extra_rdoc_files(manifest)
|
17
15
|
s.files = manifest
|
18
16
|
s.rdoc_options = rdoc_options
|
19
|
-
s.require_paths = %w(lib ext)
|
20
17
|
s.rubyforge_project = %q{qrp}
|
21
18
|
s.summary = summary
|
22
19
|
s.test_files = Dir['test/test_*.rb']
|
23
20
|
s.extensions = %w(ext/tdb/extconf.rb)
|
24
|
-
s.add_development_dependency('wrongdoc', '~> 1.
|
25
|
-
|
26
|
-
# s.license = %w(LGPL) # disabled for compatibility with older RubyGems
|
21
|
+
s.add_development_dependency('wrongdoc', '~> 1.6.2')
|
22
|
+
s.licenses = %w(LGPLv2.1+)
|
27
23
|
end
|
data/test/test_tdb.rb
CHANGED
@@ -16,6 +16,10 @@ class TestTdb < Test::Unit::TestCase
|
|
16
16
|
@tdb.close if @tdb && ! @tdb.closed?
|
17
17
|
end
|
18
18
|
|
19
|
+
def test_create_file_null_byte_in_path
|
20
|
+
assert_raises(ArgumentError) { TDB.new("hello.tdb\0") }
|
21
|
+
end
|
22
|
+
|
19
23
|
def test_create_file
|
20
24
|
assert_nothing_raised do
|
21
25
|
@tmp = Tempfile.new('tdb')
|
@@ -188,8 +192,9 @@ class TestTdb < Test::Unit::TestCase
|
|
188
192
|
def test_alternate_hashes
|
189
193
|
results = {}
|
190
194
|
expect = TDB::HASHES.to_a.map { |k,v| [ k.to_s, v.to_s ] }.sort
|
191
|
-
%w(default jenkins_lookup3 djb2 djb3 fnv1a
|
192
|
-
murmur1 murmur1_aligned murmur2 murmur2a murmur2_aligned
|
195
|
+
%w(default siphash24 jenkins_lookup3 djb2 djb3 fnv1a
|
196
|
+
murmur1 murmur1_aligned murmur2 murmur2a murmur2_aligned
|
197
|
+
murmur3a murmur3f).each do |h|
|
193
198
|
assert_nothing_raised do
|
194
199
|
tdb = TDB.new(nil, :hash => h.to_sym)
|
195
200
|
TDB::HASHES.each do |k,v|
|
@@ -275,6 +280,23 @@ class TestTdb < Test::Unit::TestCase
|
|
275
280
|
assert ! @tdb.include?("hello")
|
276
281
|
end
|
277
282
|
|
283
|
+
def test_fork
|
284
|
+
@tmp = Tempfile.new('tdb')
|
285
|
+
File.unlink(@tmp.path)
|
286
|
+
@tdb = TDB.new(@tmp.path)
|
287
|
+
@tdb["hello"] = "world"
|
288
|
+
pid = fork do
|
289
|
+
assert_equal "world", @tdb["hello"]
|
290
|
+
@tdb["hello"] = "WORLD"
|
291
|
+
@tdb["#$$"] = "NO"
|
292
|
+
exit 0
|
293
|
+
end
|
294
|
+
_, status = Process.waitpid2(pid)
|
295
|
+
assert status.success?, status.inspect
|
296
|
+
assert_equal "WORLD", @tdb["hello"]
|
297
|
+
assert_equal "NO", @tdb[pid.to_s]
|
298
|
+
end
|
299
|
+
|
278
300
|
def test_fetch_reuse_buf
|
279
301
|
assert_nothing_raised do
|
280
302
|
@tmp = Tempfile.new('tdb')
|
@@ -12,4 +12,34 @@ class TestHashFunctions < Test::Unit::TestCase
|
|
12
12
|
assert_kind_of Integer, __send__("tdb_hash_#{name}", "hello")
|
13
13
|
end
|
14
14
|
end
|
15
|
+
|
16
|
+
def test_distro_sequential
|
17
|
+
TDB::HASHES.each do |name,_|
|
18
|
+
next if :default == name
|
19
|
+
m = method "tdb_hash_#{name}"
|
20
|
+
tmp = Hash.new { |h,k| h[k] = 0 }
|
21
|
+
(1..100000).each do |s|
|
22
|
+
tmp[m.call(s.to_s) % 7] += 1
|
23
|
+
end
|
24
|
+
assert_equal 7, tmp.size
|
25
|
+
tmp.each_value do |v|
|
26
|
+
assert_in_delta 100000/7.0, v, 1000
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_distro_random
|
32
|
+
TDB::HASHES.each do |name,_|
|
33
|
+
next if :default == name
|
34
|
+
m = method "tdb_hash_#{name}"
|
35
|
+
tmp = Hash.new { |h,k| h[k] = 0 }
|
36
|
+
100000.times do
|
37
|
+
tmp[m.call(rand.to_s) % 7] += 1
|
38
|
+
end
|
39
|
+
assert_equal 7, tmp.size
|
40
|
+
tmp.each_value do |v|
|
41
|
+
assert_in_delta 100000/7.0, v, 1000
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
15
45
|
end
|
data/test/test_tdb_mt.rb
CHANGED
@@ -81,6 +81,7 @@ class Test_TDB_MT < Test::Unit::TestCase
|
|
81
81
|
m += [ :include?, :member? ]
|
82
82
|
m.sort!
|
83
83
|
unwrapped = ( (m - mt) | (mt - m)).uniq
|
84
|
+
unwrapped -= [ :initialize ]
|
84
85
|
assert unwrapped.empty?, "unwrapped methods: #{unwrapped.inspect}"
|
85
86
|
@tdb = TDB.new(nil)
|
86
87
|
respond_to?(:refute_match) and
|
metadata
CHANGED
@@ -1,49 +1,44 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: tdb
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 5
|
9
|
-
- 0
|
10
|
-
version: 0.5.0
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.6.1
|
5
|
+
prerelease:
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Ruby tdb hackers
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
dependencies:
|
21
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2014-02-10 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
22
15
|
name: wrongdoc
|
23
|
-
|
24
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
25
17
|
none: false
|
26
|
-
requirements:
|
18
|
+
requirements:
|
27
19
|
- - ~>
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
|
30
|
-
segments:
|
31
|
-
- 1
|
32
|
-
- 3
|
33
|
-
version: "1.3"
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 1.6.2
|
34
22
|
type: :development
|
35
|
-
|
36
|
-
|
37
|
-
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 1.6.2
|
30
|
+
description: ! 'TDB is much like other DBM implementations, except it allows concurrent
|
31
|
+
|
38
32
|
writer processes. TDB was initially developed for Samba, but is used by
|
33
|
+
|
39
34
|
other projects as well. These Ruby bindings allow Ruby apps to read and
|
40
|
-
|
35
|
+
|
36
|
+
write to the same databases used by Samba!'
|
41
37
|
email: ruby.tdb@librelist.org
|
42
38
|
executables: []
|
43
|
-
|
44
|
-
extensions:
|
39
|
+
extensions:
|
45
40
|
- ext/tdb/extconf.rb
|
46
|
-
extra_rdoc_files:
|
41
|
+
extra_rdoc_files:
|
47
42
|
- LICENSE
|
48
43
|
- README
|
49
44
|
- Hash_Functions
|
@@ -54,7 +49,7 @@ extra_rdoc_files:
|
|
54
49
|
- lib/tdb/mt.rb
|
55
50
|
- ext/tdb/tdb.c
|
56
51
|
- LATEST
|
57
|
-
files:
|
52
|
+
files:
|
58
53
|
- .document
|
59
54
|
- .gitignore
|
60
55
|
- .manifest
|
@@ -79,54 +74,48 @@ files:
|
|
79
74
|
- ext/tdb/lookup3.c
|
80
75
|
- ext/tdb/murmur1.c
|
81
76
|
- ext/tdb/murmur2.c
|
77
|
+
- ext/tdb/murmur3.c
|
82
78
|
- ext/tdb/rbtdb.h
|
79
|
+
- ext/tdb/siphash24.c
|
83
80
|
- ext/tdb/tdb.c
|
84
81
|
- lib/tdb.rb
|
85
82
|
- lib/tdb/mt.rb
|
83
|
+
- pkg.mk
|
86
84
|
- setup.rb
|
87
85
|
- tdb.gemspec
|
88
86
|
- test/test_tdb.rb
|
89
87
|
- test/test_tdb_hash_functions.rb
|
90
88
|
- test/test_tdb_mt.rb
|
91
|
-
has_rdoc: true
|
92
89
|
homepage: http://bogomips.org/ruby-tdb/
|
93
|
-
licenses:
|
94
|
-
|
90
|
+
licenses:
|
91
|
+
- LGPLv2.1+
|
95
92
|
post_install_message:
|
96
|
-
rdoc_options:
|
93
|
+
rdoc_options:
|
97
94
|
- -t
|
98
95
|
- tdb - Trivial Database bindings for Ruby
|
99
96
|
- -W
|
100
|
-
- http://
|
101
|
-
require_paths:
|
97
|
+
- http://bogomips.org/ruby-tdb.git/tree/%s
|
98
|
+
require_paths:
|
102
99
|
- lib
|
103
|
-
|
104
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
100
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
105
101
|
none: false
|
106
|
-
requirements:
|
107
|
-
- -
|
108
|
-
- !ruby/object:Gem::Version
|
109
|
-
|
110
|
-
|
111
|
-
- 0
|
112
|
-
version: "0"
|
113
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
102
|
+
requirements:
|
103
|
+
- - ! '>='
|
104
|
+
- !ruby/object:Gem::Version
|
105
|
+
version: '0'
|
106
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
114
107
|
none: false
|
115
|
-
requirements:
|
116
|
-
- -
|
117
|
-
- !ruby/object:Gem::Version
|
118
|
-
|
119
|
-
segments:
|
120
|
-
- 0
|
121
|
-
version: "0"
|
108
|
+
requirements:
|
109
|
+
- - ! '>='
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '0'
|
122
112
|
requirements: []
|
123
|
-
|
124
113
|
rubyforge_project: qrp
|
125
|
-
rubygems_version: 1.
|
114
|
+
rubygems_version: 1.8.23
|
126
115
|
signing_key:
|
127
116
|
specification_version: 3
|
128
117
|
summary: Trivial Database bindings for Ruby
|
129
|
-
test_files:
|
118
|
+
test_files:
|
130
119
|
- test/test_tdb_mt.rb
|
131
120
|
- test/test_tdb_hash_functions.rb
|
132
121
|
- test/test_tdb.rb
|