rocksdb-ruby 0.2.3 → 1.0.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.
- checksums.yaml +4 -4
- data/.gitignore +4 -0
- data/.travis.yml +53 -15
- data/.travis/after_failure.sh +16 -0
- data/.travis/install.sh +55 -0
- data/README.md +392 -31
- data/ext/rocksdb/extconf.rb +8 -1
- data/ext/rocksdb/rocksdb_batch_rb.cc +4 -2
- data/ext/rocksdb/rocksdb_batch_rb.h +1 -1
- data/ext/rocksdb/rocksdb_db_rb.cc +198 -247
- data/ext/rocksdb/rocksdb_db_rb.h +19 -10
- data/ext/rocksdb/rocksdb_iterator_rb.cc +285 -40
- data/ext/rocksdb/rocksdb_iterator_rb.h +22 -5
- data/ext/rocksdb/rocksdb_rb.cc +51 -18
- data/ext/rocksdb/rocksdb_rb.h +29 -6
- data/lib/rocksdb.rb +66 -45
- data/lib/rocksdb/ruby/deprecated.rb +29 -0
- data/lib/rocksdb/ruby/version.rb +1 -1
- data/rocksdb-ruby.gemspec +3 -3
- data/spec/db_null_spec.rb +27 -27
- data/spec/db_options_spec.rb +43 -8
- data/spec/db_readonly_spec.rb +44 -16
- data/spec/db_spec.rb +184 -118
- data/spec/iterator_spec.rb +307 -20
- data/spec/spec_helper.rb +17 -1
- metadata +17 -14
data/ext/rocksdb/rocksdb_db_rb.h
CHANGED
@@ -1,30 +1,39 @@
|
|
1
1
|
#include "rocksdb/db.h"
|
2
2
|
#include "rocksdb/write_batch.h"
|
3
|
+
#include "rocksdb/utilities/convenience.h"
|
3
4
|
|
4
5
|
extern "C" {
|
5
6
|
#include <ruby.h>
|
6
|
-
VALUE rocksdb_db_init(
|
7
|
-
VALUE rocksdb_db_init2(int argc, VALUE* argv, VALUE self);
|
7
|
+
VALUE rocksdb_db_init(VALUE self, VALUE v_db_path, VALUE v_readonly, VALUE v_db_options);
|
8
8
|
VALUE db_alloc(VALUE klass);
|
9
|
+
|
10
|
+
VALUE rocksdb_db_close(VALUE self);
|
9
11
|
VALUE rocksdb_db_put(VALUE self, VALUE v_key, VALUE v_value);
|
10
12
|
VALUE rocksdb_db_write(VALUE self, VALUE v_write);
|
11
13
|
VALUE rocksdb_db_property(VALUE self, VALUE v_key);
|
14
|
+
VALUE rocksdb_db_options(VALUE self);
|
12
15
|
VALUE rocksdb_db_get(VALUE self, VALUE v_key);
|
13
16
|
VALUE rocksdb_db_multi_get(VALUE self, VALUE v_array);
|
14
17
|
VALUE rocksdb_db_delete(VALUE self, VALUE v_key);
|
15
18
|
VALUE rocksdb_db_exists(VALUE self, VALUE v_key);
|
16
|
-
|
19
|
+
|
17
20
|
VALUE rocksdb_db_debug(VALUE self);
|
18
|
-
VALUE
|
21
|
+
VALUE rocksdb_db_is_writable(VALUE self);
|
19
22
|
VALUE rocksdb_db_is_open(VALUE self);
|
20
|
-
VALUE
|
23
|
+
VALUE rocksdb_db_to_iterator(VALUE self);
|
21
24
|
VALUE rocksdb_db_each(VALUE self);
|
22
|
-
VALUE rocksdb_db_each_index(VALUE self);
|
23
|
-
VALUE rocksdb_db_each_with_index(VALUE self);
|
24
25
|
VALUE rocksdb_db_reverse_each(VALUE self);
|
26
|
+
VALUE rocksdb_db_each_key(VALUE self);
|
27
|
+
VALUE rocksdb_db_each_pair(VALUE self);
|
28
|
+
VALUE rocksdb_db_each_prefix(VALUE self, VALUE v_prefix);
|
29
|
+
VALUE rocksdb_db_each_range(VALUE self, VALUE v_start, VALUE v_limit);
|
25
30
|
VALUE rocksdb_db_compact(int argc, VALUE* argv, VALUE self);
|
31
|
+
|
32
|
+
VALUE raise_status_error(rocksdb::Status *status);
|
26
33
|
void db_free(rocksdb_pointer* db_pointer);
|
27
|
-
|
28
|
-
|
29
|
-
|
34
|
+
|
35
|
+
rocksdb_pointer* get_db(VALUE *self);
|
36
|
+
rocksdb_pointer* get_db_for_read(VALUE *self);
|
37
|
+
rocksdb_pointer* get_db_for_write(VALUE *self);
|
38
|
+
void check_is_db_ready(rocksdb_pointer *db_pointer);
|
30
39
|
}
|
@@ -1,83 +1,328 @@
|
|
1
1
|
#include "rocksdb_rb.h"
|
2
2
|
#include "rocksdb_batch_rb.h"
|
3
|
+
#include "rocksdb_iterator_rb.h"
|
3
4
|
#include "ruby/encoding.h"
|
4
5
|
#include <iostream>
|
5
6
|
|
6
7
|
extern "C" {
|
7
8
|
#include <ruby.h>
|
9
|
+
#define RB_CLOSE_ITERATOR(klass) (rb_funcall(klass, rb_intern("close"), 0))
|
10
|
+
#define RB_TO_ENUM(klass, method_name) (rb_funcall(klass, rb_intern("to_enum"), 1, ID2SYM(rb_intern(method_name))))
|
11
|
+
#define RB_TO_ENUM_ARGS(klass, method_name, argc, args...) (rb_funcall(klass, rb_intern("to_enum"), argc + 1, ID2SYM(rb_intern(method_name)), args))
|
12
|
+
|
13
|
+
VALUE rocksdb_iterator_alloc(VALUE klass){
|
14
|
+
rocksdb_iterator_pointer* pointer = ALLOC(rocksdb_iterator_pointer);
|
15
|
+
pointer->it = nullptr;
|
16
|
+
pointer->db_pointer = nullptr;
|
17
|
+
return Data_Wrap_Struct(klass, 0, iterator_free, pointer);
|
18
|
+
}
|
19
|
+
|
20
|
+
void iterator_free(rocksdb_iterator_pointer* pointer){
|
21
|
+
if(pointer == nullptr) {
|
22
|
+
return;
|
23
|
+
}
|
24
|
+
|
25
|
+
pointer->db_pointer = nullptr;
|
26
|
+
|
27
|
+
delete pointer;
|
28
|
+
pointer = nullptr;
|
29
|
+
}
|
8
30
|
|
9
31
|
VALUE rocksdb_iterator_seek_to_first(VALUE klass){
|
10
|
-
rocksdb_iterator_pointer*
|
11
|
-
Data_Get_Struct(klass, rocksdb_iterator_pointer , rocksdb_it);
|
12
|
-
rocksdb_it->it->SeekToFirst();
|
32
|
+
rocksdb_iterator_pointer* pointer = get_iterator_for_read(&klass);
|
13
33
|
|
14
|
-
|
34
|
+
pointer->it->SeekToFirst();
|
35
|
+
|
36
|
+
return Qtrue;
|
15
37
|
}
|
16
38
|
|
17
39
|
VALUE rocksdb_iterator_seek_to_last(VALUE klass){
|
18
|
-
rocksdb_iterator_pointer*
|
19
|
-
|
20
|
-
rocksdb_it->it->SeekToLast();
|
40
|
+
rocksdb_iterator_pointer* pointer = get_iterator_for_read(&klass);
|
41
|
+
pointer->it->SeekToLast();
|
21
42
|
|
22
|
-
return
|
43
|
+
return Qtrue;
|
23
44
|
}
|
24
45
|
|
25
46
|
VALUE rocksdb_iterator_seek(VALUE klass, VALUE v_target){
|
26
|
-
|
27
|
-
rocksdb::Slice target = rocksdb::Slice((char*)RSTRING_PTR(v_target), RSTRING_LEN(v_target));
|
47
|
+
rocksdb_iterator_pointer* pointer = get_iterator_for_read(&klass);
|
28
48
|
|
29
|
-
|
30
|
-
|
31
|
-
rocksdb_it->it->Seek(target);
|
49
|
+
rocksdb::Slice target = SLICE_FROM_RB_VALUE(v_target);
|
50
|
+
pointer->it->Seek(target);
|
32
51
|
|
33
|
-
return
|
52
|
+
return Qtrue;
|
34
53
|
}
|
35
54
|
|
36
|
-
|
37
|
-
|
38
|
-
|
55
|
+
#if ROCKSDB_VERSION >= 41100
|
56
|
+
VALUE rocksdb_iterator_seek_for_prev(VALUE klass, VALUE v_target){
|
57
|
+
rocksdb_iterator_pointer* pointer = get_iterator_for_read(&klass);
|
58
|
+
|
59
|
+
rocksdb::Slice target = SLICE_FROM_RB_VALUE(v_target);
|
60
|
+
|
61
|
+
pointer->it->SeekForPrev(target);
|
62
|
+
|
63
|
+
return Qtrue;
|
39
64
|
}
|
65
|
+
#endif
|
40
66
|
|
41
67
|
VALUE rocksdb_iterator_valid(VALUE klass){
|
42
|
-
rocksdb_iterator_pointer*
|
43
|
-
|
44
|
-
|
68
|
+
rocksdb_iterator_pointer* pointer = get_iterator(&klass);
|
69
|
+
|
70
|
+
if(pointer != NULL && pointer->it != NULL) {
|
71
|
+
return pointer->it->Valid() ? Qtrue : Qfalse;
|
72
|
+
}
|
73
|
+
|
74
|
+
// Return falsey Qnil to indicate that iterator is closed
|
75
|
+
return Qnil;
|
45
76
|
}
|
46
77
|
|
47
78
|
VALUE rocksdb_iterator_key(VALUE klass){
|
48
|
-
rocksdb_iterator_pointer*
|
49
|
-
std::string value;
|
79
|
+
rocksdb_iterator_pointer* pointer = get_iterator_for_read(&klass);
|
50
80
|
|
51
|
-
|
52
|
-
|
81
|
+
// It seems to be safe to call `key()` even if iterator is not Valid()
|
82
|
+
rocksdb::Slice key = pointer->it->key();
|
53
83
|
|
54
|
-
return
|
84
|
+
return SLICE_TO_RB_STRING(key);
|
55
85
|
}
|
56
|
-
|
86
|
+
|
57
87
|
VALUE rocksdb_iterator_value(VALUE klass){
|
58
|
-
rocksdb_iterator_pointer*
|
59
|
-
std::string value;
|
88
|
+
rocksdb_iterator_pointer* pointer = get_iterator_for_read(&klass);
|
60
89
|
|
61
|
-
|
62
|
-
|
90
|
+
// It it not safe to call `value()` if iterator is not Valid()
|
91
|
+
if(!pointer->it->Valid()) {
|
92
|
+
return Qnil;
|
93
|
+
}
|
63
94
|
|
64
|
-
|
95
|
+
rocksdb::Slice value = pointer->it->value();
|
65
96
|
|
97
|
+
return SLICE_TO_RB_STRING(value);
|
66
98
|
}
|
67
|
-
|
99
|
+
|
68
100
|
VALUE rocksdb_iterator_next(VALUE klass){
|
69
|
-
rocksdb_iterator_pointer*
|
70
|
-
Data_Get_Struct(klass, rocksdb_iterator_pointer , rocksdb_it);
|
71
|
-
rocksdb_it->it->Next();
|
101
|
+
rocksdb_iterator_pointer* pointer = get_iterator_for_read(&klass);
|
72
102
|
|
73
|
-
|
103
|
+
pointer->it->Next();
|
104
|
+
|
105
|
+
return Qtrue;
|
106
|
+
}
|
107
|
+
|
108
|
+
VALUE rocksdb_iterator_prev(VALUE klass){
|
109
|
+
rocksdb_iterator_pointer* pointer = get_iterator_for_read(&klass);
|
110
|
+
|
111
|
+
pointer->it->Prev();
|
112
|
+
|
113
|
+
return Qtrue;
|
114
|
+
}
|
115
|
+
|
116
|
+
VALUE rocksdb_iterator_each(VALUE klass){
|
117
|
+
rocksdb_iterator_pointer* pointer = get_iterator_for_read(&klass);
|
118
|
+
|
119
|
+
if(!rb_block_given_p()){
|
120
|
+
return RB_TO_ENUM(klass, "each");
|
121
|
+
}
|
122
|
+
|
123
|
+
rocksdb::Iterator* it = pointer->it;
|
124
|
+
|
125
|
+
for (it->SeekToFirst(); it->Valid(); it->Next()) {
|
126
|
+
VALUE v_value = SLICE_TO_RB_STRING(it->value());
|
127
|
+
|
128
|
+
rb_yield(v_value);
|
129
|
+
}
|
130
|
+
|
131
|
+
RB_CLOSE_ITERATOR(klass);
|
132
|
+
return Qtrue;
|
133
|
+
}
|
134
|
+
|
135
|
+
VALUE rocksdb_iterator_reverse_each(VALUE klass){
|
136
|
+
rocksdb_iterator_pointer* pointer = get_iterator_for_read(&klass);
|
137
|
+
|
138
|
+
if(!rb_block_given_p()){
|
139
|
+
return RB_TO_ENUM(klass, "reverse_each");
|
140
|
+
}
|
141
|
+
|
142
|
+
rocksdb::Iterator* it = pointer->it;
|
143
|
+
|
144
|
+
for (it->SeekToLast(); it->Valid(); it->Prev()) {
|
145
|
+
VALUE v_value = SLICE_TO_RB_STRING(it->value());
|
146
|
+
rb_yield(v_value);
|
147
|
+
}
|
148
|
+
|
149
|
+
RB_CLOSE_ITERATOR(klass);
|
150
|
+
return Qtrue;
|
151
|
+
}
|
152
|
+
|
153
|
+
VALUE rocksdb_iterator_each_key(VALUE klass){
|
154
|
+
rocksdb_iterator_pointer* pointer = get_iterator_for_read(&klass);
|
155
|
+
|
156
|
+
if(!rb_block_given_p()){
|
157
|
+
return RB_TO_ENUM(klass, "each_key");
|
158
|
+
}
|
159
|
+
|
160
|
+
rocksdb::Iterator* it = pointer->it;
|
161
|
+
|
162
|
+
for (it->SeekToFirst(); it->Valid(); it->Next()) {
|
163
|
+
VALUE v_key = SLICE_TO_RB_STRING(it->key());
|
164
|
+
|
165
|
+
rb_yield(v_key);
|
166
|
+
}
|
167
|
+
|
168
|
+
RB_CLOSE_ITERATOR(klass);
|
169
|
+
return Qtrue;
|
170
|
+
}
|
171
|
+
|
172
|
+
VALUE rocksdb_iterator_reverse_each_key(VALUE klass){
|
173
|
+
rocksdb_iterator_pointer* pointer = get_iterator_for_read(&klass);
|
174
|
+
|
175
|
+
if(!rb_block_given_p()){
|
176
|
+
return RB_TO_ENUM(klass, "reverse_each_key");
|
177
|
+
}
|
178
|
+
|
179
|
+
rocksdb::Iterator* it = pointer->it;
|
180
|
+
|
181
|
+
for (it->SeekToLast(); it->Valid(); it->Prev()) {
|
182
|
+
VALUE v_key = SLICE_TO_RB_STRING(it->key());
|
183
|
+
rb_yield(v_key);
|
184
|
+
}
|
185
|
+
|
186
|
+
RB_CLOSE_ITERATOR(klass);
|
187
|
+
return Qtrue;
|
188
|
+
}
|
189
|
+
|
190
|
+
VALUE rocksdb_iterator_each_pair(VALUE klass){
|
191
|
+
rocksdb_iterator_pointer* pointer = get_iterator_for_read(&klass);
|
192
|
+
|
193
|
+
if(!rb_block_given_p()){
|
194
|
+
return RB_TO_ENUM(klass, "each_pair");
|
195
|
+
}
|
196
|
+
|
197
|
+
rocksdb::Iterator* it = pointer->it;
|
198
|
+
|
199
|
+
for (it->SeekToFirst(); it->Valid(); it->Next()) {
|
200
|
+
VALUE v_key = SLICE_TO_RB_STRING(it->key());
|
201
|
+
VALUE v_value = SLICE_TO_RB_STRING(it->value());
|
202
|
+
|
203
|
+
rb_yield_values(2, v_key, v_value);
|
204
|
+
}
|
205
|
+
|
206
|
+
RB_CLOSE_ITERATOR(klass);
|
207
|
+
return Qtrue;
|
208
|
+
}
|
209
|
+
|
210
|
+
VALUE rocksdb_iterator_reverse_each_pair(VALUE klass){
|
211
|
+
rocksdb_iterator_pointer* pointer = get_iterator_for_read(&klass);
|
212
|
+
|
213
|
+
if(!rb_block_given_p()){
|
214
|
+
return RB_TO_ENUM(klass, "reverse_each_pair");
|
215
|
+
}
|
216
|
+
|
217
|
+
rocksdb::Iterator* it = pointer->it;
|
218
|
+
|
219
|
+
for (it->SeekToLast(); it->Valid(); it->Prev()) {
|
220
|
+
VALUE v_key = SLICE_TO_RB_STRING(it->key());
|
221
|
+
VALUE v_value = SLICE_TO_RB_STRING(it->value());
|
222
|
+
|
223
|
+
rb_yield_values(2, v_key, v_value);
|
224
|
+
}
|
225
|
+
|
226
|
+
RB_CLOSE_ITERATOR(klass);
|
227
|
+
return Qtrue;
|
228
|
+
}
|
229
|
+
|
230
|
+
VALUE rocksdb_iterator_each_prefix(VALUE klass, VALUE v_prefix){
|
231
|
+
rocksdb_iterator_pointer* pointer = get_iterator_for_read(&klass);
|
232
|
+
|
233
|
+
if(!rb_block_given_p()){
|
234
|
+
return RB_TO_ENUM_ARGS(klass, "each_prefix", 1, v_prefix);
|
235
|
+
}
|
236
|
+
|
237
|
+
rocksdb::Iterator* it = pointer->it;
|
238
|
+
rocksdb::Slice prefix = SLICE_FROM_RB_VALUE(v_prefix);
|
239
|
+
|
240
|
+
for (it->Seek(prefix); it->Valid() && it->key().starts_with(prefix); it->Next()) {
|
241
|
+
VALUE v_key = SLICE_TO_RB_STRING(it->key());
|
242
|
+
VALUE v_value = SLICE_TO_RB_STRING(it->value());
|
243
|
+
|
244
|
+
rb_yield_values(2, v_key, v_value);
|
245
|
+
}
|
246
|
+
|
247
|
+
RB_CLOSE_ITERATOR(klass);
|
248
|
+
return Qtrue;
|
249
|
+
}
|
250
|
+
|
251
|
+
VALUE rocksdb_iterator_each_range(VALUE klass, VALUE v_start, VALUE v_limit){
|
252
|
+
rocksdb_iterator_pointer* pointer = get_iterator_for_read(&klass);
|
253
|
+
|
254
|
+
if(!rb_block_given_p()){
|
255
|
+
return RB_TO_ENUM_ARGS(klass, "each_range", 2, v_start, v_limit);
|
256
|
+
}
|
257
|
+
|
258
|
+
rocksdb::Iterator* it = pointer->it;
|
259
|
+
rocksdb::Slice start = SLICE_FROM_RB_VALUE(v_start);
|
260
|
+
std::string limit = STRING_FROM_RB_VALUE(v_limit);
|
261
|
+
|
262
|
+
for (it->Seek(start); it->Valid() && it->key().ToString() <= limit; it->Next()) {
|
263
|
+
VALUE v_key = SLICE_TO_RB_STRING(it->key());
|
264
|
+
VALUE v_value = SLICE_TO_RB_STRING(it->value());
|
265
|
+
|
266
|
+
rb_yield_values(2, v_key, v_value);
|
267
|
+
}
|
268
|
+
|
269
|
+
RB_CLOSE_ITERATOR(klass);
|
270
|
+
return Qtrue;
|
74
271
|
}
|
75
272
|
|
76
273
|
VALUE rocksdb_iterator_close(VALUE klass){
|
77
|
-
rocksdb_iterator_pointer*
|
78
|
-
Data_Get_Struct(klass, rocksdb_iterator_pointer , rocksdb_it);
|
79
|
-
delete rocksdb_it->it;
|
274
|
+
rocksdb_iterator_pointer* pointer = get_iterator(&klass);
|
80
275
|
|
81
|
-
|
276
|
+
if(pointer == nullptr) {
|
277
|
+
return Qfalse;
|
278
|
+
}
|
279
|
+
|
280
|
+
if(pointer->db_pointer == nullptr) {
|
281
|
+
return Qfalse;
|
282
|
+
}
|
283
|
+
|
284
|
+
if (pointer->db_pointer->db == nullptr) {
|
285
|
+
return Qfalse;
|
286
|
+
}
|
287
|
+
|
288
|
+
if(pointer->it == nullptr) {
|
289
|
+
return Qfalse;
|
290
|
+
}
|
291
|
+
|
292
|
+
pointer->db_pointer = nullptr;
|
293
|
+
|
294
|
+
delete pointer->it;
|
295
|
+
pointer->it = nullptr;
|
296
|
+
|
297
|
+
return Qtrue;
|
298
|
+
}
|
299
|
+
|
300
|
+
rocksdb_iterator_pointer* get_iterator_for_read(VALUE *klass) {
|
301
|
+
rocksdb_iterator_pointer* pointer = get_iterator(klass);
|
302
|
+
|
303
|
+
if (pointer == nullptr) {
|
304
|
+
rb_raise(cRocksdb_iterator_closed, "iterator is not initialized");
|
305
|
+
}
|
306
|
+
|
307
|
+
if (pointer->it == nullptr) {
|
308
|
+
rb_raise(cRocksdb_iterator_closed, "iterator is closed");
|
309
|
+
}
|
310
|
+
|
311
|
+
if (pointer->db_pointer == nullptr) {
|
312
|
+
rb_raise(cRocksdb_database_closed, "database is not initialized");
|
313
|
+
}
|
314
|
+
|
315
|
+
if (pointer->db_pointer->db == nullptr) {
|
316
|
+
rb_raise(cRocksdb_database_closed, "database is closed");
|
317
|
+
}
|
318
|
+
|
319
|
+
return pointer;
|
320
|
+
}
|
321
|
+
|
322
|
+
rocksdb_iterator_pointer* get_iterator(VALUE *klass) {
|
323
|
+
rocksdb_iterator_pointer* pointer;
|
324
|
+
Data_Get_Struct(*klass, rocksdb_iterator_pointer, pointer);
|
325
|
+
|
326
|
+
return pointer;
|
82
327
|
}
|
83
328
|
}
|
@@ -4,18 +4,35 @@
|
|
4
4
|
extern "C" {
|
5
5
|
|
6
6
|
#include <ruby.h>
|
7
|
-
|
7
|
+
|
8
8
|
typedef VALUE (*METHOD)(...);
|
9
|
+
rocksdb_iterator_pointer* get_iterator(VALUE *klass);
|
10
|
+
rocksdb_iterator_pointer* get_iterator_for_read(VALUE *klass);
|
11
|
+
void iterator_free(rocksdb_iterator_pointer* pointer);
|
12
|
+
VALUE rocksdb_iterator_alloc(VALUE klass);
|
9
13
|
|
14
|
+
VALUE rocksdb_iterator_seek(VALUE klass, VALUE v_target);
|
15
|
+
VALUE rocksdb_iterator_seek_for_prev(VALUE klass, VALUE v_target);
|
10
16
|
VALUE rocksdb_iterator_seek_to_first(VALUE klass);
|
11
17
|
VALUE rocksdb_iterator_seek_to_last(VALUE klass);
|
12
|
-
|
13
|
-
VALUE rocksdb_iterator_alloc(VALUE klass);
|
18
|
+
|
14
19
|
VALUE rocksdb_iterator_valid(VALUE klass);
|
15
20
|
VALUE rocksdb_iterator_key(VALUE klass);
|
16
21
|
VALUE rocksdb_iterator_value(VALUE klass);
|
17
22
|
VALUE rocksdb_iterator_next(VALUE klass);
|
23
|
+
VALUE rocksdb_iterator_prev(VALUE klass);
|
18
24
|
VALUE rocksdb_iterator_close(VALUE klass);
|
19
25
|
|
20
|
-
|
21
|
-
|
26
|
+
VALUE rocksdb_iterator_each(VALUE klass);
|
27
|
+
VALUE rocksdb_iterator_reverse_each(VALUE klass);
|
28
|
+
|
29
|
+
VALUE rocksdb_iterator_each_key(VALUE klass);
|
30
|
+
VALUE rocksdb_iterator_reverse_each_key(VALUE klass);
|
31
|
+
|
32
|
+
VALUE rocksdb_iterator_each_pair(VALUE klass);
|
33
|
+
VALUE rocksdb_iterator_reverse_each_pair(VALUE klass);
|
34
|
+
|
35
|
+
VALUE rocksdb_iterator_each_prefix(VALUE klass, VALUE v_prefix);
|
36
|
+
VALUE rocksdb_iterator_each_range(VALUE klass, VALUE v_start, VALUE v_limit);
|
37
|
+
}
|
38
|
+
|