libcouchbase 0.0.6 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cb45eb8d450b1b10b14d63bf0d3df86421140ff8
4
- data.tar.gz: 6eb74d3ca61e481106b9b5ec58429c33808985aa
3
+ metadata.gz: e77f4344c80a4dcb25a8b4641eb1f451871999f3
4
+ data.tar.gz: ad1dfe2a7276dbe6eaf72466203fb44f9989461a
5
5
  SHA512:
6
- metadata.gz: 0500cdf5fb26590f8e219e35baac537e51d5acd3ea691678bb98527b6b8d22cd3d599060e2edfa7bc9cbe6f6d115c4bb6154e97ff6509a7cdf98f1579d26f420
7
- data.tar.gz: 99d90632602e151801fdc3f87276b7692579e5f6473310d049ae8ddc51aebfc51cc040d2008b8c588e1476104ba9e949158bf4017963eb2a3fc4fb0f185e1ba5
6
+ metadata.gz: 77c92e787e39f9704148c3fce013fe11c52c3a0a6329b22c00f76bfbb47425fb389e3ffbda01b8f2fe2709dfdaa2d064afe2adf56eed3421ad3b044fcff8058d
7
+ data.tar.gz: fb143e552a235d9aa96412636fe197644c10a81b39780ed9a52cad8729c6f400ce659050bbf41340cd0383e75f91e98d3ad3c91ee7c666afd3fe84f3dcd1685d
@@ -1,5 +1,20 @@
1
1
  # Release Notes
2
2
 
3
+ ## 2.6.4 (November 28 2016)
4
+
5
+ * Fix bug in pillowfight where large value sizes would cause a segfault.
6
+ * Issues: [CCBC-727](https://issues.couchbase.com/browse/CCBC-727)
7
+
8
+ * Allow 64 bit values with `cbc-incr` and `cbc-decr`.
9
+ * Issues: [CCBC-716](https://issues.couchbase.com/browse/CCBC-716)
10
+
11
+ * Fix encoding in `lcb_n1p_setconsistent_token`. This function would encode
12
+ it as `scan_vector` but it should be `scan_vectors`.
13
+
14
+ * Refactor negotiation internals to use C++.
15
+ This is part of an internal refactoring to move our internals over to C++.
16
+ This will make the code more manageable and extendable in the future.
17
+
3
18
  ## 2.6.3 (September 27 2016)
4
19
 
5
20
  * Fix memory corruption for some JSON APIs when no rows are returned.
@@ -42,13 +42,13 @@ ENDIF()
42
42
 
43
43
  IF (NOT LCB_VERSION)
44
44
  SET(LCB_NOGITVERSION ON)
45
- SET(LCB_VERSION "2.6.3")
45
+ SET(LCB_VERSION "2.6.4")
46
46
  ENDIF()
47
47
  IF (NOT LCB_VERSION_CHANGESET)
48
48
  SET(LCB_VERSION_CHANGESET "0xdeadbeef")
49
49
  ENDIF()
50
50
  IF (NOT LCB_VERSION_HEX)
51
- SET(LCB_VERSION_HEX 0x020603)
51
+ SET(LCB_VERSION_HEX 0x020604)
52
52
  ENDIF()
53
53
 
54
54
  # Now parse the version string
@@ -63,7 +63,7 @@ IF(APPLE)
63
63
  ELSE()
64
64
  SET(LCB_SONAME_MAJOR "2")
65
65
  ENDIF()
66
- SET(LCB_SONAME_FULL "${LCB_SONAME_MAJOR}.0.38")
66
+ SET(LCB_SONAME_FULL "${LCB_SONAME_MAJOR}.0.39")
67
67
 
68
68
  MESSAGE(STATUS
69
69
  "libcouchbase ${LCB_VERSION_MAJOR},${LCB_VERSION_MINOR},${LCB_VERSION_PATCH}")
@@ -43,7 +43,6 @@ SET(LCB_CORE_SRC
43
43
  src/bootstrap.c
44
44
  src/callbacks.c
45
45
  src/dump.c
46
- src/handler.c
47
46
  src/getconfig.c
48
47
  src/legacy.c
49
48
  # src/mcserver/negotiate.c
@@ -61,6 +60,7 @@ SET(LCB_CORE_CXXSRC
61
60
  src/auth.cc
62
61
  src/connspec.cc
63
62
  src/nodeinfo.cc
63
+ src/handler.cc
64
64
  src/hostlist.cc
65
65
  src/http/http.cc
66
66
  src/http/http_io.cc
@@ -21,20 +21,23 @@
21
21
  #include "mc/compress.h"
22
22
  #include "trace.h"
23
23
 
24
- /** Define a compound response structure for use with mutation tokens */
25
- #define MK_RESPACK(dstname, srcname) \
26
- typedef struct { srcname resp; lcb_MUTATION_TOKEN mt; } dstname
27
- MK_RESPACK(respack_STORE, lcb_RESPSTORE);
28
- MK_RESPACK(respack_COUNTER, lcb_RESPCOUNTER);
29
- MK_RESPACK(respack_REMOVE, lcb_RESPREMOVE);
30
- MK_RESPACK(respack_SUBDOC, lcb_RESPSUBDOC);
24
+ template <typename T>
25
+ class ResponsePack {
26
+ public:
27
+ T resp;
28
+ lcb_MUTATION_TOKEN mt;
29
+
30
+ static const lcb_MUTATION_TOKEN*
31
+ get_mt(const lcb_RESPBASE *rb) {
32
+ const ResponsePack *rp = reinterpret_cast<const ResponsePack*>(rb);
33
+ return &rp->mt;
34
+ }
35
+ };
31
36
 
32
37
  LIBCOUCHBASE_API
33
38
  lcb_error_t
34
39
  lcb_errmap_default(lcb_t instance, lcb_uint16_t in)
35
40
  {
36
- (void)instance;
37
-
38
41
  switch (in) {
39
42
  case PROTOCOL_BINARY_RESPONSE_NOT_MY_VBUCKET:
40
43
  return LCB_ETIMEDOUT;
@@ -47,7 +50,11 @@ lcb_errmap_default(lcb_t instance, lcb_uint16_t in)
47
50
 
48
51
  case PROTOCOL_BINARY_RESPONSE_EINTERNAL:
49
52
  default:
50
- fprintf(stderr, "COUCHBASE: Unhandled memcached status=0x%x\n", in);
53
+ if (instance) {
54
+ lcb_log(instance->settings, "handler", LCB_LOG_ERROR, __FILE__, __LINE__, "Got unhandled memcached error 0x%X", in);
55
+ } else {
56
+ fprintf(stderr, "COUCHBASE: Unhandled memcached status=0x%x\n", in);
57
+ }
51
58
  return LCB_UNKNOWN_MEMCACHED_ERROR;
52
59
  }
53
60
  }
@@ -55,7 +62,6 @@ lcb_errmap_default(lcb_t instance, lcb_uint16_t in)
55
62
  static lcb_error_t
56
63
  map_error(lcb_t instance, int in)
57
64
  {
58
- (void)instance;
59
65
  switch (in) {
60
66
  case PROTOCOL_BINARY_RESPONSE_SUCCESS:
61
67
  return LCB_SUCCESS;
@@ -153,24 +159,26 @@ find_callback(lcb_t instance, lcb_CALLBACKTYPE type)
153
159
  * satisfied.
154
160
  */
155
161
 
156
- #define MK_ERROR(root, resp, response, imm) do { \
157
- if (imm) { \
158
- (resp)->rc = imm; \
159
- (resp)->rflags |= LCB_RESP_F_CLIENTGEN; \
160
- } else if (PACKET_STATUS(response) == PROTOCOL_BINARY_RESPONSE_SUCCESS) { \
161
- (resp)->rc = LCB_SUCCESS; \
162
- } else { \
163
- (resp)->rc = map_error(root, PACKET_STATUS(response)); \
164
- } \
165
- } while (0);
162
+ template <typename T>
163
+ void make_error(lcb_t instance, T* resp,
164
+ const packet_info *response, lcb_error_t imm) {
165
+ if (imm) {
166
+ resp->rc = imm;
167
+ resp->rflags |= LCB_RESP_F_CLIENTGEN;
168
+ } else if (PACKET_STATUS(response) == PROTOCOL_BINARY_RESPONSE_SUCCESS) {
169
+ resp->rc = LCB_SUCCESS;
170
+ } else {
171
+ resp->rc = map_error(instance, PACKET_STATUS(response));
172
+ }
173
+ }
166
174
 
167
- static void
168
- init_resp3(lcb_t instance, const packet_info *mc_resp, const mc_PACKET *req,
169
- lcb_error_t immerr, lcb_RESPBASE *resp)
175
+ template <typename T>
176
+ void init_resp(lcb_t instance, const packet_info *mc_resp, const mc_PACKET *req,
177
+ lcb_error_t immerr, T *resp)
170
178
  {
171
- MK_ERROR(instance, resp, mc_resp, immerr);
179
+ make_error(instance, resp, mc_resp, immerr);
172
180
  resp->cas = PACKET_CAS(mc_resp);
173
- resp->cookie = (void *)MCREQ_PKT_COOKIE(req);
181
+ resp->cookie = const_cast<void*>(MCREQ_PKT_COOKIE(req));
174
182
  mcreq_get_key(req, &resp->key, &resp->nkey);
175
183
  }
176
184
 
@@ -194,11 +202,12 @@ handle_mutation_token(lcb_t instance, const packet_info *mc_resp,
194
202
  if (!instance->dcpinfo && LCBT_SETTING(instance, dur_mutation_tokens)) {
195
203
  size_t nvb = LCBT_VBCONFIG(instance)->nvb;
196
204
  if (nvb) {
197
- instance->dcpinfo = calloc(nvb, sizeof(*instance->dcpinfo));
205
+ instance->dcpinfo = new lcb_MUTATION_TOKEN[nvb];
206
+ memset(instance->dcpinfo, 0, sizeof(*instance->dcpinfo) * nvb);
198
207
  }
199
208
  }
200
209
 
201
- sbuf = PACKET_BODY(mc_resp);
210
+ sbuf = reinterpret_cast<const char *>(PACKET_BODY(mc_resp));
202
211
  vbid = mcreq_get_vbucket(req);
203
212
  stok->vbid_ = vbid;
204
213
  memcpy(&stok->uuid_, sbuf, 8);
@@ -212,26 +221,30 @@ handle_mutation_token(lcb_t instance, const packet_info *mc_resp,
212
221
  }
213
222
  }
214
223
 
215
- #define MK_RESPKEY3(resp, req) do { \
216
- mcreq_get_key(req, &(resp)->key, &(resp)->nkey); \
217
- } while (0);
218
-
224
+ static lcb_t get_instance(mc_PIPELINE *pipeline) {
225
+ return reinterpret_cast<lcb_t>(pipeline->parent->cqdata);
226
+ }
219
227
 
220
- static void
221
- invoke_callback3(const mc_PACKET *pkt,
222
- lcb_t instance,lcb_CALLBACKTYPE cbtype, lcb_RESPBASE * resp)
228
+ template <typename T>
229
+ void invoke_callback(const mc_PACKET *pkt,
230
+ lcb_t instance, T* resp, lcb_CALLBACKTYPE cbtype)
223
231
  {
224
232
  if (!(pkt->flags & MCREQ_F_INVOKED)) {
225
- resp->cookie = (void *)MCREQ_PKT_COOKIE(pkt);
233
+ resp->cookie = const_cast<void*>(MCREQ_PKT_COOKIE(pkt));
234
+ const lcb_RESPBASE *base = reinterpret_cast<const lcb_RESPBASE*>(resp);
226
235
  if ((pkt->flags & MCREQ_F_PRIVCALLBACK) == 0) {
227
- find_callback(instance, cbtype)(instance, cbtype, resp);
236
+ find_callback(instance, cbtype)(instance, cbtype, base);
228
237
  } else {
229
- (*(lcb_RESPCALLBACK*)resp->cookie)(instance, cbtype, resp);
238
+ (*(lcb_RESPCALLBACK*)resp->cookie)(instance, cbtype, base);
230
239
  }
231
240
  }
232
241
  }
233
- #define INVOKE_CALLBACK3(req, res_, instance, type) { \
234
- invoke_callback3(req, instance, type, (lcb_RESPBASE *)res_); \
242
+
243
+ template <typename T>
244
+ void invoke_callback(const mc_PACKET *pkt, mc_PIPELINE *pipeline, T *resp,
245
+ lcb_CALLBACKTYPE cbtype)
246
+ {
247
+ invoke_callback(pkt, get_instance(pipeline), cbtype, resp);
235
248
  }
236
249
 
237
250
  /**
@@ -276,27 +289,27 @@ static void
276
289
  H_get(mc_PIPELINE *pipeline, mc_PACKET *request, packet_info *response,
277
290
  lcb_error_t immerr)
278
291
  {
279
- lcb_t o;
280
292
  lcb_RESPGET resp = { 0 };
281
- void *freeptr = NULL;
282
293
 
283
- o = pipeline->parent->cqdata;
284
- init_resp3(o, response, request, immerr, (lcb_RESPBASE *)&resp);
294
+ lcb_t o = get_instance(pipeline);
295
+ init_resp(o, response, request, immerr, &resp);
285
296
  resp.rflags |= LCB_RESP_F_FINAL;
286
297
 
287
298
  if (resp.rc == LCB_SUCCESS) {
288
- const protocol_binary_response_getq *getq =
289
- PACKET_EPHEMERAL_START(response);
299
+ const protocol_binary_response_get *get =
300
+ reinterpret_cast<const protocol_binary_response_get*>(
301
+ PACKET_EPHEMERAL_START(response));
290
302
  resp.datatype = PACKET_DATATYPE(response);
291
- resp.itmflags = ntohl(getq->message.body.flags);
303
+ resp.itmflags = ntohl(get->message.body.flags);
292
304
  resp.value = PACKET_VALUE(response);
293
305
  resp.nvalue = PACKET_NVALUE(response);
294
306
  resp.bufh = response->bufh;
295
307
  }
296
308
 
309
+ void *freeptr = NULL;
297
310
  maybe_decompress(o, response, &resp, &freeptr);
298
311
  TRACE_GET_END(response, &resp);
299
- INVOKE_CALLBACK3(request, &resp, o, LCB_CALLBACK_GET);
312
+ invoke_callback(request, o, &resp, LCB_CALLBACK_GET);
300
313
  free(freeptr);
301
314
  }
302
315
 
@@ -305,14 +318,16 @@ H_getreplica(mc_PIPELINE *pipeline, mc_PACKET *request, packet_info *response,
305
318
  lcb_error_t immerr)
306
319
  {
307
320
  lcb_RESPGET resp = { 0 };
308
- lcb_t instance = pipeline->parent->cqdata;
321
+ lcb_t instance = get_instance(pipeline);
309
322
  void *freeptr = NULL;
310
323
  mc_REQDATAEX *rd = request->u_rdata.exdata;
311
324
 
312
- init_resp3(instance, response, request, immerr, (lcb_RESPBASE *)&resp);
325
+ init_resp(instance, response, request, immerr, &resp);
313
326
 
314
327
  if (resp.rc == LCB_SUCCESS) {
315
- const protocol_binary_response_get *get = PACKET_EPHEMERAL_START(response);
328
+ const protocol_binary_response_get *get =
329
+ reinterpret_cast<const protocol_binary_response_get*>(
330
+ PACKET_EPHEMERAL_START(response));
316
331
  resp.itmflags = ntohl(get->message.body.flags);
317
332
  resp.datatype = PACKET_DATATYPE(response);
318
333
  resp.value = PACKET_VALUE(response);
@@ -329,11 +344,10 @@ static void
329
344
  H_subdoc(mc_PIPELINE *pipeline, mc_PACKET *request, packet_info *response,
330
345
  lcb_error_t immerr)
331
346
  {
332
- lcb_t o;
333
- respack_SUBDOC w = { { 0 } };
334
- int cbtype;
335
- o = pipeline->parent->cqdata;
336
- init_resp3(o, response, request, immerr, (lcb_RESPBASE *)&w.resp);
347
+ lcb_t o = get_instance(pipeline);
348
+ ResponsePack<lcb_RESPSUBDOC> w = {{ 0 }};
349
+ lcb_CALLBACKTYPE cbtype;
350
+ init_resp(o, response, request, immerr, &w.resp);
337
351
  w.resp.rflags |= LCB_RESP_F_FINAL;
338
352
 
339
353
  /* For mutations, add the mutation token */
@@ -366,15 +380,15 @@ H_subdoc(mc_PIPELINE *pipeline, mc_PACKET *request, packet_info *response,
366
380
  w.resp.rc = LCB_SUBDOC_MULTI_FAILURE;
367
381
  }
368
382
  }
369
- INVOKE_CALLBACK3(request, &w.resp, o, cbtype);
383
+ invoke_callback(request, o, &w.resp, cbtype);
370
384
  }
371
385
 
372
386
  static int
373
387
  sdlookup_next(const packet_info *response, lcb_SDENTRY *ent, size_t *iter)
374
388
  {
375
389
  const char *buf;
376
- lcb_U16 rc;
377
- lcb_U32 vlen;
390
+ uint16_t rc;
391
+ uint32_t vlen;
378
392
 
379
393
  if (*iter == PACKET_NVALUE(response)) {
380
394
  return 0;
@@ -407,8 +421,8 @@ static int
407
421
  sdmutate_next(const packet_info *response, lcb_SDENTRY *ent, size_t *iter)
408
422
  {
409
423
  const char *buf, *buf_end;
410
- lcb_U16 rc;
411
- lcb_U32 vlen;
424
+ uint16_t rc;
425
+ uint32_t vlen;
412
426
 
413
427
  if (*iter == PACKET_NVALUE(response)) {
414
428
  return 0;
@@ -492,28 +506,28 @@ static void
492
506
  H_delete(mc_PIPELINE *pipeline, mc_PACKET *packet, packet_info *response,
493
507
  lcb_error_t immerr)
494
508
  {
495
- lcb_t root = pipeline->parent->cqdata;
496
- respack_REMOVE w = { { 0 } };
509
+ lcb_t root = get_instance(pipeline);
510
+ ResponsePack<lcb_RESPREMOVE> w = { { 0 } };
497
511
  w.resp.rflags |= LCB_RESP_F_EXTDATA | LCB_RESP_F_FINAL;
498
- init_resp3(root, response, packet, immerr, (lcb_RESPBASE *)&w.resp);
512
+ init_resp(root, response, packet, immerr, &w.resp);
499
513
  handle_mutation_token(root, response, packet, &w.mt);
500
514
  TRACE_REMOVE_END(response, &w.resp);
501
- INVOKE_CALLBACK3(packet, &w.resp, root, LCB_CALLBACK_REMOVE);
515
+ invoke_callback(packet, root, &w.resp, LCB_CALLBACK_REMOVE);
502
516
  }
503
517
 
504
518
  static void
505
519
  H_observe(mc_PIPELINE *pipeline, mc_PACKET *request, packet_info *response,
506
520
  lcb_error_t immerr)
507
521
  {
508
- lcb_t root = pipeline->parent->cqdata;
522
+ lcb_t root = get_instance(pipeline);
509
523
  uint32_t ttp;
510
524
  uint32_t ttr;
511
- lcb_size_t pos;
525
+ size_t pos;
512
526
  lcbvb_CONFIG* config;
513
527
  const char *end, *ptr;
514
528
  mc_REQDATAEX *rd = request->u_rdata.exdata;
515
529
  lcb_RESPOBSERVE resp = { 0 };
516
- MK_ERROR(root, &resp, response, immerr);
530
+ make_error(root, &resp, response, immerr);
517
531
 
518
532
  if (resp.rc != LCB_SUCCESS) {
519
533
  if (! (request->flags & MCREQ_F_INVOKED)) {
@@ -531,14 +545,14 @@ H_observe(mc_PIPELINE *pipeline, mc_PACKET *request, packet_info *response,
531
545
  ttr = ntohl(ttr);
532
546
 
533
547
  /** Actual payload sequence of (vb, nkey, key). Repeats multiple times */
534
- ptr = response->payload;
548
+ ptr = reinterpret_cast<const char *>(response->payload);
535
549
  end = (char *)ptr + PACKET_NBODY(response);
536
550
  config = pipeline->parent->config;
537
551
 
538
552
  for (pos = 0; ptr < end; pos++) {
539
- lcb_cas_t cas;
540
- lcb_uint8_t obs;
541
- lcb_uint16_t nkey, vb;
553
+ uint64_t cas;
554
+ uint8_t obs;
555
+ uint16_t nkey, vb;
542
556
  const char *key;
543
557
 
544
558
  memcpy(&vb, ptr, sizeof(vb));
@@ -573,15 +587,15 @@ static void
573
587
  H_observe_seqno(mc_PIPELINE *pipeline, mc_PACKET *request,
574
588
  packet_info *response, lcb_error_t immerr)
575
589
  {
576
- lcb_t root = pipeline->parent->cqdata;
590
+ lcb_t root = get_instance(pipeline);
577
591
  lcb_RESPOBSEQNO resp = { 0 };
578
- init_resp3(root, response, request, immerr, (lcb_RESPBASE*)&resp);
592
+ init_resp(root, response, request, immerr, &resp);
579
593
 
580
594
  resp.server_index = pipeline->index;
581
595
 
582
596
  if (resp.rc == LCB_SUCCESS) {
583
- const lcb_U8 *data = PACKET_BODY(response);
584
- int is_failover = *data != 0;
597
+ const uint8_t *data = reinterpret_cast<const uint8_t*>(PACKET_BODY(response));
598
+ bool is_failover = *data != 0;
585
599
 
586
600
  data++;
587
601
  #define COPY_ADV(dstfld, n, conv_fn) \
@@ -602,17 +616,17 @@ H_observe_seqno(mc_PIPELINE *pipeline, mc_PACKET *request,
602
616
  /* Get the server for this command. Note that since this is a successful
603
617
  * operation, the server is never a dummy */
604
618
  }
605
- INVOKE_CALLBACK3(request, &resp, root, LCB_CALLBACK_OBSEQNO);
619
+ invoke_callback(request, root, &resp, LCB_CALLBACK_OBSEQNO);
606
620
  }
607
621
 
608
622
  static void
609
623
  H_store(mc_PIPELINE *pipeline, mc_PACKET *request, packet_info *response,
610
624
  lcb_error_t immerr)
611
625
  {
612
- lcb_t root = pipeline->parent->cqdata;
613
- respack_STORE w = { { 0 } };
614
- lcb_U8 opcode;
615
- init_resp3(root, response, request, immerr, (lcb_RESPBASE*)&w.resp);
626
+ lcb_t root = get_instance(pipeline);
627
+ ResponsePack<lcb_RESPSTORE> w = { { 0 } };
628
+ uint8_t opcode;
629
+ init_resp(root, response, request, immerr, &w.resp);
616
630
  if (!immerr) {
617
631
  opcode = PACKET_OPCODE(response);
618
632
  } else {
@@ -637,7 +651,7 @@ H_store(mc_PIPELINE *pipeline, mc_PACKET *request, packet_info *response,
637
651
  if (request->flags & MCREQ_F_REQEXT) {
638
652
  request->u_rdata.exdata->procs->handler(pipeline, request, immerr, &w.resp);
639
653
  } else {
640
- INVOKE_CALLBACK3(request, &w.resp, root, LCB_CALLBACK_STORE);
654
+ invoke_callback(request, root, &w.resp, LCB_CALLBACK_STORE);
641
655
  }
642
656
  }
643
657
 
@@ -645,9 +659,9 @@ static void
645
659
  H_arithmetic(mc_PIPELINE *pipeline, mc_PACKET *request, packet_info *response,
646
660
  lcb_error_t immerr)
647
661
  {
648
- lcb_t root = pipeline->parent->cqdata;
649
- respack_COUNTER w = { { 0 } };
650
- init_resp3(root, response, request, immerr, (lcb_RESPBASE*)&w.resp);
662
+ lcb_t root = get_instance(pipeline);
663
+ ResponsePack<lcb_RESPCOUNTER> w = { { 0 } };
664
+ init_resp(root, response, request, immerr, &w.resp);
651
665
 
652
666
  if (w.resp.rc == LCB_SUCCESS) {
653
667
  memcpy(&w.resp.value, PACKET_VALUE(response), sizeof(w.resp.value));
@@ -658,18 +672,18 @@ H_arithmetic(mc_PIPELINE *pipeline, mc_PACKET *request, packet_info *response,
658
672
  w.resp.rflags |= LCB_RESP_F_FINAL;
659
673
  w.resp.cas = PACKET_CAS(response);
660
674
  TRACE_ARITHMETIC_END(response, &w.resp);
661
- INVOKE_CALLBACK3(request, &w.resp, root, LCB_CALLBACK_COUNTER);
675
+ invoke_callback(request, root, &w.resp, LCB_CALLBACK_COUNTER);
662
676
  }
663
677
 
664
678
  static void
665
679
  H_stats(mc_PIPELINE *pipeline, mc_PACKET *request, packet_info *response,
666
680
  lcb_error_t immerr)
667
681
  {
668
- lcb_t root = pipeline->parent->cqdata;
682
+ lcb_t root = get_instance(pipeline);
669
683
  lcb_RESPSTATS resp = { 0 };
670
684
  mc_REQDATAEX *exdata;
671
685
 
672
- MK_ERROR(root, &resp, response, immerr);
686
+ make_error(root, &resp, response, immerr);
673
687
  resp.version = 0;
674
688
 
675
689
  exdata = request->u_rdata.exdata;
@@ -694,10 +708,10 @@ static void
694
708
  H_verbosity(mc_PIPELINE *pipeline, mc_PACKET *request, packet_info *response,
695
709
  lcb_error_t immerr)
696
710
  {
697
- lcb_t root = pipeline->parent->cqdata;
711
+ lcb_t root = get_instance(pipeline);
698
712
  lcb_RESPBASE dummy = { 0 };
699
713
  mc_REQDATAEX *exdata = request->u_rdata.exdata;
700
- MK_ERROR(root, &dummy, response, immerr);
714
+ make_error(root, &dummy, response, immerr);
701
715
 
702
716
  exdata->procs->handler(pipeline, request, dummy.rc, NULL);
703
717
  }
@@ -706,14 +720,14 @@ static void
706
720
  H_version(mc_PIPELINE *pipeline, mc_PACKET *request, packet_info *response,
707
721
  lcb_error_t immerr)
708
722
  {
709
- lcb_t root = pipeline->parent->cqdata;
723
+ lcb_t root = get_instance(pipeline);
710
724
  lcb_RESPMCVERSION resp = { 0 };
711
725
  mc_REQDATAEX *exdata = request->u_rdata.exdata;
712
726
 
713
- MK_ERROR(root, &resp, response, immerr);
727
+ make_error(root, &resp, response, immerr);
714
728
 
715
729
  if (PACKET_NBODY(response)) {
716
- resp.mcversion = response->payload;
730
+ resp.mcversion = reinterpret_cast<const char *>(response->payload);
717
731
  resp.nversion = PACKET_NBODY(response);
718
732
  }
719
733
 
@@ -725,22 +739,22 @@ static void
725
739
  H_touch(mc_PIPELINE *pipeline, mc_PACKET *request, packet_info *response,
726
740
  lcb_error_t immerr)
727
741
  {
728
- lcb_t root = pipeline->parent->cqdata;
742
+ lcb_t root = get_instance(pipeline);
729
743
  lcb_RESPTOUCH resp = { 0 };
730
- init_resp3(root, response, request, immerr, &resp);
744
+ init_resp(root, response, request, immerr, &resp);
731
745
  resp.rflags |= LCB_RESP_F_FINAL;
732
746
  TRACE_TOUCH_END(response, &resp);
733
- INVOKE_CALLBACK3(request, &resp, root, LCB_CALLBACK_TOUCH);
747
+ invoke_callback(request, root, &resp, LCB_CALLBACK_TOUCH);
734
748
  }
735
749
 
736
750
  static void
737
751
  H_flush(mc_PIPELINE *pipeline, mc_PACKET *request, packet_info *response,
738
752
  lcb_error_t immerr)
739
753
  {
740
- lcb_t root = pipeline->parent->cqdata;
754
+ lcb_t root = get_instance(pipeline);
741
755
  lcb_RESPFLUSH resp = { 0 };
742
756
  mc_REQDATAEX *exdata = request->u_rdata.exdata;
743
- MK_ERROR(root, &resp, response, immerr);
757
+ make_error(root, &resp, response, immerr);
744
758
  exdata->procs->handler(pipeline, request, resp.rc, &resp);
745
759
  }
746
760
 
@@ -748,12 +762,12 @@ static void
748
762
  H_unlock(mc_PIPELINE *pipeline, mc_PACKET *request, packet_info *response,
749
763
  lcb_error_t immerr)
750
764
  {
751
- lcb_t root = pipeline->parent->cqdata;
765
+ lcb_t root = get_instance(pipeline);
752
766
  lcb_RESPUNLOCK resp = { 0 };
753
- init_resp3(root, response, request, immerr, &resp);
767
+ init_resp(root, response, request, immerr, &resp);
754
768
  resp.rflags |= LCB_RESP_F_FINAL;
755
769
  TRACE_UNLOCK_END(response, &resp);
756
- INVOKE_CALLBACK3(request, &resp, root, LCB_CALLBACK_UNLOCK);
770
+ invoke_callback(request, root, &resp, LCB_CALLBACK_UNLOCK);
757
771
  }
758
772
 
759
773
  static void
@@ -763,20 +777,19 @@ H_config(mc_PIPELINE *pipeline, mc_PACKET *request, packet_info *response,
763
777
  /** We just jump to the normal config handler */
764
778
  lcb_RESPBASE dummy;
765
779
  mc_REQDATAEX *exdata = request->u_rdata.exdata;
766
- MK_ERROR(pipeline->parent->cqdata, &dummy, response, immerr);
780
+ make_error(get_instance(pipeline), &dummy, response, immerr);
767
781
 
768
782
  exdata->procs->handler(pipeline, request, dummy.rc, response);
769
783
  }
770
784
 
771
785
  static void
772
- record_metrics(mc_PIPELINE *pipeline, mc_PACKET *req, packet_info *res)
786
+ record_metrics(mc_PIPELINE *pipeline, mc_PACKET *req, packet_info *)
773
787
  {
774
- lcb_t instance = pipeline->parent->cqdata;
788
+ lcb_t instance = get_instance(pipeline);
775
789
  if (instance->kv_timings) {
776
790
  lcb_histogram_record(instance->kv_timings,
777
791
  gethrtime() - MCREQ_PKT_RDATA(req)->start);
778
792
  }
779
- (void)res;
780
793
  }
781
794
 
782
795
  static void
@@ -896,19 +909,19 @@ lcb_resp_get_mutation_token(int cbtype, const lcb_RESPBASE *rb)
896
909
 
897
910
  switch (cbtype) {
898
911
  case LCB_CALLBACK_STORE:
899
- ss = &((const respack_STORE*)rb)->mt;
912
+ ss = ResponsePack<lcb_RESPSTORE>::get_mt(rb);
900
913
  break;
901
914
 
902
915
  case LCB_CALLBACK_COUNTER:
903
- ss = &((const respack_COUNTER*)rb)->mt;
916
+ ss = ResponsePack<lcb_RESPCOUNTER>::get_mt(rb);
904
917
  break;
905
918
 
906
919
  case LCB_CALLBACK_REMOVE:
907
- ss = &((const respack_REMOVE*)rb)->mt;
920
+ ss = ResponsePack<lcb_RESPREMOVE>::get_mt(rb);
908
921
  break;
909
922
 
910
923
  case LCB_CALLBACK_SDMUTATE:
911
- ss = &((const respack_SUBDOC*)rb)->mt;
924
+ ss = ResponsePack<lcb_RESPSUBDOC>::get_mt(rb);
912
925
  break;
913
926
 
914
927
  default:
@@ -508,7 +508,7 @@ void lcb_destroy(lcb_t instance)
508
508
  instance->scratch = NULL;
509
509
  }
510
510
 
511
- free(instance->dcpinfo);
511
+ delete[] instance->dcpinfo;
512
512
  memset(instance, 0xff, sizeof(*instance));
513
513
  free(instance);
514
514
  #undef DESTROY
@@ -18,9 +18,14 @@
18
18
  #ifndef LIBCOUCHBASE_TRACE_H
19
19
  #define LIBCOUCHBASE_TRACE_H 1
20
20
 
21
- #ifdef __clang__
21
+ #if defined(__clang__) || defined(__GNUC__)
22
22
  #pragma GCC diagnostic push
23
+
24
+ #ifdef __clang__
23
25
  #pragma GCC diagnostic ignored "-Wgnu-zero-variadic-macro-arguments"
26
+ #else
27
+ #pragma GCC diagnostic ignored "-Wvariadic-macros"
28
+ #endif
24
29
  #endif
25
30
 
26
31
  #ifdef HAVE_DTRACE
@@ -42,11 +47,11 @@
42
47
  (cmd)->key.contig.bytes, (cmd)->key.contig.nbytes)
43
48
 
44
49
  #define TRACE_END_COMMON(TGT, mcresp, resp, ...) \
45
- TGT(PACKET_OPAQUE(mcresp), 0, PACKET_OPCODE(mcresp), (resp)->rc, (resp)->key, (resp)->nkey, \
50
+ TGT(PACKET_OPAQUE(mcresp), 0, PACKET_OPCODE(mcresp), (resp)->rc, (const char *)(resp)->key, (resp)->nkey, \
46
51
  ## __VA_ARGS__)
47
52
 
48
53
  #define TRACE_END_SIMPLE(TGT, mcresp, resp) \
49
- TGT(PACKET_OPAQUE(mcresp), 0, PACKET_OPCODE(mcresp), (resp)->rc, (resp)->key, (resp)->nkey)
54
+ TGT(PACKET_OPAQUE(mcresp), 0, PACKET_OPCODE(mcresp), (resp)->rc, (const char *)(resp)->key, (resp)->nkey)
50
55
 
51
56
  #define TRACE_GET_BEGIN(req, cmd) \
52
57
  TRACE(TRACE_BEGIN_COMMON(LIBCOUCHBASE_GET_BEGIN, req, cmd, (cmd)->exptime))
@@ -139,10 +139,10 @@ module Libcouchbase
139
139
  end
140
140
 
141
141
  result(@reactor.all(*promises).then(proc { |results|
142
- if not extended
143
- results.collect! { |resp| resp.value if resp }
144
- else
142
+ if extended
145
143
  results.compact!
144
+ else
145
+ results.collect! { |resp| resp.value if resp }
146
146
  end
147
147
 
148
148
  if assemble_hash
@@ -12,6 +12,12 @@ module Libcouchbase
12
12
  @results = []
13
13
  @fiber = nil
14
14
 
15
+ # We don't want to resume a fiber that is waiting
16
+ # in a yield to user code as then the Fiber might
17
+ # end before we've finished processing and this is
18
+ # very much not desirable - dead fiber errors
19
+ @resume_results = true
20
+
15
21
  # This could be a view or n1ql query
16
22
  @query = query
17
23
  @row_modifier = row_modifier
@@ -33,8 +39,10 @@ module Libcouchbase
33
39
  begin
34
40
  while not @query_completed do
35
41
  if @results.length > 0
42
+ @resume_results = false
36
43
  yield @results.shift
37
44
  else
45
+ @resume_results = true
38
46
  resume
39
47
  end
40
48
  end
@@ -42,6 +50,7 @@ module Libcouchbase
42
50
  # cancel is executed on break or error
43
51
  cancel unless @query_completed
44
52
  @fiber = nil
53
+ @resume_results = true
45
54
  end
46
55
  end
47
56
  self
@@ -69,9 +78,11 @@ module Libcouchbase
69
78
  begin
70
79
  while not @query_completed do
71
80
  if index < @results.length
81
+ @resume_results = false
72
82
  yield @results[index]
73
83
  index += 1
74
84
  else
85
+ @resume_results = true
75
86
  resume
76
87
  end
77
88
  end
@@ -79,6 +90,7 @@ module Libcouchbase
79
90
  # cancel is executed on break or error
80
91
  cancel unless @query_completed
81
92
  @fiber = nil
93
+ @resume_results = true
82
94
  end
83
95
  end
84
96
  self
@@ -202,7 +214,7 @@ module Libcouchbase
202
214
  end
203
215
 
204
216
  # Resume processing
205
- @fiber.resume if @fiber && (!@cancelled || final)
217
+ @fiber.resume if @fiber && @resume_results && (!@cancelled || final)
206
218
  end
207
219
  end
208
220
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true, encoding: ASCII-8BIT
2
2
 
3
3
  module Libcouchbase
4
- VERSION = '0.0.6'
4
+ VERSION = '0.0.7'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: libcouchbase
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stephen von Takach
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-11-25 00:00:00.000000000 Z
11
+ date: 2016-12-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ffi
@@ -406,7 +406,7 @@ files:
406
406
  - ext/libcouchbase/src/dump.c
407
407
  - ext/libcouchbase/src/getconfig.c
408
408
  - ext/libcouchbase/src/gethrtime.c
409
- - ext/libcouchbase/src/handler.c
409
+ - ext/libcouchbase/src/handler.cc
410
410
  - ext/libcouchbase/src/hashtable.c
411
411
  - ext/libcouchbase/src/hdr_timings.c
412
412
  - ext/libcouchbase/src/hostlist.cc