couchbase 3.2.0 → 3.2.4

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