aerospike_native 0.1.0 → 0.1.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c51c0e08ade86fe6ee4a30dc9e7013601f4fd500
4
- data.tar.gz: 613a8f40a4f5953a52ec7bf58868d12329a61485
3
+ metadata.gz: c3a4c1501ed65384aa0a0d8dd90db474e0ff72de
4
+ data.tar.gz: 04e3a37359e96e9a753fb2dd88ab1251d68d9290
5
5
  SHA512:
6
- metadata.gz: d0e496f4a413e7c14aac31c9603aecbdd7fc33446928be8087d956e4bb1ec70fd72e909305feb0de3863b4e593f065bbad769e7a482b21f7f68480465fa96373
7
- data.tar.gz: 11fe87341e7d90de314dab1d0369ab931d5e4ce84be95b9fbca1ec1cffb3067a7ed0e2e331540452d7b7adf4ff82c689718347d702a5fc7bd3f3b1f9341114be
6
+ metadata.gz: 9ceaf60e6dbe985eee662d96f931af9caf2a95573f3612a0b53411cf38fd57da4f0e9713092883eaf41301b665ea1bd29e8c1f9792356b62773d2978c54aa3d6
7
+ data.tar.gz: b962db5ee9f2f2d394424c3a7eeaee3f36ff14f613d727337e3251abbb4518881f3e4077fd5ba2591d5543cd5ae81332eb325dd39d9ee6500d5c30beb5e7f34d
data/README.md CHANGED
@@ -28,9 +28,9 @@ Or install it yourself as:
28
28
  * `exixts?` command
29
29
  * `where` command (query support)
30
30
  * :disappointed: Raw (bytes) type is not supported
31
- * Supported timeout for policies
31
+ * Supported policies with all parameters for described commands
32
32
  * Supported digest keys
33
- * Supported exceptions (`AerospikeNative::Exception`) with several error codes constants like `AerospikeNative::Exception::ERR_CLIENT`
33
+ * Supported exceptions (`AerospikeNative::Exception`) with several error codes constants `AerospikeNative::Exception.constants`
34
34
  * Index management (`create_index` and `drop_index`)
35
35
 
36
36
  ## Usage
@@ -4,6 +4,7 @@
4
4
  #include "operation.h"
5
5
  #include "record.h"
6
6
  #include "condition.h"
7
+ #include "policy.h"
7
8
 
8
9
  VALUE AerospikeNativeClass;
9
10
 
@@ -16,6 +17,7 @@ void Init_aerospike_native()
16
17
  define_record();
17
18
  define_operation();
18
19
  define_condition();
20
+ define_policy();
19
21
 
20
22
  rb_define_const(AerospikeNativeClass, "INDEX_NUMERIC", INT2FIX(INDEX_NUMERIC));
21
23
  rb_define_const(AerospikeNativeClass, "INDEX_STRING", INT2FIX(INDEX_STRING));
@@ -30,6 +30,13 @@ static VALUE client_allocate(VALUE klass)
30
30
  return obj;
31
31
  }
32
32
 
33
+ /*
34
+ * call-seq:
35
+ * new() -> AerospikeNative::Client
36
+ * new(hosts) -> AerospikeNative::Client
37
+ *
38
+ * initialize new client, use {'host' => ..., 'port' => ...} for each hosts element
39
+ */
33
40
  VALUE client_initialize(int argc, VALUE* argv, VALUE self)
34
41
  {
35
42
  VALUE ary = Qnil;
@@ -82,6 +89,13 @@ VALUE client_initialize(int argc, VALUE* argv, VALUE self)
82
89
  return self;
83
90
  }
84
91
 
92
+ /*
93
+ * call-seq:
94
+ * put(key, bins) -> true or false
95
+ * put(key, bins, policy_settings) -> true or false
96
+ *
97
+ * put bins to specified key, bins are hash
98
+ */
85
99
  VALUE client_put(int argc, VALUE* vArgs, VALUE vSelf)
86
100
  {
87
101
  VALUE vKey;
@@ -108,8 +122,8 @@ VALUE client_put(int argc, VALUE* vArgs, VALUE vSelf)
108
122
 
109
123
  as_policy_write_init(&policy);
110
124
 
111
- if (argc == 3) {
112
- SET_POLICY(policy, vArgs[2]);
125
+ if (argc == 3 && TYPE(vArgs[2]) != T_NIL) {
126
+ SET_WRITE_POLICY(policy, vArgs[2]);
113
127
  }
114
128
 
115
129
  idx = RHASH_SIZE(vBins);
@@ -135,7 +149,7 @@ VALUE client_put(int argc, VALUE* vArgs, VALUE vSelf)
135
149
  as_record_set_int64(&record, StringValueCStr(bin_name), NUM2LONG(bin_value));
136
150
  break;
137
151
  default:
138
- rb_raise(rb_eArgError, "Incorrect input type (expected string or fixnum)");
152
+ rb_raise(rb_eTypeError, "wrong argument type for bin value (expected Fixnum or String)");
139
153
  break;
140
154
  }
141
155
  }
@@ -151,19 +165,22 @@ VALUE client_put(int argc, VALUE* vArgs, VALUE vSelf)
151
165
  return Qtrue;
152
166
  }
153
167
 
168
+ /*
169
+ * call-seq:
170
+ * get(key) -> AerospikeNative::Record
171
+ * get(key, policy_settings) -> AerospikeNative::Record
172
+ *
173
+ * get record
174
+ */
154
175
  VALUE client_get(int argc, VALUE* vArgs, VALUE vSelf)
155
176
  {
156
177
  VALUE vKey;
157
- VALUE vParams[4];
158
178
 
159
179
  aerospike *ptr;
160
180
  as_key* key;
161
181
  as_error err;
162
182
  as_record* record = NULL;
163
183
  as_policy_read policy;
164
- as_bin bin;
165
-
166
- int n = 0;
167
184
 
168
185
  if (argc > 2 || argc < 1) { // there should only be 1 or 2 arguments
169
186
  rb_raise(rb_eArgError, "wrong number of arguments (%d for 1..2)", argc);
@@ -174,8 +191,8 @@ VALUE client_get(int argc, VALUE* vArgs, VALUE vSelf)
174
191
 
175
192
  as_policy_read_init(&policy);
176
193
 
177
- if (argc == 2) {
178
- SET_POLICY(policy, vArgs[1]);
194
+ if (argc == 2 && TYPE(vArgs[1]) != T_NIL) {
195
+ SET_READ_POLICY(policy, vArgs[1]);
179
196
  }
180
197
 
181
198
  Data_Get_Struct(vSelf, aerospike, ptr);
@@ -186,35 +203,20 @@ VALUE client_get(int argc, VALUE* vArgs, VALUE vSelf)
186
203
  raise_aerospike_exception(err.code, err.message);
187
204
  }
188
205
 
189
- vParams[0] = vKey;
190
- vParams[1] = rb_hash_new();
191
- vParams[2] = UINT2NUM(record->gen);
192
- vParams[3] = UINT2NUM(record->ttl);
193
-
194
- for(n = 0; n < record->bins.size; n++) {
195
- bin = record->bins.entries[n];
196
- switch( as_val_type(bin.valuep) ) {
197
- case AS_INTEGER:
198
- rb_hash_aset(vParams[1], rb_str_new2(bin.name), LONG2NUM(bin.valuep->integer.value));
199
- break;
200
- case AS_STRING:
201
- rb_hash_aset(vParams[1], rb_str_new2(bin.name), rb_str_new2(bin.valuep->string.value));
202
- break;
203
- case AS_UNDEF:
204
- default:
205
- break;
206
- }
207
- }
208
-
209
- as_record_destroy(record);
210
- return rb_class_new_instance(4, vParams, RecordClass);
206
+ return rb_record_from_c(record, key);
211
207
  }
212
208
 
209
+ /*
210
+ * call-seq:
211
+ * operate(key, operations) -> true, false or AerospikeNative::Record
212
+ * operate(key, operations, policy_settings) -> true, false or AerospikeNative::Record
213
+ *
214
+ * perform multiple operations in one transaction, operations are array of AerospikeNative::Operation
215
+ */
213
216
  VALUE client_operate(int argc, VALUE* vArgs, VALUE vSelf)
214
217
  {
215
218
  VALUE vKey;
216
219
  VALUE vOperations;
217
- VALUE vParams[4];
218
220
  long idx = 0, n = 0;
219
221
  bool isset_read = false;
220
222
 
@@ -224,7 +226,6 @@ VALUE client_operate(int argc, VALUE* vArgs, VALUE vSelf)
224
226
  as_error err;
225
227
  as_policy_operate policy;
226
228
  as_record* record = NULL;
227
- as_bin bin;
228
229
 
229
230
  if (argc > 3 || argc < 2) { // there should only be 2 or 3 arguments
230
231
  rb_raise(rb_eArgError, "wrong number of arguments (%d for 2..3)", argc);
@@ -237,8 +238,8 @@ VALUE client_operate(int argc, VALUE* vArgs, VALUE vSelf)
237
238
  Check_Type(vOperations, T_ARRAY);
238
239
  as_policy_operate_init(&policy);
239
240
 
240
- if (argc == 3) {
241
- SET_POLICY(policy, vArgs[2]);
241
+ if (argc == 3 && TYPE(vArgs[2]) != T_NIL) {
242
+ SET_OPERATE_POLICY(policy, vArgs[2]);
242
243
  }
243
244
 
244
245
  idx = RARRAY_LEN(vOperations);
@@ -303,28 +304,7 @@ VALUE client_operate(int argc, VALUE* vArgs, VALUE vSelf)
303
304
 
304
305
  as_operations_destroy(&ops);
305
306
 
306
- vParams[0] = vKey;
307
- vParams[1] = rb_hash_new();
308
- vParams[2] = UINT2NUM(record->gen);
309
- vParams[3] = UINT2NUM(record->ttl);
310
-
311
- for(n = 0; n < record->bins.size; n++) {
312
- bin = record->bins.entries[n];
313
- switch( as_val_type(bin.valuep) ) {
314
- case AS_INTEGER:
315
- rb_hash_aset(vParams[1], rb_str_new2(bin.name), LONG2NUM(bin.valuep->integer.value));
316
- break;
317
- case AS_STRING:
318
- rb_hash_aset(vParams[1], rb_str_new2(bin.name), rb_str_new2(bin.valuep->string.value));
319
- break;
320
- case AS_UNDEF:
321
- default:
322
- break;
323
- }
324
- }
325
-
326
- as_record_destroy(record);
327
- return rb_class_new_instance(4, vParams, RecordClass);
307
+ return rb_record_from_c(record, key);
328
308
  } else {
329
309
  if (aerospike_key_operate(ptr, &err, &policy, key, &ops, NULL) != AEROSPIKE_OK) {
330
310
  as_operations_destroy(&ops);
@@ -336,6 +316,13 @@ VALUE client_operate(int argc, VALUE* vArgs, VALUE vSelf)
336
316
  }
337
317
  }
338
318
 
319
+ /*
320
+ * call-seq:
321
+ * remove(key) -> true or false
322
+ * remove(key, policy_settings) -> true or false
323
+ *
324
+ * remove record
325
+ */
339
326
  VALUE client_remove(int argc, VALUE* vArgs, VALUE vSelf)
340
327
  {
341
328
  VALUE vKey;
@@ -352,8 +339,8 @@ VALUE client_remove(int argc, VALUE* vArgs, VALUE vSelf)
352
339
  vKey = vArgs[0];
353
340
  check_aerospike_key(vKey);
354
341
 
355
- if (argc == 2) {
356
- SET_POLICY(policy, vArgs[2]);
342
+ if (argc == 2 && TYPE(vArgs[2]) != T_NIL) {
343
+ SET_REMOVE_POLICY(policy, vArgs[2]);
357
344
  }
358
345
 
359
346
  Data_Get_Struct(vSelf, aerospike, ptr);
@@ -366,6 +353,13 @@ VALUE client_remove(int argc, VALUE* vArgs, VALUE vSelf)
366
353
  return Qtrue;
367
354
  }
368
355
 
356
+ /*
357
+ * call-seq:
358
+ * exists?(key) -> true or false
359
+ * exists?(key, policy_settings) -> true or false
360
+ *
361
+ * check existing record by key
362
+ */
369
363
  VALUE client_exists(int argc, VALUE* vArgs, VALUE vSelf)
370
364
  {
371
365
  VALUE vKey;
@@ -384,8 +378,8 @@ VALUE client_exists(int argc, VALUE* vArgs, VALUE vSelf)
384
378
  vKey = vArgs[0];
385
379
  check_aerospike_key(vKey);
386
380
 
387
- if (argc == 2) {
388
- SET_POLICY(policy, vArgs[1]);
381
+ if (argc == 2 && TYPE(vArgs[1]) != T_NIL) {
382
+ SET_READ_POLICY(policy, vArgs[1]);
389
383
  }
390
384
 
391
385
  Data_Get_Struct(vSelf, aerospike, ptr);
@@ -405,18 +399,23 @@ VALUE client_exists(int argc, VALUE* vArgs, VALUE vSelf)
405
399
  return Qtrue;
406
400
  }
407
401
 
402
+ /*
403
+ * call-seq:
404
+ * select(key, bins) -> AerospikeNative::Record
405
+ * select(key, bins, policy_settings) -> AerospikeNative::Record
406
+ *
407
+ * select specified bins by key
408
+ */
408
409
  VALUE client_select(int argc, VALUE* vArgs, VALUE vSelf)
409
410
  {
410
411
  VALUE vKey;
411
412
  VALUE vArray;
412
- VALUE vParams[4];
413
413
 
414
414
  aerospike *ptr;
415
415
  as_key* key;
416
416
  as_error err;
417
417
  as_policy_read policy;
418
418
  as_record* record = NULL;
419
- as_bin bin;
420
419
  long n = 0, idx = 0;
421
420
 
422
421
  if (argc > 3 || argc < 2) { // there should only be 2 or 3 arguments
@@ -433,8 +432,8 @@ VALUE client_select(int argc, VALUE* vArgs, VALUE vSelf)
433
432
  return Qfalse;
434
433
  }
435
434
 
436
- if (argc == 3) {
437
- SET_POLICY(policy, vArgs[2]);
435
+ if (argc == 3 && TYPE(vArgs[2]) != T_NIL) {
436
+ SET_READ_POLICY(policy, vArgs[2]);
438
437
  }
439
438
 
440
439
  Data_Get_Struct(vSelf, aerospike, ptr);
@@ -462,30 +461,16 @@ VALUE client_select(int argc, VALUE* vArgs, VALUE vSelf)
462
461
  free(bins[n]);
463
462
  }
464
463
 
465
- vParams[0] = vKey;
466
- vParams[1] = rb_hash_new();
467
- vParams[2] = UINT2NUM(record->gen);
468
- vParams[3] = UINT2NUM(record->ttl);
469
-
470
- for(n = 0; n < record->bins.size; n++) {
471
- bin = record->bins.entries[n];
472
- switch( as_val_type(bin.valuep) ) {
473
- case AS_INTEGER:
474
- rb_hash_aset(vParams[1], rb_str_new2(bin.name), LONG2NUM(bin.valuep->integer.value));
475
- break;
476
- case AS_STRING:
477
- rb_hash_aset(vParams[1], rb_str_new2(bin.name), rb_str_new2(bin.valuep->string.value));
478
- break;
479
- case AS_UNDEF:
480
- default:
481
- break;
482
- }
483
- }
484
-
485
- as_record_destroy(record);
486
- return rb_class_new_instance(4, vParams, RecordClass);
464
+ return rb_record_from_c(record, key);
487
465
  }
488
466
 
467
+ /*
468
+ * call-seq:
469
+ * create_index(namespace, set, bin_name, index_name) -> true or false
470
+ * create_index(namespace, set, bin_name, index_name, policy_settings) -> true or false
471
+ *
472
+ * Create new index, use {'type' => AerospikeNative::INDEX_NUMERIC or AerospikeNative::INDEX_STRING} as policy_settings to define index type
473
+ */
489
474
  VALUE client_create_index(int argc, VALUE* vArgs, VALUE vSelf)
490
475
  {
491
476
  VALUE vNamespace, vSet, vBinName, vIndexName;
@@ -512,9 +497,9 @@ VALUE client_create_index(int argc, VALUE* vArgs, VALUE vSelf)
512
497
  vIndexName = vArgs[3];
513
498
  Check_Type(vIndexName, T_STRING);
514
499
 
515
- if (argc == 5) {
500
+ if (argc == 5 && TYPE(vArgs[4]) != T_NIL) {
516
501
  VALUE vType = Qnil;
517
- SET_POLICY(policy, vArgs[4]);
502
+ SET_INFO_POLICY(policy, vArgs[4]);
518
503
  vType = rb_hash_aref(vArgs[4], rb_str_new2("type"));
519
504
  if (TYPE(vType) == T_FIXNUM) {
520
505
  switch(FIX2INT(vType)) {
@@ -544,13 +529,22 @@ VALUE client_create_index(int argc, VALUE* vArgs, VALUE vSelf)
544
529
 
545
530
  task.as = ptr;
546
531
  strcpy(task.ns, StringValueCStr(vNamespace));
547
- strcpy(task.name, StringValueCStr(vBinName));
532
+ strcpy(task.name, StringValueCStr(vIndexName));
548
533
  task.done = false;
549
- aerospike_index_create_wait(&err, &task, 1000);
534
+ if (aerospike_index_create_wait(&err, &task, 1000) != AEROSPIKE_OK) {
535
+ raise_aerospike_exception(err.code, err.message);
536
+ }
550
537
 
551
538
  return (task.done ? Qtrue : Qfalse);
552
539
  }
553
540
 
541
+ /*
542
+ * call-seq:
543
+ * drop_index(namespace, index_name) -> true or false
544
+ * drop_index(namespace, index_name, policy_settings) -> true or false
545
+ *
546
+ * Remove specified index from node
547
+ */
554
548
  VALUE client_drop_index(int argc, VALUE* vArgs, VALUE vSelf)
555
549
  {
556
550
  VALUE vNamespace, vIndexName;
@@ -569,8 +563,8 @@ VALUE client_drop_index(int argc, VALUE* vArgs, VALUE vSelf)
569
563
  vIndexName = vArgs[1];
570
564
  Check_Type(vIndexName, T_STRING);
571
565
 
572
- if (argc == 3) {
573
- SET_POLICY(policy, vArgs[2]);
566
+ if (argc == 3 && TYPE(vArgs[2]) != T_NIL) {
567
+ SET_INFO_POLICY(policy, vArgs[2]);
574
568
  }
575
569
 
576
570
  Data_Get_Struct(vSelf, aerospike, ptr);
@@ -583,12 +577,8 @@ VALUE client_drop_index(int argc, VALUE* vArgs, VALUE vSelf)
583
577
  }
584
578
 
585
579
  bool query_callback(const as_val *value, void *udata) {
586
- VALUE vParams[4], vKeyParams[4];
587
580
  VALUE vRecord;
588
-
589
581
  as_record *record;
590
- as_bin bin;
591
- int n;
592
582
 
593
583
  if (value == NULL) {
594
584
  // query is complete
@@ -598,54 +588,36 @@ bool query_callback(const as_val *value, void *udata) {
598
588
  record = as_record_fromval(value);
599
589
 
600
590
  if (record != NULL) {
601
- vKeyParams[0] = rb_str_new2(record->key.ns);
602
- vKeyParams[1] = rb_str_new2(record->key.set);
603
-
604
- if (record->key.valuep == NULL) {
605
- vKeyParams[2] = Qnil;
606
- } else {
607
- vKeyParams[2] = rb_str_new2(record->key.value.string.value);
608
- }
609
- vKeyParams[3] = rb_str_new(record->key.digest.value, AS_DIGEST_VALUE_SIZE);
610
-
611
- vParams[0] = rb_class_new_instance(4, vKeyParams, KeyClass);
612
- vParams[1] = rb_hash_new();
613
- vParams[2] = UINT2NUM(record->gen);
614
- vParams[3] = UINT2NUM(record->ttl);
615
-
616
- for(n = 0; n < record->bins.size; n++) {
617
- bin = record->bins.entries[n];
618
- switch( as_val_type(bin.valuep) ) {
619
- case AS_INTEGER:
620
- rb_hash_aset(vParams[1], rb_str_new2(bin.name), LONG2NUM(bin.valuep->integer.value));
621
- break;
622
- case AS_STRING:
623
- rb_hash_aset(vParams[1], rb_str_new2(bin.name), rb_str_new2(bin.valuep->string.value));
624
- break;
625
- case AS_UNDEF:
626
- default:
627
- break;
628
- }
629
- }
630
-
631
- as_record_destroy(record);
632
- vRecord = rb_class_new_instance(4, vParams, RecordClass);
591
+ vRecord = rb_record_from_c(record, NULL);
633
592
 
634
593
  if ( rb_block_given_p() ) {
635
594
  rb_yield(vRecord);
636
595
  } else {
637
- // TODO: write default aggregate block
596
+ VALUE *vArray = (VALUE*) udata;
597
+ rb_ary_push(*vArray, vRecord);
638
598
  }
639
599
  }
640
600
 
641
601
  return true;
642
602
  }
643
603
 
604
+ /*
605
+ * call-seq:
606
+ * where(namespace, set) -> array
607
+ * where(namespace, set, conditions) -> array
608
+ * where(namespace, set, conditions, policy_settings) -> array
609
+ * where(namespace, set) { |record| ... } -> nil
610
+ * where(namespace, set, conditions) { |record| ... } -> nil
611
+ * where(namespace, set, conditions, policy_settings) { |record| ... } -> nil
612
+ *
613
+ * Perform a query with where clause
614
+ */
644
615
  VALUE client_exec_query(int argc, VALUE* vArgs, VALUE vSelf)
645
616
  {
646
617
  VALUE vNamespace;
647
618
  VALUE vSet;
648
619
  VALUE vConditions;
620
+ VALUE vArray;
649
621
 
650
622
  aerospike *ptr;
651
623
  as_error err;
@@ -654,13 +626,8 @@ VALUE client_exec_query(int argc, VALUE* vArgs, VALUE vSelf)
654
626
 
655
627
  int idx = 0, n = 0;
656
628
 
657
- if (argc > 4 || argc < 3) { // there should only be 3 or 4 arguments
658
- rb_raise(rb_eArgError, "wrong number of arguments (%d for 3..4)", argc);
659
- }
660
-
661
- // TODO: write default aggregate block
662
- if ( !rb_block_given_p() ) {
663
- rb_raise(rb_eArgError, "no block given");
629
+ if (argc > 4 || argc < 2) { // there should only be 2, 3 or 4 arguments
630
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 2..4)", argc);
664
631
  }
665
632
 
666
633
  vNamespace = vArgs[0];
@@ -670,18 +637,21 @@ VALUE client_exec_query(int argc, VALUE* vArgs, VALUE vSelf)
670
637
  Check_Type(vSet, T_STRING);
671
638
 
672
639
  vConditions = vArgs[2];
673
- Check_Type(vConditions, T_ARRAY);
640
+ switch(TYPE(vConditions)) {
641
+ case T_NIL:
642
+ break;
643
+ case T_ARRAY:
644
+ idx = RARRAY_LEN(vConditions);
645
+ break;
646
+ default:
647
+ rb_raise(rb_eTypeError, "wrong argument type for condition (expected Array or Nil)");
648
+ }
674
649
 
675
650
  as_policy_query_init(&policy);
676
- if (argc == 4) {
651
+ if (argc == 4 && TYPE(vArgs[3]) != T_NIL) {
677
652
  SET_POLICY(policy, vArgs[3]);
678
653
  }
679
654
 
680
- idx = RARRAY_LEN(vConditions);
681
- if (idx == 0) {
682
- return Qnil;
683
- }
684
-
685
655
  Data_Get_Struct(vSelf, aerospike, ptr);
686
656
 
687
657
  as_query_init(&query, StringValueCStr(vNamespace), StringValueCStr(vSet));
@@ -717,13 +687,18 @@ VALUE client_exec_query(int argc, VALUE* vArgs, VALUE vSelf)
717
687
  }
718
688
  }
719
689
 
720
- if (aerospike_query_foreach(ptr, &err, &policy, &query, query_callback, NULL) != AEROSPIKE_OK) {
690
+ vArray = rb_ary_new();
691
+ if (aerospike_query_foreach(ptr, &err, &policy, &query, query_callback, &vArray) != AEROSPIKE_OK) {
721
692
  as_query_destroy(&query);
722
693
  raise_aerospike_exception(err.code, err.message);
723
694
  }
724
695
  as_query_destroy(&query);
725
696
 
726
- return Qnil;
697
+ if ( rb_block_given_p() ) {
698
+ return Qnil;
699
+ }
700
+
701
+ return vArray;
727
702
  }
728
703
 
729
704
  void define_client()
@@ -7,20 +7,163 @@
7
7
  VALUE rb_hash_keys(VALUE hash);
8
8
 
9
9
  #define SET_POLICY(policy, vSettings) \
10
- switch (TYPE(vSettings)) { \
11
- case T_NIL: \
12
- break; \
13
- case T_HASH: { \
14
- VALUE vTimeout = rb_hash_aref(vSettings, rb_str_new2("timeout")); \
15
- if (TYPE(vTimeout) == T_FIXNUM) { \
16
- policy.timeout = NUM2UINT( vTimeout ); \
10
+ VALUE vTimeout; \
11
+ Check_Type(vSettings, T_HASH); \
12
+ vTimeout = rb_hash_aref(vSettings, rb_str_new2("timeout")); \
13
+ if (TYPE(vTimeout) == T_FIXNUM) { \
14
+ policy.timeout = NUM2UINT( vTimeout ); \
15
+ }
16
+
17
+ #define SET_RETRY_POLICY(policy, vSettings) \
18
+ vRetry = rb_hash_aref(vSettings, rb_str_new2("retry")); \
19
+ if (TYPE(vRetry) == T_FIXNUM) { \
20
+ int policy_retry = FIX2INT(vRetry); \
21
+ switch(policy_retry) { \
22
+ case AS_POLICY_RETRY_NONE: \
23
+ case AS_POLICY_RETRY_ONCE: \
24
+ break; \
25
+ default: \
26
+ rb_raise(rb_eArgError, "Incorrect \"retry\" policy value"); \
27
+ } \
28
+ policy.retry = policy_retry; \
29
+ }
30
+
31
+ #define SET_KEY_POLICY(policy, vSettings) \
32
+ vKey = rb_hash_aref(vSettings, rb_str_new2("key")); \
33
+ if (TYPE(vKey) == T_FIXNUM) { \
34
+ int policy_key = FIX2INT(vKey); \
35
+ switch(policy_key) { \
36
+ case AS_POLICY_KEY_DIGEST: \
37
+ case AS_POLICY_KEY_SEND: \
38
+ break; \
39
+ default: \
40
+ rb_raise(rb_eArgError, "Incorrect \"key\" policy value"); \
41
+ } \
42
+ policy.key = policy_key; \
43
+ }
44
+
45
+ #define SET_GEN_POLICY(policy, vSettings) \
46
+ vGen = rb_hash_aref(vSettings, rb_str_new2("gen")); \
47
+ if (TYPE(vGen) == T_FIXNUM) { \
48
+ int policy_gen = FIX2INT(vGen); \
49
+ switch(policy_gen) { \
50
+ case AS_POLICY_GEN_IGNORE: \
51
+ case AS_POLICY_GEN_EQ: \
52
+ case AS_POLICY_GEN_GT: \
53
+ break; \
54
+ default: \
55
+ rb_raise(rb_eArgError, "Incorrect \"gen\" policy value"); \
56
+ } \
57
+ policy.gen = policy_gen; \
58
+ }
59
+
60
+ #define SET_EXISTS_POLICY(policy, vSettings) \
61
+ vExists = rb_hash_aref(vSettings, rb_str_new2("exists")); \
62
+ if (TYPE(vExists) == T_FIXNUM) { \
63
+ int policy_exists = FIX2INT(vExists); \
64
+ switch(policy_exists) { \
65
+ case AS_POLICY_EXISTS_CREATE: \
66
+ case AS_POLICY_EXISTS_CREATE_OR_REPLACE: \
67
+ case AS_POLICY_EXISTS_IGNORE: \
68
+ case AS_POLICY_EXISTS_REPLACE: \
69
+ case AS_POLICY_EXISTS_UPDATE: \
70
+ break; \
71
+ default: \
72
+ rb_raise(rb_eArgError, "Incorrect \"exists\" policy value"); \
73
+ } \
74
+ policy.exists = policy_exists; \
75
+ }
76
+
77
+ #define SET_COMMIT_LEVEL_POLICY(policy, vSettings) \
78
+ vCommitLevel = rb_hash_aref(vSettings, rb_str_new2("commit_level")); \
79
+ if (TYPE(vCommitLevel) == T_FIXNUM) { \
80
+ int policy_commit = FIX2INT(vCommitLevel); \
81
+ switch(policy_commit) { \
82
+ case AS_POLICY_COMMIT_LEVEL_ALL: \
83
+ case AS_POLICY_COMMIT_LEVEL_MASTER: \
84
+ break; \
85
+ default: \
86
+ rb_raise(rb_eArgError, "Incorrect \"commit_level\" policy value");\
17
87
  } \
18
- break; \
88
+ policy.commit_level = policy_commit; \
89
+ }
90
+
91
+ #define SET_REPLICA_POLICY(policy, vSettings) \
92
+ vReplica = rb_hash_aref(vSettings, rb_str_new2("replica")); \
93
+ if (TYPE(vReplica) == T_FIXNUM) { \
94
+ int policy_replica = FIX2INT(vReplica); \
95
+ switch(policy_replica) { \
96
+ case AS_POLICY_REPLICA_ANY: \
97
+ case AS_POLICY_REPLICA_MASTER: \
98
+ break; \
99
+ default: \
100
+ rb_raise(rb_eArgError, "Incorrect \"replica\" policy value"); \
101
+ } \
102
+ policy.replica = policy_replica; \
103
+ }
104
+
105
+ #define SET_CONSISTENCY_LEVEL_POLICY(policy, vSettings) \
106
+ vConsistencyLevel = rb_hash_aref(vSettings, rb_str_new2("consistency_level")); \
107
+ if (TYPE(vConsistencyLevel) == T_FIXNUM) { \
108
+ int policy_consistency_level = FIX2INT(vConsistencyLevel); \
109
+ switch(policy_consistency_level) { \
110
+ case AS_POLICY_CONSISTENCY_LEVEL_ALL: \
111
+ case AS_POLICY_CONSISTENCY_LEVEL_ONE: \
112
+ break; \
113
+ default: \
114
+ rb_raise(rb_eArgError, "Incorrect \"consistency_level\" policy value"); \
115
+ } \
116
+ policy.consistency_level = policy_consistency_level; \
117
+ }
118
+
119
+ #define SET_WRITE_POLICY(policy, vSettings) \
120
+ VALUE vRetry, vKey, vGen, vExists, vCommitLevel; \
121
+ SET_POLICY(policy, vSettings); \
122
+ SET_RETRY_POLICY(policy, vSettings); \
123
+ SET_KEY_POLICY(policy, vSettings); \
124
+ SET_GEN_POLICY(policy, vSettings); \
125
+ SET_EXISTS_POLICY(policy, vSettings); \
126
+ SET_COMMIT_LEVEL_POLICY(policy, vSettings);
127
+
128
+ #define SET_READ_POLICY(policy, vSettings) \
129
+ VALUE vKey, vReplica, vConsistencyLevel; \
130
+ SET_POLICY(policy, vSettings); \
131
+ SET_KEY_POLICY(policy, vSettings); \
132
+ SET_REPLICA_POLICY(policy, vSettings); \
133
+ SET_CONSISTENCY_LEVEL_POLICY(policy, vSettings);
134
+
135
+ #define SET_OPERATE_POLICY(policy, vSettings) \
136
+ VALUE vRetry, vKey, vGen, vReplica, vConsistencyLevel, vCommitLevel; \
137
+ SET_POLICY(policy, vSettings); \
138
+ SET_RETRY_POLICY(policy, vSettings); \
139
+ SET_KEY_POLICY(policy, vSettings); \
140
+ SET_GEN_POLICY(policy, vSettings); \
141
+ SET_REPLICA_POLICY(policy, vSettings); \
142
+ SET_CONSISTENCY_LEVEL_POLICY(policy, vSettings); \
143
+ SET_COMMIT_LEVEL_POLICY(policy, vSettings);
144
+
145
+ #define SET_REMOVE_POLICY(policy, vSettings) \
146
+ VALUE vRetry, vKey, vGen, vCommitLevel, vGeneration; \
147
+ SET_POLICY(policy, vSettings); \
148
+ SET_RETRY_POLICY(policy, vSettings); \
149
+ SET_KEY_POLICY(policy, vSettings); \
150
+ SET_GEN_POLICY(policy, vSettings); \
151
+ SET_COMMIT_LEVEL_POLICY(policy, vSettings); \
152
+ vGeneration = rb_hash_aref(vSettings, rb_str_new2("generation")); \
153
+ if (TYPE(vGeneration) == T_FIXNUM) { \
154
+ policy.generation = FIX2UINT(vGeneration); \
155
+ }
156
+
157
+ #define SET_INFO_POLICY(policy, vSettings) \
158
+ VALUE vSendAsIs, vCheckBounds; \
159
+ SET_POLICY(policy, vSettings); \
160
+ vSendAsIs = rb_hash_aref(vSettings, rb_str_new2("send_as_is")); \
161
+ if (TYPE(vSendAsIs) != T_NIL) { \
162
+ policy.send_as_is = RTEST(vSendAsIs); \
19
163
  } \
20
- default: \
21
- /* raise exception */ \
22
- Check_Type(vSettings, T_HASH); \
23
- break; \
164
+ vCheckBounds = rb_hash_aref(vSettings, rb_str_new2("check_bounds")); \
165
+ if (TYPE(vCheckBounds) != T_NIL) { \
166
+ policy.check_bounds = RTEST(vCheckBounds); \
24
167
  }
25
168
 
26
169
  #endif // COMMON_H
@@ -29,7 +29,7 @@ VALUE condition_initialize(VALUE vSelf, VALUE vBinName, VALUE vIndexType, VALUE
29
29
  case T_FIXNUM:
30
30
  break;
31
31
  default:
32
- rb_raise(rb_eArgError, "Expected FIXNUM or NIL value");
32
+ rb_raise(rb_eTypeError, "wrong argument type for max value (expected Fixnum or Nil)");
33
33
  }
34
34
  break;
35
35
  case INDEX_STRING:
@@ -39,7 +39,7 @@ VALUE condition_initialize(VALUE vSelf, VALUE vBinName, VALUE vIndexType, VALUE
39
39
  case T_STRING:
40
40
  break;
41
41
  default:
42
- rb_raise(rb_eArgError, "Expected STRING or NIL value");
42
+ rb_raise(rb_eTypeError, "wrong argument type for max value (expected String or Nil)");
43
43
  }
44
44
  break;
45
45
  default:
@@ -80,7 +80,7 @@ VALUE condition_equal(VALUE vSelf, VALUE vBinName, VALUE vVal)
80
80
  index_type = INDEX_STRING;
81
81
  break;
82
82
  default:
83
- rb_raise(rb_eArgError, "Expected only FIXNUM or STRING types");
83
+ rb_raise(rb_eTypeError, "wrong argument type for value (expected Fixnum or String)");
84
84
  }
85
85
 
86
86
  vArgs[0] = vBinName;
@@ -19,6 +19,13 @@ static VALUE key_allocate(VALUE klass)
19
19
  return obj;
20
20
  }
21
21
 
22
+ /*
23
+ * call-seq:
24
+ * new(namespace, set, value) -> AerospikeNative::Key
25
+ * new(namespace, set, value, digest) -> AerospikeNative::Key
26
+ *
27
+ * initialize new key
28
+ */
22
29
  VALUE key_initialize(int argc, VALUE* vArgs, VALUE vSelf)
23
30
  {
24
31
  VALUE vNamespace, vSet, vValue, vDigest = Qnil;
@@ -43,7 +50,7 @@ VALUE key_initialize(int argc, VALUE* vArgs, VALUE vSelf)
43
50
 
44
51
  Data_Get_Struct(vSelf, as_key, ptr);
45
52
 
46
- if(TYPE(vDigest) == T_NIL) {
53
+ if(TYPE(vValue) == T_STRING) {
47
54
  switch(TYPE(vValue)) {
48
55
  case T_FIXNUM:
49
56
  as_key_init_int64(ptr, StringValueCStr( vNamespace ), StringValueCStr( vSet ), FIX2LONG( vValue ));
@@ -2,6 +2,12 @@
2
2
 
3
3
  VALUE OperationClass;
4
4
 
5
+ /*
6
+ * call-seq:
7
+ * new(operation_type, bin_name, bin_value) -> AerospikeNative::Operation
8
+ *
9
+ * initialize new operation for client.operate command
10
+ */
5
11
  VALUE operation_initialize(VALUE vSelf, VALUE vOpType, VALUE vBinName, VALUE vBinValue)
6
12
  {
7
13
  int op_type = 0;
@@ -22,6 +28,12 @@ VALUE operation_initialize(VALUE vSelf, VALUE vOpType, VALUE vBinName, VALUE vBi
22
28
  return vSelf;
23
29
  }
24
30
 
31
+ /*
32
+ * call-seq:
33
+ * write(bin_name, bin_value) -> AerospikeNative::Operation
34
+ *
35
+ * initialize new write operation
36
+ */
25
37
  VALUE operation_write(VALUE vSelf, VALUE vBinName, VALUE vBinValue)
26
38
  {
27
39
  VALUE vArgs[3];
@@ -31,6 +43,12 @@ VALUE operation_write(VALUE vSelf, VALUE vBinName, VALUE vBinValue)
31
43
  return rb_class_new_instance(3, vArgs, vSelf);
32
44
  }
33
45
 
46
+ /*
47
+ * call-seq:
48
+ * append(bin_name, bin_value) -> AerospikeNative::Operation
49
+ *
50
+ * initialize new append operation
51
+ */
34
52
  VALUE operation_append(VALUE vSelf, VALUE vBinName, VALUE vBinValue)
35
53
  {
36
54
  VALUE vArgs[3];
@@ -43,6 +61,12 @@ VALUE operation_append(VALUE vSelf, VALUE vBinName, VALUE vBinValue)
43
61
  return rb_class_new_instance(3, vArgs, vSelf);
44
62
  }
45
63
 
64
+ /*
65
+ * call-seq:
66
+ * prepend(bin_name, bin_value) -> AerospikeNative::Operation
67
+ *
68
+ * initialize new prepend operation
69
+ */
46
70
  VALUE operation_prepend(VALUE vSelf, VALUE vBinName, VALUE vBinValue)
47
71
  {
48
72
  VALUE vArgs[3];
@@ -55,6 +79,12 @@ VALUE operation_prepend(VALUE vSelf, VALUE vBinName, VALUE vBinValue)
55
79
  return rb_class_new_instance(3, vArgs, vSelf);
56
80
  }
57
81
 
82
+ /*
83
+ * call-seq:
84
+ * increment(bin_name, bin_value) -> AerospikeNative::Operation
85
+ *
86
+ * initialize new increment operation
87
+ */
58
88
  VALUE operation_increment(VALUE vSelf, VALUE vBinName, VALUE vBinValue)
59
89
  {
60
90
  VALUE vArgs[3];
@@ -67,6 +97,12 @@ VALUE operation_increment(VALUE vSelf, VALUE vBinName, VALUE vBinValue)
67
97
  return rb_class_new_instance(3, vArgs, vSelf);
68
98
  }
69
99
 
100
+ /*
101
+ * call-seq:
102
+ * touch() -> AerospikeNative::Operation
103
+ *
104
+ * initialize new touch operation
105
+ */
70
106
  VALUE operation_touch(VALUE vSelf)
71
107
  {
72
108
  VALUE vArgs[3];
@@ -77,6 +113,12 @@ VALUE operation_touch(VALUE vSelf)
77
113
  return rb_class_new_instance(3, vArgs, vSelf);
78
114
  }
79
115
 
116
+ /*
117
+ * call-seq:
118
+ * read(bin_name) -> AerospikeNative::Operation
119
+ *
120
+ * initialize new read operation
121
+ */
80
122
  VALUE operation_read(VALUE vSelf, VALUE vBinName)
81
123
  {
82
124
  VALUE vArgs[3];
@@ -0,0 +1,34 @@
1
+ #include "policy.h"
2
+ #include <aerospike/as_policy.h>
3
+
4
+ VALUE PolicyClass;
5
+
6
+ void define_policy()
7
+ {
8
+ PolicyClass = rb_define_class_under(AerospikeNativeClass, "Policy", rb_cObject);
9
+
10
+ rb_define_const(PolicyClass, "RETRY_NONE", INT2FIX(AS_POLICY_RETRY_NONE));
11
+ rb_define_const(PolicyClass, "RETRY_ONCE", INT2FIX(AS_POLICY_RETRY_ONCE));
12
+
13
+ rb_define_const(PolicyClass, "KEY_DIGEST", INT2FIX(AS_POLICY_KEY_DIGEST));
14
+ rb_define_const(PolicyClass, "KEY_SEND", INT2FIX(AS_POLICY_KEY_SEND));
15
+
16
+ rb_define_const(PolicyClass, "GEN_IGNORE", INT2FIX(AS_POLICY_GEN_IGNORE));
17
+ rb_define_const(PolicyClass, "GEN_EQ", INT2FIX(AS_POLICY_GEN_EQ));
18
+ rb_define_const(PolicyClass, "GEN_GT", INT2FIX(AS_POLICY_GEN_GT));
19
+
20
+ rb_define_const(PolicyClass, "EXISTS_CREATE", INT2FIX(AS_POLICY_EXISTS_CREATE));
21
+ rb_define_const(PolicyClass, "EXISTS_CREATE_OR_REPLACE", INT2FIX(AS_POLICY_EXISTS_CREATE_OR_REPLACE));
22
+ rb_define_const(PolicyClass, "EXISTS_IGNORE", INT2FIX(AS_POLICY_EXISTS_IGNORE));
23
+ rb_define_const(PolicyClass, "EXISTS_REPLACE", INT2FIX(AS_POLICY_EXISTS_REPLACE));
24
+ rb_define_const(PolicyClass, "EXISTS_UPDATE", INT2FIX(AS_POLICY_EXISTS_UPDATE));
25
+
26
+ rb_define_const(PolicyClass, "COMMIT_LEVEL_ALL", INT2FIX(AS_POLICY_COMMIT_LEVEL_ALL));
27
+ rb_define_const(PolicyClass, "COMMIT_LEVEL_MASTER", INT2FIX(AS_POLICY_COMMIT_LEVEL_MASTER));
28
+
29
+ rb_define_const(PolicyClass, "REPLICA_ANY", INT2FIX(AS_POLICY_REPLICA_ANY));
30
+ rb_define_const(PolicyClass, "REPLICA_MASTER", INT2FIX(AS_POLICY_REPLICA_MASTER));
31
+
32
+ rb_define_const(PolicyClass, "CONSISTENCY_LEVEL_ALL", INT2FIX(AS_POLICY_CONSISTENCY_LEVEL_ALL));
33
+ rb_define_const(PolicyClass, "CONSISTENCY_LEVEL_ONE", INT2FIX(AS_POLICY_CONSISTENCY_LEVEL_ONE));
34
+ }
@@ -0,0 +1,10 @@
1
+ #ifndef POLICY_H
2
+ #define POLICY_H
3
+
4
+ #include "aerospike_native.h"
5
+
6
+ RUBY_EXTERN VALUE PolicyClass;
7
+ void define_policy();
8
+
9
+ #endif // POLICY_H
10
+
@@ -3,6 +3,12 @@
3
3
 
4
4
  VALUE RecordClass;
5
5
 
6
+ /*
7
+ * call-seq:
8
+ * new(key, bins, gen, ttl) -> AerospikeNative::Record
9
+ *
10
+ * initialize new record
11
+ */
6
12
  VALUE record_initialize(VALUE vSelf, VALUE vKey, VALUE vBins, VALUE vGen, VALUE vTtl)
7
13
  {
8
14
  check_aerospike_key(vKey);
@@ -18,6 +24,52 @@ VALUE record_initialize(VALUE vSelf, VALUE vKey, VALUE vBins, VALUE vGen, VALUE
18
24
  return vSelf;
19
25
  }
20
26
 
27
+ VALUE rb_record_from_c(as_record* record, as_key* key)
28
+ {
29
+ VALUE vKeyParams[5], vParams[4];
30
+ as_key current_key;
31
+ as_bin bin;
32
+ int n;
33
+
34
+ if (key == NULL) {
35
+ current_key = record->key;
36
+ } else {
37
+ current_key = *key;
38
+ }
39
+
40
+ vKeyParams[0] = rb_str_new2(current_key.ns);
41
+ vKeyParams[1] = rb_str_new2(current_key.set);
42
+
43
+ if (current_key.valuep == NULL) {
44
+ vKeyParams[2] = Qnil;
45
+ } else {
46
+ vKeyParams[2] = rb_str_new2(current_key.value.string.value);
47
+ }
48
+ vKeyParams[3] = rb_str_new(current_key.digest.value, AS_DIGEST_VALUE_SIZE);
49
+
50
+ vParams[0] = rb_class_new_instance(4, vKeyParams, KeyClass);
51
+ vParams[1] = rb_hash_new();
52
+ vParams[2] = UINT2NUM(record->gen);
53
+ vParams[3] = UINT2NUM(record->ttl);
54
+
55
+ for(n = 0; n < record->bins.size; n++) {
56
+ bin = record->bins.entries[n];
57
+ switch( as_val_type(bin.valuep) ) {
58
+ case AS_INTEGER:
59
+ rb_hash_aset(vParams[1], rb_str_new2(bin.name), LONG2NUM(bin.valuep->integer.value));
60
+ break;
61
+ case AS_STRING:
62
+ rb_hash_aset(vParams[1], rb_str_new2(bin.name), rb_str_new2(bin.valuep->string.value));
63
+ break;
64
+ case AS_UNDEF:
65
+ default:
66
+ break;
67
+ }
68
+ }
69
+
70
+ as_record_destroy(record);
71
+ return rb_class_new_instance(4, vParams, RecordClass);
72
+ }
21
73
 
22
74
  void define_record()
23
75
  {
@@ -2,9 +2,12 @@
2
2
  #define RECORD_H
3
3
 
4
4
  #include "aerospike_native.h"
5
+ #include <aerospike/as_record.h>
5
6
 
6
7
  RUBY_EXTERN VALUE RecordClass;
7
8
  void define_record();
8
9
 
10
+ VALUE rb_record_from_c(as_record* record, as_key* key);
11
+
9
12
  #endif // RECORD_H
10
13
 
@@ -1,3 +1,3 @@
1
1
  module AerospikeNative
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
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.1.0
4
+ version: 0.1.1
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 00:00:00.000000000 Z
11
+ date: 2015-07-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -97,6 +97,8 @@ files:
97
97
  - ext/aerospike_native/lib/.keep
98
98
  - ext/aerospike_native/operation.c
99
99
  - ext/aerospike_native/operation.h
100
+ - ext/aerospike_native/policy.c
101
+ - ext/aerospike_native/policy.h
100
102
  - ext/aerospike_native/record.c
101
103
  - ext/aerospike_native/record.h
102
104
  - lib/aerospike_native.rb