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

Sign up to get free protection for your applications and to get access to all the features.
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;