tdb 0.3.0 → 0.5.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.
- data/.document +1 -0
- data/.gitignore +1 -0
- data/.wrongdoc.yml +4 -0
- data/GIT-VERSION-GEN +1 -1
- data/GNUmakefile +30 -67
- data/HACKING +60 -0
- data/README +7 -5
- data/Rakefile +0 -103
- data/ext/tdb/tdb.c +32 -14
- data/lib/tdb.rb +2 -1
- data/lib/tdb/mt.rb +2 -0
- data/tdb.gemspec +8 -17
- data/test/test_tdb.rb +56 -2
- data/test/test_tdb_mt.rb +1 -0
- metadata +28 -8
data/.document
CHANGED
data/.gitignore
CHANGED
data/.wrongdoc.yml
ADDED
data/GIT-VERSION-GEN
CHANGED
data/GNUmakefile
CHANGED
@@ -3,8 +3,6 @@ all::
|
|
3
3
|
RUBY = ruby
|
4
4
|
RAKE = rake
|
5
5
|
RSYNC = rsync
|
6
|
-
GIT_URL = git://git.bogomips.org/ruby-tdb.git
|
7
|
-
CGIT_URL = http://git.bogomips.org/cgit/ruby-tdb.git
|
8
6
|
|
9
7
|
GIT-VERSION-FILE: .FORCE-GIT-VERSION-FILE
|
10
8
|
@./GIT-VERSION-GEN
|
@@ -29,61 +27,27 @@ install:
|
|
29
27
|
setup_rb_files := .config InstalledFiles
|
30
28
|
prep_setup_rb := @-$(RM) $(setup_rb_files);$(MAKE) -C $(ext) clean
|
31
29
|
|
30
|
+
extdir := ext/tdb
|
32
31
|
clean:
|
33
|
-
-$(MAKE) -C
|
34
|
-
$(RM) $(setup_rb_files)
|
35
|
-
|
36
|
-
pkg_extra := GIT-VERSION-FILE NEWS ChangeLog
|
37
|
-
manifest: $(pkg_extra)
|
38
|
-
$(RM) .manifest
|
39
|
-
$(MAKE) .manifest
|
40
|
-
|
41
|
-
.manifest:
|
42
|
-
(git ls-files && \
|
43
|
-
for i in $@ $(pkg_extra) $(man1_paths); \
|
44
|
-
do echo $$i; done) | LC_ALL=C sort > $@+
|
45
|
-
cmp $@+ $@ || mv $@+ $@
|
46
|
-
$(RM) $@+
|
32
|
+
-$(MAKE) -C $(extdir) clean
|
33
|
+
$(RM) $(setup_rb_files) $(extdir)/Makefile
|
47
34
|
|
48
|
-
|
49
|
-
|
50
|
-
|
35
|
+
pkg_extra := GIT-VERSION-FILE NEWS ChangeLog LATEST
|
36
|
+
ChangeLog: GIT-VERSION-FILE .wrongdoc.yml
|
37
|
+
wrongdoc prepare
|
51
38
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
$(shell git rev-parse -q "$(GIT_VERSION)" >/dev/null 2>&1 && \
|
58
|
-
echo $(GIT_VERSION) || git describe)
|
59
|
-
ifneq ($(SINCE),)
|
60
|
-
ChangeLog: log_range = v$(SINCE)..$(LOG_VERSION)
|
61
|
-
endif
|
62
|
-
ChangeLog: GIT-VERSION-FILE
|
63
|
-
@echo "ChangeLog from $(GIT_URL) ($(log_range))" > $@+
|
64
|
-
@echo >> $@+
|
65
|
-
git log $(log_range) | sed -e 's/^/ /' >> $@+
|
66
|
-
mv $@+ $@
|
67
|
-
|
68
|
-
news_atom := http://bogomips.org/ruby-tdb/NEWS.atom.xml
|
69
|
-
cgit_atom := $(CGIT_URL)/atom/?h=master
|
70
|
-
atom = <link rel="alternate" title="Atom feed" href="$(1)" \
|
71
|
-
type="application/atom+xml"/>
|
39
|
+
.manifest: ChangeLog
|
40
|
+
(git ls-files && for i in $@ $(pkg_extra); do echo $$i; done) | \
|
41
|
+
LC_ALL=C sort > $@+
|
42
|
+
cmp $@+ $@ || mv $@+ $@
|
43
|
+
$(RM) $@+
|
72
44
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
45
|
+
doc: .document .wrongdoc.yml
|
46
|
+
find lib ext -type f -name '*.rbc' -exec rm -f '{}' ';'
|
47
|
+
$(RM) -r doc
|
48
|
+
wrongdoc all
|
77
49
|
install -m644 COPYING doc/COPYING
|
78
50
|
install -m644 $(shell grep '^[A-Z]' .document) doc/
|
79
|
-
$(RUBY) -i -p -e \
|
80
|
-
'$$_.gsub!("</title>",%q{\&$(call atom,$(cgit_atom))})' \
|
81
|
-
doc/ChangeLog.html
|
82
|
-
$(RUBY) -i -p -e \
|
83
|
-
'$$_.gsub!("</title>",%q{\&$(call atom,$(news_atom))})' \
|
84
|
-
doc/NEWS.html doc/README.html
|
85
|
-
$(RAKE) -s news_atom > doc/NEWS.atom.xml
|
86
|
-
cd doc && ln README.html tmp && mv tmp index.html
|
87
51
|
|
88
52
|
ifneq ($(VERSION),)
|
89
53
|
rfproject := qrp
|
@@ -96,10 +60,10 @@ release_changes := release_changes-$(VERSION)
|
|
96
60
|
release-notes: $(release_notes)
|
97
61
|
release-changes: $(release_changes)
|
98
62
|
$(release_changes):
|
99
|
-
|
63
|
+
wrongdoc release_changes > $@+
|
100
64
|
$(VISUAL) $@+ && test -s $@+ && mv $@+ $@
|
101
65
|
$(release_notes):
|
102
|
-
|
66
|
+
wrongdoc release_notes > $@+
|
103
67
|
$(VISUAL) $@+ && test -s $@+ && mv $@+ $@
|
104
68
|
|
105
69
|
# ensures we're actually on the tagged $(VERSION), only used for release
|
@@ -119,14 +83,14 @@ gem: $(pkggem)
|
|
119
83
|
install-gem: $(pkggem)
|
120
84
|
gem install $(CURDIR)/$<
|
121
85
|
|
122
|
-
$(pkggem): manifest fix-perms
|
86
|
+
$(pkggem): .manifest fix-perms
|
123
87
|
gem build $(rfpackage).gemspec
|
124
88
|
mkdir -p pkg
|
125
89
|
mv $(@F) $@
|
126
90
|
|
127
91
|
$(pkgtgz): distdir = $(basename $@)
|
128
92
|
$(pkgtgz): HEAD = v$(VERSION)
|
129
|
-
$(pkgtgz): manifest fix-perms
|
93
|
+
$(pkgtgz): .manifest fix-perms
|
130
94
|
@test -n "$(distdir)"
|
131
95
|
$(RM) -r $(distdir)
|
132
96
|
mkdir -p $(distdir)
|
@@ -147,16 +111,18 @@ release: verify package $(release_notes) $(release_changes)
|
|
147
111
|
-rubyforge add_file \
|
148
112
|
$(rfproject) $(rfpackage) $(VERSION) $(pkggem)
|
149
113
|
$(RAKE) raa_update VERSION=$(VERSION)
|
114
|
+
$(RAKE) publish_news VERSION=$(VERSION)
|
150
115
|
else
|
151
116
|
gem install-gem: GIT-VERSION-FILE
|
152
117
|
$(MAKE) $@ VERSION=$(GIT_VERSION)
|
153
118
|
endif
|
154
119
|
|
155
|
-
ext :=
|
156
|
-
|
157
|
-
cd $(@D) && $(RUBY) extconf.rb
|
120
|
+
ext := $(extdir)/tdb_ext.$(DLEXT)
|
121
|
+
$(extdir)/Makefile: $(extdir)/extconf.rb
|
122
|
+
cd $(@D) && $(RUBY) extconf.rb
|
158
123
|
|
159
|
-
$(
|
124
|
+
c_files := $(wildcard $(extdir)/*.[ch] $(extdir)/*/*.h)
|
125
|
+
$(ext): $(c_files) $(extdir)/Makefile
|
160
126
|
$(MAKE) -C $(@D)
|
161
127
|
|
162
128
|
all:: test
|
@@ -166,16 +132,14 @@ test_units := $(wildcard test/test_*.rb)
|
|
166
132
|
test: test-unit
|
167
133
|
test-unit: $(test_units)
|
168
134
|
$(test_units): build
|
169
|
-
$(RUBY) -I lib
|
135
|
+
$(RUBY) -I lib:$(extdir) $@
|
170
136
|
|
171
137
|
# this requires GNU coreutils variants
|
172
138
|
publish_doc:
|
173
139
|
-git set-file-times
|
174
|
-
$(
|
175
|
-
|
176
|
-
|
177
|
-
find doc/images doc/js -type f | \
|
178
|
-
TZ=UTC xargs touch -d '1970-01-01 00:00:00' doc/rdoc.css
|
140
|
+
$(MAKE) doc
|
141
|
+
find doc/images -type f | \
|
142
|
+
TZ=UTC xargs touch -d '1970-01-01 00:00:06' doc/rdoc.css
|
179
143
|
$(MAKE) doc_gz
|
180
144
|
chmod 644 $$(find doc -type f)
|
181
145
|
$(RSYNC) -av doc/ bogomips.org:/srv/bogomips/ruby-tdb/
|
@@ -185,8 +149,7 @@ publish_doc:
|
|
185
149
|
# "gzip_static on" can serve the gzipped versions directly.
|
186
150
|
doc_gz: docs = $(shell find doc -type f ! -regex '^.*\.\(gif\|jpg\|png\|gz\)$$')
|
187
151
|
doc_gz:
|
188
|
-
touch doc/NEWS.atom.xml -d "$$(awk 'NR==1{print $$4,$$5,$$6}' NEWS)"
|
189
152
|
for i in $(docs); do \
|
190
153
|
gzip --rsyncable -9 < $$i > $$i.gz; touch -r $$i $$i.gz; done
|
191
154
|
|
192
|
-
.PHONY: .FORCE-GIT-VERSION-FILE doc
|
155
|
+
.PHONY: .FORCE-GIT-VERSION-FILE doc test $(test_units)
|
data/HACKING
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
= Ruby TDB Hacker's Guide
|
2
|
+
|
3
|
+
=== Code Compatibility
|
4
|
+
|
5
|
+
We target Ruby 1.9.2 and eventually Rubinius 1.1+ and their respective C
|
6
|
+
APIs.
|
7
|
+
|
8
|
+
All of our C code should be compatible with all reasonably modern Unices
|
9
|
+
and should run on compilers supported by the versions of Ruby we target.
|
10
|
+
|
11
|
+
We will NEVER support non-Free platforms under any circumstances.
|
12
|
+
|
13
|
+
Our C code follows K&R indentation style (hard tabs, tabs are always 8
|
14
|
+
characters wide) and NOT the indentation style of Matz Ruby.
|
15
|
+
|
16
|
+
== Contributing
|
17
|
+
|
18
|
+
Contributions are welcome in the form of patches, pull requests, code
|
19
|
+
review, testing, documentation, user support or any other feedback. The
|
20
|
+
{Ruby TDB mailing list}[mailto:ruby.tdb@librelist.org] is the central
|
21
|
+
coordination point for all user and developer feedback and bug reports.
|
22
|
+
|
23
|
+
=== Submitting Patches
|
24
|
+
|
25
|
+
Follow conventions already established in the code and do not exceed 80
|
26
|
+
characters per line.
|
27
|
+
|
28
|
+
Inline patches (from "git format-patch -M") to the mailing list are
|
29
|
+
preferred because they allow code review and comments in the reply to
|
30
|
+
the patch.
|
31
|
+
|
32
|
+
We will adhere to mostly the same conventions for patch submissions as
|
33
|
+
git itself. See the Documentation/SubmittingPatches document
|
34
|
+
distributed with git on on patch submission guidelines to follow. Just
|
35
|
+
don't email the git mailing list or maintainer with Ruby TDB patches :)
|
36
|
+
|
37
|
+
=== Mailing list rules
|
38
|
+
|
39
|
+
* Do not {top post}[http://catb.org/jargon/html/T/top-post.html] in replies
|
40
|
+
* Quote only the relevant portions of the message you're replying to
|
41
|
+
* Do not send HTML mail, they will be mercilessly deleted.
|
42
|
+
|
43
|
+
When referencing mailing list posts, use
|
44
|
+
"http://mid.gmane.org/$MESSAGE_ID" if possible since the Message-ID
|
45
|
+
remains searchable even if Gmane becomes unavailable.
|
46
|
+
|
47
|
+
== Running Development Versions
|
48
|
+
|
49
|
+
It is easy to install the contents of your git working directory:
|
50
|
+
|
51
|
+
Via RubyGems (RubyGems 1.3.5+ recommended for prerelease versions):
|
52
|
+
|
53
|
+
gmake install-gem
|
54
|
+
|
55
|
+
Without RubyGems (via setup.rb):
|
56
|
+
|
57
|
+
gmake install
|
58
|
+
|
59
|
+
It is not at all recommended to mix a RubyGems installation with an
|
60
|
+
installation done without RubyGems, however.
|
data/README
CHANGED
@@ -15,7 +15,7 @@ write to the same databases used by Samba!
|
|
15
15
|
and child processes.
|
16
16
|
|
17
17
|
* Releases the GVL for slow disk operations under Ruby 1.9 so
|
18
|
-
other threads can run (but not other TDB operations
|
18
|
+
other threads can run (but not other TDB operations! see Caveats below)
|
19
19
|
|
20
20
|
* Includes several {hash functions}[link:Hash_Functions.html]
|
21
21
|
not included by upstream TDB.
|
@@ -25,10 +25,12 @@ write to the same databases used by Samba!
|
|
25
25
|
These caveats will be addressed upstream in
|
26
26
|
{TDB2}[http://mid.gmane.org/201008021002.47351.rusty@rustcorp.com.au]
|
27
27
|
|
28
|
-
* NOT native thread-safe
|
29
|
-
|
30
|
-
|
31
|
-
|
28
|
+
* NOT native thread-safe. Don't try accessing TDB objects from
|
29
|
+
multiple threads at the same time. This probably needs to be
|
30
|
+
fixed upstream since our attempts to make it work have failed.
|
31
|
+
|
32
|
+
However, TDB will allow other Ruby 1.9 threads to run doing non-TDB
|
33
|
+
things just fine.
|
32
34
|
|
33
35
|
* Database size is limited to 4G, even on 64-bit systems.
|
34
36
|
|
data/Rakefile
CHANGED
@@ -1,107 +1,4 @@
|
|
1
1
|
# -*- encoding: binary -*-
|
2
|
-
|
3
|
-
# most tasks are in the GNUmakefile which offers better parallelism
|
4
|
-
|
5
|
-
def tags
|
6
|
-
timefmt = '%Y-%m-%dT%H:%M:%SZ'
|
7
|
-
@tags ||= `git tag -l`.split(/\n/).map do |tag|
|
8
|
-
if %r{\Av[\d\.]+} =~ tag
|
9
|
-
header, subject, body = `git cat-file tag #{tag}`.split(/\n\n/, 3)
|
10
|
-
header = header.split(/\n/)
|
11
|
-
tagger = header.grep(/\Atagger /).first
|
12
|
-
body ||= "initial"
|
13
|
-
{
|
14
|
-
:time => Time.at(tagger.split(/ /)[-2].to_i).utc.strftime(timefmt),
|
15
|
-
:tagger_name => %r{^tagger ([^<]+)}.match(tagger)[1].strip,
|
16
|
-
:tagger_email => %r{<([^>]+)>}.match(tagger)[1].strip,
|
17
|
-
:id => `git rev-parse refs/tags/#{tag}`.chomp!,
|
18
|
-
:tag => tag,
|
19
|
-
:subject => subject,
|
20
|
-
:body => body,
|
21
|
-
}
|
22
|
-
end
|
23
|
-
end.compact.sort { |a,b| b[:time] <=> a[:time] }
|
24
|
-
end
|
25
|
-
|
26
|
-
cgit_url = "http://git.bogomips.org/cgit/ruby-tdb.git"
|
27
|
-
git_url = ENV['GIT_URL'] || 'git://git.bogomips.org/ruby-tdb.git'
|
28
|
-
web_url = "http://bogomips.org/ruby-tdb/"
|
29
|
-
|
30
|
-
desc 'prints news as an Atom feed'
|
31
|
-
task :news_atom do
|
32
|
-
require 'nokogiri'
|
33
|
-
new_tags = tags[0,10]
|
34
|
-
puts(Nokogiri::XML::Builder.new do
|
35
|
-
feed :xmlns => "http://www.w3.org/2005/Atom" do
|
36
|
-
id! "#{web_url}NEWS.atom.xml"
|
37
|
-
title "Ruby tdb news"
|
38
|
-
subtitle "Trivial Database bindings for Ruby"
|
39
|
-
link! :rel => "alternate", :type => "text/html",
|
40
|
-
:href => "#{web_url}NEWS.html"
|
41
|
-
updated(new_tags.empty? ? "1970-01-01T00:00:00Z" : new_tags.first[:time])
|
42
|
-
new_tags.each do |tag|
|
43
|
-
entry do
|
44
|
-
title tag[:subject]
|
45
|
-
updated tag[:time]
|
46
|
-
published tag[:time]
|
47
|
-
author {
|
48
|
-
name tag[:tagger_name]
|
49
|
-
email tag[:tagger_email]
|
50
|
-
}
|
51
|
-
url = "#{cgit_url}/tag/?id=#{tag[:tag]}"
|
52
|
-
link! :rel => "alternate", :type => "text/html", :href =>url
|
53
|
-
id! url
|
54
|
-
message_only = tag[:body].split(/\n.+\(\d+\):\n {6}/s).first.strip
|
55
|
-
content({:type =>:text}, message_only)
|
56
|
-
content(:type =>:xhtml) { pre tag[:body] }
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end.to_xml)
|
61
|
-
end
|
62
|
-
|
63
|
-
desc 'prints RDoc-formatted news'
|
64
|
-
task :news_rdoc do
|
65
|
-
tags.each do |tag|
|
66
|
-
time = tag[:time].tr!('T', ' ').gsub!(/:\d\dZ/, ' UTC')
|
67
|
-
puts "=== #{tag[:tag].sub(/^v/, '')} / #{time}"
|
68
|
-
puts ""
|
69
|
-
|
70
|
-
body = tag[:body]
|
71
|
-
puts tag[:body].gsub(/^/sm, " ").gsub(/[ \t]+$/sm, "")
|
72
|
-
puts ""
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
desc "print release changelog for Rubyforge"
|
77
|
-
task :release_changes do
|
78
|
-
version = ENV['VERSION'] or abort "VERSION= needed"
|
79
|
-
version = "v#{version}"
|
80
|
-
vtags = tags.map { |tag| tag[:tag] =~ /\Av/ and tag[:tag] }.sort
|
81
|
-
prev = vtags[vtags.index(version) - 1]
|
82
|
-
if prev
|
83
|
-
system('git', 'diff', '--stat', prev, version) or abort $?
|
84
|
-
puts ""
|
85
|
-
system('git', 'log', "#{prev}..#{version}") or abort $?
|
86
|
-
else
|
87
|
-
system('git', 'log', version) or abort $?
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
desc "print release notes for Rubyforge"
|
92
|
-
task :release_notes do
|
93
|
-
spec = Gem::Specification.load('tdb.gemspec')
|
94
|
-
puts spec.description.strip
|
95
|
-
puts ""
|
96
|
-
puts "* #{spec.homepage}"
|
97
|
-
puts "* #{spec.email}"
|
98
|
-
puts "* #{git_url}"
|
99
|
-
|
100
|
-
_, _, body = `git cat-file tag v#{spec.version}`.split(/\n\n/, 3)
|
101
|
-
print "\nChanges:\n\n"
|
102
|
-
puts body
|
103
|
-
end
|
104
|
-
|
105
2
|
desc "post to RAA"
|
106
3
|
task :raa_update do
|
107
4
|
require 'net/http'
|
data/ext/tdb/tdb.c
CHANGED
@@ -331,7 +331,9 @@ struct fetch_parse_args {
|
|
331
331
|
struct tdb_context *tdb;
|
332
332
|
union {
|
333
333
|
TDB_DATA key;
|
334
|
-
|
334
|
+
long value_len;
|
335
|
+
char *value_ptr;
|
336
|
+
VALUE value;
|
335
337
|
} as;
|
336
338
|
VALUE value;
|
337
339
|
};
|
@@ -341,11 +343,12 @@ static VALUE str_new_tdb_data(TDB_DATA *val)
|
|
341
343
|
return rb_str_new((const char *)val->dptr, val->dsize);
|
342
344
|
}
|
343
345
|
|
344
|
-
static void *
|
346
|
+
static void *gvl_str_resize(void *data)
|
345
347
|
{
|
346
348
|
struct fetch_parse_args *f = data;
|
347
349
|
|
348
|
-
f->value
|
350
|
+
rb_str_resize(f->value, f->as.value_len);
|
351
|
+
f->as.value_ptr = RSTRING_PTR(f->value);
|
349
352
|
|
350
353
|
return NULL;
|
351
354
|
}
|
@@ -354,8 +357,10 @@ static int fetch_parse(TDB_DATA key, TDB_DATA val, void *data)
|
|
354
357
|
{
|
355
358
|
struct fetch_parse_args *f = data;
|
356
359
|
|
357
|
-
f->as.
|
358
|
-
(void)rb_thread_call_with_gvl(
|
360
|
+
f->as.value_len = val.dsize;
|
361
|
+
(void)rb_thread_call_with_gvl(gvl_str_resize, data);
|
362
|
+
memcpy(f->as.value_ptr, val.dptr, val.dsize);
|
363
|
+
f->as.value = f->value;
|
359
364
|
|
360
365
|
return 0;
|
361
366
|
}
|
@@ -367,16 +372,24 @@ static VALUE nogvl_parse_record(void *ptr)
|
|
367
372
|
if (tdb_parse_record(f->tdb, f->as.key, fetch_parse, ptr) == -1)
|
368
373
|
return Qnil;
|
369
374
|
|
370
|
-
return f->value;
|
375
|
+
return f->value == f->as.value ? f->value : Qnil;
|
371
376
|
}
|
372
377
|
|
373
|
-
static VALUE fetch(VALUE
|
378
|
+
static VALUE fetch(int argc, VALUE *argv, VALUE self)
|
374
379
|
{
|
375
380
|
struct fetch_parse_args f;
|
381
|
+
VALUE key;
|
382
|
+
|
383
|
+
rb_scan_args(argc, argv, "11", &key, &f.value);
|
384
|
+
if (NIL_P(f.value)) {
|
385
|
+
f.value = rb_str_new(0, 0);
|
386
|
+
} else {
|
387
|
+
StringValue(f.value);
|
388
|
+
rb_str_set_len(f.value, 0);
|
389
|
+
}
|
376
390
|
|
377
391
|
f.tdb = db(self, 1);
|
378
392
|
TO_TDB_DATA(f.as.key, key);
|
379
|
-
f.value = Qnil;
|
380
393
|
|
381
394
|
return my_tbr(nogvl_parse_record, &f);
|
382
395
|
}
|
@@ -549,12 +562,17 @@ static VALUE nuke(VALUE self, VALUE key)
|
|
549
562
|
return my_tbr(nogvl_delete, &d);
|
550
563
|
}
|
551
564
|
|
552
|
-
static VALUE
|
565
|
+
static VALUE aref(VALUE self, VALUE key)
|
566
|
+
{
|
567
|
+
return fetch(1, &key, self);
|
568
|
+
}
|
569
|
+
|
570
|
+
static VALUE delete(int argc, VALUE *argv, VALUE self)
|
553
571
|
{
|
554
|
-
VALUE rc = fetch(
|
572
|
+
VALUE rc = fetch(argc, argv, self);
|
555
573
|
|
556
574
|
if (! NIL_P(rc))
|
557
|
-
if (nuke(self,
|
575
|
+
if (nuke(self, argv[0]) == Qfalse)
|
558
576
|
return Qnil;
|
559
577
|
return rc;
|
560
578
|
}
|
@@ -674,8 +692,8 @@ void Init_tdb_ext(void)
|
|
674
692
|
rb_define_method(cTDB, "close", tdbclose, 0);
|
675
693
|
rb_define_method(cTDB, "closed?", closed, 0);
|
676
694
|
|
677
|
-
rb_define_method(cTDB, "fetch", fetch, 1);
|
678
|
-
rb_define_method(cTDB, "[]",
|
695
|
+
rb_define_method(cTDB, "fetch", fetch, -1);
|
696
|
+
rb_define_method(cTDB, "[]", aref, 1);
|
679
697
|
rb_define_method(cTDB, "store", store, 2);
|
680
698
|
rb_define_method(cTDB, "[]=", store, 2);
|
681
699
|
rb_define_method(cTDB, "insert!", insert_bang, 2);
|
@@ -689,7 +707,7 @@ void Init_tdb_ext(void)
|
|
689
707
|
rb_define_method(cTDB, "member?", has_key, 1);
|
690
708
|
rb_define_method(cTDB, "each", each, 0);
|
691
709
|
rb_define_method(cTDB, "nuke!", nuke, 1);
|
692
|
-
rb_define_method(cTDB, "delete", delete, 1);
|
710
|
+
rb_define_method(cTDB, "delete", delete, -1);
|
693
711
|
|
694
712
|
rb_define_method(cTDB, "lockall", lockall, 0);
|
695
713
|
rb_define_method(cTDB, "trylockall", trylockall, 0);
|
data/lib/tdb.rb
CHANGED
data/lib/tdb/mt.rb
CHANGED
data/tdb.gemspec
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
ENV["VERSION"] or abort "VERSION= must be specified"
|
2
2
|
manifest = File.readlines('.manifest').map! { |x| x.chomp! }
|
3
|
-
|
4
|
-
|
3
|
+
require 'wrongdoc'
|
4
|
+
extend Wrongdoc::Gemspec
|
5
|
+
name, summary, title = readme_metadata
|
5
6
|
|
6
7
|
Gem::Specification.new do |s|
|
7
8
|
s.name = %q{tdb}
|
@@ -10,27 +11,17 @@ Gem::Specification.new do |s|
|
|
10
11
|
s.homepage = 'http://bogomips.org/ruby-tdb/'
|
11
12
|
s.authors = ["Ruby tdb hackers"]
|
12
13
|
s.date = Time.now.utc.strftime('%Y-%m-%d')
|
13
|
-
s.description =
|
14
|
+
s.description = readme_description
|
14
15
|
s.email = %q{ruby.tdb@librelist.org}
|
15
|
-
|
16
|
-
s.extra_rdoc_files = File.readlines('.document').map! do |x|
|
17
|
-
x.chomp!
|
18
|
-
if File.directory?(x)
|
19
|
-
manifest.grep(%r{\A#{x}/})
|
20
|
-
elsif File.file?(x)
|
21
|
-
x
|
22
|
-
else
|
23
|
-
nil
|
24
|
-
end
|
25
|
-
end.flatten.compact
|
26
|
-
|
16
|
+
s.extra_rdoc_files = extra_rdoc_files(manifest)
|
27
17
|
s.files = manifest
|
28
|
-
s.rdoc_options =
|
18
|
+
s.rdoc_options = rdoc_options
|
29
19
|
s.require_paths = %w(lib ext)
|
30
|
-
s.rubyforge_project = %q{
|
20
|
+
s.rubyforge_project = %q{qrp}
|
31
21
|
s.summary = summary
|
32
22
|
s.test_files = Dir['test/test_*.rb']
|
33
23
|
s.extensions = %w(ext/tdb/extconf.rb)
|
24
|
+
s.add_development_dependency('wrongdoc', '~> 1.3')
|
34
25
|
|
35
26
|
# s.license = %w(LGPL) # disabled for compatibility with older RubyGems
|
36
27
|
end
|
data/test/test_tdb.rb
CHANGED
@@ -275,10 +275,64 @@ class TestTdb < Test::Unit::TestCase
|
|
275
275
|
assert ! @tdb.include?("hello")
|
276
276
|
end
|
277
277
|
|
278
|
-
def
|
279
|
-
|
278
|
+
def test_fetch_reuse_buf
|
279
|
+
assert_nothing_raised do
|
280
|
+
@tmp = Tempfile.new('tdb')
|
281
|
+
File.unlink(@tmp.path)
|
282
|
+
end
|
283
|
+
@tdb = TDB.new(@tmp.path)
|
284
|
+
@tdb["HELLO"] = "WORLD"
|
285
|
+
rbuf = "HI"
|
286
|
+
rv = @tdb.fetch("HELLO", rbuf)
|
287
|
+
assert_equal rbuf.object_id, rv.object_id
|
288
|
+
|
289
|
+
assert_equal "WORLD", rbuf
|
290
|
+
assert_nil @tdb.fetch("HELLO!", rbuf)
|
291
|
+
assert_equal "", rbuf
|
292
|
+
|
293
|
+
@tdb["HELLO"] = "WORLD" * 100
|
294
|
+
rv = @tdb.fetch("HELLO", rbuf)
|
295
|
+
assert_equal rbuf.object_id, rv.object_id
|
296
|
+
assert_equal "WORLD" * 100, rbuf
|
297
|
+
end
|
298
|
+
|
299
|
+
def test_delete_reuse_buf
|
300
|
+
assert_nothing_raised do
|
301
|
+
@tmp = Tempfile.new('tdb')
|
302
|
+
File.unlink(@tmp.path)
|
303
|
+
end
|
304
|
+
@tdb = TDB.new(@tmp.path)
|
305
|
+
@tdb["HELLO"] = "WORLD"
|
306
|
+
rbuf = "HI"
|
307
|
+
rv = @tdb.delete("HELLO", rbuf)
|
308
|
+
assert_equal rbuf.object_id, rv.object_id
|
309
|
+
assert_equal "WORLD", rbuf
|
310
|
+
assert ! @tdb.include?("HELLO")
|
311
|
+
|
312
|
+
assert_nil @tdb.delete("HELLO!", rbuf)
|
313
|
+
assert_equal "", rbuf
|
314
|
+
|
315
|
+
@tdb["HELLO"] = "WORLD" * 100
|
316
|
+
rv = @tdb.delete("HELLO", rbuf)
|
317
|
+
assert_equal rbuf.object_id, rv.object_id
|
318
|
+
assert_equal "WORLD" * 100, rbuf
|
319
|
+
assert ! @tdb.include?("HELLO")
|
320
|
+
end
|
321
|
+
|
322
|
+
def test_repack_file
|
323
|
+
assert_nothing_raised do
|
324
|
+
@tmp = Tempfile.new('tdb')
|
325
|
+
File.unlink(@tmp.path)
|
326
|
+
end
|
327
|
+
@tdb = TDB.new(@tmp.path)
|
280
328
|
@tdb["hello"] = "world"
|
281
329
|
assert_equal @tdb, @tdb.repack
|
282
330
|
assert_equal "world", @tdb["hello"]
|
283
331
|
end if TDB.method_defined?(:repack)
|
332
|
+
|
333
|
+
def test_repack_mem
|
334
|
+
@tdb = TDB.new(nil)
|
335
|
+
@tdb["hello"] = "world"
|
336
|
+
assert_raises(TDB::ERR::EINVAL) { @tdb.repack }
|
337
|
+
end if TDB.method_defined?(:repack)
|
284
338
|
end
|
data/test/test_tdb_mt.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tdb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 11
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
8
|
+
- 5
|
9
9
|
- 0
|
10
|
-
version: 0.
|
10
|
+
version: 0.5.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Ruby tdb hackers
|
@@ -15,10 +15,24 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date:
|
18
|
+
date: 2011-01-17 00:00:00 +00:00
|
19
19
|
default_executable:
|
20
|
-
dependencies:
|
21
|
-
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: wrongdoc
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 9
|
30
|
+
segments:
|
31
|
+
- 1
|
32
|
+
- 3
|
33
|
+
version: "1.3"
|
34
|
+
type: :development
|
35
|
+
version_requirements: *id001
|
22
36
|
description: |-
|
23
37
|
TDB is much like other DBM implementations, except it allows concurrent
|
24
38
|
writer processes. TDB was initially developed for Samba, but is used by
|
@@ -39,16 +53,20 @@ extra_rdoc_files:
|
|
39
53
|
- lib/tdb.rb
|
40
54
|
- lib/tdb/mt.rb
|
41
55
|
- ext/tdb/tdb.c
|
56
|
+
- LATEST
|
42
57
|
files:
|
43
58
|
- .document
|
44
59
|
- .gitignore
|
45
60
|
- .manifest
|
61
|
+
- .wrongdoc.yml
|
46
62
|
- COPYING
|
47
63
|
- ChangeLog
|
48
64
|
- GIT-VERSION-FILE
|
49
65
|
- GIT-VERSION-GEN
|
50
66
|
- GNUmakefile
|
67
|
+
- HACKING
|
51
68
|
- Hash_Functions
|
69
|
+
- LATEST
|
52
70
|
- LICENSE
|
53
71
|
- NEWS
|
54
72
|
- README
|
@@ -77,7 +95,9 @@ licenses: []
|
|
77
95
|
post_install_message:
|
78
96
|
rdoc_options:
|
79
97
|
- -t
|
80
|
-
- Trivial Database bindings for Ruby
|
98
|
+
- tdb - Trivial Database bindings for Ruby
|
99
|
+
- -W
|
100
|
+
- http://git.bogomips.org/cgit/ruby-tdb.git/tree/%s
|
81
101
|
require_paths:
|
82
102
|
- lib
|
83
103
|
- ext
|
@@ -101,7 +121,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
101
121
|
version: "0"
|
102
122
|
requirements: []
|
103
123
|
|
104
|
-
rubyforge_project:
|
124
|
+
rubyforge_project: qrp
|
105
125
|
rubygems_version: 1.3.7
|
106
126
|
signing_key:
|
107
127
|
specification_version: 3
|