couchbase 1.2.0.beta-x86-mingw32 → 1.2.0-x86-mingw32

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.
Files changed (45) hide show
  1. data/.travis.yml +1 -1
  2. data/Makefile +3 -0
  3. data/README.markdown +15 -4
  4. data/RELEASE_NOTES.markdown +513 -0
  5. data/couchbase.gemspec +0 -1
  6. data/ext/couchbase_ext/arguments.c +161 -244
  7. data/ext/couchbase_ext/arithmetic.c +29 -37
  8. data/ext/couchbase_ext/bucket.c +252 -219
  9. data/ext/couchbase_ext/couchbase_ext.c +540 -417
  10. data/ext/couchbase_ext/couchbase_ext.h +218 -191
  11. data/ext/couchbase_ext/delete.c +30 -27
  12. data/ext/couchbase_ext/extconf.rb +15 -3
  13. data/ext/couchbase_ext/get.c +45 -37
  14. data/ext/couchbase_ext/http.c +95 -74
  15. data/ext/couchbase_ext/multithread_plugin.c +1201 -0
  16. data/ext/couchbase_ext/observe.c +42 -37
  17. data/ext/couchbase_ext/result.c +17 -20
  18. data/ext/couchbase_ext/stats.c +30 -28
  19. data/ext/couchbase_ext/store.c +46 -39
  20. data/ext/couchbase_ext/timer.c +11 -11
  21. data/ext/couchbase_ext/touch.c +30 -27
  22. data/ext/couchbase_ext/unlock.c +30 -27
  23. data/ext/couchbase_ext/utils.c +166 -89
  24. data/ext/couchbase_ext/version.c +29 -26
  25. data/lib/action_dispatch/middleware/session/couchbase_store.rb +2 -2
  26. data/lib/active_support/cache/couchbase_store.rb +6 -6
  27. data/lib/couchbase.rb +1 -0
  28. data/lib/couchbase/bucket.rb +6 -11
  29. data/lib/couchbase/cluster.rb +105 -0
  30. data/lib/couchbase/utils.rb +8 -5
  31. data/lib/couchbase/version.rb +1 -1
  32. data/lib/couchbase/view.rb +51 -5
  33. data/lib/couchbase/view_row.rb +1 -1
  34. data/lib/ext/multi_json_fix.rb +13 -9
  35. data/lib/rack/session/couchbase.rb +11 -7
  36. data/tasks/compile.rake +1 -1
  37. data/tasks/test.rake +40 -34
  38. data/tasks/util.rake +1 -1
  39. data/test/setup.rb +9 -2
  40. data/test/test_arithmetic.rb +37 -0
  41. data/test/test_async.rb +22 -18
  42. data/test/test_unlock.rb +0 -1
  43. data/test/test_utils.rb +32 -0
  44. metadata +13 -23
  45. data/HISTORY.markdown +0 -215
data/couchbase.gemspec CHANGED
@@ -46,6 +46,5 @@ Gem::Specification.new do |s|
46
46
  s.add_development_dependency 'yard-xml'
47
47
  s.add_development_dependency 'mini_portile'
48
48
  s.add_development_dependency 'yajl-ruby', '~> 1.1.0'
49
- s.add_development_dependency RUBY_VERSION =~ /^1\.9/ ? 'debugger' : 'ruby-debug'
50
49
  s.add_development_dependency 'active_support'
51
50
  end
@@ -17,32 +17,45 @@
17
17
 
18
18
  #include "couchbase_ext.h"
19
19
 
20
-
21
20
  /* TOUCH */
22
21
 
22
+ #define _alloc_data_for_s(type, _type, size, items, ptr) do {\
23
+ lcb_size_t ii; \
24
+ \
25
+ params->cmd.type.num = size; \
26
+ params->cmd.type.items = calloc(size, sizeof(_type)); \
27
+ if (params->cmd.type.items == NULL) { \
28
+ rb_raise(cb_eClientNoMemoryError, "failed to allocate memory for arguments"); \
29
+ } \
30
+ params->cmd.type.ptr = calloc(size, sizeof(_type *)); \
31
+ if (params->cmd.type.ptr == NULL) { \
32
+ rb_raise(cb_eClientNoMemoryError, "failed to allocate memory for arguments"); \
33
+ } \
34
+ for (ii = 0; ii < size; ++ii) { \
35
+ params->cmd.type.ptr[ii] = params->cmd.type.items + ii; \
36
+ } \
37
+ } while(0)
38
+
39
+ #define _alloc_data_for(type, _type) _alloc_data_for_s(type, _type, size, items, ptr)
40
+
41
+
42
+ #define _release_data_for_s(type, items, ptr) \
43
+ free(params->cmd.type.items); \
44
+ free(params->cmd.type.ptr);
45
+
46
+ #define _release_data_for(type) _release_data_for_s(type, items, ptr)
47
+
48
+
23
49
  static void
24
- cb_params_touch_alloc(struct params_st *params, lcb_size_t size)
50
+ cb_params_touch_alloc(struct cb_params_st *params, lcb_size_t size)
25
51
  {
26
- lcb_size_t ii;
27
-
28
- params->cmd.touch.num = size;
29
- params->cmd.touch.items = xcalloc(size, sizeof(lcb_touch_cmd_t));
30
- if (params->cmd.touch.items == NULL) {
31
- rb_raise(eClientNoMemoryError, "failed to allocate memory for arguments");
32
- }
33
- params->cmd.touch.ptr = xcalloc(size, sizeof(lcb_touch_cmd_t *));
34
- if (params->cmd.touch.ptr == NULL) {
35
- rb_raise(eClientNoMemoryError, "failed to allocate memory for arguments");
36
- }
37
- for (ii = 0; ii < size; ++ii) {
38
- params->cmd.touch.ptr[ii] = params->cmd.touch.items + ii;
39
- }
52
+ _alloc_data_for(touch, lcb_touch_cmd_t);
40
53
  }
41
54
 
42
55
  static void
43
- cb_params_touch_init_item(struct params_st *params, lcb_size_t idx, VALUE key_obj, lcb_time_t exptime)
56
+ cb_params_touch_init_item(struct cb_params_st *params, lcb_size_t idx, VALUE key_obj, lcb_time_t exptime)
44
57
  {
45
- key_obj = unify_key(params->bucket, key_obj, 1);
58
+ key_obj = cb_unify_key(params->bucket, key_obj, 1);
46
59
  params->cmd.touch.items[idx].v.v0.key = RSTRING_PTR(key_obj);
47
60
  params->cmd.touch.items[idx].v.v0.nkey = RSTRING_LEN(key_obj);
48
61
  params->cmd.touch.items[idx].v.v0.exptime = exptime;
@@ -52,30 +65,31 @@ cb_params_touch_init_item(struct params_st *params, lcb_size_t idx, VALUE key_ob
52
65
  static int
53
66
  cb_params_touch_extract_keys_i(VALUE key, VALUE value, VALUE arg)
54
67
  {
55
- struct params_st *params = (struct params_st *)arg;
68
+ struct cb_params_st *params = (struct cb_params_st *)arg;
56
69
  cb_params_touch_init_item(params, params->idx++, key, NUM2ULONG(value));
57
70
  return ST_CONTINUE;
58
71
  }
59
72
 
60
73
  static void
61
- cb_params_touch_parse_options(struct params_st *params, VALUE options)
74
+ cb_params_touch_parse_options(struct cb_params_st *params, VALUE options)
62
75
  {
63
76
  VALUE tmp;
64
77
 
65
78
  if (NIL_P(options)) {
66
79
  return;
67
80
  }
68
- tmp = rb_hash_aref(options, sym_ttl);
81
+ tmp = rb_hash_aref(options, cb_sym_ttl);
69
82
  if (tmp != Qnil) {
70
83
  params->cmd.touch.ttl = NUM2ULONG(tmp);
71
84
  }
72
- if (RTEST(rb_funcall(options, id_has_key_p, 1, sym_quiet))) {
73
- params->cmd.touch.quiet = RTEST(rb_hash_aref(options, sym_quiet));
85
+ tmp = rb_hash_lookup2(options, cb_sym_quiet, Qundef);
86
+ if (tmp != Qundef) {
87
+ params->cmd.touch.quiet = RTEST(tmp);
74
88
  }
75
89
  }
76
90
 
77
91
  static void
78
- cb_params_touch_parse_arguments(struct params_st *params, int argc, VALUE argv)
92
+ cb_params_touch_parse_arguments(struct cb_params_st *params, int argc, VALUE argv)
79
93
  {
80
94
  lcb_size_t ii;
81
95
 
@@ -117,28 +131,15 @@ cb_params_touch_parse_arguments(struct params_st *params, int argc, VALUE argv)
117
131
  /* REMOVE */
118
132
 
119
133
  static void
120
- cb_params_remove_alloc(struct params_st *params, lcb_size_t size)
134
+ cb_params_remove_alloc(struct cb_params_st *params, lcb_size_t size)
121
135
  {
122
- lcb_size_t ii;
123
-
124
- params->cmd.remove.num = size;
125
- params->cmd.remove.items = xcalloc(size, sizeof(lcb_remove_cmd_t));
126
- if (params->cmd.remove.items == NULL) {
127
- rb_raise(eClientNoMemoryError, "failed to allocate memory for arguments");
128
- }
129
- params->cmd.remove.ptr = xcalloc(size, sizeof(lcb_remove_cmd_t *));
130
- if (params->cmd.remove.ptr == NULL) {
131
- rb_raise(eClientNoMemoryError, "failed to allocate memory for arguments");
132
- }
133
- for (ii = 0; ii < size; ++ii) {
134
- params->cmd.remove.ptr[ii] = params->cmd.remove.items + ii;
135
- }
136
+ _alloc_data_for(remove, lcb_remove_cmd_t);
136
137
  }
137
138
 
138
139
  static void
139
- cb_params_remove_init_item(struct params_st *params, lcb_size_t idx, VALUE key_obj, lcb_cas_t cas)
140
+ cb_params_remove_init_item(struct cb_params_st *params, lcb_size_t idx, VALUE key_obj, lcb_cas_t cas)
140
141
  {
141
- key_obj = unify_key(params->bucket, key_obj, 1);
142
+ key_obj = cb_unify_key(params->bucket, key_obj, 1);
142
143
  params->cmd.remove.items[idx].v.v0.key = RSTRING_PTR(key_obj);
143
144
  params->cmd.remove.items[idx].v.v0.nkey = RSTRING_LEN(key_obj);
144
145
  params->cmd.remove.items[idx].v.v0.cas = cas;
@@ -148,30 +149,31 @@ cb_params_remove_init_item(struct params_st *params, lcb_size_t idx, VALUE key_o
148
149
  static int
149
150
  cb_params_remove_extract_keys_i(VALUE key, VALUE value, VALUE arg)
150
151
  {
151
- struct params_st *params = (struct params_st *)arg;
152
+ struct cb_params_st *params = (struct cb_params_st *)arg;
152
153
  cb_params_remove_init_item(params, params->idx++, key, NUM2ULL(value));
153
154
  return ST_CONTINUE;
154
155
  }
155
156
 
156
157
  static void
157
- cb_params_remove_parse_options(struct params_st *params, VALUE options)
158
+ cb_params_remove_parse_options(struct cb_params_st *params, VALUE options)
158
159
  {
159
160
  VALUE tmp;
160
161
 
161
162
  if (NIL_P(options)) {
162
163
  return;
163
164
  }
164
- if (RTEST(rb_funcall(options, id_has_key_p, 1, sym_quiet))) {
165
- params->cmd.remove.quiet = RTEST(rb_hash_aref(options, sym_quiet));
165
+ tmp = rb_hash_lookup2(options, cb_sym_quiet, Qundef);
166
+ if (tmp != Qundef) {
167
+ params->cmd.remove.quiet = RTEST(tmp);
166
168
  }
167
- tmp = rb_hash_aref(options, sym_cas);
169
+ tmp = rb_hash_aref(options, cb_sym_cas);
168
170
  if (tmp != Qnil) {
169
171
  params->cmd.remove.cas = NUM2ULL(tmp);
170
172
  }
171
173
  }
172
174
 
173
175
  static void
174
- cb_params_remove_parse_arguments(struct params_st *params, int argc, VALUE argv)
176
+ cb_params_remove_parse_arguments(struct cb_params_st *params, int argc, VALUE argv)
175
177
  {
176
178
  lcb_size_t ii;
177
179
 
@@ -212,33 +214,30 @@ cb_params_remove_parse_arguments(struct params_st *params, int argc, VALUE argv)
212
214
 
213
215
  /* STORE */
214
216
  static void
215
- cb_params_store_alloc(struct params_st *params, lcb_size_t size)
217
+ cb_params_store_alloc(struct cb_params_st *params, lcb_size_t size)
216
218
  {
217
- lcb_size_t ii;
218
-
219
- params->cmd.store.num = size;
220
- params->cmd.store.items = xcalloc(size, sizeof(lcb_store_cmd_t));
221
- if (params->cmd.store.items == NULL) {
222
- rb_raise(eClientNoMemoryError, "failed to allocate memory for arguments");
223
- }
224
- params->cmd.store.ptr = xcalloc(size, sizeof(lcb_store_cmd_t *));
225
- if (params->cmd.store.ptr == NULL) {
226
- rb_raise(eClientNoMemoryError, "failed to allocate memory for arguments");
227
- }
228
- for (ii = 0; ii < size; ++ii) {
229
- params->cmd.store.ptr[ii] = params->cmd.store.items + ii;
230
- }
219
+ _alloc_data_for(store, lcb_store_cmd_t);
231
220
  }
232
221
 
233
222
  static void
234
- cb_params_store_init_item(struct params_st *params, lcb_size_t idx,
223
+ cb_params_store_init_item(struct cb_params_st *params, lcb_size_t idx,
235
224
  VALUE key_obj, VALUE value_obj, lcb_uint32_t flags, lcb_cas_t cas,
236
225
  lcb_time_t exptime)
237
226
  {
238
- key_obj = unify_key(params->bucket, key_obj, 1);
239
- value_obj = encode_value(value_obj, params->cmd.store.flags);
240
- if (value_obj == Qundef) {
241
- rb_raise(eValueFormatError, "unable to convert value for key '%s'", RSTRING_PTR(key_obj));
227
+ key_obj = cb_unify_key(params->bucket, key_obj, 1);
228
+ value_obj = cb_encode_value(value_obj, params->cmd.store.flags);
229
+ if (rb_obj_is_kind_of(value_obj, rb_eStandardError)) {
230
+ VALUE exc_str = rb_funcall(value_obj, cb_id_to_s, 0);
231
+ VALUE msg = rb_funcall(rb_mKernel, cb_id_sprintf, 3,
232
+ rb_str_new2("unable to convert value for key '%s': %s"), key_obj, exc_str);
233
+ VALUE exc = rb_exc_new3(cb_eValueFormatError, msg);
234
+ rb_ivar_set(exc, cb_id_iv_inner_exception, value_obj);
235
+ rb_exc_raise(exc);
236
+ }
237
+ /* the value must be string after conversion */
238
+ if (TYPE(value_obj) != T_STRING) {
239
+ VALUE val = rb_any_to_s(value_obj);
240
+ rb_raise(cb_eValueFormatError, "unable to convert value for key '%s' to string: %s", RSTRING_PTR(key_obj), RSTRING_PTR(val));
242
241
  }
243
242
  params->cmd.store.items[idx].v.v0.datatype = params->cmd.store.datatype;
244
243
  params->cmd.store.items[idx].v.v0.operation = params->cmd.store.operation;
@@ -255,50 +254,50 @@ cb_params_store_init_item(struct params_st *params, lcb_size_t idx,
255
254
  static int
256
255
  cb_params_store_extract_keys_i(VALUE key, VALUE value, VALUE arg)
257
256
  {
258
- struct params_st *params = (struct params_st *)arg;
257
+ struct cb_params_st *params = (struct cb_params_st *)arg;
259
258
  cb_params_store_init_item(params, params->idx++, key, value,
260
259
  params->cmd.store.flags, 0, params->cmd.store.ttl);
261
260
  return ST_CONTINUE;
262
261
  }
263
262
 
264
263
  static void
265
- cb_params_store_parse_options(struct params_st *params, VALUE options)
264
+ cb_params_store_parse_options(struct cb_params_st *params, VALUE options)
266
265
  {
267
266
  VALUE tmp;
268
267
 
269
268
  if (NIL_P(options)) {
270
269
  return;
271
270
  }
272
- tmp = rb_hash_aref(options, sym_flags);
271
+ tmp = rb_hash_aref(options, cb_sym_flags);
273
272
  if (tmp != Qnil) {
274
273
  params->cmd.store.flags = (lcb_uint32_t)NUM2ULONG(tmp);
275
274
  }
276
- tmp = rb_hash_aref(options, sym_format);
275
+ tmp = rb_hash_aref(options, cb_sym_format);
277
276
  if (tmp != Qnil) { /* rewrite format bits */
278
- params->cmd.store.flags = flags_set_format(params->cmd.store.flags, tmp);
277
+ params->cmd.store.flags = cb_flags_set_format(params->cmd.store.flags, tmp);
279
278
  }
280
- tmp = rb_hash_aref(options, sym_ttl);
279
+ tmp = rb_hash_aref(options, cb_sym_ttl);
281
280
  if (tmp != Qnil) {
282
281
  params->cmd.store.ttl = NUM2ULONG(tmp);
283
282
  }
284
- tmp = rb_hash_aref(options, sym_cas);
283
+ tmp = rb_hash_aref(options, cb_sym_cas);
285
284
  if (tmp != Qnil) {
286
285
  params->cmd.store.cas = NUM2ULL(tmp);
287
286
  }
288
- tmp = rb_hash_aref(options, sym_observe);
287
+ tmp = rb_hash_aref(options, cb_sym_observe);
289
288
  if (tmp != Qnil) {
290
289
  Check_Type(tmp, T_HASH);
291
- rb_funcall(params->bucket->self, id_verify_observe_options, 1, tmp);
290
+ rb_funcall(params->bucket->self, cb_id_verify_observe_options, 1, tmp);
292
291
  params->cmd.store.observe = tmp;
293
292
  }
294
- if (flags_get_format(params->cmd.store.flags) == sym_document) {
293
+ if (cb_flags_get_format(params->cmd.store.flags) == cb_sym_document) {
295
294
  /* just amend datatype for now */
296
295
  params->cmd.store.datatype = 0x01;
297
296
  }
298
297
  }
299
298
 
300
299
  static void
301
- cb_params_store_parse_arguments(struct params_st *params, int argc, VALUE argv)
300
+ cb_params_store_parse_arguments(struct cb_params_st *params, int argc, VALUE argv)
302
301
  {
303
302
  VALUE keys;
304
303
 
@@ -334,43 +333,20 @@ cb_params_store_parse_arguments(struct params_st *params, int argc, VALUE argv)
334
333
 
335
334
  /* GET */
336
335
  static void
337
- cb_params_get_alloc(struct params_st *params, lcb_size_t size)
336
+ cb_params_get_alloc(struct cb_params_st *params, lcb_size_t size)
338
337
  {
339
- lcb_size_t ii;
340
-
341
- params->cmd.get.num = size;
342
338
  if (params->cmd.get.replica) {
343
- params->cmd.get.items = xcalloc(size, sizeof(lcb_get_replica_cmd_t));
344
- if (params->cmd.get.items_gr == NULL) {
345
- rb_raise(eClientNoMemoryError, "failed to allocate memory for arguments");
346
- }
347
- params->cmd.get.ptr = xcalloc(size, sizeof(lcb_get_replica_cmd_t *));
348
- if (params->cmd.get.ptr_gr == NULL) {
349
- rb_raise(eClientNoMemoryError, "failed to allocate memory for arguments");
350
- }
351
- for (ii = 0; ii < size; ++ii) {
352
- params->cmd.get.ptr_gr[ii] = params->cmd.get.items_gr + ii;
353
- }
339
+ _alloc_data_for_s(get, lcb_get_replica_cmd_t, size, items_gr, ptr_gr);
354
340
  } else {
355
- params->cmd.get.items = xcalloc(size, sizeof(lcb_get_cmd_t));
356
- if (params->cmd.get.items == NULL) {
357
- rb_raise(eClientNoMemoryError, "failed to allocate memory for arguments");
358
- }
359
- params->cmd.get.ptr = xcalloc(size, sizeof(lcb_get_cmd_t *));
360
- if (params->cmd.get.ptr == NULL) {
361
- rb_raise(eClientNoMemoryError, "failed to allocate memory for arguments");
362
- }
363
- for (ii = 0; ii < size; ++ii) {
364
- params->cmd.get.ptr[ii] = params->cmd.get.items + ii;
365
- }
341
+ _alloc_data_for(get, lcb_get_cmd_t);
366
342
  }
367
343
  }
368
344
 
369
345
  static void
370
- cb_params_get_init_item(struct params_st *params, lcb_size_t idx,
346
+ cb_params_get_init_item(struct cb_params_st *params, lcb_size_t idx,
371
347
  VALUE key_obj, lcb_time_t exptime)
372
348
  {
373
- key_obj = unify_key(params->bucket, key_obj, 1);
349
+ key_obj = cb_unify_key(params->bucket, key_obj, 1);
374
350
  if (params->cmd.get.replica) {
375
351
  params->cmd.get.items_gr[idx].v.v0.key = RSTRING_PTR(key_obj);
376
352
  params->cmd.get.items_gr[idx].v.v0.nkey = RSTRING_LEN(key_obj);
@@ -387,37 +363,38 @@ cb_params_get_init_item(struct params_st *params, lcb_size_t idx,
387
363
  static int
388
364
  cb_params_get_extract_keys_i(VALUE key, VALUE value, VALUE arg)
389
365
  {
390
- struct params_st *params = (struct params_st *)arg;
366
+ struct cb_params_st *params = (struct cb_params_st *)arg;
391
367
  rb_ary_push(params->cmd.get.keys_ary, key);
392
368
  cb_params_get_init_item(params, params->idx++, key, NUM2ULONG(value));
393
369
  return ST_CONTINUE;
394
370
  }
395
371
 
396
372
  static void
397
- cb_params_get_parse_options(struct params_st *params, VALUE options)
373
+ cb_params_get_parse_options(struct cb_params_st *params, VALUE options)
398
374
  {
399
375
  VALUE tmp;
400
376
 
401
377
  if (NIL_P(options)) {
402
378
  return;
403
379
  }
404
- params->cmd.get.replica = RTEST(rb_hash_aref(options, sym_replica));
405
- params->cmd.get.extended = RTEST(rb_hash_aref(options, sym_extended));
406
- params->cmd.get.assemble_hash = RTEST(rb_hash_aref(options, sym_assemble_hash));
407
- if (RTEST(rb_funcall(options, id_has_key_p, 1, sym_quiet))) {
408
- params->cmd.get.quiet = RTEST(rb_hash_aref(options, sym_quiet));
380
+ params->cmd.get.replica = RTEST(rb_hash_aref(options, cb_sym_replica));
381
+ params->cmd.get.extended = RTEST(rb_hash_aref(options, cb_sym_extended));
382
+ params->cmd.get.assemble_hash = RTEST(rb_hash_aref(options, cb_sym_assemble_hash));
383
+ tmp = rb_hash_lookup2(options, cb_sym_quiet, Qundef);
384
+ if (tmp != Qundef) {
385
+ params->cmd.get.quiet = RTEST(tmp);
409
386
  }
410
- tmp = rb_hash_aref(options, sym_format);
387
+ tmp = rb_hash_aref(options, cb_sym_format);
411
388
  if (tmp != Qnil) {
412
389
  Check_Type(tmp, T_SYMBOL);
413
390
  params->cmd.get.forced_format = tmp;
414
391
  }
415
- tmp = rb_hash_aref(options, sym_ttl);
392
+ tmp = rb_hash_aref(options, cb_sym_ttl);
416
393
  if (tmp != Qnil) {
417
394
  params->cmd.get.ttl = NUM2ULONG(tmp);
418
395
  }
419
396
  /* boolean or number of seconds to lock */
420
- tmp = rb_hash_aref(options, sym_lock);
397
+ tmp = rb_hash_aref(options, cb_sym_lock);
421
398
  if (tmp != Qnil) {
422
399
  params->cmd.get.lock = RTEST(tmp);
423
400
  if (TYPE(tmp) == T_FIXNUM) {
@@ -427,7 +404,7 @@ cb_params_get_parse_options(struct params_st *params, VALUE options)
427
404
  }
428
405
 
429
406
  static void
430
- cb_params_get_parse_arguments(struct params_st *params, int argc, VALUE argv)
407
+ cb_params_get_parse_arguments(struct cb_params_st *params, int argc, VALUE argv)
431
408
  {
432
409
  lcb_size_t ii;
433
410
 
@@ -474,29 +451,16 @@ cb_params_get_parse_arguments(struct params_st *params, int argc, VALUE argv)
474
451
 
475
452
  /* ARITH */
476
453
  static void
477
- cb_params_arith_alloc(struct params_st *params, lcb_size_t size)
454
+ cb_params_arith_alloc(struct cb_params_st *params, lcb_size_t size)
478
455
  {
479
- lcb_size_t ii;
480
-
481
- params->cmd.arith.num = size;
482
- params->cmd.arith.items = xcalloc(size, sizeof(lcb_arithmetic_cmd_t));
483
- if (params->cmd.arith.items == NULL) {
484
- rb_raise(eClientNoMemoryError, "failed to allocate memory for arguments");
485
- }
486
- params->cmd.arith.ptr = xcalloc(size, sizeof(lcb_arithmetic_cmd_t *));
487
- if (params->cmd.arith.ptr == NULL) {
488
- rb_raise(eClientNoMemoryError, "failed to allocate memory for arguments");
489
- }
490
- for (ii = 0; ii < size; ++ii) {
491
- params->cmd.arith.ptr[ii] = params->cmd.arith.items + ii;
492
- }
456
+ _alloc_data_for(arith, lcb_arithmetic_cmd_t);
493
457
  }
494
458
 
495
459
  static void
496
- cb_params_arith_init_item(struct params_st *params, lcb_size_t idx,
460
+ cb_params_arith_init_item(struct cb_params_st *params, lcb_size_t idx,
497
461
  VALUE key_obj, lcb_int64_t delta)
498
462
  {
499
- key_obj = unify_key(params->bucket, key_obj, 1);
463
+ key_obj = cb_unify_key(params->bucket, key_obj, 1);
500
464
  params->cmd.arith.items[idx].v.v0.key = RSTRING_PTR(key_obj);
501
465
  params->cmd.arith.items[idx].v.v0.nkey = RSTRING_LEN(key_obj);
502
466
  params->cmd.arith.items[idx].v.v0.delta = delta * params->cmd.arith.sign;
@@ -509,46 +473,49 @@ cb_params_arith_init_item(struct params_st *params, lcb_size_t idx,
509
473
  static int
510
474
  cb_params_arith_extract_keys_i(VALUE key, VALUE value, VALUE arg)
511
475
  {
512
- struct params_st *params = (struct params_st *)arg;
476
+ struct cb_params_st *params = (struct cb_params_st *)arg;
513
477
  cb_params_arith_init_item(params, params->idx++, key, NUM2ULONG(value) & INT64_MAX);
514
478
  return ST_CONTINUE;
515
479
  }
516
480
 
517
481
  static void
518
- cb_params_arith_parse_options(struct params_st *params, VALUE options)
482
+ cb_params_arith_parse_options(struct cb_params_st *params, VALUE options)
519
483
  {
520
484
  VALUE tmp;
521
485
 
522
486
  if (NIL_P(options)) {
523
487
  return;
524
488
  }
525
- params->cmd.arith.create = RTEST(rb_hash_aref(options, sym_create));
526
- params->cmd.arith.extended = RTEST(rb_hash_aref(options, sym_extended));
527
- tmp = rb_hash_aref(options, sym_ttl);
489
+ tmp = rb_hash_aref(options, cb_sym_create);
490
+ if (tmp != Qnil) {
491
+ params->cmd.arith.create = RTEST(tmp);
492
+ }
493
+ params->cmd.arith.extended = RTEST(rb_hash_aref(options, cb_sym_extended));
494
+ tmp = rb_hash_aref(options, cb_sym_ttl);
528
495
  if (tmp != Qnil) {
529
496
  params->cmd.arith.ttl = NUM2ULONG(tmp);
530
497
  }
531
- tmp = rb_hash_aref(options, sym_initial);
498
+ tmp = rb_hash_aref(options, cb_sym_initial);
532
499
  if (tmp != Qnil) {
533
500
  params->cmd.arith.initial = NUM2ULL(tmp);
534
501
  params->cmd.arith.create = 1;
535
502
  }
536
- tmp = rb_hash_aref(options, sym_delta);
503
+ tmp = rb_hash_aref(options, cb_sym_delta);
537
504
  if (tmp != Qnil) {
538
505
  params->cmd.arith.delta = NUM2ULL(tmp) & INT64_MAX;
539
506
  }
540
- tmp = rb_hash_aref(options, sym_format);
507
+ tmp = rb_hash_aref(options, cb_sym_format);
541
508
  if (tmp != Qnil) { /* rewrite format bits */
542
509
  params->cmd.arith.format = tmp;
543
510
  }
544
- if (params->cmd.arith.format == sym_document) {
511
+ if (params->cmd.arith.format == cb_sym_document) {
545
512
  /* just amend datatype for now */
546
513
  params->cmd.arith.datatype = 0x01;
547
514
  }
548
515
  }
549
516
 
550
517
  static void
551
- cb_params_arith_parse_arguments(struct params_st *params, int argc, VALUE argv)
518
+ cb_params_arith_parse_arguments(struct cb_params_st *params, int argc, VALUE argv)
552
519
  {
553
520
  lcb_size_t ii;
554
521
 
@@ -588,36 +555,23 @@ cb_params_arith_parse_arguments(struct params_st *params, int argc, VALUE argv)
588
555
 
589
556
  /* STATS */
590
557
  static void
591
- cb_params_stats_alloc(struct params_st *params, lcb_size_t size)
558
+ cb_params_stats_alloc(struct cb_params_st *params, lcb_size_t size)
592
559
  {
593
- lcb_size_t ii;
594
-
595
- params->cmd.stats.num = size;
596
- params->cmd.stats.items = xcalloc(size, sizeof(lcb_server_stats_cmd_t));
597
- if (params->cmd.stats.items == NULL) {
598
- rb_raise(eClientNoMemoryError, "failed to allocate memory for arguments");
599
- }
600
- params->cmd.stats.ptr = xcalloc(size, sizeof(lcb_server_stats_cmd_t *));
601
- if (params->cmd.stats.ptr == NULL) {
602
- rb_raise(eClientNoMemoryError, "failed to allocate memory for arguments");
603
- }
604
- for (ii = 0; ii < size; ++ii) {
605
- params->cmd.stats.ptr[ii] = params->cmd.stats.items + ii;
606
- }
560
+ _alloc_data_for(stats, lcb_server_stats_cmd_t);
607
561
  }
608
562
 
609
563
  static void
610
- cb_params_stats_init_item(struct params_st *params, lcb_size_t idx,
564
+ cb_params_stats_init_item(struct cb_params_st *params, lcb_size_t idx,
611
565
  VALUE key_obj)
612
566
  {
613
- key_obj = unify_key(params->bucket, key_obj, 1);
567
+ key_obj = cb_unify_key(params->bucket, key_obj, 1);
614
568
  params->cmd.stats.items[idx].v.v0.name = RSTRING_PTR(key_obj);
615
569
  params->cmd.stats.items[idx].v.v0.nname = RSTRING_LEN(key_obj);
616
570
  params->npayload += RSTRING_LEN(key_obj);
617
571
  }
618
572
 
619
573
  static void
620
- cb_params_stats_parse_arguments(struct params_st *params, int argc, VALUE argv)
574
+ cb_params_stats_parse_arguments(struct cb_params_st *params, int argc, VALUE argv)
621
575
  {
622
576
  lcb_size_t ii;
623
577
 
@@ -653,35 +607,22 @@ cb_params_stats_parse_arguments(struct params_st *params, int argc, VALUE argv)
653
607
  /* REMOVE */
654
608
 
655
609
  static void
656
- cb_params_observe_alloc(struct params_st *params, lcb_size_t size)
610
+ cb_params_observe_alloc(struct cb_params_st *params, lcb_size_t size)
657
611
  {
658
- lcb_size_t ii;
659
-
660
- params->cmd.observe.num = size;
661
- params->cmd.observe.items = xcalloc(size, sizeof(lcb_observe_cmd_t));
662
- if (params->cmd.observe.items == NULL) {
663
- rb_raise(eClientNoMemoryError, "failed to allocate memory for arguments");
664
- }
665
- params->cmd.observe.ptr = xcalloc(size, sizeof(lcb_observe_cmd_t *));
666
- if (params->cmd.observe.ptr == NULL) {
667
- rb_raise(eClientNoMemoryError, "failed to allocate memory for arguments");
668
- }
669
- for (ii = 0; ii < size; ++ii) {
670
- params->cmd.observe.ptr[ii] = params->cmd.observe.items + ii;
671
- }
612
+ _alloc_data_for(observe, lcb_observe_cmd_t);
672
613
  }
673
614
 
674
615
  static void
675
- cb_params_observe_init_item(struct params_st *params, lcb_size_t idx, VALUE key_obj)
616
+ cb_params_observe_init_item(struct cb_params_st *params, lcb_size_t idx, VALUE key_obj)
676
617
  {
677
- key_obj = unify_key(params->bucket, key_obj, 1);
618
+ key_obj = cb_unify_key(params->bucket, key_obj, 1);
678
619
  params->cmd.observe.items[idx].v.v0.key = RSTRING_PTR(key_obj);
679
620
  params->cmd.observe.items[idx].v.v0.nkey = RSTRING_LEN(key_obj);
680
621
  params->npayload += RSTRING_LEN(key_obj);
681
622
  }
682
623
 
683
624
  static void
684
- cb_params_observe_parse_arguments(struct params_st *params, int argc, VALUE argv)
625
+ cb_params_observe_parse_arguments(struct cb_params_st *params, int argc, VALUE argv)
685
626
  {
686
627
  lcb_size_t ii;
687
628
 
@@ -716,28 +657,15 @@ cb_params_observe_parse_arguments(struct params_st *params, int argc, VALUE argv
716
657
 
717
658
  /* UNLOCK */
718
659
  static void
719
- cb_params_unlock_alloc(struct params_st *params, lcb_size_t size)
660
+ cb_params_unlock_alloc(struct cb_params_st *params, lcb_size_t size)
720
661
  {
721
- lcb_size_t ii;
722
-
723
- params->cmd.unlock.num = size;
724
- params->cmd.unlock.items = xcalloc(size, sizeof(lcb_unlock_cmd_t));
725
- if (params->cmd.unlock.items == NULL) {
726
- rb_raise(eClientNoMemoryError, "failed to allocate memory for arguments");
727
- }
728
- params->cmd.unlock.ptr = xcalloc(size, sizeof(lcb_unlock_cmd_t *));
729
- if (params->cmd.unlock.ptr == NULL) {
730
- rb_raise(eClientNoMemoryError, "failed to allocate memory for arguments");
731
- }
732
- for (ii = 0; ii < size; ++ii) {
733
- params->cmd.unlock.ptr[ii] = params->cmd.unlock.items + ii;
734
- }
662
+ _alloc_data_for(unlock, lcb_unlock_cmd_t);
735
663
  }
736
664
 
737
665
  static void
738
- cb_params_unlock_init_item(struct params_st *params, lcb_size_t idx, VALUE key_obj, lcb_cas_t cas)
666
+ cb_params_unlock_init_item(struct cb_params_st *params, lcb_size_t idx, VALUE key_obj, lcb_cas_t cas)
739
667
  {
740
- key_obj = unify_key(params->bucket, key_obj, 1);
668
+ key_obj = cb_unify_key(params->bucket, key_obj, 1);
741
669
  params->cmd.unlock.items[idx].v.v0.key = RSTRING_PTR(key_obj);
742
670
  params->cmd.unlock.items[idx].v.v0.nkey = RSTRING_LEN(key_obj);
743
671
  params->cmd.unlock.items[idx].v.v0.cas = cas;
@@ -747,30 +675,31 @@ cb_params_unlock_init_item(struct params_st *params, lcb_size_t idx, VALUE key_o
747
675
  static int
748
676
  cb_params_unlock_extract_keys_i(VALUE key, VALUE value, VALUE arg)
749
677
  {
750
- struct params_st *params = (struct params_st *)arg;
678
+ struct cb_params_st *params = (struct cb_params_st *)arg;
751
679
  cb_params_unlock_init_item(params, params->idx++, key, NUM2ULL(value));
752
680
  return ST_CONTINUE;
753
681
  }
754
682
 
755
683
  static void
756
- cb_params_unlock_parse_options(struct params_st *params, VALUE options)
684
+ cb_params_unlock_parse_options(struct cb_params_st *params, VALUE options)
757
685
  {
758
686
  VALUE tmp;
759
687
 
760
688
  if (NIL_P(options)) {
761
689
  return;
762
690
  }
763
- tmp = rb_hash_aref(options, sym_cas);
691
+ tmp = rb_hash_aref(options, cb_sym_cas);
764
692
  if (tmp != Qnil) {
765
693
  params->cmd.unlock.cas = NUM2ULL(tmp);
766
694
  }
767
- if (RTEST(rb_funcall(options, id_has_key_p, 1, sym_quiet))) {
768
- params->cmd.unlock.quiet = RTEST(rb_hash_aref(options, sym_quiet));
695
+ tmp = rb_hash_lookup2(options, cb_sym_quiet, Qundef);
696
+ if (tmp != Qundef) {
697
+ params->cmd.unlock.quiet = RTEST(tmp);
769
698
  }
770
699
  }
771
700
 
772
701
  static void
773
- cb_params_unlock_parse_arguments(struct params_st *params, int argc, VALUE argv)
702
+ cb_params_unlock_parse_arguments(struct cb_params_st *params, int argc, VALUE argv)
774
703
  {
775
704
  if (argc == 1) {
776
705
  VALUE keys = RARRAY_PTR(argv)[0];
@@ -793,66 +722,52 @@ cb_params_unlock_parse_arguments(struct params_st *params, int argc, VALUE argv)
793
722
 
794
723
  /* VERSION */
795
724
  static void
796
- cb_params_version_alloc(struct params_st *params)
725
+ cb_params_version_alloc(struct cb_params_st *params)
797
726
  {
798
727
  params->cmd.version.num = 1;
799
- params->cmd.version.items = xcalloc(1, sizeof(lcb_server_version_cmd_t));
800
- if (params->cmd.version.items == NULL) {
801
- rb_raise(eClientNoMemoryError, "failed to allocate memory for arguments");
802
- }
803
- params->cmd.version.ptr = xcalloc(1, sizeof(lcb_server_version_cmd_t *));
804
- if (params->cmd.version.ptr == NULL) {
805
- rb_raise(eClientNoMemoryError, "failed to allocate memory for arguments");
806
- }
807
- params->cmd.version.ptr[0] = params->cmd.version.items;
728
+ _alloc_data_for_s(version, lcb_server_version_cmd_t, 1, items, ptr);
808
729
  }
809
730
 
810
731
 
811
732
  /* common stuff */
812
733
  void
813
- cb_params_destroy(struct params_st *params)
734
+ cb_params_destroy(struct cb_params_st *params)
814
735
  {
815
- #define _release_data_for(type) \
816
- xfree(params->cmd.type.items); \
817
- xfree(params->cmd.type.ptr);
818
-
819
736
  switch (params->type) {
820
- case cmd_get:
737
+ case cb_cmd_get:
821
738
  _release_data_for(get);
822
- xfree(params->cmd.get.items_gr);
823
- xfree(params->cmd.get.ptr_gr);
739
+ _release_data_for_s(get, items_gr, ptr_gr);
824
740
  break;
825
- case cmd_touch:
741
+ case cb_cmd_touch:
826
742
  _release_data_for(touch);
827
743
  break;
828
- case cmd_arith:
744
+ case cb_cmd_arith:
829
745
  _release_data_for(arith);
830
746
  break;
831
- case cmd_remove:
747
+ case cb_cmd_remove:
832
748
  _release_data_for(remove);
833
749
  break;
834
- case cmd_store:
750
+ case cb_cmd_store:
835
751
  _release_data_for(store);
836
752
  break;
837
- case cmd_stats:
753
+ case cb_cmd_stats:
838
754
  _release_data_for(stats);
839
755
  break;
840
- case cmd_version:
756
+ case cb_cmd_version:
841
757
  _release_data_for(version);
842
758
  break;
843
- case cmd_observe:
759
+ case cb_cmd_observe:
844
760
  _release_data_for(observe);
845
761
  break;
846
- case cmd_unlock:
762
+ case cb_cmd_unlock:
847
763
  _release_data_for(unlock);
848
764
  break;
849
765
  }
850
- #undef _release_data_for
851
766
  }
852
767
 
853
768
  struct build_params_st
854
769
  {
855
- struct params_st *params;
770
+ struct cb_params_st *params;
856
771
  int argc;
857
772
  VALUE argv;
858
773
  };
@@ -863,7 +778,7 @@ do_params_build(VALUE ptr)
863
778
  VALUE opts;
864
779
  /* unpack arguments */
865
780
  struct build_params_st *p = (struct build_params_st *)ptr;
866
- struct params_st *params = p->params;
781
+ struct cb_params_st *params = p->params;
867
782
  int argc = p->argc;
868
783
  VALUE argv = p->argv;
869
784
 
@@ -875,15 +790,15 @@ do_params_build(VALUE ptr)
875
790
  opts = Qnil;
876
791
  }
877
792
 
878
- params->npayload = PACKET_HEADER_SIZE; /* size of packet header */
793
+ params->npayload = CB_PACKET_HEADER_SIZE; /* size of packet header */
879
794
  switch (params->type) {
880
- case cmd_touch:
795
+ case cb_cmd_touch:
881
796
  params->cmd.touch.quiet = params->bucket->quiet;
882
797
  params->cmd.touch.ttl = params->bucket->default_ttl;
883
798
  cb_params_touch_parse_options(params, opts);
884
799
  cb_params_touch_parse_arguments(params, argc, argv);
885
800
  break;
886
- case cmd_remove:
801
+ case cb_cmd_remove:
887
802
  params->cmd.remove.quiet = params->bucket->quiet;
888
803
  if (argc == 2) {
889
804
  int type = TYPE(RARRAY_PTR(argv)[1]);
@@ -896,7 +811,7 @@ do_params_build(VALUE ptr)
896
811
  cb_params_remove_parse_options(params, opts);
897
812
  cb_params_remove_parse_arguments(params, argc, argv);
898
813
  break;
899
- case cmd_store:
814
+ case cb_cmd_store:
900
815
  if (argc == 1 && opts != Qnil) {
901
816
  /* put last hash back because it is the value */
902
817
  rb_ary_push(argv, opts);
@@ -905,18 +820,20 @@ do_params_build(VALUE ptr)
905
820
  }
906
821
  params->cmd.store.datatype = 0x00;
907
822
  params->cmd.store.ttl = params->bucket->default_ttl;
908
- params->cmd.store.flags = flags_set_format(params->bucket->default_flags,
823
+ params->cmd.store.flags = cb_flags_set_format(params->bucket->default_flags,
909
824
  params->bucket->default_format);
910
825
  params->cmd.store.observe = Qnil;
911
826
  cb_params_store_parse_options(params, opts);
912
827
  cb_params_store_parse_arguments(params, argc, argv);
913
828
  break;
914
- case cmd_get:
829
+ case cb_cmd_get:
915
830
  params->cmd.get.quiet = params->bucket->quiet;
916
831
  cb_params_get_parse_options(params, opts);
917
832
  cb_params_get_parse_arguments(params, argc, argv);
918
833
  break;
919
- case cmd_arith:
834
+ case cb_cmd_arith:
835
+ params->cmd.arith.create = params->bucket->default_arith_create;
836
+ params->cmd.arith.initial = params->bucket->default_arith_init;
920
837
  params->cmd.arith.delta = 1;
921
838
  params->cmd.arith.format = params->bucket->default_format;
922
839
  params->cmd.arith.ttl = params->bucket->default_ttl;
@@ -928,16 +845,16 @@ do_params_build(VALUE ptr)
928
845
  cb_params_arith_parse_options(params, opts);
929
846
  cb_params_arith_parse_arguments(params, argc, argv);
930
847
  break;
931
- case cmd_stats:
848
+ case cb_cmd_stats:
932
849
  cb_params_stats_parse_arguments(params, argc, argv);
933
850
  break;
934
- case cmd_version:
851
+ case cb_cmd_version:
935
852
  cb_params_version_alloc(params);
936
853
  break;
937
- case cmd_observe:
854
+ case cb_cmd_observe:
938
855
  cb_params_observe_parse_arguments(params, argc, argv);
939
856
  break;
940
- case cmd_unlock:
857
+ case cb_cmd_unlock:
941
858
  params->cmd.unlock.quiet = params->bucket->quiet;
942
859
  if (argc == 2) {
943
860
  int type = TYPE(RARRAY_PTR(argv)[1]);
@@ -956,7 +873,7 @@ do_params_build(VALUE ptr)
956
873
  }
957
874
 
958
875
  void
959
- cb_params_build(struct params_st *params, int argc, VALUE argv)
876
+ cb_params_build(struct cb_params_st *params, int argc, VALUE argv)
960
877
  {
961
878
  int fail = 0;
962
879
  struct build_params_st args;