couchbase 1.1.5 → 1.2.0.beta

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. data/.gitignore +2 -1
  2. data/.travis.yml +12 -1
  3. data/HISTORY.markdown +112 -1
  4. data/README.markdown +149 -6
  5. data/couchbase.gemspec +5 -1
  6. data/ext/couchbase_ext/.gitignore +4 -0
  7. data/ext/couchbase_ext/arguments.c +973 -0
  8. data/ext/couchbase_ext/arithmetic.c +322 -0
  9. data/ext/couchbase_ext/bucket.c +1092 -0
  10. data/ext/couchbase_ext/couchbase_ext.c +618 -3247
  11. data/ext/couchbase_ext/couchbase_ext.h +519 -0
  12. data/ext/couchbase_ext/delete.c +167 -0
  13. data/ext/couchbase_ext/extconf.rb +24 -5
  14. data/ext/couchbase_ext/get.c +301 -0
  15. data/ext/couchbase_ext/gethrtime.c +124 -0
  16. data/ext/couchbase_ext/http.c +402 -0
  17. data/ext/couchbase_ext/observe.c +174 -0
  18. data/ext/couchbase_ext/result.c +126 -0
  19. data/ext/couchbase_ext/stats.c +169 -0
  20. data/ext/couchbase_ext/store.c +522 -0
  21. data/ext/couchbase_ext/timer.c +192 -0
  22. data/ext/couchbase_ext/touch.c +190 -0
  23. data/ext/couchbase_ext/unlock.c +180 -0
  24. data/ext/couchbase_ext/utils.c +471 -0
  25. data/ext/couchbase_ext/version.c +147 -0
  26. data/lib/action_dispatch/middleware/session/couchbase_store.rb +38 -0
  27. data/lib/active_support/cache/couchbase_store.rb +356 -0
  28. data/lib/couchbase.rb +24 -3
  29. data/lib/couchbase/bucket.rb +372 -9
  30. data/lib/couchbase/result.rb +26 -0
  31. data/lib/couchbase/utils.rb +59 -0
  32. data/lib/couchbase/version.rb +1 -1
  33. data/lib/couchbase/view.rb +305 -0
  34. data/lib/couchbase/view_row.rb +230 -0
  35. data/lib/ext/multi_json_fix.rb +47 -0
  36. data/lib/rack/session/couchbase.rb +104 -0
  37. data/tasks/compile.rake +5 -14
  38. data/test/setup.rb +6 -2
  39. data/test/test_arithmetic.rb +32 -2
  40. data/test/test_async.rb +18 -4
  41. data/test/test_bucket.rb +11 -1
  42. data/test/test_cas.rb +13 -3
  43. data/test/test_couchbase_rails_cache_store.rb +294 -0
  44. data/test/test_delete.rb +60 -3
  45. data/test/test_format.rb +28 -17
  46. data/test/test_get.rb +91 -14
  47. data/test/test_store.rb +31 -1
  48. data/test/{test_flush.rb → test_timer.rb} +11 -18
  49. data/test/test_touch.rb +33 -5
  50. data/test/test_unlock.rb +120 -0
  51. data/test/test_utils.rb +26 -0
  52. metadata +101 -8
@@ -0,0 +1,519 @@
1
+ /* vim: ft=c et ts=8 sts=4 sw=4 cino=
2
+ *
3
+ * Copyright 2011, 2012 Couchbase, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ #ifndef COUCHBASE_EXT_H
18
+ #define COUCHBASE_EXT_H
19
+
20
+ #include <ruby.h>
21
+ #ifndef RUBY_ST_H
22
+ #include <st.h>
23
+ #endif
24
+
25
+ #include "couchbase_config.h"
26
+ #ifndef HAVE_GETHRTIME
27
+ typedef uint64_t hrtime_t;
28
+ extern hrtime_t gethrtime(void);
29
+ #endif
30
+
31
+ #include <stdint.h>
32
+ #include <libcouchbase/couchbase.h>
33
+
34
+ #ifdef HAVE_RUBY_ENCODING_H
35
+ #include "ruby/encoding.h"
36
+ #define STR_NEW(ptr, len) rb_external_str_new((ptr), (len))
37
+ #define STR_NEW_CSTR(str) rb_external_str_new_cstr((str))
38
+ #else
39
+ #define STR_NEW(ptr, len) rb_str_new((ptr), (len))
40
+ #define STR_NEW_CSTR(str) rb_str_new2((str))
41
+ #endif
42
+
43
+ #ifdef HAVE_STDARG_PROTOTYPES
44
+ #include <stdarg.h>
45
+ #define va_init_list(a,b) va_start(a,b)
46
+ #else
47
+ #include <varargs.h>
48
+ #define va_init_list(a,b) va_start(a)
49
+ #endif
50
+
51
+ #define debug_object(OBJ) \
52
+ rb_funcall(rb_stderr, rb_intern("print"), 1, rb_funcall(OBJ, rb_intern("object_id"), 0)); \
53
+ rb_funcall(rb_stderr, rb_intern("print"), 1, STR_NEW_CSTR(" ")); \
54
+ rb_funcall(rb_stderr, rb_intern("print"), 1, rb_funcall(OBJ, rb_intern("class"), 0)); \
55
+ rb_funcall(rb_stderr, rb_intern("print"), 1, STR_NEW_CSTR(" ")); \
56
+ rb_funcall(rb_stderr, rb_intern("puts"), 1, rb_funcall(OBJ, rb_intern("inspect"), 0));
57
+
58
+ #define FMT_MASK 0x3
59
+ #define FMT_DOCUMENT 0x0
60
+ #define FMT_MARSHAL 0x1
61
+ #define FMT_PLAIN 0x2
62
+
63
+ #define PACKET_HEADER_SIZE 24
64
+ /* Structs */
65
+ struct bucket_st
66
+ {
67
+ lcb_t handle;
68
+ struct lcb_io_opt_st *io;
69
+ uint16_t port;
70
+ char *authority;
71
+ char *hostname;
72
+ char *pool;
73
+ char *bucket;
74
+ char *username;
75
+ char *password;
76
+ int async;
77
+ int quiet;
78
+ VALUE default_format; /* should update +default_flags+ on change */
79
+ uint32_t default_flags;
80
+ time_t default_ttl;
81
+ time_t default_observe_timeout;
82
+ uint32_t timeout;
83
+ size_t threshold; /* the number of bytes to trigger event loop, zero if don't care */
84
+ size_t nbytes; /* the number of bytes scheduled to be sent */
85
+ VALUE exception; /* error delivered by error_callback */
86
+ VALUE on_error_proc; /* is using to deliver errors in async mode */
87
+ VALUE environment; /* sym_development or sym_production */
88
+ char *key_prefix;
89
+ VALUE key_prefix_val;
90
+ char *node_list;
91
+ VALUE object_space;
92
+ VALUE self; /* the pointer to bucket representation in ruby land */
93
+ };
94
+
95
+ struct http_request_st;
96
+ struct context_st
97
+ {
98
+ struct bucket_st* bucket;
99
+ int extended;
100
+ VALUE proc;
101
+ void *rv;
102
+ VALUE exception;
103
+ VALUE observe_options;
104
+ VALUE force_format;
105
+ VALUE operation;
106
+ VALUE headers_val;
107
+ int headers_built;
108
+ struct http_request_st *request;
109
+ int quiet;
110
+ int arith; /* incr: +1, decr: -1, other: 0 */
111
+ size_t nqueries;
112
+ };
113
+
114
+ struct http_request_st {
115
+ struct bucket_st *bucket;
116
+ VALUE bucket_obj;
117
+ VALUE type;
118
+ int extended;
119
+ int running;
120
+ int completed;
121
+ lcb_http_request_t request;
122
+ lcb_http_cmd_t cmd;
123
+ struct context_st *ctx;
124
+ VALUE on_body_callback;
125
+ };
126
+
127
+ struct timer_st
128
+ {
129
+ struct bucket_st *bucket;
130
+ int periodic;
131
+ uint32_t usec;
132
+ lcb_timer_t timer;
133
+ VALUE self;
134
+ VALUE callback;
135
+ };
136
+
137
+ /* Classes */
138
+ extern VALUE cBucket;
139
+ extern VALUE cCouchRequest;
140
+ extern VALUE cResult;
141
+ extern VALUE cTimer;
142
+
143
+ /* Modules */
144
+ extern VALUE mCouchbase;
145
+ extern VALUE mError;
146
+ extern VALUE mMarshal;
147
+ extern VALUE mMultiJson;
148
+ extern VALUE mURI;
149
+
150
+ /* Symbols */
151
+ extern ID sym_add;
152
+ extern ID sym_append;
153
+ extern ID sym_assemble_hash;
154
+ extern ID sym_body;
155
+ extern ID sym_bucket;
156
+ extern ID sym_cas;
157
+ extern ID sym_chunked;
158
+ extern ID sym_content_type;
159
+ extern ID sym_create;
160
+ extern ID sym_decrement;
161
+ extern ID sym_default_flags;
162
+ extern ID sym_default_format;
163
+ extern ID sym_default_observe_timeout;
164
+ extern ID sym_default_ttl;
165
+ extern ID sym_delete;
166
+ extern ID sym_delta;
167
+ extern ID sym_development;
168
+ extern ID sym_document;
169
+ extern ID sym_environment;
170
+ extern ID sym_extended;
171
+ extern ID sym_flags;
172
+ extern ID sym_format;
173
+ extern ID sym_found;
174
+ extern ID sym_get;
175
+ extern ID sym_hostname;
176
+ extern ID sym_http_request;
177
+ extern ID sym_increment;
178
+ extern ID sym_initial;
179
+ extern ID sym_key_prefix;
180
+ extern ID sym_lock;
181
+ extern ID sym_management;
182
+ extern ID sym_marshal;
183
+ extern ID sym_method;
184
+ extern ID sym_node_list;
185
+ extern ID sym_not_found;
186
+ extern ID sym_num_replicas;
187
+ extern ID sym_observe;
188
+ extern ID sym_password;
189
+ extern ID sym_periodic;
190
+ extern ID sym_persisted;
191
+ extern ID sym_plain;
192
+ extern ID sym_pool;
193
+ extern ID sym_port;
194
+ extern ID sym_post;
195
+ extern ID sym_prepend;
196
+ extern ID sym_production;
197
+ extern ID sym_put;
198
+ extern ID sym_quiet;
199
+ extern ID sym_replace;
200
+ extern ID sym_replica;
201
+ extern ID sym_send_threshold;
202
+ extern ID sym_set;
203
+ extern ID sym_stats;
204
+ extern ID sym_timeout;
205
+ extern ID sym_touch;
206
+ extern ID sym_ttl;
207
+ extern ID sym_type;
208
+ extern ID sym_unlock;
209
+ extern ID sym_username;
210
+ extern ID sym_version;
211
+ extern ID sym_view;
212
+ extern ID id_arity;
213
+ extern ID id_call;
214
+ extern ID id_delete;
215
+ extern ID id_dump;
216
+ extern ID id_dup;
217
+ extern ID id_flatten_bang;
218
+ extern ID id_has_key_p;
219
+ extern ID id_host;
220
+ extern ID id_iv_cas;
221
+ extern ID id_iv_completed;
222
+ extern ID id_iv_error;
223
+ extern ID id_iv_flags;
224
+ extern ID id_iv_from_master;
225
+ extern ID id_iv_headers;
226
+ extern ID id_iv_key;
227
+ extern ID id_iv_node;
228
+ extern ID id_iv_operation;
229
+ extern ID id_iv_status;
230
+ extern ID id_iv_time_to_persist;
231
+ extern ID id_iv_time_to_replicate;
232
+ extern ID id_iv_value;
233
+ extern ID id_load;
234
+ extern ID id_match;
235
+ extern ID id_observe_and_wait;
236
+ extern ID id_parse;
237
+ extern ID id_password;
238
+ extern ID id_path;
239
+ extern ID id_port;
240
+ extern ID id_scheme;
241
+ extern ID id_to_s;
242
+ extern ID id_user;
243
+ extern ID id_verify_observe_options;
244
+
245
+ /* Errors */
246
+ extern VALUE eBaseError;
247
+ extern VALUE eValueFormatError;
248
+ /* LCB_SUCCESS = 0x00 */
249
+ /* LCB_AUTH_CONTINUE = 0x01 */
250
+ extern VALUE eAuthError; /* LCB_AUTH_ERROR = 0x02 */
251
+ extern VALUE eDeltaBadvalError; /* LCB_DELTA_BADVAL = 0x03 */
252
+ extern VALUE eTooBigError; /* LCB_E2BIG = 0x04 */
253
+ extern VALUE eBusyError; /* LCB_EBUSY = 0x05 */
254
+ extern VALUE eInternalError; /* LCB_EINTERNAL = 0x06 */
255
+ extern VALUE eInvalidError; /* LCB_EINVAL = 0x07 */
256
+ extern VALUE eNoMemoryError; /* LCB_ENOMEM = 0x08 */
257
+ extern VALUE eRangeError; /* LCB_ERANGE = 0x09 */
258
+ extern VALUE eLibcouchbaseError; /* LCB_ERROR = 0x0a */
259
+ extern VALUE eTmpFailError; /* LCB_ETMPFAIL = 0x0b */
260
+ extern VALUE eKeyExistsError; /* LCB_KEY_EEXISTS = 0x0c */
261
+ extern VALUE eNotFoundError; /* LCB_KEY_ENOENT = 0x0d */
262
+ extern VALUE eLibeventError; /* LCB_LIBEVENT_ERROR = 0x0e */
263
+ extern VALUE eNetworkError; /* LCB_NETWORK_ERROR = 0x0f */
264
+ extern VALUE eNotMyVbucketError; /* LCB_NOT_MY_VBUCKET = 0x10 */
265
+ extern VALUE eNotStoredError; /* LCB_NOT_STORED = 0x11 */
266
+ extern VALUE eNotSupportedError; /* LCB_NOT_SUPPORTED = 0x12 */
267
+ extern VALUE eUnknownCommandError; /* LCB_UNKNOWN_COMMAND = 0x13 */
268
+ extern VALUE eUnknownHostError; /* LCB_UNKNOWN_HOST = 0x14 */
269
+ extern VALUE eProtocolError; /* LCB_PROTOCOL_ERROR = 0x15 */
270
+ extern VALUE eTimeoutError; /* LCB_ETIMEDOUT = 0x16 */
271
+ extern VALUE eConnectError; /* LCB_CONNECT_ERROR = 0x17 */
272
+ extern VALUE eBucketNotFoundError; /* LCB_BUCKET_ENOENT = 0x18 */
273
+ extern VALUE eClientNoMemoryError; /* LCB_CLIENT_ENOMEM = 0x19 */
274
+ extern VALUE eClientTmpFailError; /* LCB_CLIENT_ETMPFAIL = 0x20 */
275
+
276
+ void strip_key_prefix(struct bucket_st *bucket, VALUE key);
277
+ VALUE cb_check_error(lcb_error_t rc, const char *msg, VALUE key);
278
+ VALUE cb_check_error_with_status(lcb_error_t rc, const char *msg, VALUE key, lcb_http_status_t status);
279
+ VALUE cb_gc_protect(struct bucket_st *bucket, VALUE val);
280
+ VALUE cb_gc_unprotect(struct bucket_st *bucket, VALUE val);
281
+ VALUE cb_proc_call(VALUE recv, int argc, ...);
282
+ int cb_first_value_i(VALUE key, VALUE value, VALUE arg);
283
+ void cb_build_headers(struct context_st *ctx, const char * const *headers);
284
+ void maybe_do_loop(struct bucket_st *bucket);
285
+ VALUE unify_key(struct bucket_st *bucket, VALUE key, int apply_prefix);
286
+ VALUE encode_value(VALUE val, uint32_t flags);
287
+ VALUE decode_value(VALUE blob, uint32_t flags, VALUE force_format);
288
+ uint32_t flags_set_format(uint32_t flags, ID format);
289
+ ID flags_get_format(uint32_t flags);
290
+
291
+ void storage_callback(lcb_t handle, const void *cookie, lcb_storage_t operation, lcb_error_t error, const lcb_store_resp_t *resp);
292
+ void get_callback(lcb_t handle, const void *cookie, lcb_error_t error, const lcb_get_resp_t *resp);
293
+ void touch_callback(lcb_t handle, const void *cookie, lcb_error_t error, const lcb_touch_resp_t *resp);
294
+ void delete_callback(lcb_t handle, const void *cookie, lcb_error_t error, const lcb_remove_resp_t *resp);
295
+ void stat_callback(lcb_t handle, const void *cookie, lcb_error_t error, const lcb_server_stat_resp_t *resp);
296
+ void arithmetic_callback(lcb_t handle, const void *cookie, lcb_error_t error, const lcb_arithmetic_resp_t *resp);
297
+ void version_callback(lcb_t handle, const void *cookie, lcb_error_t error, const lcb_server_version_resp_t *resp);
298
+ void http_complete_callback(lcb_http_request_t request, lcb_t handle, const void *cookie, lcb_error_t error, const lcb_http_resp_t *resp);
299
+ void http_data_callback(lcb_http_request_t request, lcb_t handle, const void *cookie, lcb_error_t error, const lcb_http_resp_t *resp);
300
+ void observe_callback(lcb_t handle, const void *cookie, lcb_error_t error, const lcb_observe_resp_t *resp);
301
+ void unlock_callback(lcb_t handle, const void *cookie, lcb_error_t error, const lcb_unlock_resp_t *resp);
302
+
303
+
304
+ VALUE cb_bucket_alloc(VALUE klass);
305
+ void cb_bucket_free(void *ptr);
306
+ VALUE cb_bucket_init_copy(VALUE copy, VALUE orig);
307
+ VALUE cb_bucket_init(int argc, VALUE *argv, VALUE self);
308
+ VALUE cb_bucket_inspect(VALUE self);
309
+ VALUE cb_bucket_touch(int argc, VALUE *argv, VALUE self);
310
+ VALUE cb_bucket_delete(int argc, VALUE *argv, VALUE self);
311
+ VALUE cb_bucket_stats(int argc, VALUE *argv, VALUE self);
312
+ VALUE cb_bucket_set(int argc, VALUE *argv, VALUE self);
313
+ VALUE cb_bucket_add(int argc, VALUE *argv, VALUE self);
314
+ VALUE cb_bucket_replace(int argc, VALUE *argv, VALUE self);
315
+ VALUE cb_bucket_append(int argc, VALUE *argv, VALUE self);
316
+ VALUE cb_bucket_prepend(int argc, VALUE *argv, VALUE self);
317
+ VALUE cb_bucket_aset(int argc, VALUE *argv, VALUE self);
318
+ VALUE cb_bucket_get(int argc, VALUE *argv, VALUE self);
319
+ VALUE cb_bucket_incr(int argc, VALUE *argv, VALUE self);
320
+ VALUE cb_bucket_decr(int argc, VALUE *argv, VALUE self);
321
+ VALUE cb_bucket_unlock(int argc, VALUE *argv, VALUE self);
322
+ VALUE cb_bucket_run(int argc, VALUE *argv, VALUE self);
323
+ VALUE cb_bucket_stop(VALUE self);
324
+ VALUE cb_bucket_version(int argc, VALUE *argv, VALUE self);
325
+ VALUE cb_bucket_disconnect(VALUE self);
326
+ VALUE cb_bucket_reconnect(int argc, VALUE *argv, VALUE self);
327
+ VALUE cb_bucket_make_http_request(int argc, VALUE *argv, VALUE self);
328
+ VALUE cb_bucket_observe(int argc, VALUE *argv, VALUE self);
329
+ VALUE cb_bucket_connected_p(VALUE self);
330
+ VALUE cb_bucket_async_p(VALUE self);
331
+ VALUE cb_bucket_quiet_get(VALUE self);
332
+ VALUE cb_bucket_quiet_set(VALUE self, VALUE val);
333
+ VALUE cb_bucket_default_flags_get(VALUE self);
334
+ VALUE cb_bucket_default_flags_set(VALUE self, VALUE val);
335
+ VALUE cb_bucket_default_format_get(VALUE self);
336
+ VALUE cb_bucket_default_format_set(VALUE self, VALUE val);
337
+ VALUE cb_bucket_on_error_set(VALUE self, VALUE val);
338
+ VALUE cb_bucket_on_error_get(VALUE self);
339
+ VALUE cb_bucket_timeout_get(VALUE self);
340
+ VALUE cb_bucket_timeout_set(VALUE self, VALUE val);
341
+ VALUE cb_bucket_key_prefix_get(VALUE self);
342
+ VALUE cb_bucket_key_prefix_set(VALUE self, VALUE val);
343
+ VALUE cb_bucket_url_get(VALUE self);
344
+ VALUE cb_bucket_hostname_get(VALUE self);
345
+ VALUE cb_bucket_port_get(VALUE self);
346
+ VALUE cb_bucket_authority_get(VALUE self);
347
+ VALUE cb_bucket_bucket_get(VALUE self);
348
+ VALUE cb_bucket_pool_get(VALUE self);
349
+ VALUE cb_bucket_username_get(VALUE self);
350
+ VALUE cb_bucket_password_get(VALUE self);
351
+ VALUE cb_bucket_environment_get(VALUE self);
352
+ VALUE cb_bucket_num_replicas_get(VALUE self);
353
+ VALUE cb_bucket_default_observe_timeout_get(VALUE self);
354
+ VALUE cb_bucket_default_observe_timeout_set(VALUE self, VALUE val);
355
+
356
+ VALUE cb_http_request_alloc(VALUE klass);
357
+ VALUE cb_http_request_init(int argc, VALUE *argv, VALUE self);
358
+ VALUE cb_http_request_inspect(VALUE self);
359
+ VALUE cb_http_request_on_body(VALUE self);
360
+ VALUE cb_http_request_perform(VALUE self);
361
+ VALUE cb_http_request_pause(VALUE self);
362
+ VALUE cb_http_request_continue(VALUE self);
363
+ VALUE cb_http_request_path_get(VALUE self);
364
+ VALUE cb_http_request_extended_get(VALUE self);
365
+ VALUE cb_http_request_chunked_get(VALUE self);
366
+
367
+ VALUE cb_result_success_p(VALUE self);
368
+ VALUE cb_result_inspect(VALUE self);
369
+
370
+ VALUE cb_timer_alloc(VALUE klass);
371
+ VALUE cb_timer_inspect(VALUE self);
372
+ VALUE cb_timer_cancel(VALUE self);
373
+ VALUE cb_timer_init(int argc, VALUE *argv, VALUE self);
374
+
375
+ /* Method arguments */
376
+
377
+ enum command_t {
378
+ cmd_touch = 0x01,
379
+ cmd_remove = 0x02,
380
+ cmd_store = 0x03,
381
+ cmd_get = 0x04,
382
+ cmd_arith = 0x05,
383
+ cmd_stats = 0x06,
384
+ cmd_version = 0x08,
385
+ cmd_observe = 0x09,
386
+ cmd_unlock = 0x10
387
+ };
388
+
389
+ struct params_st
390
+ {
391
+ enum command_t type;
392
+ union {
393
+ struct {
394
+ /* number of items */
395
+ size_t num;
396
+ /* array of the items */
397
+ lcb_touch_cmd_t *items;
398
+ /* array of the pointers to the items */
399
+ const lcb_touch_cmd_t **ptr;
400
+ unsigned int quiet : 1;
401
+ unsigned int array : 1;
402
+ lcb_time_t ttl;
403
+ } touch;
404
+ struct {
405
+ /* number of items */
406
+ size_t num;
407
+ /* array of the items */
408
+ lcb_remove_cmd_t *items;
409
+ /* array of the pointers to the items */
410
+ const lcb_remove_cmd_t **ptr;
411
+ unsigned int array : 1;
412
+ /* 1 if it should silense NOT_FOUND errors */
413
+ unsigned int quiet : 1;
414
+ lcb_cas_t cas;
415
+ } remove;
416
+ struct {
417
+ /* number of items */
418
+ size_t num;
419
+ /* array of the items */
420
+ lcb_store_cmd_t *items;
421
+ /* array of the pointers to the items */
422
+ const lcb_store_cmd_t **ptr;
423
+ lcb_storage_t operation;
424
+ lcb_uint32_t flags;
425
+ lcb_time_t ttl;
426
+ lcb_cas_t cas;
427
+ lcb_datatype_t datatype;
428
+ VALUE observe;
429
+ } store;
430
+ struct {
431
+ /* number of items */
432
+ size_t num;
433
+ /* array of the items */
434
+ lcb_get_cmd_t *items;
435
+ /* array of the pointers to the items */
436
+ const lcb_get_cmd_t **ptr;
437
+ /* array of the items for GET_REPLICA command */
438
+ lcb_get_replica_cmd_t *items_gr;
439
+ /* array of the pointers to the items for GET_REPLICA command */
440
+ const lcb_get_replica_cmd_t **ptr_gr;
441
+ unsigned int array : 1;
442
+ unsigned int lock : 1;
443
+ unsigned int replica : 1;
444
+ unsigned int assemble_hash : 1;
445
+ unsigned int extended : 1;
446
+ unsigned int quiet : 1;
447
+ /* arguments given in form of hash key-ttl to "get and touch" */
448
+ unsigned int gat : 1;
449
+ lcb_time_t ttl;
450
+ VALUE forced_format;
451
+ VALUE keys_ary;
452
+ } get;
453
+ struct {
454
+ /* number of items */
455
+ size_t num;
456
+ /* array of the items */
457
+ lcb_arithmetic_cmd_t *items;
458
+ /* array of the pointers to the items */
459
+ const lcb_arithmetic_cmd_t **ptr;
460
+ unsigned int array : 1;
461
+ unsigned int extended : 1;
462
+ unsigned int create : 1;
463
+ lcb_time_t ttl;
464
+ lcb_uint64_t initial;
465
+ lcb_uint64_t delta;
466
+ int sign;
467
+ VALUE format;
468
+ lcb_datatype_t datatype;
469
+ } arith;
470
+ struct {
471
+ /* number of items */
472
+ size_t num;
473
+ /* array of the items */
474
+ lcb_server_stats_cmd_t *items;
475
+ /* array of the pointers to the items */
476
+ const lcb_server_stats_cmd_t **ptr;
477
+ unsigned int array : 1;
478
+ } stats;
479
+ struct {
480
+ /* number of items */
481
+ size_t num;
482
+ /* array of the items */
483
+ lcb_server_version_cmd_t *items;
484
+ /* array of the pointers to the items */
485
+ const lcb_server_version_cmd_t **ptr;
486
+ } version;
487
+ struct {
488
+ /* number of items */
489
+ size_t num;
490
+ /* array of the items */
491
+ lcb_observe_cmd_t *items;
492
+ /* array of the pointers to the items */
493
+ const lcb_observe_cmd_t **ptr;
494
+ unsigned int array : 1;
495
+ } observe;
496
+ struct {
497
+ /* number of items */
498
+ size_t num;
499
+ /* array of the items */
500
+ lcb_unlock_cmd_t *items;
501
+ /* array of the pointers to the items */
502
+ const lcb_unlock_cmd_t **ptr;
503
+ unsigned int quiet : 1;
504
+ lcb_cas_t cas;
505
+ } unlock;
506
+ } cmd;
507
+ struct bucket_st *bucket;
508
+ /* helper index for iterators */
509
+ size_t idx;
510
+ /* the approximate size of the data to be sent */
511
+ size_t npayload;
512
+ };
513
+
514
+ void cb_params_destroy(struct params_st *params);
515
+ void cb_params_build(struct params_st *params, int argc, VALUE argv);
516
+
517
+
518
+ #endif
519
+