libcdb-ruby 0.1.1-x86-mingw32 → 0.2.0.1-x86-mingw32
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ChangeLog +10 -0
- data/README +3 -3
- data/Rakefile +2 -13
- data/ext/libcdb/ruby_cdb.h +9 -3
- data/ext/libcdb/ruby_cdb_reader.c +32 -29
- data/ext/libcdb/ruby_cdb_reader.h +18 -9
- data/ext/libcdb/ruby_cdb_writer.c +3 -2
- data/lib/libcdb.rb +117 -6
- data/lib/libcdb/1.9/libcdb_ruby.so +0 -0
- data/lib/libcdb/2.0/libcdb_ruby.so +0 -0
- data/lib/libcdb/2.1/libcdb_ruby.so +0 -0
- data/lib/libcdb/2.2/libcdb_ruby.so +0 -0
- data/lib/libcdb/version.rb +3 -3
- data/spec/data/empty.cdb +0 -0
- data/spec/data/empty.dump +0 -0
- data/spec/data/test.cdb +0 -0
- data/spec/data/test.dump +57 -0
- data/spec/libcdb/reader_spec.rb +113 -62
- data/spec/libcdb/writer_spec.rb +16 -11
- data/spec/spec_helper.rb +19 -1
- metadata +31 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 16c003eb860813062c77cfa49fe77085cce0d82f
|
4
|
+
data.tar.gz: ac97684ab4a9acf50a9e8afe7648e4380141281f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fdcacb3ae6d39bacd950e0e5c4bff71503b58ab43f7d4feb38d0b61e48775833ae1d0e2abfd0db6344dcb76d38db16148220fb1a5fa169827f14e6ce771fcd38
|
7
|
+
data.tar.gz: 91c34ffc4151b3d39556bc88f9dd983e616b17d777cf849a8b738b182dc394ab1193a08784cbc3e14ad0d76650d90aefde89179066824e6277582f245bebb993
|
data/ChangeLog
CHANGED
@@ -2,6 +2,16 @@
|
|
2
2
|
|
3
3
|
= Revision history for libcdb-ruby
|
4
4
|
|
5
|
+
== 0.2.0 [2014-12-05]
|
6
|
+
|
7
|
+
* Added encoding support to LibCDB::CDB::Reader.
|
8
|
+
* Added LibCDB::CDB.load and LibCDB::CDB.load_file to create a database from a
|
9
|
+
dump.
|
10
|
+
* Added LibCDB::CDB.stats and LibCDB::CDB.print_stats to collect stats from a
|
11
|
+
database.
|
12
|
+
* Fixed that LibCDB::CDB::Reader#each_key and LibCDB::CDB::Reader#each_value
|
13
|
+
would not return an enumerator when no block was given.
|
14
|
+
|
5
15
|
== 0.1.1 [2014-04-25]
|
6
16
|
|
7
17
|
* <b>Dropped support for Ruby 1.9.2.</b>
|
data/README
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
== VERSION
|
4
4
|
|
5
|
-
This documentation refers to libcdb-ruby version 0.
|
5
|
+
This documentation refers to libcdb-ruby version 0.2.0
|
6
6
|
|
7
7
|
|
8
8
|
== DESCRIPTION
|
@@ -74,7 +74,7 @@ creating and reading {constant databases}[http://cr.yp.to/cdb.html].
|
|
74
74
|
== SUPPORTED PLATFORMS
|
75
75
|
|
76
76
|
Linux:: MRI 1.9.3, 2.0 & 2.1 (Tested on 64-bit Ubuntu GNU/Linux
|
77
|
-
with 1.9.
|
77
|
+
with 1.9.3p550, 2.0.0p594 and 2.1.5p273)
|
78
78
|
Windows:: MRI 1.9.3 (Tested on 32-bit Windows XP with 1.9.3p194)
|
79
79
|
|
80
80
|
|
@@ -82,7 +82,7 @@ Windows:: MRI 1.9.3 (Tested on 32-bit Windows XP with 1.9.3p194)
|
|
82
82
|
|
83
83
|
CDB:: http://cr.yp.to/cdb.html
|
84
84
|
TinyCDB:: http://www.corpit.ru/mjt/tinycdb.html
|
85
|
-
Documentation:: https://blackwinter.github.
|
85
|
+
Documentation:: https://blackwinter.github.com/libcdb-ruby
|
86
86
|
Source code:: https://github.com/blackwinter/libcdb-ruby
|
87
87
|
RubyGem:: https://rubygems.org/gems/libcdb-ruby
|
88
88
|
Travis CI:: https://travis-ci.org/blackwinter/libcdb-ruby
|
data/Rakefile
CHANGED
@@ -1,19 +1,8 @@
|
|
1
|
-
|
1
|
+
require_relative 'lib/libcdb/version'
|
2
2
|
|
3
3
|
begin
|
4
4
|
require 'hen'
|
5
5
|
|
6
|
-
cco = []
|
7
|
-
|
8
|
-
if dir = ENV['TINYCDB']
|
9
|
-
cco << "--with-cdb-include=#{dir}"
|
10
|
-
cco << "--with-cdb-lib=#{dir}"
|
11
|
-
end
|
12
|
-
|
13
|
-
if dir = ENV['MINGW32']
|
14
|
-
cco << %Q{--with-cflags="-I#{dir}/include -L#{dir}/lib"}
|
15
|
-
end
|
16
|
-
|
17
6
|
Hen.lay! {{
|
18
7
|
gem: {
|
19
8
|
name: %q{libcdb-ruby},
|
@@ -23,7 +12,7 @@ begin
|
|
23
12
|
email: %q{jens.wille@gmail.com},
|
24
13
|
license: %q{AGPL-3.0},
|
25
14
|
homepage: :blackwinter,
|
26
|
-
extension: {
|
15
|
+
extension: { with_cross_cdb: lambda { |dir| [dir] } },
|
27
16
|
|
28
17
|
required_ruby_version: '>= 1.9.3'
|
29
18
|
}
|
data/ext/libcdb/ruby_cdb.h
CHANGED
@@ -38,17 +38,23 @@ rcdb_##what##er_alloc(VALUE klass) {\
|
|
38
38
|
rb_sys_fail(0);\
|
39
39
|
}
|
40
40
|
|
41
|
-
#define
|
41
|
+
#define RCDB_RAISE_ARGS0(min, max, argc) \
|
42
42
|
rb_raise(rb_eArgError,\
|
43
43
|
"wrong number of arguments (%d for " #min "-" #max ")", argc);
|
44
44
|
|
45
|
-
#define
|
45
|
+
#define RCDB_RAISE_ARGS(min, max) RCDB_RAISE_ARGS0(min, max, argc)
|
46
|
+
|
47
|
+
#define RCDB_RETURN_ENUMERATOR0(argc, argv, max) \
|
46
48
|
if (argc > max) {\
|
47
|
-
|
49
|
+
RCDB_RAISE_ARGS0(0, max, argc)\
|
48
50
|
}\
|
49
51
|
\
|
50
52
|
RETURN_ENUMERATOR(self, argc, argv)
|
51
53
|
|
54
|
+
#define RCDB_RETURN_ENUMERATOR(max) RCDB_RETURN_ENUMERATOR0(argc, argv, max)
|
55
|
+
|
56
|
+
#define RCDB_RETURN_ENUMERATOR_NONE RCDB_RETURN_ENUMERATOR0(0, NULL, 0)
|
57
|
+
|
52
58
|
#define RCDB_DEFINE_INSPECT(what) \
|
53
59
|
static VALUE \
|
54
60
|
rcdb_##what##er_inspect(VALUE self) {\
|
@@ -25,6 +25,7 @@ rcdb_reader_closed_p(VALUE self) {
|
|
25
25
|
static VALUE
|
26
26
|
rcdb_reader_initialize(VALUE self, VALUE io) {
|
27
27
|
RCDB_INITIALIZE(read, READ, cdb, init)
|
28
|
+
rb_iv_set(self, "@encoding", rb_enc_default_external());
|
28
29
|
return self;
|
29
30
|
}
|
30
31
|
|
@@ -40,22 +41,20 @@ rcdb_reader_iter_push(VALUE val, VALUE ary) {
|
|
40
41
|
/* Helper method */
|
41
42
|
static VALUE
|
42
43
|
rcdb_reader_iter_aset(VALUE pair, VALUE hash) {
|
43
|
-
VALUE key = rb_ary_entry(pair, 0)
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
break;
|
58
|
-
}
|
44
|
+
VALUE key = rb_ary_entry(pair, 0);
|
45
|
+
VALUE val = rb_ary_entry(pair, 1);
|
46
|
+
VALUE old = rb_hash_aref(hash, key);
|
47
|
+
|
48
|
+
switch (TYPE(old)) {
|
49
|
+
case T_NIL:
|
50
|
+
rb_hash_aset(hash, key, val);
|
51
|
+
break;
|
52
|
+
case T_ARRAY:
|
53
|
+
rb_ary_push(old, val);
|
54
|
+
break;
|
55
|
+
default:
|
56
|
+
rb_hash_aset(hash, key, rb_ary_new3(2, old, val));
|
57
|
+
break;
|
59
58
|
}
|
60
59
|
|
61
60
|
return Qnil;
|
@@ -104,9 +103,9 @@ rcdb_reader_dump_pair(VALUE key, VALUE val) {
|
|
104
103
|
VALUE str = rb_str_new2("");
|
105
104
|
|
106
105
|
rb_str_cat2(str, "+");
|
107
|
-
rb_str_append(str,
|
106
|
+
rb_str_append(str, RCDB_READER_STRING_LEN(key));
|
108
107
|
rb_str_cat2(str, ",");
|
109
|
-
rb_str_append(str,
|
108
|
+
rb_str_append(str, RCDB_READER_STRING_LEN(val));
|
110
109
|
rb_str_cat2(str, ":");
|
111
110
|
rb_str_append(str, key);
|
112
111
|
rb_str_cat2(str, "->");
|
@@ -144,7 +143,7 @@ rcdb_reader_each(int argc, VALUE *argv, VALUE self) {
|
|
144
143
|
unsigned cdbp;
|
145
144
|
VALUE key;
|
146
145
|
|
147
|
-
RCDB_RETURN_ENUMERATOR(
|
146
|
+
RCDB_RETURN_ENUMERATOR(1);
|
148
147
|
RCDB_READER_GET(self, cdb);
|
149
148
|
|
150
149
|
if (rb_scan_args(argc, argv, "01", &key) == 1 && !NIL_P(key)) {
|
@@ -155,7 +154,7 @@ rcdb_reader_each(int argc, VALUE *argv, VALUE self) {
|
|
155
154
|
}
|
156
155
|
|
157
156
|
while (cdb_findnext(&cdbf) > 0) {
|
158
|
-
rb_yield(
|
157
|
+
rb_yield(RCDB_READER_READ(data));
|
159
158
|
}
|
160
159
|
}
|
161
160
|
else {
|
@@ -163,8 +162,8 @@ rcdb_reader_each(int argc, VALUE *argv, VALUE self) {
|
|
163
162
|
|
164
163
|
while (cdb_seqnext(&cdbp, cdb) > 0) {
|
165
164
|
rb_yield(rb_ary_new3(2,
|
166
|
-
|
167
|
-
|
165
|
+
RCDB_READER_READ(key),
|
166
|
+
RCDB_READER_READ(data)));
|
168
167
|
}
|
169
168
|
}
|
170
169
|
|
@@ -184,9 +183,11 @@ static VALUE
|
|
184
183
|
rcdb_reader_each_dump(int argc, VALUE *argv, VALUE self) {
|
185
184
|
VALUE key;
|
186
185
|
|
187
|
-
RCDB_RETURN_ENUMERATOR(
|
186
|
+
RCDB_RETURN_ENUMERATOR(1);
|
188
187
|
|
189
188
|
if (rb_scan_args(argc, argv, "01", &key) == 1 && !NIL_P(key)) {
|
189
|
+
StringValue(key);
|
190
|
+
|
190
191
|
RCDB_READER_ITERATE0(each, yield_dump2, rb_ary_new3(1, key))
|
191
192
|
}
|
192
193
|
else {
|
@@ -210,11 +211,12 @@ rcdb_reader_each_key(VALUE self) {
|
|
210
211
|
unsigned cdbp;
|
211
212
|
VALUE key, hash = rb_hash_new();
|
212
213
|
|
214
|
+
RCDB_RETURN_ENUMERATOR_NONE;
|
213
215
|
RCDB_READER_GET(self, cdb);
|
214
216
|
cdb_seqinit(&cdbp, cdb);
|
215
217
|
|
216
218
|
while (cdb_seqnext(&cdbp, cdb) > 0) {
|
217
|
-
if (
|
219
|
+
if (NIL_P(rb_hash_lookup(hash, key = RCDB_READER_READ(key)))) {
|
218
220
|
rb_hash_aset(hash, key, Qtrue);
|
219
221
|
rb_yield(key);
|
220
222
|
}
|
@@ -236,11 +238,12 @@ rcdb_reader_each_value(VALUE self) {
|
|
236
238
|
struct cdb *cdb = NULL;
|
237
239
|
unsigned cdbp;
|
238
240
|
|
241
|
+
RCDB_RETURN_ENUMERATOR_NONE;
|
239
242
|
RCDB_READER_GET(self, cdb);
|
240
243
|
cdb_seqinit(&cdbp, cdb);
|
241
244
|
|
242
245
|
while (cdb_seqnext(&cdbp, cdb) > 0) {
|
243
|
-
rb_yield(
|
246
|
+
rb_yield(RCDB_READER_READ(data));
|
244
247
|
}
|
245
248
|
|
246
249
|
return self;
|
@@ -274,7 +277,7 @@ rcdb_reader_fetch_first(VALUE self, VALUE key) {
|
|
274
277
|
RCDB_READER_GET(self, cdb);
|
275
278
|
|
276
279
|
if (cdb_find(cdb, RSTRING_PTR(key), RSTRING_LEN(key)) > 0) {
|
277
|
-
val =
|
280
|
+
val = RCDB_READER_READ(data);
|
278
281
|
}
|
279
282
|
|
280
283
|
return val;
|
@@ -307,9 +310,7 @@ rcdb_reader_fetch_last(VALUE self, VALUE key) {
|
|
307
310
|
}
|
308
311
|
|
309
312
|
if (pos > 0) {
|
310
|
-
|
311
|
-
cdb_read(cdb, RSTRING_PTR(val), len, pos);
|
312
|
-
rb_str_set_len(val, len);
|
313
|
+
RCDB_READER_READ_POS(pos)
|
313
314
|
}
|
314
315
|
|
315
316
|
return val;
|
@@ -511,6 +512,8 @@ rcdb_init_reader(void) {
|
|
511
512
|
rb_define_alloc_func(cCDBReader, rcdb_reader_alloc);
|
512
513
|
rb_include_module(cCDBReader, rb_mEnumerable);
|
513
514
|
|
515
|
+
rb_define_attr(cCDBReader, "encoding", 1, 1);
|
516
|
+
|
514
517
|
rb_define_method(cCDBReader, "close", rcdb_reader_close, 0);
|
515
518
|
rb_define_method(cCDBReader, "closed?", rcdb_reader_closed_p, 0);
|
516
519
|
rb_define_method(cCDBReader, "dump", rcdb_reader_dump, 0);
|
@@ -28,19 +28,28 @@
|
|
28
28
|
|
29
29
|
#define RCDB_READER_DEFINE_READ(what) \
|
30
30
|
static VALUE \
|
31
|
-
rcdb_reader_read_##what(struct cdb *cdb) {\
|
32
|
-
size_t len;\
|
33
|
-
VALUE
|
31
|
+
rcdb_reader_read_##what(struct cdb *cdb, VALUE self) {\
|
32
|
+
size_t len = cdb_##what##len(cdb);\
|
33
|
+
VALUE val;\
|
34
34
|
\
|
35
|
-
|
36
|
-
ret = rb_str_buf_new(len);\
|
35
|
+
RCDB_READER_READ_POS(cdb_##what##pos(cdb))\
|
37
36
|
\
|
38
|
-
|
39
|
-
rb_str_set_len(ret, len);\
|
40
|
-
\
|
41
|
-
return ret;\
|
37
|
+
return val;\
|
42
38
|
}
|
43
39
|
|
40
|
+
#define RCDB_READER_READ_POS(pos) \
|
41
|
+
val = rb_str_buf_new(len);\
|
42
|
+
\
|
43
|
+
cdb_read(cdb, RSTRING_PTR(val), len, pos);\
|
44
|
+
rb_str_set_len(val, len);\
|
45
|
+
\
|
46
|
+
rb_funcall(val, rb_intern("force_encoding"), 1, rb_iv_get(self, "@encoding"));
|
47
|
+
|
48
|
+
#define RCDB_READER_READ(what) rcdb_reader_read_##what(cdb, self)
|
49
|
+
|
50
|
+
#define RCDB_READER_STRING_LEN(str) \
|
51
|
+
rb_funcall(LONG2NUM(RSTRING_LEN(str)), rb_intern("to_s"), 0)
|
52
|
+
|
44
53
|
extern VALUE cCDBReader;
|
45
54
|
void rcdb_init_reader(void);
|
46
55
|
|
@@ -60,6 +60,8 @@ static void
|
|
60
60
|
rcdb_writer_put_value(struct cdb_make *cdbm, VALUE key, VALUE val, enum cdb_put_mode mode) {
|
61
61
|
long i;
|
62
62
|
|
63
|
+
StringValue(key);
|
64
|
+
|
63
65
|
switch (TYPE(val)) {
|
64
66
|
case T_ARRAY:
|
65
67
|
switch (mode) {
|
@@ -132,8 +134,7 @@ rcdb_writer_put(int argc, VALUE *argv, VALUE self, enum cdb_put_mode mode) {
|
|
132
134
|
|
133
135
|
break;
|
134
136
|
case T_HASH:
|
135
|
-
val = rb_ary_new();
|
136
|
-
st_foreach(RHASH_TBL(arg), rcdb_writer_push_pair, val);
|
137
|
+
rb_hash_foreach(arg, rcdb_writer_push_pair, val = rb_ary_new());
|
137
138
|
|
138
139
|
for (i = 0; i < RARRAY_LEN(val); i++) {
|
139
140
|
tmp = rb_ary_entry(val, i);
|
data/lib/libcdb.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
begin
|
2
2
|
require "libcdb/#{RUBY_VERSION[/\d+.\d+/]}/libcdb_ruby"
|
3
|
-
rescue LoadError
|
3
|
+
rescue LoadError => err
|
4
|
+
raise if err.respond_to?(:path) && !err.path
|
4
5
|
require 'libcdb/libcdb_ruby'
|
5
6
|
end
|
6
7
|
|
@@ -86,6 +87,116 @@ module LibCDB
|
|
86
87
|
}
|
87
88
|
end
|
88
89
|
|
90
|
+
# call-seq:
|
91
|
+
# CDB.load(path, dump) -> aCDB
|
92
|
+
#
|
93
|
+
# Opens +path+ for writing and loads +dump+ into the database. +dump+
|
94
|
+
# may be a string or an IO object. Returns the (unclosed) CDB object.
|
95
|
+
def load(path, dump)
|
96
|
+
require 'strscan'
|
97
|
+
|
98
|
+
s, n, e = nil, 0, lambda { |m| s.eos? ?
|
99
|
+
raise("Unexpected end of input (#{m} at #{n}).") :
|
100
|
+
raise("#{m} at #{n}:#{s.pos}: #{s.peek(16).inspect}") }
|
101
|
+
|
102
|
+
cdb = open(path, 'w+')
|
103
|
+
|
104
|
+
dump.each_line { |line|
|
105
|
+
n += 1
|
106
|
+
|
107
|
+
s = StringScanner.new(line)
|
108
|
+
|
109
|
+
e['Record identifier expected'] unless s.scan(/\+/)
|
110
|
+
|
111
|
+
e['Key length expected'] unless s.scan(/\d+/)
|
112
|
+
klen = s.matched.to_i
|
113
|
+
|
114
|
+
e['Length separator expected'] unless s.scan(/,/)
|
115
|
+
|
116
|
+
e['Value length expected'] unless s.scan(/\d+/)
|
117
|
+
vlen = s.matched.to_i
|
118
|
+
|
119
|
+
e['Key separator expected'] unless s.scan(/:/)
|
120
|
+
|
121
|
+
key = ''
|
122
|
+
klen.times { key << s.get_byte }
|
123
|
+
|
124
|
+
e['Value separator expected'] unless s.scan(/->/)
|
125
|
+
|
126
|
+
value = ''
|
127
|
+
vlen.times { value << s.get_byte }
|
128
|
+
|
129
|
+
e['Record terminator expected'] unless s.scan(/\n/)
|
130
|
+
e['Unexpected data'] unless s.eos?
|
131
|
+
|
132
|
+
cdb.store(key, value)
|
133
|
+
}
|
134
|
+
|
135
|
+
cdb
|
136
|
+
end
|
137
|
+
|
138
|
+
# call-seq:
|
139
|
+
# CDB.load_file(path, file) -> aCDB
|
140
|
+
#
|
141
|
+
# Loads the dump at +file+ into the database at +path+ (see #load).
|
142
|
+
def load_file(path, file)
|
143
|
+
File.open(file, 'rb') { |f| self.load(path, f) }
|
144
|
+
end
|
145
|
+
|
146
|
+
# call-seq:
|
147
|
+
# CDB.stats(path) -> aHash
|
148
|
+
#
|
149
|
+
# Returns a hash with the stats on +path+.
|
150
|
+
def stats(path)
|
151
|
+
{}.tap { |stats| open(path) { |cdb|
|
152
|
+
stats[:records] = cnt = cdb.total
|
153
|
+
|
154
|
+
stats[:keys] = khash = { min: Float::INFINITY, avg: 0, max: 0 }
|
155
|
+
stats[:values] = vhash = khash.dup
|
156
|
+
|
157
|
+
stats[:hash] = Hash.new(0).update(distances: Hash.new([0, 0]))
|
158
|
+
|
159
|
+
khash[:min] = vhash[:min] = 0 and break if cnt.zero?
|
160
|
+
|
161
|
+
ktot, vtot, update = 0, 0, lambda { |h, s| s.bytesize.tap { |l|
|
162
|
+
h[:min] = l if l < h[:min]
|
163
|
+
h[:max] = l if l > h[:max]
|
164
|
+
} }
|
165
|
+
|
166
|
+
cdb.each_key { |k| ktot += update[khash, k] }
|
167
|
+
cdb.each_value { |v| vtot += update[vhash, v] }
|
168
|
+
|
169
|
+
khash[:avg] = (ktot + cnt / 2) / cnt
|
170
|
+
vhash[:avg] = (vtot + cnt / 2) / cnt
|
171
|
+
|
172
|
+
# TODO: hash table stats
|
173
|
+
} }
|
174
|
+
end
|
175
|
+
|
176
|
+
# call-seq:
|
177
|
+
# CDB.print_stats(path) -> aHash
|
178
|
+
#
|
179
|
+
# Prints the #stats on +path+.
|
180
|
+
def print_stats(path)
|
181
|
+
stats(path).tap { |s|
|
182
|
+
r, k, v, h = s.values_at(:records, :keys, :values, :hash)
|
183
|
+
|
184
|
+
v1, v2 = [:min, :avg, :max], [:tables, :entries, :collisions]
|
185
|
+
|
186
|
+
puts 'number of records: %d' % r
|
187
|
+
puts 'key min/avg/max length: %d/%d/%d' % k.values_at(*v1)
|
188
|
+
puts 'val min/avg/max length: %d/%d/%d' % v.values_at(*v1)
|
189
|
+
next # TODO: hash table stats
|
190
|
+
puts 'hash tables/entries/collisions: %d/%d/%d' % h.values_at(*v2)
|
191
|
+
puts 'hash table min/avg/max length: %d/%d/%d' % h.values_at(*v1)
|
192
|
+
puts 'hash table distances:'
|
193
|
+
|
194
|
+
d = h[:distances]
|
195
|
+
0.upto(9) { |i| puts ' d%d: %6d %2d%%' % [i, *d[i]] }
|
196
|
+
puts ' >9: %6d %2d%%' % d[-1]
|
197
|
+
}
|
198
|
+
end
|
199
|
+
|
89
200
|
private
|
90
201
|
|
91
202
|
def _open_args(path, mode)
|
@@ -145,11 +256,11 @@ module LibCDB
|
|
145
256
|
end
|
146
257
|
|
147
258
|
def_delegators :reader, :[], :dump, :each, :each_dump, :each_key,
|
148
|
-
:each_value, :empty?, :
|
149
|
-
:
|
150
|
-
:
|
151
|
-
:length, :member?, :rget, :size,
|
152
|
-
:to_h, :total, :value?, :values, :values_at
|
259
|
+
:each_value, :empty?, :encoding, :encoding=,
|
260
|
+
:fetch, :fetch_all, :fetch_first, :fetch_last,
|
261
|
+
:get, :has_key?, :has_value?, :include?, :key,
|
262
|
+
:key?, :keys, :length, :member?, :rget, :size,
|
263
|
+
:to_a, :to_h, :total, :value?, :values, :values_at
|
153
264
|
|
154
265
|
def_delegators :writer, :<<, :[]=, :add, :insert, :replace, :store
|
155
266
|
|