rocksdb-ruby 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +11 -5
- data/ext/rocksdb/rocksdb_rb.cc +104 -20
- data/lib/rocksdb/ruby/version.rb +1 -1
- data/spec/db_spec.rb +35 -10
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bc1e5a783225ab8620f3f704c1bc1a26bf2553e1
|
4
|
+
data.tar.gz: 160e91cf18f55e4b9e381793433ad8d7ad105133
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 13df5b7e0bed1234d6a0a7f603ff02b9f2a971137ffb2d21f4b440571668de43f6615301722a32a0153d1c8241147f204e561423676e965e3e5c165edb25b966
|
7
|
+
data.tar.gz: c5b5fb9d7376f5e05c3f45a0c2e401b0f953a5169fb555528d21ade062329cfaca1ac702e0a4c9bd49adf9254d9dc3de5c8cd68fc28d8d24a2dd3b3f4d5d8a28
|
data/README.md
CHANGED
@@ -28,11 +28,17 @@ Or install it yourself as:
|
|
28
28
|
|
29
29
|
key = "test"
|
30
30
|
value = "1"
|
31
|
-
|
32
|
-
|
33
|
-
new_value =
|
34
|
-
|
35
|
-
|
31
|
+
rocksdb = RocksDB::DB.new "/tmp/file"
|
32
|
+
rocksdb.put(key, value)
|
33
|
+
new_value = rocksdb.get(key)
|
34
|
+
rocksdb.delete(key)
|
35
|
+
|
36
|
+
batch = RocksDB::Batch.new
|
37
|
+
batch.delete("test:batch1")
|
38
|
+
batch.put("test:batch2", "b")
|
39
|
+
rocksdb.write(batch)
|
40
|
+
|
41
|
+
rocksdb.close
|
36
42
|
|
37
43
|
|
38
44
|
## Contributing
|
data/ext/rocksdb/rocksdb_rb.cc
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
#include "rocksdb/db.h"
|
2
|
+
#include "rocksdb/write_batch.h"
|
2
3
|
#include <iostream>
|
3
4
|
|
4
5
|
extern "C" {
|
@@ -8,28 +9,46 @@ extern "C" {
|
|
8
9
|
|
9
10
|
typedef VALUE (*METHOD)(...);
|
10
11
|
|
11
|
-
VALUE
|
12
|
-
VALUE
|
13
|
-
VALUE
|
14
|
-
VALUE
|
15
|
-
VALUE
|
16
|
-
|
12
|
+
VALUE rocksdb_db_init(int argc, VALUE* argv, VALUE self);
|
13
|
+
VALUE rocksdb_db_put(VALUE self, VALUE v_key, VALUE v_value);
|
14
|
+
VALUE rocksdb_db_write(VALUE self, VALUE v_write);
|
15
|
+
VALUE rocksdb_db_get(VALUE self, VALUE v_key);
|
16
|
+
VALUE rocksdb_db_multi_get(VALUE self, VALUE v_array);
|
17
|
+
VALUE rocksdb_db_delete(VALUE self, VALUE v_key);
|
18
|
+
VALUE rocksdb_db_close();
|
19
|
+
|
20
|
+
VALUE rocksdb_write_batch_init();
|
21
|
+
VALUE batch_alloc(VALUE klass);
|
22
|
+
VALUE rocksdb_write_batch_put(VALUE self, VALUE v_key, VALUE v_value);
|
23
|
+
VALUE rocksdb_write_batch_delete(VALUE self, VALUE v_key);
|
17
24
|
|
18
25
|
rocksdb::DB* db;
|
19
26
|
|
20
27
|
void Init_RocksDB(){
|
21
28
|
|
22
29
|
VALUE cRocksdb;
|
30
|
+
VALUE cRocksdb_db;
|
31
|
+
VALUE cRocksdb_write_batch;
|
23
32
|
|
24
33
|
cRocksdb = rb_define_class("RocksDB", rb_cObject);
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
rb_define_method(
|
29
|
-
rb_define_method(
|
34
|
+
cRocksdb_db = rb_define_class_under(cRocksdb, "DB", rb_cObject);
|
35
|
+
|
36
|
+
rb_define_private_method(cRocksdb_db, "initialize", (METHOD)rocksdb_db_init, -1);
|
37
|
+
rb_define_method(cRocksdb_db, "put", (METHOD)rocksdb_db_put, 2);
|
38
|
+
rb_define_method(cRocksdb_db, "write", (METHOD)rocksdb_db_write, 1);
|
39
|
+
rb_define_method(cRocksdb_db, "get", (METHOD)rocksdb_db_get, 1);
|
40
|
+
rb_define_method(cRocksdb_db, "multi_get", (METHOD)rocksdb_db_multi_get, 1);
|
41
|
+
rb_define_method(cRocksdb_db, "delete", (METHOD)rocksdb_db_delete, 1);
|
42
|
+
rb_define_method(cRocksdb_db, "close", (METHOD)rocksdb_db_close, 0);
|
43
|
+
|
44
|
+
cRocksdb_write_batch = rb_define_class_under(cRocksdb, "Batch", rb_cObject);
|
45
|
+
rb_define_alloc_func(cRocksdb_write_batch, batch_alloc);
|
46
|
+
rb_define_private_method(cRocksdb_write_batch, "initialize", (METHOD)rocksdb_write_batch_init, 0);
|
47
|
+
rb_define_method(cRocksdb_write_batch, "put", (METHOD)rocksdb_write_batch_put, 2);
|
48
|
+
rb_define_method(cRocksdb_write_batch, "delete", (METHOD)rocksdb_write_batch_delete, 1);
|
30
49
|
}
|
31
|
-
|
32
|
-
VALUE
|
50
|
+
|
51
|
+
VALUE rocksdb_db_init(int argc, VALUE* argv, VALUE self) {
|
33
52
|
VALUE v_db_file_name;
|
34
53
|
|
35
54
|
rb_scan_args(argc, argv, "01", &v_db_file_name);
|
@@ -43,7 +62,7 @@ extern "C" {
|
|
43
62
|
return status.ok() ? Qtrue : Qfalse;
|
44
63
|
}
|
45
64
|
|
46
|
-
VALUE
|
65
|
+
VALUE rocksdb_db_put(VALUE self, VALUE v_key, VALUE v_value) {
|
47
66
|
Check_Type(v_key, T_STRING);
|
48
67
|
Check_Type(v_value, T_STRING);
|
49
68
|
|
@@ -55,7 +74,15 @@ extern "C" {
|
|
55
74
|
return status.ok() ? Qtrue : Qfalse;
|
56
75
|
}
|
57
76
|
|
58
|
-
VALUE
|
77
|
+
VALUE rocksdb_db_write(VALUE self, VALUE v_write){
|
78
|
+
rocksdb::WriteBatch *batch;
|
79
|
+
Data_Get_Struct(v_write, rocksdb::WriteBatch, batch);
|
80
|
+
|
81
|
+
rocksdb::Status status = db->Write(rocksdb::WriteOptions(), batch);
|
82
|
+
return status.ok() ? Qtrue : Qfalse;
|
83
|
+
}
|
84
|
+
|
85
|
+
VALUE rocksdb_db_get(VALUE self, VALUE v_key){
|
59
86
|
Check_Type(v_key, T_STRING);
|
60
87
|
|
61
88
|
std::string key = std::string((char*)RSTRING_PTR(v_key));
|
@@ -65,17 +92,74 @@ extern "C" {
|
|
65
92
|
return rb_str_new(value.data(), value.size());
|
66
93
|
}
|
67
94
|
|
68
|
-
VALUE rocksdb_delete(VALUE self, VALUE v_key){
|
69
|
-
Check_Type(v_key, T_STRING);
|
70
95
|
|
96
|
+
VALUE rocksdb_db_multi_get(VALUE self, VALUE v_array){
|
97
|
+
Check_Type(v_array, T_ARRAY);
|
98
|
+
|
99
|
+
long i;
|
100
|
+
VALUE *tmp = RARRAY_PTR(v_array);
|
101
|
+
long length = RARRAY_LEN(v_array);
|
102
|
+
std::vector<std::string> values(length);
|
103
|
+
std::vector<rocksdb::Slice> keys(length);
|
104
|
+
std::vector<rocksdb::Status> status;
|
105
|
+
|
106
|
+
for(i=0; i < length; i++){
|
107
|
+
keys[i] = rocksdb::Slice((char*)RSTRING_PTR(*tmp));
|
108
|
+
tmp++;
|
109
|
+
}
|
110
|
+
|
111
|
+
status = db->MultiGet(rocksdb::ReadOptions(),keys,&values);
|
112
|
+
for(i=0; i < length; i++){
|
113
|
+
RARRAY_PTR(v_array)[i] = rb_str_new(values[i].data(), values[i].size());
|
114
|
+
}
|
115
|
+
return v_array;
|
116
|
+
}
|
117
|
+
|
118
|
+
VALUE rocksdb_db_delete(VALUE self, VALUE v_key){
|
119
|
+
Check_Type(v_key, T_STRING);
|
120
|
+
|
71
121
|
std::string key = std::string((char*)RSTRING_PTR(v_key));
|
72
122
|
rocksdb::Status status = db->Delete(rocksdb::WriteOptions(), key);
|
73
|
-
|
123
|
+
|
74
124
|
return status.ok() ? Qtrue : Qfalse;
|
75
125
|
}
|
76
|
-
|
77
|
-
VALUE
|
126
|
+
|
127
|
+
VALUE rocksdb_db_close(){
|
78
128
|
delete db;
|
79
129
|
return Qnil;
|
80
130
|
}
|
131
|
+
|
132
|
+
VALUE batch_alloc(VALUE klass){
|
133
|
+
rocksdb::WriteBatch *batch = ALLOC(rocksdb::WriteBatch);
|
134
|
+
batch = new rocksdb::WriteBatch;
|
135
|
+
return Data_Wrap_Struct(klass, 0, -1, batch);
|
136
|
+
}
|
137
|
+
|
138
|
+
VALUE rocksdb_write_batch_init(){
|
139
|
+
return Qtrue;
|
140
|
+
}
|
141
|
+
VALUE rocksdb_write_batch_put(VALUE self, VALUE v_key, VALUE v_value){
|
142
|
+
Check_Type(v_key, T_STRING);
|
143
|
+
Check_Type(v_value, T_STRING);
|
144
|
+
|
145
|
+
rocksdb::WriteBatch *batch;
|
146
|
+
std::string key = std::string((char*)RSTRING_PTR(v_key));
|
147
|
+
std::string value = std::string((char*)RSTRING_PTR(v_value));
|
148
|
+
|
149
|
+
Data_Get_Struct(self, rocksdb::WriteBatch, batch);
|
150
|
+
batch->Put(key, value);
|
151
|
+
return Qnil;
|
152
|
+
}
|
153
|
+
VALUE rocksdb_write_batch_delete(VALUE self, VALUE v_key){
|
154
|
+
Check_Type(v_key, T_STRING);
|
155
|
+
|
156
|
+
rocksdb::WriteBatch *batch;
|
157
|
+
std::string key = std::string((char*)RSTRING_PTR(v_key));
|
158
|
+
|
159
|
+
Data_Get_Struct(self, rocksdb::WriteBatch, batch);
|
160
|
+
batch->Delete(key);
|
161
|
+
|
162
|
+
return Qnil;
|
163
|
+
}
|
164
|
+
|
81
165
|
}
|
data/lib/rocksdb/ruby/version.rb
CHANGED
data/spec/db_spec.rb
CHANGED
@@ -3,29 +3,54 @@ require "RocksDB"
|
|
3
3
|
|
4
4
|
describe RocksDB do
|
5
5
|
before do
|
6
|
-
@
|
6
|
+
@rocksdb = RocksDB::DB.new "/tmp/file"
|
7
7
|
end
|
8
8
|
|
9
9
|
it 'should get data' do
|
10
|
-
@
|
11
|
-
@
|
10
|
+
@rocksdb.put("test:read", "1")
|
11
|
+
@rocksdb.get("test:read").should eq "1"
|
12
12
|
end
|
13
13
|
|
14
14
|
it 'should put data' do
|
15
|
-
@
|
16
|
-
@
|
15
|
+
@rocksdb.put("test:put", "2").should be_true
|
16
|
+
@rocksdb.get("test:put").should eq "2"
|
17
17
|
end
|
18
18
|
|
19
19
|
it 'should delete data' do
|
20
|
-
@
|
21
|
-
@
|
20
|
+
@rocksdb.put("test:delete", "3")
|
21
|
+
@rocksdb.get("test:delete").should eq "3"
|
22
22
|
|
23
|
-
@
|
24
|
-
@
|
23
|
+
@rocksdb.delete("test:delete").should be_true
|
24
|
+
@rocksdb.get("test:delete").should be_empty
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'should get multi data' do
|
28
|
+
@rocksdb.put("test:multi1", "a")
|
29
|
+
@rocksdb.put("test:multi2", "b")
|
30
|
+
@rocksdb.put("test:multi3", "c")
|
31
|
+
|
32
|
+
@rocksdb.multi_get(["test:multi1", "test:multi2", "test:multi3"]).should eq ["a", "b", "c"]
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'should put data atomic update' do
|
36
|
+
@rocksdb.put("test:batch1", "a")
|
37
|
+
@rocksdb.delete("test:batch2")
|
38
|
+
|
39
|
+
@rocksdb.get("test:batch1").should eq "a"
|
40
|
+
@rocksdb.get("test:batch").should eq ""
|
41
|
+
|
42
|
+
batch = RocksDB::Batch.new
|
43
|
+
batch.delete("test:batch1")
|
44
|
+
batch.put("test:batch2", "b")
|
45
|
+
@rocksdb.write(batch)
|
46
|
+
|
47
|
+
@rocksdb.get("test:batch1").should eq ""
|
48
|
+
@rocksdb.get("test:batch2").should eq "b"
|
25
49
|
end
|
26
50
|
|
27
51
|
after do
|
28
|
-
@
|
52
|
+
@rocksdb.close
|
29
53
|
end
|
30
54
|
|
31
55
|
end
|
56
|
+
|