aerospike_native 0.2.1 → 0.3.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/examples/batch.rb +27 -0
- data/ext/aerospike_native/aerospike_native.c +2 -0
- data/ext/aerospike_native/batch.c +213 -0
- data/ext/aerospike_native/batch.h +10 -0
- data/ext/aerospike_native/client.c +10 -0
- data/ext/aerospike_native/common.h +3 -0
- data/ext/aerospike_native/exception.c +13 -0
- data/ext/aerospike_native/record.c +14 -10
- data/lib/aerospike_native/version.rb +1 -1
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cb0270c96b7bd4fa49f251d9b5fd406a21ae109b
|
4
|
+
data.tar.gz: 92c3cdb727dafa076735b779eb198011cb028058
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 27c8668efda00c0a467844f5f840fce63223dbbab69d71e53d8c9177c1bf6a4c23f69fb5366a3092a6b20eb90be95c372126fa1b4de1653533e3596a4957dcdf
|
7
|
+
data.tar.gz: 9d4fde1a9e2942ac4bfbe108cbc6babd807fdf37eef6d67e079cb797297458ab8404971716f7613d2bf1542c2c08ed3bbfdaf4df5b035be96521b492167dfde5
|
data/examples/batch.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
require './common/common'
|
2
|
+
|
3
|
+
def main
|
4
|
+
Common::Common.run_example do |client, namespace, set, logger|
|
5
|
+
20.times do |i|
|
6
|
+
client.put(AerospikeNative::Key.new(namespace, set, i), {'number' => i, 'key' => 'number', 'testbin' => i.to_s})
|
7
|
+
client.put(AerospikeNative::Key.new(namespace, set, "key#{i}"), {'number' => i, 'key' => 'string', 'testbin' => i.to_s})
|
8
|
+
end
|
9
|
+
|
10
|
+
keys = []
|
11
|
+
keys << AerospikeNative::Key.new(namespace, set, 1)
|
12
|
+
keys << AerospikeNative::Key.new(namespace, set, 10)
|
13
|
+
keys << AerospikeNative::Key.new(namespace, set, "key5")
|
14
|
+
keys << AerospikeNative::Key.new(namespace, set, "key26")
|
15
|
+
|
16
|
+
records = client.batch.get_exists(keys)
|
17
|
+
logger.info "fetched records metadata: #{records.inspect}"
|
18
|
+
|
19
|
+
records = client.batch.get(keys)
|
20
|
+
logger.info "fetched records with specified bins: #{records.inspect}"
|
21
|
+
|
22
|
+
records = client.batch.get(keys, bins)
|
23
|
+
logger.info "fetched records with all bins: #{records.inspect}"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
main
|
@@ -5,6 +5,7 @@
|
|
5
5
|
#include "record.h"
|
6
6
|
#include "policy.h"
|
7
7
|
#include "query.h"
|
8
|
+
#include "batch.h"
|
8
9
|
|
9
10
|
VALUE AerospikeNativeClass;
|
10
11
|
|
@@ -14,6 +15,7 @@ void Init_aerospike_native()
|
|
14
15
|
define_exception();
|
15
16
|
define_logger();
|
16
17
|
define_query();
|
18
|
+
define_batch();
|
17
19
|
define_native_key();
|
18
20
|
define_record();
|
19
21
|
define_operation();
|
@@ -0,0 +1,213 @@
|
|
1
|
+
#include "batch.h"
|
2
|
+
#include "client.h"
|
3
|
+
#include "record.h"
|
4
|
+
#include <aerospike/aerospike_batch.h>
|
5
|
+
|
6
|
+
VALUE BatchClass;
|
7
|
+
|
8
|
+
VALUE batch_initialize(VALUE vSelf, VALUE vClient)
|
9
|
+
{
|
10
|
+
check_aerospike_client(vClient);
|
11
|
+
rb_iv_set(vSelf, "@client", vClient);
|
12
|
+
return vSelf;
|
13
|
+
}
|
14
|
+
|
15
|
+
bool batch_read_callback(const as_batch_read* results, uint32_t n, void* udata)
|
16
|
+
{
|
17
|
+
uint32_t i = 0;
|
18
|
+
VALUE vLogger;
|
19
|
+
char sMsg[1000];
|
20
|
+
|
21
|
+
vLogger = rb_cv_get(ClientClass, "@@logger");
|
22
|
+
|
23
|
+
for(i = 0; i < n; i++) {
|
24
|
+
switch(results[i].result) {
|
25
|
+
case AEROSPIKE_OK: {
|
26
|
+
VALUE vRecord = rb_record_from_c(&results[i].record, results[i].key);
|
27
|
+
|
28
|
+
if ( rb_block_given_p() ) {
|
29
|
+
rb_yield(vRecord);
|
30
|
+
} else {
|
31
|
+
VALUE *vArray = (VALUE*) udata;
|
32
|
+
rb_ary_push(*vArray, vRecord);
|
33
|
+
}
|
34
|
+
break;
|
35
|
+
}
|
36
|
+
case AEROSPIKE_ERR_RECORD_NOT_FOUND:
|
37
|
+
sprintf(sMsg, "Aerospike batch read record not found %d", i);
|
38
|
+
rb_funcall(vLogger, rb_intern("warn"), 1, rb_str_new2(sMsg));
|
39
|
+
break;
|
40
|
+
default:
|
41
|
+
sprintf(sMsg, "Aerospike batch read error %d", results[i].result);
|
42
|
+
rb_funcall(vLogger, rb_intern("error"), 1, rb_str_new2(sMsg));
|
43
|
+
}
|
44
|
+
}
|
45
|
+
|
46
|
+
return true;
|
47
|
+
}
|
48
|
+
|
49
|
+
/*
|
50
|
+
* call-seq:
|
51
|
+
* get(keys) -> Array
|
52
|
+
* get(keys, bins) -> Array
|
53
|
+
* get(keys, bins, policy_settings) -> Array
|
54
|
+
* get(keys, policy_settings) -> Array
|
55
|
+
* get(keys, ...) { |record| ... } -> Nil
|
56
|
+
*
|
57
|
+
* batch get records by keys with specified bins
|
58
|
+
*/
|
59
|
+
VALUE batch_get(int argc, VALUE* vArgs, VALUE vSelf)
|
60
|
+
{
|
61
|
+
VALUE vKeys, vClient, vArray, vBins;
|
62
|
+
|
63
|
+
as_batch batch;
|
64
|
+
as_policy_batch policy;
|
65
|
+
as_key* key;
|
66
|
+
aerospike* ptr;
|
67
|
+
as_error err;
|
68
|
+
|
69
|
+
uint32_t n = 0, idx = 0, bins_idx = 0;
|
70
|
+
|
71
|
+
if (argc > 3 || argc < 1) { // there should only be 1, 2 or 3 arguments
|
72
|
+
rb_raise(rb_eArgError, "wrong number of arguments (%d for 1..3)", argc);
|
73
|
+
}
|
74
|
+
|
75
|
+
vKeys = vArgs[0];
|
76
|
+
Check_Type(vKeys, T_ARRAY);
|
77
|
+
as_policy_batch_init(&policy);
|
78
|
+
|
79
|
+
if (argc == 3) {
|
80
|
+
vBins = vArgs[1];
|
81
|
+
Check_Type(vBins, T_ARRAY);
|
82
|
+
bins_idx = RARRAY_LEN(vBins);
|
83
|
+
|
84
|
+
if (TYPE(vArgs[2]) != T_NIL) {
|
85
|
+
SET_POLICY(policy, vArgs[2]);
|
86
|
+
}
|
87
|
+
} else {
|
88
|
+
switch(TYPE(vArgs[1])) {
|
89
|
+
case T_NIL:
|
90
|
+
break;
|
91
|
+
case T_ARRAY:
|
92
|
+
vBins = vArgs[1];
|
93
|
+
bins_idx = RARRAY_LEN(vBins);
|
94
|
+
break;
|
95
|
+
case T_HASH: {
|
96
|
+
SET_POLICY(policy, vArgs[1]);
|
97
|
+
break;
|
98
|
+
}
|
99
|
+
default:
|
100
|
+
rb_raise(rb_eTypeError, "wrong argument type (expected Array or Hash)");
|
101
|
+
}
|
102
|
+
}
|
103
|
+
|
104
|
+
idx = RARRAY_LEN(vKeys);
|
105
|
+
as_batch_inita(&batch, idx);
|
106
|
+
|
107
|
+
for(n = 0; n < idx; n++) {
|
108
|
+
VALUE vKey = rb_ary_entry(vKeys, n);
|
109
|
+
Data_Get_Struct(vKey, as_key, key);
|
110
|
+
as_key_init_value(as_batch_keyat(&batch, n), key->ns, key->set, key->valuep);
|
111
|
+
}
|
112
|
+
|
113
|
+
vClient = rb_iv_get(vSelf, "@client");
|
114
|
+
Data_Get_Struct(vClient, aerospike, ptr);
|
115
|
+
|
116
|
+
vArray = rb_ary_new();
|
117
|
+
if (bins_idx > 0) {
|
118
|
+
char* sBins[bins_idx];
|
119
|
+
for(n = 0; n < bins_idx; n++) {
|
120
|
+
VALUE vEl = rb_ary_entry(vBins, n);
|
121
|
+
GET_STRING(vEl);
|
122
|
+
sBins[n] = StringValueCStr(vEl);
|
123
|
+
}
|
124
|
+
if (aerospike_batch_get_bins(ptr, &err, &policy, &batch, sBins, bins_idx, batch_read_callback, &vArray) != AEROSPIKE_OK) {
|
125
|
+
as_batch_destroy(&batch);
|
126
|
+
raise_aerospike_exception(err.code, err.message);
|
127
|
+
}
|
128
|
+
} else {
|
129
|
+
if (aerospike_batch_get(ptr, &err, &policy, &batch, batch_read_callback, &vArray) != AEROSPIKE_OK) {
|
130
|
+
as_batch_destroy(&batch);
|
131
|
+
raise_aerospike_exception(err.code, err.message);
|
132
|
+
}
|
133
|
+
}
|
134
|
+
|
135
|
+
as_batch_destroy(&batch);
|
136
|
+
if ( rb_block_given_p() ) {
|
137
|
+
return Qnil;
|
138
|
+
}
|
139
|
+
|
140
|
+
return vArray;
|
141
|
+
}
|
142
|
+
|
143
|
+
// TODO: implement batch read to customize bins for each key
|
144
|
+
// VALUE batch_read(int argc, VALUE* vArgs, VALUE vSelf);
|
145
|
+
|
146
|
+
/*
|
147
|
+
* call-seq:
|
148
|
+
* exists(keys) -> Array
|
149
|
+
* exists(keys, policy_settings) -> Array
|
150
|
+
* exists(keys, ...) { |record| ... } -> Nil
|
151
|
+
* exists(keys, policy_settings) { |record| ... } -> Nil
|
152
|
+
*
|
153
|
+
* batch get metatdata of records (ttl, gen)
|
154
|
+
*/
|
155
|
+
VALUE batch_exists(int argc, VALUE* vArgs, VALUE vSelf)
|
156
|
+
{
|
157
|
+
VALUE vKeys, vClient, vArray;
|
158
|
+
|
159
|
+
as_batch batch;
|
160
|
+
as_policy_batch policy;
|
161
|
+
as_key* key;
|
162
|
+
aerospike* ptr;
|
163
|
+
as_error err;
|
164
|
+
|
165
|
+
uint32_t n = 0, idx = 0;
|
166
|
+
|
167
|
+
if (argc > 2 || argc < 1) { // there should only be 1 or 2 arguments
|
168
|
+
rb_raise(rb_eArgError, "wrong number of arguments (%d for 1..2)", argc);
|
169
|
+
}
|
170
|
+
|
171
|
+
vKeys = vArgs[0];
|
172
|
+
Check_Type(vKeys, T_ARRAY);
|
173
|
+
|
174
|
+
as_policy_batch_init(&policy);
|
175
|
+
if (argc == 2 && TYPE(vArgs[1]) != T_NIL) {
|
176
|
+
SET_POLICY(policy, vArgs[1]);
|
177
|
+
}
|
178
|
+
|
179
|
+
idx = RARRAY_LEN(vKeys);
|
180
|
+
as_batch_inita(&batch, idx);
|
181
|
+
|
182
|
+
for(n = 0; n < idx; n++) {
|
183
|
+
VALUE vKey = rb_ary_entry(vKeys, n);
|
184
|
+
Data_Get_Struct(vKey, as_key, key);
|
185
|
+
as_key_init_value(as_batch_keyat(&batch, n), key->ns, key->set, key->valuep);
|
186
|
+
}
|
187
|
+
|
188
|
+
vClient = rb_iv_get(vSelf, "@client");
|
189
|
+
Data_Get_Struct(vClient, aerospike, ptr);
|
190
|
+
|
191
|
+
vArray = rb_ary_new();
|
192
|
+
if (aerospike_batch_exists(ptr, &err, &policy, &batch, batch_read_callback, &vArray) != AEROSPIKE_OK) {
|
193
|
+
as_batch_destroy(&batch);
|
194
|
+
raise_aerospike_exception(err.code, err.message);
|
195
|
+
}
|
196
|
+
as_batch_destroy(&batch);
|
197
|
+
|
198
|
+
if ( rb_block_given_p() ) {
|
199
|
+
return Qnil;
|
200
|
+
}
|
201
|
+
|
202
|
+
return vArray;
|
203
|
+
}
|
204
|
+
|
205
|
+
void define_batch()
|
206
|
+
{
|
207
|
+
BatchClass = rb_define_class_under(AerospikeNativeClass, "Batch", rb_cObject);
|
208
|
+
rb_define_method(BatchClass, "initialize", batch_initialize, 1);
|
209
|
+
rb_define_method(BatchClass, "get", batch_get, -1);
|
210
|
+
rb_define_method(BatchClass, "exists", batch_exists, -1);
|
211
|
+
|
212
|
+
rb_define_attr(BatchClass, "client", 1, 0);
|
213
|
+
}
|
@@ -3,6 +3,7 @@
|
|
3
3
|
#include "key.h"
|
4
4
|
#include "record.h"
|
5
5
|
#include "query.h"
|
6
|
+
#include "batch.h"
|
6
7
|
#include <aerospike/as_key.h>
|
7
8
|
#include <aerospike/as_operations.h>
|
8
9
|
#include <aerospike/aerospike_key.h>
|
@@ -654,6 +655,14 @@ VALUE client_set_log_level(VALUE vSelf, VALUE vLevel)
|
|
654
655
|
return rb_funcall(vLogger, rb_intern("set_level"), 1, vLevel);
|
655
656
|
}
|
656
657
|
|
658
|
+
VALUE client_batch(VALUE vSelf)
|
659
|
+
{
|
660
|
+
VALUE vParams[1];
|
661
|
+
|
662
|
+
vParams[0] = vSelf;
|
663
|
+
return rb_class_new_instance(1, vParams, BatchClass);
|
664
|
+
}
|
665
|
+
|
657
666
|
void define_client()
|
658
667
|
{
|
659
668
|
ClientClass = rb_define_class_under(AerospikeNativeClass, "Client", rb_cObject);
|
@@ -668,6 +677,7 @@ void define_client()
|
|
668
677
|
rb_define_method(ClientClass, "create_index", client_create_index, -1);
|
669
678
|
rb_define_method(ClientClass, "drop_index", client_drop_index, -1);
|
670
679
|
rb_define_method(ClientClass, "query", client_query, 2);
|
680
|
+
rb_define_method(ClientClass, "batch", client_batch, 0);
|
671
681
|
|
672
682
|
rb_cv_set(ClientClass, "@@logger", rb_class_new_instance(0, NULL, LoggerClass));
|
673
683
|
rb_define_singleton_method(ClientClass, "set_logger", client_set_logger, 1);
|
@@ -21,6 +21,9 @@ VALUE rb_hash_keys(VALUE hash);
|
|
21
21
|
VALUE vTimeout; \
|
22
22
|
Check_Type(vSettings, T_HASH); \
|
23
23
|
vTimeout = rb_hash_aref(vSettings, rb_str_new2("timeout")); \
|
24
|
+
if (TYPE(vTimeout) == T_NIL) { \
|
25
|
+
vTimeout = rb_hash_aref(vSettings, ID2SYM(rb_intern("timeout"))); \
|
26
|
+
} \
|
24
27
|
if (TYPE(vTimeout) == T_FIXNUM) { \
|
25
28
|
policy.timeout = NUM2UINT( vTimeout ); \
|
26
29
|
}
|
@@ -10,10 +10,23 @@ VALUE exception_initialize(VALUE vSelf, VALUE vMessage)
|
|
10
10
|
return vSelf;
|
11
11
|
}
|
12
12
|
|
13
|
+
VALUE exception_inspect(VALUE vSelf)
|
14
|
+
{
|
15
|
+
VALUE vCode, vMsg;
|
16
|
+
char sMsg[200];
|
17
|
+
|
18
|
+
vCode = rb_iv_get(vSelf, "@code");
|
19
|
+
vMsg = rb_iv_get(vSelf, "@message");
|
20
|
+
sprintf(sMsg, "#<AerospikeNative::Exception: @code=%d, @message=\"%s\">", NUM2INT(vCode), StringValueCStr(vMsg));
|
21
|
+
|
22
|
+
return rb_str_new2(sMsg);
|
23
|
+
}
|
24
|
+
|
13
25
|
void define_exception()
|
14
26
|
{
|
15
27
|
ExceptionClass = rb_define_class_under(AerospikeNativeClass, "Exception", rb_eStandardError);
|
16
28
|
rb_define_method(ExceptionClass, "initialize", exception_initialize, 1);
|
29
|
+
rb_define_method(ExceptionClass, "inspect", exception_inspect, 0);
|
17
30
|
rb_define_attr(ExceptionClass, "code", 1, 0);
|
18
31
|
rb_define_attr(ExceptionClass, "message", 1, 0);
|
19
32
|
|
@@ -43,15 +43,18 @@ VALUE rb_record_from_c(as_record* record, as_key* key)
|
|
43
43
|
|
44
44
|
vKeyParams[0] = rb_str_new2(current_key.ns);
|
45
45
|
vKeyParams[1] = rb_str_new2(current_key.set);
|
46
|
+
vKeyParams[2] = Qnil;
|
46
47
|
|
47
|
-
if (current_key.valuep
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
48
|
+
if (current_key.valuep != NULL) {
|
49
|
+
switch( as_val_type(current_key.valuep) ) {
|
50
|
+
case AS_INTEGER:
|
51
|
+
vKeyParams[2] = INT2NUM(as_integer_get(current_key.valuep));
|
52
|
+
break;
|
53
|
+
case AS_STRING:
|
54
|
+
if (current_key.value.string.len > 0) {
|
55
|
+
vKeyParams[2] = rb_str_new2(as_string_get(current_key.valuep));
|
56
|
+
}
|
57
|
+
break;
|
55
58
|
}
|
56
59
|
}
|
57
60
|
vKeyParams[3] = rb_str_new(current_key.digest.value, AS_DIGEST_VALUE_SIZE);
|
@@ -69,12 +72,13 @@ VALUE rb_record_from_c(as_record* record, as_key* key)
|
|
69
72
|
rb_hash_aset(vParams[1], rb_str_new2(bin.name), Qnil);
|
70
73
|
break;
|
71
74
|
case AS_INTEGER:
|
72
|
-
rb_hash_aset(vParams[1], rb_str_new2(bin.name), LONG2NUM(bin.valuep
|
75
|
+
rb_hash_aset(vParams[1], rb_str_new2(bin.name), LONG2NUM(as_integer_get(bin.valuep)));
|
73
76
|
break;
|
74
77
|
case AS_STRING:
|
75
|
-
rb_hash_aset(vParams[1], rb_str_new2(bin.name), rb_str_new2(bin.valuep
|
78
|
+
rb_hash_aset(vParams[1], rb_str_new2(bin.name), rb_str_new2(as_string_get(bin.valuep)));
|
76
79
|
break;
|
77
80
|
case AS_BYTES: {
|
81
|
+
// as_bytes_get();
|
78
82
|
VALUE vString = rb_str_new(bin.valuep->bytes.value, bin.valuep->bytes.size);
|
79
83
|
rb_hash_aset(vParams[1], rb_str_new2(bin.name), rb_funcall(vMsgPackClass, rb_intern("unpack"), 1, vString));
|
80
84
|
break;
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aerospike_native
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Vladimir Ziablitskii
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-07-
|
11
|
+
date: 2015-07-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: msgpack
|
@@ -95,11 +95,14 @@ files:
|
|
95
95
|
- README.md
|
96
96
|
- Rakefile
|
97
97
|
- aerospike_native.gemspec
|
98
|
+
- examples/batch.rb
|
98
99
|
- examples/common/common.rb
|
99
100
|
- examples/operate.rb
|
100
101
|
- examples/query_and_index.rb
|
101
102
|
- ext/aerospike_native/aerospike_native.c
|
102
103
|
- ext/aerospike_native/aerospike_native.h
|
104
|
+
- ext/aerospike_native/batch.c
|
105
|
+
- ext/aerospike_native/batch.h
|
103
106
|
- ext/aerospike_native/client.c
|
104
107
|
- ext/aerospike_native/client.h
|
105
108
|
- ext/aerospike_native/common.c
|