couchbase 3.2.0 → 3.2.4

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 (175) hide show
  1. package/README.md +24 -18
  2. package/binding.gyp +88 -85
  3. package/deps/lcb/CMakeLists.txt +1 -1
  4. package/deps/lcb/CONTRIBUTING.md +1 -1
  5. package/deps/lcb/README.markdown +2 -2
  6. package/deps/lcb/RELEASE_NOTES.markdown +99 -14
  7. package/deps/lcb/cmake/Modules/GetVersionInfo.cmake +1 -1
  8. package/deps/lcb/contrib/cbsasl/src/scram-sha/scram_utils.cc +22 -26
  9. package/deps/lcb/contrib/lcb-jsoncpp/lcb-jsoncpp.cpp +20 -7
  10. package/deps/lcb/doc/Doxyfile +1 -1
  11. package/deps/lcb/example/CMakeLists.txt +4 -4
  12. package/deps/lcb/example/libuvdirect/main.c +39 -12
  13. package/deps/lcb/example/minimal/durability.cc +149 -0
  14. package/deps/lcb/example/minimal/query.c +11 -9
  15. package/deps/lcb/gyp_config/common/libcouchbase/configuration.h +3 -3
  16. package/deps/lcb/gyp_config/linux/arm64/config.h +243 -0
  17. package/deps/lcb/include/libcouchbase/couchbase.h +80 -5
  18. package/deps/lcb/include/libcouchbase/error.h +2 -0
  19. package/deps/lcb/include/libcouchbase/ixmgmt.h +15 -10
  20. package/deps/lcb/include/libcouchbase/tracing.h +2 -2
  21. package/deps/lcb/include/memcached/protocol_binary.h +21 -0
  22. package/deps/lcb/libcouchbase.gyp +347 -349
  23. package/deps/lcb/packaging/deb/control +1 -1
  24. package/deps/lcb/src/analytics/analytics_handle.cc +13 -5
  25. package/deps/lcb/src/analytics/analytics_handle.hh +29 -0
  26. package/deps/lcb/src/bootstrap.cc +6 -3
  27. package/deps/lcb/src/capi/cmd_analytics.cc +12 -1
  28. package/deps/lcb/src/capi/cmd_analytics.hh +30 -0
  29. package/deps/lcb/src/capi/cmd_counter.hh +23 -0
  30. package/deps/lcb/src/capi/cmd_exists.hh +24 -1
  31. package/deps/lcb/src/capi/cmd_get.hh +22 -0
  32. package/deps/lcb/src/capi/cmd_get_replica.hh +23 -0
  33. package/deps/lcb/src/capi/cmd_http.hh +7 -0
  34. package/deps/lcb/src/capi/cmd_query.cc +11 -1
  35. package/deps/lcb/src/capi/cmd_query.hh +31 -0
  36. package/deps/lcb/src/capi/cmd_remove.hh +23 -0
  37. package/deps/lcb/src/capi/cmd_search.cc +6 -0
  38. package/deps/lcb/src/capi/cmd_search.hh +23 -0
  39. package/deps/lcb/src/capi/cmd_store.hh +33 -21
  40. package/deps/lcb/src/capi/cmd_subdoc.hh +35 -0
  41. package/deps/lcb/src/capi/cmd_touch.hh +23 -0
  42. package/deps/lcb/src/capi/cmd_unlock.hh +23 -0
  43. package/deps/lcb/src/capi/cmd_view.hh +6 -0
  44. package/deps/lcb/src/capi/collection_qualifier.hh +2 -2
  45. package/deps/lcb/src/cntl.cc +45 -11
  46. package/deps/lcb/src/crypto.cc +2 -2
  47. package/deps/lcb/src/dns-srv.cc +5 -3
  48. package/deps/lcb/src/errmap.cc +5 -9
  49. package/deps/lcb/src/errmap.h +7 -3
  50. package/deps/lcb/src/handler.cc +24 -18
  51. package/deps/lcb/src/hostlist.h +2 -2
  52. package/deps/lcb/src/http/http-priv.h +2 -2
  53. package/deps/lcb/src/http/http.cc +5 -2
  54. package/deps/lcb/src/instance.cc +20 -11
  55. package/deps/lcb/src/internal.h +9 -0
  56. package/deps/lcb/src/lcbio/connect.cc +14 -2
  57. package/deps/lcb/src/lcbio/connect.h +2 -2
  58. package/deps/lcb/src/lcbio/ctx.cc +4 -2
  59. package/deps/lcb/src/lcbio/ioutils.cc +9 -10
  60. package/deps/lcb/src/lcbio/manager.cc +1 -1
  61. package/deps/lcb/src/mcserver/mcserver.cc +9 -6
  62. package/deps/lcb/src/mcserver/negotiate.cc +39 -17
  63. package/deps/lcb/src/n1ql/ixmgmt.cc +1 -2
  64. package/deps/lcb/src/n1ql/query_handle.cc +41 -19
  65. package/deps/lcb/src/n1ql/query_handle.hh +28 -1
  66. package/deps/lcb/src/operations/counter.cc +18 -5
  67. package/deps/lcb/src/operations/exists.cc +25 -4
  68. package/deps/lcb/src/operations/get.cc +39 -19
  69. package/deps/lcb/src/operations/get_replica.cc +28 -8
  70. package/deps/lcb/src/operations/observe.cc +1 -1
  71. package/deps/lcb/src/operations/ping.cc +8 -8
  72. package/deps/lcb/src/operations/pktfwd.cc +2 -1
  73. package/deps/lcb/src/operations/remove.cc +39 -22
  74. package/deps/lcb/src/operations/store.cc +18 -5
  75. package/deps/lcb/src/operations/subdoc.cc +18 -6
  76. package/deps/lcb/src/operations/touch.cc +34 -16
  77. package/deps/lcb/src/operations/unlock.cc +24 -5
  78. package/deps/lcb/src/packetutils.h +3 -2
  79. package/deps/lcb/src/retryq.cc +24 -5
  80. package/deps/lcb/src/search/search.cc +1 -0
  81. package/deps/lcb/src/search/search_handle.cc +30 -8
  82. package/deps/lcb/src/search/search_handle.hh +29 -0
  83. package/deps/lcb/src/settings.cc +1 -1
  84. package/deps/lcb/src/ssl/ssl_common.c +6 -7
  85. package/deps/lcb/src/tracing/span.cc +47 -14
  86. package/deps/lcb/src/tracing/tracer.cc +11 -2
  87. package/deps/lcb/src/tracing/tracing-internal.h +105 -93
  88. package/deps/lcb/src/utilities.cc +43 -0
  89. package/deps/lcb/src/utilities.h +53 -0
  90. package/deps/lcb/src/vbucket/vbucket.c +34 -33
  91. package/deps/lcb/src/views/view_handle.cc +13 -5
  92. package/deps/lcb/src/views/view_handle.hh +29 -0
  93. package/deps/lcb/tests/CMakeLists.txt +21 -0
  94. package/deps/lcb/tests/basic/t_ctlcodes.cc +24 -3
  95. package/deps/lcb/tests/basic/t_jsparse.cc +8 -0
  96. package/deps/lcb/tests/basic/t_n1qlstrings.cc +73 -0
  97. package/deps/lcb/tests/iotests/mock-environment.cc +30 -1
  98. package/deps/lcb/tests/iotests/mock-environment.h +49 -0
  99. package/deps/lcb/tests/iotests/mock-unit-test.cc +104 -6
  100. package/deps/lcb/tests/iotests/mock-unit-test.h +34 -0
  101. package/deps/lcb/tests/iotests/t_collections.cc +1 -1
  102. package/deps/lcb/tests/iotests/t_confmon.cc +4 -2
  103. package/deps/lcb/tests/iotests/t_get.cc +109 -7
  104. package/deps/lcb/tests/iotests/t_http.cc +9 -4
  105. package/deps/lcb/tests/iotests/t_lock.cc +18 -0
  106. package/deps/lcb/tests/iotests/t_mutate.cc +157 -63
  107. package/deps/lcb/tests/iotests/t_n1ql.cc +330 -33
  108. package/deps/lcb/tests/iotests/t_views.cc +1 -0
  109. package/deps/lcb/tests/iotests/testutil.cc +168 -0
  110. package/deps/lcb/tests/iotests/testutil.h +116 -0
  111. package/deps/lcb/tests/mocksupport/procutil.c +32 -28
  112. package/deps/lcb/tests/mocksupport/server.c +0 -1
  113. package/deps/lcb/tests/mocksupport/timeout.c +2 -2
  114. package/deps/lcb/tools/cbc.cc +7 -0
  115. package/dist/analyticsindexmanager.js +512 -524
  116. package/dist/binding.d.ts +3 -0
  117. package/dist/bindingutilities.js +4 -0
  118. package/dist/bucket.js +1 -1
  119. package/dist/bucketmanager.d.ts +31 -1
  120. package/dist/bucketmanager.js +194 -186
  121. package/dist/cluster.d.ts +7 -0
  122. package/dist/cluster.js +48 -38
  123. package/dist/collection.js +11 -17
  124. package/dist/collectionmanager.js +181 -197
  125. package/dist/connection.d.ts +3 -1
  126. package/dist/connection.js +27 -16
  127. package/dist/couchbase.d.ts +1 -0
  128. package/dist/couchbase.js +3 -13
  129. package/dist/datastructures.js +239 -310
  130. package/dist/diagnosticsexecutor.js +70 -85
  131. package/dist/errors.d.ts +70 -0
  132. package/dist/errors.js +96 -2
  133. package/dist/eventingfunctionmanager.d.ts +804 -0
  134. package/dist/eventingfunctionmanager.js +993 -0
  135. package/dist/httpexecutor.d.ts +2 -1
  136. package/dist/httpexecutor.js +30 -37
  137. package/dist/queryindexmanager.js +240 -266
  138. package/dist/scope.js +10 -4
  139. package/dist/sdspecs.d.ts +1 -1
  140. package/dist/searchexecutor.js +3 -0
  141. package/dist/searchindexmanager.js +240 -271
  142. package/dist/searchquery.d.ts +17 -0
  143. package/dist/searchquery.js +22 -1
  144. package/dist/searchtypes.d.ts +7 -2
  145. package/dist/searchtypes.js +2 -2
  146. package/dist/usermanager.js +251 -264
  147. package/dist/utilities.d.ts +2 -0
  148. package/dist/utilities.js +7 -2
  149. package/dist/viewexecutor.js +1 -1
  150. package/dist/viewindexmanager.js +131 -150
  151. package/package.json +1 -1
  152. package/src/addondata.cpp +58 -0
  153. package/src/addondata.h +40 -0
  154. package/src/binding.cpp +3 -1
  155. package/src/cas.h +2 -2
  156. package/src/connection.cpp +25 -178
  157. package/src/connection.h +8 -65
  158. package/src/connection_ops.cpp +57 -34
  159. package/src/constants.cpp +3 -0
  160. package/src/instance.cpp +235 -0
  161. package/src/instance.h +102 -0
  162. package/src/{connection_callbacks.cpp → instance_callbacks.cpp} +34 -34
  163. package/src/logger.cpp +11 -1
  164. package/src/logger.h +3 -0
  165. package/src/metrics.cpp +10 -0
  166. package/src/metrics.h +3 -0
  167. package/src/mutationtoken.h +2 -2
  168. package/src/opbuilder.h +13 -15
  169. package/src/respreader.cpp +1 -0
  170. package/src/respreader.h +6 -4
  171. package/src/tracespan.h +11 -11
  172. package/src/tracing.cpp +11 -0
  173. package/src/tracing.h +3 -0
  174. package/src/valueparser.h +5 -0
  175. package/deps/lcb/example/observe/durability.c +0 -110
@@ -2,88 +2,21 @@
2
2
 
3
3
  #include "error.h"
4
4
  #include "logger.h"
5
- #include "metrics.h"
6
- #include "tracing.h"
7
5
 
8
6
  namespace couchnode
9
7
  {
10
8
 
11
- Connection::Connection(lcb_INSTANCE *instance, Logger *logger)
9
+ Connection::Connection(Instance *instance)
12
10
  : _instance(instance)
13
- , _logger(logger)
14
- , _clientStringCache(nullptr)
15
- , _bootstrapCookie(nullptr)
16
- , _openCookie(nullptr)
17
11
  {
18
- _flushWatch = new uv_prepare_t();
19
- uv_prepare_init(uv_default_loop(), _flushWatch);
20
- _flushWatch->data = this;
21
12
  }
22
13
 
23
14
  Connection::~Connection()
24
15
  {
25
- if (_flushWatch) {
26
- uv_prepare_stop(_flushWatch);
27
- uv_close(reinterpret_cast<uv_handle_t *>(_flushWatch),
28
- [](uv_handle_t *handle) { delete handle; });
29
- _flushWatch = nullptr;
30
- }
31
16
  if (_instance) {
32
- lcb_destroy(_instance);
17
+ _instance->shutdown();
33
18
  _instance = nullptr;
34
19
  }
35
- if (_logger) {
36
- delete _logger;
37
- _logger = nullptr;
38
- }
39
- if (_clientStringCache) {
40
- delete[] _clientStringCache;
41
- _clientStringCache = nullptr;
42
- }
43
- if (_bootstrapCookie) {
44
- delete _bootstrapCookie;
45
- _bootstrapCookie = nullptr;
46
- }
47
- if (_openCookie) {
48
- delete _openCookie;
49
- _openCookie = nullptr;
50
- }
51
- }
52
-
53
- const char *Connection::bucketName()
54
- {
55
- const char *value = nullptr;
56
- lcb_cntl(_instance, LCB_CNTL_GET, LCB_CNTL_BUCKETNAME, &value);
57
- return value;
58
- }
59
-
60
- const char *Connection::clientString()
61
- {
62
- // Check to see if our cache is already populated
63
- if (_clientStringCache) {
64
- return _clientStringCache;
65
- }
66
-
67
- // Fetch from libcouchbase if we have not done that yet.
68
- const char *lcbClientString;
69
- lcb_cntl(_instance, LCB_CNTL_GET, LCB_CNTL_CLIENT_STRING, &lcbClientString);
70
- if (!lcbClientString) {
71
- // Backup string in case something goes wrong
72
- lcbClientString = "couchbase-nodejs-sdk";
73
- }
74
-
75
- // Copy it to memory we own.
76
- int lcbClientStringLen = strlen(lcbClientString);
77
- char *allocString = new char[lcbClientStringLen + 1];
78
- memcpy(allocString, lcbClientString, lcbClientStringLen + 1);
79
-
80
- if (_clientStringCache) {
81
- delete[] _clientStringCache;
82
- _clientStringCache = nullptr;
83
- }
84
- _clientStringCache = allocString;
85
-
86
- return _clientStringCache;
87
20
  }
88
21
 
89
22
  NAN_MODULE_INIT(Connection::Init)
@@ -134,7 +67,7 @@ NAN_METHOD(Connection::fnNew)
134
67
  lcbuv_options_t iopsOptions;
135
68
 
136
69
  iopsOptions.version = 0;
137
- iopsOptions.v.v0.loop = uv_default_loop();
70
+ iopsOptions.v.v0.loop = Nan::GetCurrentEventLoop();
138
71
  iopsOptions.v.v0.startsop_noop = 1;
139
72
 
140
73
  err = lcb_create_libuv_io_opts(0, &iops, &iopsOptions);
@@ -269,119 +202,33 @@ NAN_METHOD(Connection::fnNew)
269
202
  return Nan::ThrowError(Error::create(err));
270
203
  }
271
204
 
272
- Connection *obj = new Connection(instance, logger);
205
+ Instance *inst = new Instance(instance, logger, tracer, meter);
206
+
207
+ Connection *obj = new Connection(inst);
273
208
  obj->Wrap(info.This());
274
209
 
275
- lcb_set_cookie(instance, reinterpret_cast<void *>(obj));
276
- lcb_set_bootstrap_callback(instance, &lcbBootstapHandler);
277
- lcb_set_open_callback(instance, &lcbOpenHandler);
278
- lcb_install_callback(
279
- instance, LCB_CALLBACK_GET,
280
- reinterpret_cast<lcb_RESPCALLBACK>(&lcbGetRespHandler));
281
- lcb_install_callback(
282
- instance, LCB_CALLBACK_EXISTS,
283
- reinterpret_cast<lcb_RESPCALLBACK>(&lcbExistsRespHandler));
284
- lcb_install_callback(
285
- instance, LCB_CALLBACK_GETREPLICA,
286
- reinterpret_cast<lcb_RESPCALLBACK>(&lcbGetReplicaRespHandler));
287
- lcb_install_callback(
288
- instance, LCB_CALLBACK_STORE,
289
- reinterpret_cast<lcb_RESPCALLBACK>(&lcbStoreRespHandler));
290
- lcb_install_callback(
291
- instance, LCB_CALLBACK_COUNTER,
292
- reinterpret_cast<lcb_RESPCALLBACK>(&lcbCounterRespHandler));
293
- lcb_install_callback(
294
- instance, LCB_CALLBACK_REMOVE,
295
- reinterpret_cast<lcb_RESPCALLBACK>(&lcbRemoveRespHandler));
296
- lcb_install_callback(
297
- instance, LCB_CALLBACK_TOUCH,
298
- reinterpret_cast<lcb_RESPCALLBACK>(&lcbTouchRespHandler));
299
- lcb_install_callback(
300
- instance, LCB_CALLBACK_UNLOCK,
301
- reinterpret_cast<lcb_RESPCALLBACK>(&lcbUnlockRespHandler));
302
- lcb_install_callback(
303
- instance, LCB_CALLBACK_SDLOOKUP,
304
- reinterpret_cast<lcb_RESPCALLBACK>(&lcbLookupRespHandler));
305
- lcb_install_callback(
306
- instance, LCB_CALLBACK_SDMUTATE,
307
- reinterpret_cast<lcb_RESPCALLBACK>(&lcbMutateRespHandler));
308
- lcb_install_callback(
309
- instance, LCB_CALLBACK_PING,
310
- reinterpret_cast<lcb_RESPCALLBACK>(&lcbPingRespHandler));
311
- lcb_install_callback(
312
- instance, LCB_CALLBACK_DIAG,
313
- reinterpret_cast<lcb_RESPCALLBACK>(&lcbDiagRespHandler));
314
- lcb_install_callback(
315
- instance, LCB_CALLBACK_HTTP,
316
- reinterpret_cast<lcb_RESPCALLBACK>(&lcbHttpDataHandler));
210
+ inst->_connection = obj;
317
211
 
318
212
  info.GetReturnValue().Set(info.This());
319
213
  }
320
214
 
321
- void Connection::uvFlushHandler(uv_prepare_t *handle)
322
- {
323
- Connection *me = reinterpret_cast<Connection *>(handle->data);
324
- lcb_sched_flush(me->_instance);
325
- }
326
-
327
- void Connection::lcbBootstapHandler(lcb_INSTANCE *instance, lcb_STATUS err)
328
- {
329
- Connection *me = Connection::fromInstance(instance);
330
-
331
- if (err != 0) {
332
- lcb_set_bootstrap_callback(instance, [](lcb_INSTANCE *, lcb_STATUS) {});
333
- lcb_destroy_async(instance, NULL);
334
- me->_instance = nullptr;
335
- } else {
336
- uv_prepare_start(me->_flushWatch, &uvFlushHandler);
337
-
338
- int flushMode = 0;
339
- lcb_cntl(instance, LCB_CNTL_SET, LCB_CNTL_SCHED_IMPLICIT_FLUSH,
340
- &flushMode);
341
- }
342
-
343
- if (me->_bootstrapCookie) {
344
- Nan::HandleScope scope;
345
-
346
- Local<Value> args[] = {Error::create(err)};
347
- me->_bootstrapCookie->Call(1, args);
348
-
349
- delete me->_bootstrapCookie;
350
- me->_bootstrapCookie = nullptr;
351
- }
352
- }
353
-
354
- void Connection::lcbOpenHandler(lcb_INSTANCE *instance, lcb_STATUS err)
355
- {
356
- Connection *me = Connection::fromInstance(instance);
357
-
358
- if (me->_openCookie) {
359
- Nan::HandleScope scope;
360
-
361
- Local<Value> args[] = {Error::create(err)};
362
- me->_openCookie->Call(1, args);
363
-
364
- delete me->_openCookie;
365
- me->_openCookie = nullptr;
366
- }
367
- }
368
-
369
215
  NAN_METHOD(Connection::fnConnect)
370
216
  {
371
- Connection *me = Nan::ObjectWrap::Unwrap<Connection>(info.This());
217
+ Connection *me = ObjectWrap::Unwrap<Connection>(info.This());
218
+ Instance *inst = me->_instance;
372
219
  Nan::HandleScope scope;
373
220
 
374
221
  if (info.Length() != 1) {
375
222
  return Nan::ThrowError(Error::create("expected 1 parameter"));
376
223
  }
377
224
 
378
- if (me->_bootstrapCookie) {
379
- delete me->_bootstrapCookie;
380
- me->_bootstrapCookie = nullptr;
225
+ if (inst->_bootstrapCookie) {
226
+ delete inst->_bootstrapCookie;
227
+ inst->_bootstrapCookie = nullptr;
381
228
  }
382
- me->_bootstrapCookie = new Cookie("connect", info[0].As<Function>());
229
+ inst->_bootstrapCookie = new Cookie("connect", info[0].As<Function>());
383
230
 
384
- lcb_STATUS ec = lcb_connect(me->_instance);
231
+ lcb_STATUS ec = lcb_connect(inst->_instance);
385
232
  if (ec != LCB_SUCCESS) {
386
233
  return Nan::ThrowError(Error::create(ec));
387
234
  }
@@ -391,7 +238,8 @@ NAN_METHOD(Connection::fnConnect)
391
238
 
392
239
  NAN_METHOD(Connection::fnSelectBucket)
393
240
  {
394
- Connection *me = Nan::ObjectWrap::Unwrap<Connection>(info.This());
241
+ Connection *me = ObjectWrap::Unwrap<Connection>(info.This());
242
+ Instance *inst = me->_instance;
395
243
  Nan::HandleScope scope;
396
244
 
397
245
  if (info.Length() != 2) {
@@ -405,13 +253,13 @@ NAN_METHOD(Connection::fnSelectBucket)
405
253
 
406
254
  Nan::Utf8String bucketName(info[0]);
407
255
 
408
- if (me->_openCookie) {
409
- delete me->_openCookie;
410
- me->_openCookie = nullptr;
256
+ if (inst->_openCookie) {
257
+ delete inst->_openCookie;
258
+ inst->_openCookie = nullptr;
411
259
  }
412
- me->_openCookie = new Cookie("open", info[1].As<Function>());
260
+ inst->_openCookie = new Cookie("open", info[1].As<Function>());
413
261
 
414
- lcb_STATUS ec = lcb_open(me->_instance, *bucketName, bucketName.length());
262
+ lcb_STATUS ec = lcb_open(inst->_instance, *bucketName, bucketName.length());
415
263
  if (ec != LCB_SUCCESS) {
416
264
  return Nan::ThrowError(Error::create(ec));
417
265
  }
@@ -424,10 +272,8 @@ NAN_METHOD(Connection::fnShutdown)
424
272
  Connection *me = ObjectWrap::Unwrap<Connection>(info.This());
425
273
  Nan::HandleScope scope;
426
274
 
427
- uv_prepare_stop(me->_flushWatch);
428
-
429
275
  if (me->_instance) {
430
- lcb_destroy_async(me->_instance, NULL);
276
+ me->_instance->shutdown();
431
277
  me->_instance = nullptr;
432
278
  }
433
279
 
@@ -459,6 +305,7 @@ CntlFormat getCntlFormat(int option)
459
305
  NAN_METHOD(Connection::fnCntl)
460
306
  {
461
307
  Connection *me = ObjectWrap::Unwrap<Connection>(info.This());
308
+ Instance *inst = me->_instance;
462
309
  Nan::HandleScope scope;
463
310
 
464
311
  int mode = Nan::To<int>(info[0]).FromJust();
@@ -468,7 +315,7 @@ NAN_METHOD(Connection::fnCntl)
468
315
  if (fmt == CntlTimeValue) {
469
316
  if (mode == LCB_CNTL_GET) {
470
317
  int val;
471
- lcb_STATUS err = lcb_cntl(me->_instance, mode, option, &val);
318
+ lcb_STATUS err = lcb_cntl(inst->_instance, mode, option, &val);
472
319
  if (err != LCB_SUCCESS) {
473
320
  Nan::ThrowError(Error::create(err));
474
321
  return;
@@ -478,7 +325,7 @@ NAN_METHOD(Connection::fnCntl)
478
325
  return;
479
326
  } else {
480
327
  int val = Nan::To<int>(info[2]).FromJust();
481
- lcb_STATUS err = lcb_cntl(me->_instance, mode, option, &val);
328
+ lcb_STATUS err = lcb_cntl(inst->_instance, mode, option, &val);
482
329
  if (err != LCB_SUCCESS) {
483
330
  Nan::ThrowError(Error::create(err));
484
331
  return;
package/src/connection.h CHANGED
@@ -2,8 +2,12 @@
2
2
  #ifndef CONNECTION_H
3
3
  #define CONNECTION_H
4
4
 
5
+ #include "addondata.h"
5
6
  #include "cookie.h"
7
+ #include "instance.h"
6
8
  #include "logger.h"
9
+ #include "metrics.h"
10
+ #include "tracing.h"
7
11
  #include "valueparser.h"
8
12
 
9
13
  #include <libcouchbase/couchbase.h>
@@ -23,29 +27,15 @@ public:
23
27
 
24
28
  static inline Nan::Persistent<Function> &constructor()
25
29
  {
26
- static Nan::Persistent<Function> class_constructor;
27
- return class_constructor;
30
+ return addondata::Get()->_connectionConstructor;
28
31
  }
29
32
 
30
- lcb_INSTANCE *lcbHandle() const
31
- {
32
- return _instance;
33
- }
34
-
35
- const char *bucketName();
36
- const char *clientString();
33
+ Connection(Instance *instance);
34
+ ~Connection();
37
35
 
38
- static inline Connection *fromInstance(lcb_INSTANCE *instance)
39
- {
40
- void *cookie = const_cast<void *>(lcb_get_cookie(instance));
41
- Connection *conn = reinterpret_cast<Connection *>(cookie);
42
- return conn;
43
- }
36
+ Instance *_instance;
44
37
 
45
38
  private:
46
- Connection(lcb_INSTANCE *instance, Logger *logger);
47
- ~Connection();
48
-
49
39
  static NAN_METHOD(fnNew);
50
40
 
51
41
  static NAN_METHOD(fnConnect);
@@ -70,53 +60,6 @@ private:
70
60
  static NAN_METHOD(fnHttpRequest);
71
61
  static NAN_METHOD(fnPing);
72
62
  static NAN_METHOD(fnDiag);
73
-
74
- static void uvFlushHandler(uv_prepare_t *handle);
75
- static void lcbRegisterCallbacks(lcb_INSTANCE *instance);
76
- static void lcbBootstapHandler(lcb_INSTANCE *instance, lcb_STATUS err);
77
- static void lcbOpenHandler(lcb_INSTANCE *instance, lcb_STATUS err);
78
- static void lcbGetRespHandler(lcb_INSTANCE *instance, int cbtype,
79
- const lcb_RESPGET *resp);
80
- static void lcbExistsRespHandler(lcb_INSTANCE *instance, int cbtype,
81
- const lcb_RESPEXISTS *resp);
82
- static void lcbGetReplicaRespHandler(lcb_INSTANCE *instance, int cbtype,
83
- const lcb_RESPGETREPLICA *resp);
84
- static void lcbUnlockRespHandler(lcb_INSTANCE *instance, int cbtype,
85
- const lcb_RESPUNLOCK *resp);
86
- static void lcbRemoveRespHandler(lcb_INSTANCE *instance, int cbtype,
87
- const lcb_RESPREMOVE *resp);
88
- static void lcbTouchRespHandler(lcb_INSTANCE *instance, int cbtype,
89
- const lcb_RESPTOUCH *resp);
90
- static void lcbStoreRespHandler(lcb_INSTANCE *instance, int cbtype,
91
- const lcb_RESPSTORE *resp);
92
- static void lcbCounterRespHandler(lcb_INSTANCE *instance, int cbtype,
93
- const lcb_RESPCOUNTER *resp);
94
- static void lcbLookupRespHandler(lcb_INSTANCE *instance, int cbtype,
95
- const lcb_RESPSUBDOC *resp);
96
- static void lcbMutateRespHandler(lcb_INSTANCE *instance, int cbtype,
97
- const lcb_RESPSUBDOC *resp);
98
- static void lcbViewDataHandler(lcb_INSTANCE *instance, int cbtype,
99
- const lcb_RESPVIEW *resp);
100
- static void lcbQueryDataHandler(lcb_INSTANCE *instance, int cbtype,
101
- const lcb_RESPQUERY *resp);
102
- static void lcbAnalyticsDataHandler(lcb_INSTANCE *instance, int cbtype,
103
- const lcb_RESPANALYTICS *resp);
104
- static void lcbSearchDataHandler(lcb_INSTANCE *instance, int cbtype,
105
- const lcb_RESPSEARCH *resp);
106
- static void lcbPingRespHandler(lcb_INSTANCE *instance, int cbtype,
107
- const lcb_RESPPING *resp);
108
- static void lcbDiagRespHandler(lcb_INSTANCE *instance, int cbtype,
109
- const lcb_RESPDIAG *resp);
110
- static void lcbHttpDataHandler(lcb_INSTANCE *instance, int cbtype,
111
- const lcb_RESPHTTP *resp);
112
-
113
- lcb_INSTANCE *_instance;
114
- Logger *_logger;
115
- uv_prepare_t *_flushWatch;
116
- const char *_clientStringCache;
117
-
118
- Cookie *_bootstrapCookie;
119
- Cookie *_openCookie;
120
63
  };
121
64
 
122
65
  } // namespace couchnode
@@ -8,8 +8,9 @@ namespace couchnode
8
8
  NAN_METHOD(Connection::fnGet)
9
9
  {
10
10
  Connection *me = ObjectWrap::Unwrap<Connection>(info.This());
11
+ Instance *inst = me->_instance;
11
12
  Nan::HandleScope scope;
12
- OpBuilder<lcb_CMDGET> enc(me);
13
+ OpBuilder<lcb_CMDGET> enc(inst);
13
14
 
14
15
  if (!enc.parseParentSpan(info[6])) {
15
16
  return Nan::ThrowError(Error::create("bad parent span passed"));
@@ -25,10 +26,12 @@ NAN_METHOD(Connection::fnGet)
25
26
  if (!enc.parseTranscoder(info[3])) {
26
27
  return Nan::ThrowError(Error::create("bad transcoder passed"));
27
28
  }
28
- if (!enc.parseOption<&lcb_cmdget_expiry>(info[4])) {
29
- return Nan::ThrowError(Error::create("bad expiry passed"));
29
+ if (ValueParser::isSet(info[4])) {
30
+ if (!enc.parseOption<&lcb_cmdget_expiry>(info[4])) {
31
+ return Nan::ThrowError(Error::create("bad expiry passed"));
32
+ }
30
33
  }
31
- if (ValueParser::asUint(info[5]) > 0) {
34
+ if (ValueParser::isSet(info[5])) {
32
35
  if (!enc.parseOption<&lcb_cmdget_locktime>(info[5])) {
33
36
  return Nan::ThrowError(Error::create("bad locked passed"));
34
37
  }
@@ -51,8 +54,9 @@ NAN_METHOD(Connection::fnGet)
51
54
  NAN_METHOD(Connection::fnExists)
52
55
  {
53
56
  Connection *me = ObjectWrap::Unwrap<Connection>(info.This());
57
+ Instance *inst = me->_instance;
54
58
  Nan::HandleScope scope;
55
- OpBuilder<lcb_CMDEXISTS> enc(me);
59
+ OpBuilder<lcb_CMDEXISTS> enc(inst);
56
60
 
57
61
  if (!enc.parseParentSpan(info[3])) {
58
62
  return Nan::ThrowError(Error::create("bad parent span passed"));
@@ -83,12 +87,13 @@ NAN_METHOD(Connection::fnExists)
83
87
  NAN_METHOD(Connection::fnGetReplica)
84
88
  {
85
89
  Connection *me = ObjectWrap::Unwrap<Connection>(info.This());
90
+ Instance *inst = me->_instance;
86
91
  Nan::HandleScope scope;
87
92
 
88
93
  lcb_REPLICA_MODE mode =
89
94
  static_cast<lcb_REPLICA_MODE>(ValueParser::asUint(info[4]));
90
95
 
91
- OpBuilder<lcb_CMDGETREPLICA> enc(me, mode);
96
+ OpBuilder<lcb_CMDGETREPLICA> enc(inst, mode);
92
97
 
93
98
  if (!enc.parseParentSpan(info[5])) {
94
99
  return Nan::ThrowError(Error::create("bad parent span passed"));
@@ -122,6 +127,7 @@ NAN_METHOD(Connection::fnGetReplica)
122
127
  NAN_METHOD(Connection::fnStore)
123
128
  {
124
129
  Connection *me = ObjectWrap::Unwrap<Connection>(info.This());
130
+ Instance *inst = me->_instance;
125
131
  Nan::HandleScope scope;
126
132
 
127
133
  const char *opName = "store";
@@ -147,7 +153,7 @@ NAN_METHOD(Connection::fnStore)
147
153
  return Nan::ThrowError(Error::create("bad op type passed"));
148
154
  }
149
155
 
150
- OpBuilder<lcb_CMDSTORE> enc(me, opType);
156
+ OpBuilder<lcb_CMDSTORE> enc(inst, opType);
151
157
 
152
158
  if (!enc.parseParentSpan(info[10])) {
153
159
  return Nan::ThrowError(Error::create("bad parent span passed"));
@@ -187,11 +193,13 @@ NAN_METHOD(Connection::fnStore)
187
193
  return Nan::ThrowError(Error::create("bad adjoin value passed"));
188
194
  }
189
195
  }
190
- if (ValueParser::asInt64(info[5]) < 0) {
191
- lcb_cmdstore_preserve_expiry(enc.cmd(), 1);
192
- } else {
193
- if (!enc.parseOption<&lcb_cmdstore_expiry>(info[5])) {
194
- return Nan::ThrowError(Error::create("bad expiry passed"));
196
+ if (ValueParser::isSet(info[5])) {
197
+ if (ValueParser::asInt64(info[5]) < 0) {
198
+ lcb_cmdstore_preserve_expiry(enc.cmd(), 1);
199
+ } else {
200
+ if (!enc.parseOption<&lcb_cmdstore_expiry>(info[5])) {
201
+ return Nan::ThrowError(Error::create("bad expiry passed"));
202
+ }
195
203
  }
196
204
  }
197
205
  if (!enc.parseCasOption<&lcb_cmdstore_cas>(info[6])) {
@@ -236,8 +244,9 @@ NAN_METHOD(Connection::fnStore)
236
244
  NAN_METHOD(Connection::fnRemove)
237
245
  {
238
246
  Connection *me = ObjectWrap::Unwrap<Connection>(info.This());
247
+ Instance *inst = me->_instance;
239
248
  Nan::HandleScope scope;
240
- OpBuilder<lcb_CMDREMOVE> enc(me);
249
+ OpBuilder<lcb_CMDREMOVE> enc(inst);
241
250
 
242
251
  if (!enc.parseParentSpan(info[7])) {
243
252
  return Nan::ThrowError(Error::create("bad parent span passed"));
@@ -282,8 +291,9 @@ NAN_METHOD(Connection::fnRemove)
282
291
  NAN_METHOD(Connection::fnTouch)
283
292
  {
284
293
  Connection *me = ObjectWrap::Unwrap<Connection>(info.This());
294
+ Instance *inst = me->_instance;
285
295
  Nan::HandleScope scope;
286
- OpBuilder<lcb_CMDTOUCH> enc(me);
296
+ OpBuilder<lcb_CMDTOUCH> enc(inst);
287
297
 
288
298
  if (!enc.parseParentSpan(info[7])) {
289
299
  return Nan::ThrowError(Error::create("bad parent span passed"));
@@ -328,8 +338,9 @@ NAN_METHOD(Connection::fnTouch)
328
338
  NAN_METHOD(Connection::fnUnlock)
329
339
  {
330
340
  Connection *me = ObjectWrap::Unwrap<Connection>(info.This());
341
+ Instance *inst = me->_instance;
331
342
  Nan::HandleScope scope;
332
- OpBuilder<lcb_CMDUNLOCK> enc(me);
343
+ OpBuilder<lcb_CMDUNLOCK> enc(inst);
333
344
 
334
345
  if (!enc.parseParentSpan(info[4])) {
335
346
  return Nan::ThrowError(Error::create("bad parent span passed"));
@@ -363,8 +374,9 @@ NAN_METHOD(Connection::fnUnlock)
363
374
  NAN_METHOD(Connection::fnCounter)
364
375
  {
365
376
  Connection *me = ObjectWrap::Unwrap<Connection>(info.This());
377
+ Instance *inst = me->_instance;
366
378
  Nan::HandleScope scope;
367
- OpBuilder<lcb_CMDCOUNTER> enc(me);
379
+ OpBuilder<lcb_CMDCOUNTER> enc(inst);
368
380
 
369
381
  if (!enc.parseParentSpan(info[9])) {
370
382
  return Nan::ThrowError(Error::create("bad parent span passed"));
@@ -415,8 +427,9 @@ NAN_METHOD(Connection::fnCounter)
415
427
  NAN_METHOD(Connection::fnLookupIn)
416
428
  {
417
429
  Connection *me = ObjectWrap::Unwrap<Connection>(info.This());
430
+ Instance *inst = me->_instance;
418
431
  Nan::HandleScope scope;
419
- OpBuilder<lcb_CMDSUBDOC> enc(me);
432
+ OpBuilder<lcb_CMDSUBDOC> enc(inst);
420
433
 
421
434
  if (!enc.parseParentSpan(info[5])) {
422
435
  return Nan::ThrowError(Error::create("bad parent span passed"));
@@ -481,8 +494,9 @@ NAN_METHOD(Connection::fnLookupIn)
481
494
  NAN_METHOD(Connection::fnMutateIn)
482
495
  {
483
496
  Connection *me = ObjectWrap::Unwrap<Connection>(info.This());
497
+ Instance *inst = me->_instance;
484
498
  Nan::HandleScope scope;
485
- OpBuilder<lcb_CMDSUBDOC> enc(me);
499
+ OpBuilder<lcb_CMDSUBDOC> enc(inst);
486
500
 
487
501
  if (!enc.parseParentSpan(info[10])) {
488
502
  return Nan::ThrowError(Error::create("bad parent span passed"));
@@ -495,11 +509,13 @@ NAN_METHOD(Connection::fnMutateIn)
495
509
  if (!enc.parseOption<&lcb_cmdsubdoc_key>(info[2])) {
496
510
  return Nan::ThrowError(Error::create("bad key passed"));
497
511
  }
498
- if (ValueParser::asInt64(info[3]) < 0) {
499
- lcb_cmdsubdoc_preserve_expiry(enc.cmd(), 1);
500
- } else {
501
- if (!enc.parseOption<&lcb_cmdsubdoc_expiry>(info[3])) {
502
- return Nan::ThrowError(Error::create("bad expiry passed"));
512
+ if (ValueParser::isSet(info[3])) {
513
+ if (ValueParser::asInt64(info[3]) < 0) {
514
+ lcb_cmdsubdoc_preserve_expiry(enc.cmd(), 1);
515
+ } else {
516
+ if (!enc.parseOption<&lcb_cmdsubdoc_expiry>(info[3])) {
517
+ return Nan::ThrowError(Error::create("bad expiry passed"));
518
+ }
503
519
  }
504
520
  }
505
521
  if (!enc.parseCasOption<&lcb_cmdsubdoc_cas>(info[4])) {
@@ -598,15 +614,16 @@ NAN_METHOD(Connection::fnMutateIn)
598
614
  NAN_METHOD(Connection::fnViewQuery)
599
615
  {
600
616
  Connection *me = ObjectWrap::Unwrap<Connection>(info.This());
617
+ Instance *inst = me->_instance;
601
618
  Nan::HandleScope scope;
602
- OpBuilder<lcb_CMDVIEW> enc(me);
619
+ OpBuilder<lcb_CMDVIEW> enc(inst);
603
620
 
604
621
  if (!enc.parseParentSpan(info[5])) {
605
622
  return Nan::ThrowError(Error::create("bad parent span passed"));
606
623
  }
607
624
  enc.beginTrace(LCBTRACE_SERVICE_VIEW, "viewQuery");
608
625
 
609
- lcb_cmdview_callback(enc.cmd(), &lcbViewDataHandler);
626
+ lcb_cmdview_callback(enc.cmd(), &Instance::lcbViewDataHandler);
610
627
 
611
628
  if (!enc.parseOption<&lcb_cmdview_design_document>(info[0])) {
612
629
  return Nan::ThrowError(Error::create("bad ddoc name passed"));
@@ -639,15 +656,16 @@ NAN_METHOD(Connection::fnViewQuery)
639
656
  NAN_METHOD(Connection::fnQuery)
640
657
  {
641
658
  Connection *me = ObjectWrap::Unwrap<Connection>(info.This());
659
+ Instance *inst = me->_instance;
642
660
  Nan::HandleScope scope;
643
- OpBuilder<lcb_CMDQUERY> enc(me);
661
+ OpBuilder<lcb_CMDQUERY> enc(inst);
644
662
 
645
663
  if (!enc.parseParentSpan(info[2])) {
646
664
  return Nan::ThrowError(Error::create("bad parent span passed"));
647
665
  }
648
666
  enc.beginTrace(LCBTRACE_SERVICE_QUERY, "query");
649
667
 
650
- lcb_cmdquery_callback(enc.cmd(), &lcbQueryDataHandler);
668
+ lcb_cmdquery_callback(enc.cmd(), &Instance::lcbQueryDataHandler);
651
669
 
652
670
  if (!enc.parseOption<&lcb_cmdquery_payload>(info[0])) {
653
671
  return Nan::ThrowError(Error::create("bad query passed"));
@@ -676,15 +694,16 @@ NAN_METHOD(Connection::fnQuery)
676
694
  NAN_METHOD(Connection::fnAnalyticsQuery)
677
695
  {
678
696
  Connection *me = ObjectWrap::Unwrap<Connection>(info.This());
697
+ Instance *inst = me->_instance;
679
698
  Nan::HandleScope scope;
680
- OpBuilder<lcb_CMDANALYTICS> enc(me);
699
+ OpBuilder<lcb_CMDANALYTICS> enc(inst);
681
700
 
682
701
  if (!enc.parseParentSpan(info[2])) {
683
702
  return Nan::ThrowError(Error::create("bad parent span passed"));
684
703
  }
685
704
  enc.beginTrace(LCBTRACE_SERVICE_ANALYTICS, "analyticsQuery");
686
705
 
687
- lcb_cmdanalytics_callback(enc.cmd(), &lcbAnalyticsDataHandler);
706
+ lcb_cmdanalytics_callback(enc.cmd(), &Instance::lcbAnalyticsDataHandler);
688
707
 
689
708
  if (!enc.parseOption<&lcb_cmdanalytics_payload>(info[0])) {
690
709
  return Nan::ThrowError(Error::create("bad query passed"));
@@ -713,15 +732,16 @@ NAN_METHOD(Connection::fnAnalyticsQuery)
713
732
  NAN_METHOD(Connection::fnSearchQuery)
714
733
  {
715
734
  Connection *me = ObjectWrap::Unwrap<Connection>(info.This());
735
+ Instance *inst = me->_instance;
716
736
  Nan::HandleScope scope;
717
- OpBuilder<lcb_CMDSEARCH> enc(me);
737
+ OpBuilder<lcb_CMDSEARCH> enc(inst);
718
738
 
719
739
  if (!enc.parseParentSpan(info[2])) {
720
740
  return Nan::ThrowError(Error::create("bad parent span passed"));
721
741
  }
722
742
  enc.beginTrace(LCBTRACE_SERVICE_SEARCH, "searchQuery");
723
743
 
724
- lcb_cmdsearch_callback(enc.cmd(), &lcbSearchDataHandler);
744
+ lcb_cmdsearch_callback(enc.cmd(), &Instance::lcbSearchDataHandler);
725
745
 
726
746
  if (!enc.parseOption<&lcb_cmdsearch_payload>(info[0])) {
727
747
  return Nan::ThrowError(Error::create("bad query passed"));
@@ -745,12 +765,13 @@ NAN_METHOD(Connection::fnSearchQuery)
745
765
  NAN_METHOD(Connection::fnHttpRequest)
746
766
  {
747
767
  Connection *me = ObjectWrap::Unwrap<Connection>(info.This());
768
+ Instance *inst = me->_instance;
748
769
  Nan::HandleScope scope;
749
770
 
750
771
  lcb_HTTP_TYPE mode =
751
772
  static_cast<lcb_HTTP_TYPE>(ValueParser::asUint(info[0]));
752
773
 
753
- OpBuilder<lcb_CMDHTTP> enc(me, mode);
774
+ OpBuilder<lcb_CMDHTTP> enc(inst, mode);
754
775
 
755
776
  if (!enc.parseParentSpan(info[5])) {
756
777
  return Nan::ThrowError(Error::create("bad parent span passed"));
@@ -794,9 +815,10 @@ NAN_METHOD(Connection::fnHttpRequest)
794
815
  NAN_METHOD(Connection::fnPing)
795
816
  {
796
817
  Connection *me = ObjectWrap::Unwrap<Connection>(info.This());
818
+ Instance *inst = me->_instance;
797
819
  Nan::HandleScope scope;
798
820
 
799
- OpBuilder<lcb_CMDPING> enc(me);
821
+ OpBuilder<lcb_CMDPING> enc(inst);
800
822
 
801
823
  if (!enc.parseParentSpan(info[2])) {
802
824
  return Nan::ThrowError(Error::create("bad parent span passed"));
@@ -846,9 +868,10 @@ NAN_METHOD(Connection::fnPing)
846
868
  NAN_METHOD(Connection::fnDiag)
847
869
  {
848
870
  Connection *me = ObjectWrap::Unwrap<Connection>(info.This());
871
+ Instance *inst = me->_instance;
849
872
  Nan::HandleScope scope;
850
873
 
851
- OpBuilder<lcb_CMDDIAG> enc(me);
874
+ OpBuilder<lcb_CMDDIAG> enc(inst);
852
875
 
853
876
  if (!enc.parseOption<&lcb_cmddiag_report_id>(info[0])) {
854
877
  return Nan::ThrowError(Error::create("bad report id passed"));