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
package/src/constants.cpp CHANGED
@@ -67,6 +67,8 @@ NAN_MODULE_INIT(Init)
67
67
  X(LCB_ERR_SCOPE_NOT_FOUND)
68
68
  X(LCB_ERR_INDEX_NOT_FOUND)
69
69
  X(LCB_ERR_INDEX_EXISTS)
70
+ X(LCB_ERR_RATE_LIMITED)
71
+ X(LCB_ERR_QUOTA_LIMITED)
70
72
  X(LCB_ERR_DOCUMENT_NOT_FOUND)
71
73
  X(LCB_ERR_DOCUMENT_UNRETRIEVABLE)
72
74
  X(LCB_ERR_DOCUMENT_LOCKED)
@@ -183,6 +185,7 @@ NAN_MODULE_INIT(Init)
183
185
  X(LCB_HTTP_TYPE_QUERY)
184
186
  X(LCB_HTTP_TYPE_SEARCH)
185
187
  X(LCB_HTTP_TYPE_ANALYTICS)
188
+ X(LCB_HTTP_TYPE_EVENTING)
186
189
 
187
190
  X(LCB_HTTP_METHOD_GET)
188
191
  X(LCB_HTTP_METHOD_POST)
@@ -0,0 +1,235 @@
1
+ #include "instance.h"
2
+ #include "connection.h"
3
+
4
+ #include "error.h"
5
+ #include "logger.h"
6
+
7
+ namespace couchnode
8
+ {
9
+
10
+ Instance::Instance(lcb_INSTANCE *instance, Logger *logger,
11
+ RequestTracer *tracer, Meter *meter)
12
+ : _connection(nullptr)
13
+ , _instance(instance)
14
+ , _logger(logger)
15
+ , _tracer(tracer)
16
+ , _meter(meter)
17
+ , _clientStringCache(nullptr)
18
+ , _bootstrapCookie(nullptr)
19
+ , _openCookie(nullptr)
20
+ {
21
+ _parent = addondata::Get();
22
+ _parent->add_instance(this);
23
+
24
+ _flushWatch = new uv_prepare_t();
25
+ uv_prepare_init(Nan::GetCurrentEventLoop(), _flushWatch);
26
+ _flushWatch->data = this;
27
+
28
+ _shutdownProc = new uv_check_t();
29
+ uv_check_init(Nan::GetCurrentEventLoop(), _shutdownProc);
30
+ _shutdownProc->data = this;
31
+
32
+ lcb_set_cookie(instance, reinterpret_cast<void *>(this));
33
+ lcb_set_bootstrap_callback(instance, &lcbBootstapHandler);
34
+ lcb_set_open_callback(instance, &lcbOpenHandler);
35
+ lcb_install_callback(
36
+ instance, LCB_CALLBACK_GET,
37
+ reinterpret_cast<lcb_RESPCALLBACK>(&lcbGetRespHandler));
38
+ lcb_install_callback(
39
+ instance, LCB_CALLBACK_EXISTS,
40
+ reinterpret_cast<lcb_RESPCALLBACK>(&lcbExistsRespHandler));
41
+ lcb_install_callback(
42
+ instance, LCB_CALLBACK_GETREPLICA,
43
+ reinterpret_cast<lcb_RESPCALLBACK>(&lcbGetReplicaRespHandler));
44
+ lcb_install_callback(
45
+ instance, LCB_CALLBACK_STORE,
46
+ reinterpret_cast<lcb_RESPCALLBACK>(&lcbStoreRespHandler));
47
+ lcb_install_callback(
48
+ instance, LCB_CALLBACK_COUNTER,
49
+ reinterpret_cast<lcb_RESPCALLBACK>(&lcbCounterRespHandler));
50
+ lcb_install_callback(
51
+ instance, LCB_CALLBACK_REMOVE,
52
+ reinterpret_cast<lcb_RESPCALLBACK>(&lcbRemoveRespHandler));
53
+ lcb_install_callback(
54
+ instance, LCB_CALLBACK_TOUCH,
55
+ reinterpret_cast<lcb_RESPCALLBACK>(&lcbTouchRespHandler));
56
+ lcb_install_callback(
57
+ instance, LCB_CALLBACK_UNLOCK,
58
+ reinterpret_cast<lcb_RESPCALLBACK>(&lcbUnlockRespHandler));
59
+ lcb_install_callback(
60
+ instance, LCB_CALLBACK_SDLOOKUP,
61
+ reinterpret_cast<lcb_RESPCALLBACK>(&lcbLookupRespHandler));
62
+ lcb_install_callback(
63
+ instance, LCB_CALLBACK_SDMUTATE,
64
+ reinterpret_cast<lcb_RESPCALLBACK>(&lcbMutateRespHandler));
65
+ lcb_install_callback(
66
+ instance, LCB_CALLBACK_PING,
67
+ reinterpret_cast<lcb_RESPCALLBACK>(&lcbPingRespHandler));
68
+ lcb_install_callback(
69
+ instance, LCB_CALLBACK_DIAG,
70
+ reinterpret_cast<lcb_RESPCALLBACK>(&lcbDiagRespHandler));
71
+ lcb_install_callback(
72
+ instance, LCB_CALLBACK_HTTP,
73
+ reinterpret_cast<lcb_RESPCALLBACK>(&lcbHttpDataHandler));
74
+ }
75
+
76
+ Instance::~Instance()
77
+ {
78
+ if (_connection) {
79
+ _connection->_instance = nullptr;
80
+ _connection = nullptr;
81
+ }
82
+
83
+ if (_parent) {
84
+ _parent->remove_instance(this);
85
+ _parent = nullptr;
86
+ }
87
+
88
+ if (_flushWatch) {
89
+ uv_prepare_stop(_flushWatch);
90
+ uv_close(reinterpret_cast<uv_handle_t *>(_flushWatch),
91
+ [](uv_handle_t *handle) { delete handle; });
92
+ _flushWatch = nullptr;
93
+ }
94
+
95
+ if (_shutdownProc) {
96
+ uv_check_stop(_shutdownProc);
97
+ uv_close(reinterpret_cast<uv_handle_t *>(_shutdownProc),
98
+ [](uv_handle_t *handle) { delete handle; });
99
+ _shutdownProc = nullptr;
100
+ }
101
+
102
+ if (_instance) {
103
+ lcb_destroy(_instance);
104
+ _instance = nullptr;
105
+ }
106
+
107
+ // If there is a custom hooks registered, we need to deactivate them here
108
+ // since the GC might be the one invoking us, which will cause problems
109
+ // as we can't call into v8 during garbage collection.
110
+ if (_logger) {
111
+ _logger->disconnect();
112
+ }
113
+ if (_tracer) {
114
+ _tracer->disconnect();
115
+ }
116
+ if (_meter) {
117
+ _meter->disconnect();
118
+ }
119
+
120
+ if (_logger) {
121
+ delete _logger;
122
+ _logger = nullptr;
123
+ }
124
+ // tracer is destroyed by libcouchbase
125
+ // meter is destroyed by libcouchbase
126
+
127
+ if (_clientStringCache) {
128
+ delete[] _clientStringCache;
129
+ _clientStringCache = nullptr;
130
+ }
131
+ if (_bootstrapCookie) {
132
+ delete _bootstrapCookie;
133
+ _bootstrapCookie = nullptr;
134
+ }
135
+ if (_openCookie) {
136
+ delete _openCookie;
137
+ _openCookie = nullptr;
138
+ }
139
+ }
140
+
141
+ void Instance::uvShutdownHandler(uv_check_t *handle)
142
+ {
143
+ delete reinterpret_cast<Instance *>(handle->data);
144
+ }
145
+
146
+ void Instance::shutdown()
147
+ {
148
+ uv_check_start(_shutdownProc, &uvShutdownHandler);
149
+ }
150
+
151
+ const char *Instance::bucketName()
152
+ {
153
+ const char *value = nullptr;
154
+ lcb_cntl(_instance, LCB_CNTL_GET, LCB_CNTL_BUCKETNAME, &value);
155
+ return value;
156
+ }
157
+
158
+ const char *Instance::clientString()
159
+ {
160
+ // Check to see if our cache is already populated
161
+ if (_clientStringCache) {
162
+ return _clientStringCache;
163
+ }
164
+
165
+ // Fetch from libcouchbase if we have not done that yet.
166
+ const char *lcbClientString;
167
+ lcb_cntl(_instance, LCB_CNTL_GET, LCB_CNTL_CLIENT_STRING, &lcbClientString);
168
+ if (!lcbClientString) {
169
+ // Backup string in case something goes wrong
170
+ lcbClientString = "couchbase-nodejs-sdk";
171
+ }
172
+
173
+ // Copy it to memory we own.
174
+ int lcbClientStringLen = strlen(lcbClientString);
175
+ char *allocString = new char[lcbClientStringLen + 1];
176
+ memcpy(allocString, lcbClientString, lcbClientStringLen + 1);
177
+
178
+ if (_clientStringCache) {
179
+ delete[] _clientStringCache;
180
+ _clientStringCache = nullptr;
181
+ }
182
+ _clientStringCache = allocString;
183
+
184
+ return _clientStringCache;
185
+ }
186
+
187
+ void Instance::uvFlushHandler(uv_prepare_t *handle)
188
+ {
189
+ Instance *me = reinterpret_cast<Instance *>(handle->data);
190
+ lcb_sched_flush(me->_instance);
191
+ }
192
+
193
+ void Instance::lcbBootstapHandler(lcb_INSTANCE *instance, lcb_STATUS err)
194
+ {
195
+ Instance *me = Instance::fromLcbInst(instance);
196
+
197
+ if (err != 0) {
198
+ lcb_set_bootstrap_callback(instance, [](lcb_INSTANCE *, lcb_STATUS) {});
199
+ lcb_destroy_async(instance, NULL);
200
+ me->_instance = nullptr;
201
+ } else {
202
+ uv_prepare_start(me->_flushWatch, &uvFlushHandler);
203
+
204
+ int flushMode = 0;
205
+ lcb_cntl(instance, LCB_CNTL_SET, LCB_CNTL_SCHED_IMPLICIT_FLUSH,
206
+ &flushMode);
207
+ }
208
+
209
+ if (me->_bootstrapCookie) {
210
+ Nan::HandleScope scope;
211
+
212
+ Local<Value> args[] = {Error::create(err)};
213
+ me->_bootstrapCookie->Call(1, args);
214
+
215
+ delete me->_bootstrapCookie;
216
+ me->_bootstrapCookie = nullptr;
217
+ }
218
+ }
219
+
220
+ void Instance::lcbOpenHandler(lcb_INSTANCE *instance, lcb_STATUS err)
221
+ {
222
+ Instance *me = Instance::fromLcbInst(instance);
223
+
224
+ if (me->_openCookie) {
225
+ Nan::HandleScope scope;
226
+
227
+ Local<Value> args[] = {Error::create(err)};
228
+ me->_openCookie->Call(1, args);
229
+
230
+ delete me->_openCookie;
231
+ me->_openCookie = nullptr;
232
+ }
233
+ }
234
+
235
+ } // namespace couchnode
package/src/instance.h ADDED
@@ -0,0 +1,102 @@
1
+ #pragma once
2
+ #ifndef INSTANCE_H
3
+ #define INSTANCE_H
4
+
5
+ #include "addondata.h"
6
+ #include "cookie.h"
7
+ #include "logger.h"
8
+ #include "metrics.h"
9
+ #include "tracing.h"
10
+ #include "valueparser.h"
11
+
12
+ #include <libcouchbase/couchbase.h>
13
+ #include <libcouchbase/libuv_io_opts.h>
14
+ #include <nan.h>
15
+ #include <node.h>
16
+
17
+ namespace couchnode
18
+ {
19
+
20
+ using namespace v8;
21
+
22
+ class Instance
23
+ {
24
+ public:
25
+ static inline Instance *fromLcbInst(lcb_INSTANCE *instance)
26
+ {
27
+ void *cookie = const_cast<void *>(lcb_get_cookie(instance));
28
+ Instance *inst = reinterpret_cast<Instance *>(cookie);
29
+ return inst;
30
+ }
31
+
32
+ Instance(lcb_INSTANCE *instance, Logger *logger, RequestTracer *tracer,
33
+ Meter *meter);
34
+ ~Instance();
35
+
36
+ lcb_INSTANCE *lcbHandle() const
37
+ {
38
+ return _instance;
39
+ }
40
+
41
+ void shutdown();
42
+
43
+ const char *bucketName();
44
+ const char *clientString();
45
+
46
+ static void uvFlushHandler(uv_prepare_t *handle);
47
+ static void uvShutdownHandler(uv_check_t *handle);
48
+ static void lcbRegisterCallbacks(lcb_INSTANCE *instance);
49
+ static void lcbBootstapHandler(lcb_INSTANCE *instance, lcb_STATUS err);
50
+ static void lcbOpenHandler(lcb_INSTANCE *instance, lcb_STATUS err);
51
+ static void lcbGetRespHandler(lcb_INSTANCE *instance, int cbtype,
52
+ const lcb_RESPGET *resp);
53
+ static void lcbExistsRespHandler(lcb_INSTANCE *instance, int cbtype,
54
+ const lcb_RESPEXISTS *resp);
55
+ static void lcbGetReplicaRespHandler(lcb_INSTANCE *instance, int cbtype,
56
+ const lcb_RESPGETREPLICA *resp);
57
+ static void lcbUnlockRespHandler(lcb_INSTANCE *instance, int cbtype,
58
+ const lcb_RESPUNLOCK *resp);
59
+ static void lcbRemoveRespHandler(lcb_INSTANCE *instance, int cbtype,
60
+ const lcb_RESPREMOVE *resp);
61
+ static void lcbTouchRespHandler(lcb_INSTANCE *instance, int cbtype,
62
+ const lcb_RESPTOUCH *resp);
63
+ static void lcbStoreRespHandler(lcb_INSTANCE *instance, int cbtype,
64
+ const lcb_RESPSTORE *resp);
65
+ static void lcbCounterRespHandler(lcb_INSTANCE *instance, int cbtype,
66
+ const lcb_RESPCOUNTER *resp);
67
+ static void lcbLookupRespHandler(lcb_INSTANCE *instance, int cbtype,
68
+ const lcb_RESPSUBDOC *resp);
69
+ static void lcbMutateRespHandler(lcb_INSTANCE *instance, int cbtype,
70
+ const lcb_RESPSUBDOC *resp);
71
+ static void lcbViewDataHandler(lcb_INSTANCE *instance, int cbtype,
72
+ const lcb_RESPVIEW *resp);
73
+ static void lcbQueryDataHandler(lcb_INSTANCE *instance, int cbtype,
74
+ const lcb_RESPQUERY *resp);
75
+ static void lcbAnalyticsDataHandler(lcb_INSTANCE *instance, int cbtype,
76
+ const lcb_RESPANALYTICS *resp);
77
+ static void lcbSearchDataHandler(lcb_INSTANCE *instance, int cbtype,
78
+ const lcb_RESPSEARCH *resp);
79
+ static void lcbPingRespHandler(lcb_INSTANCE *instance, int cbtype,
80
+ const lcb_RESPPING *resp);
81
+ static void lcbDiagRespHandler(lcb_INSTANCE *instance, int cbtype,
82
+ const lcb_RESPDIAG *resp);
83
+ static void lcbHttpDataHandler(lcb_INSTANCE *instance, int cbtype,
84
+ const lcb_RESPHTTP *resp);
85
+
86
+ AddonData *_parent;
87
+ class Connection *_connection;
88
+ lcb_INSTANCE *_instance;
89
+ Logger *_logger;
90
+ RequestTracer *_tracer;
91
+ Meter *_meter;
92
+ uv_prepare_t *_flushWatch;
93
+ uv_check_t *_shutdownProc;
94
+ const char *_clientStringCache;
95
+
96
+ Cookie *_bootstrapCookie;
97
+ Cookie *_openCookie;
98
+ };
99
+
100
+ } // namespace couchnode
101
+
102
+ #endif // CONNECTION_H
@@ -8,8 +8,8 @@
8
8
  namespace couchnode
9
9
  {
10
10
 
11
- void Connection::lcbGetRespHandler(lcb_INSTANCE *instance, int cbtype,
12
- const lcb_RESPGET *resp)
11
+ void Instance::lcbGetRespHandler(lcb_INSTANCE *instance, int cbtype,
12
+ const lcb_RESPGET *resp)
13
13
  {
14
14
  Nan::HandleScope scope;
15
15
  RespReader<lcb_RESPGET, &lcb_respget_cookie> rdr(instance, resp);
@@ -37,8 +37,8 @@ void Connection::lcbGetRespHandler(lcb_INSTANCE *instance, int cbtype,
37
37
  rdr.invokeCallback(errVal, casVal, valueVal);
38
38
  }
39
39
 
40
- void Connection::lcbExistsRespHandler(lcb_INSTANCE *instance, int cbtype,
41
- const lcb_RESPEXISTS *resp)
40
+ void Instance::lcbExistsRespHandler(lcb_INSTANCE *instance, int cbtype,
41
+ const lcb_RESPEXISTS *resp)
42
42
  {
43
43
  Nan::HandleScope scope;
44
44
  RespReader<lcb_RESPEXISTS, &lcb_respexists_cookie> rdr(instance, resp);
@@ -64,8 +64,8 @@ void Connection::lcbExistsRespHandler(lcb_INSTANCE *instance, int cbtype,
64
64
  rdr.invokeCallback(errVal, casVal, existsVal);
65
65
  }
66
66
 
67
- void Connection::lcbGetReplicaRespHandler(lcb_INSTANCE *instance, int cbtype,
68
- const lcb_RESPGETREPLICA *resp)
67
+ void Instance::lcbGetReplicaRespHandler(lcb_INSTANCE *instance, int cbtype,
68
+ const lcb_RESPGETREPLICA *resp)
69
69
  {
70
70
  Nan::HandleScope scope;
71
71
  RespReader<lcb_RESPGETREPLICA, &lcb_respgetreplica_cookie> rdr(instance,
@@ -106,8 +106,8 @@ void Connection::lcbGetReplicaRespHandler(lcb_INSTANCE *instance, int cbtype,
106
106
  }
107
107
  }
108
108
 
109
- void Connection::lcbUnlockRespHandler(lcb_INSTANCE *instance, int cbtype,
110
- const lcb_RESPUNLOCK *resp)
109
+ void Instance::lcbUnlockRespHandler(lcb_INSTANCE *instance, int cbtype,
110
+ const lcb_RESPUNLOCK *resp)
111
111
  {
112
112
  Nan::HandleScope scope;
113
113
  RespReader<lcb_RESPUNLOCK, &lcb_respunlock_cookie> rdr(instance, resp);
@@ -118,8 +118,8 @@ void Connection::lcbUnlockRespHandler(lcb_INSTANCE *instance, int cbtype,
118
118
  rdr.invokeCallback(errVal);
119
119
  }
120
120
 
121
- void Connection::lcbRemoveRespHandler(lcb_INSTANCE *instance, int cbtype,
122
- const lcb_RESPREMOVE *resp)
121
+ void Instance::lcbRemoveRespHandler(lcb_INSTANCE *instance, int cbtype,
122
+ const lcb_RESPREMOVE *resp)
123
123
  {
124
124
  Nan::HandleScope scope;
125
125
  RespReader<lcb_RESPREMOVE, &lcb_respremove_cookie> rdr(instance, resp);
@@ -137,8 +137,8 @@ void Connection::lcbRemoveRespHandler(lcb_INSTANCE *instance, int cbtype,
137
137
  rdr.invokeCallback(errVal, casVal);
138
138
  }
139
139
 
140
- void Connection::lcbTouchRespHandler(lcb_INSTANCE *instance, int cbtype,
141
- const lcb_RESPTOUCH *resp)
140
+ void Instance::lcbTouchRespHandler(lcb_INSTANCE *instance, int cbtype,
141
+ const lcb_RESPTOUCH *resp)
142
142
  {
143
143
  Nan::HandleScope scope;
144
144
  RespReader<lcb_RESPTOUCH, &lcb_resptouch_cookie> rdr(instance, resp);
@@ -156,8 +156,8 @@ void Connection::lcbTouchRespHandler(lcb_INSTANCE *instance, int cbtype,
156
156
  rdr.invokeCallback(errVal, casVal);
157
157
  }
158
158
 
159
- void Connection::lcbStoreRespHandler(lcb_INSTANCE *instance, int cbtype,
160
- const lcb_RESPSTORE *resp)
159
+ void Instance::lcbStoreRespHandler(lcb_INSTANCE *instance, int cbtype,
160
+ const lcb_RESPSTORE *resp)
161
161
  {
162
162
  Nan::HandleScope scope;
163
163
  RespReader<lcb_RESPSTORE, &lcb_respstore_cookie> rdr(instance, resp);
@@ -177,8 +177,8 @@ void Connection::lcbStoreRespHandler(lcb_INSTANCE *instance, int cbtype,
177
177
  rdr.invokeCallback(errVal, casVal, tokenVal);
178
178
  }
179
179
 
180
- void Connection::lcbCounterRespHandler(lcb_INSTANCE *instance, int cbtype,
181
- const lcb_RESPCOUNTER *resp)
180
+ void Instance::lcbCounterRespHandler(lcb_INSTANCE *instance, int cbtype,
181
+ const lcb_RESPCOUNTER *resp)
182
182
  {
183
183
  Nan::HandleScope scope;
184
184
  RespReader<lcb_RESPCOUNTER, &lcb_respcounter_cookie> rdr(instance, resp);
@@ -200,8 +200,8 @@ void Connection::lcbCounterRespHandler(lcb_INSTANCE *instance, int cbtype,
200
200
  rdr.invokeCallback(errVal, casVal, tokenVal, valueVal);
201
201
  }
202
202
 
203
- void Connection::lcbLookupRespHandler(lcb_INSTANCE *instance, int cbtype,
204
- const lcb_RESPSUBDOC *resp)
203
+ void Instance::lcbLookupRespHandler(lcb_INSTANCE *instance, int cbtype,
204
+ const lcb_RESPSUBDOC *resp)
205
205
  {
206
206
  Nan::HandleScope scope;
207
207
  RespReader<lcb_RESPSUBDOC, &lcb_respsubdoc_cookie> rdr(instance, resp);
@@ -245,8 +245,8 @@ void Connection::lcbLookupRespHandler(lcb_INSTANCE *instance, int cbtype,
245
245
  rdr.invokeCallback(errVal, resVal);
246
246
  }
247
247
 
248
- void Connection::lcbMutateRespHandler(lcb_INSTANCE *instance, int cbtype,
249
- const lcb_RESPSUBDOC *resp)
248
+ void Instance::lcbMutateRespHandler(lcb_INSTANCE *instance, int cbtype,
249
+ const lcb_RESPSUBDOC *resp)
250
250
  {
251
251
  Nan::HandleScope scope;
252
252
  RespReader<lcb_RESPSUBDOC, &lcb_respsubdoc_cookie> rdr(instance, resp);
@@ -300,8 +300,8 @@ void Connection::lcbMutateRespHandler(lcb_INSTANCE *instance, int cbtype,
300
300
  rdr.invokeCallback(errVal, resVal);
301
301
  }
302
302
 
303
- void Connection::lcbViewDataHandler(lcb_INSTANCE *instance, int cbtype,
304
- const lcb_RESPVIEW *resp)
303
+ void Instance::lcbViewDataHandler(lcb_INSTANCE *instance, int cbtype,
304
+ const lcb_RESPVIEW *resp)
305
305
  {
306
306
  Nan::HandleScope scope;
307
307
  RespReader<lcb_RESPVIEW, &lcb_respview_cookie> rdr(instance, resp);
@@ -326,8 +326,8 @@ void Connection::lcbViewDataHandler(lcb_INSTANCE *instance, int cbtype,
326
326
  }
327
327
  }
328
328
 
329
- void Connection::lcbQueryDataHandler(lcb_INSTANCE *instance, int cbtype,
330
- const lcb_RESPQUERY *resp)
329
+ void Instance::lcbQueryDataHandler(lcb_INSTANCE *instance, int cbtype,
330
+ const lcb_RESPQUERY *resp)
331
331
  {
332
332
  Nan::HandleScope scope;
333
333
  RespReader<lcb_RESPQUERY, &lcb_respquery_cookie> rdr(instance, resp);
@@ -350,8 +350,8 @@ void Connection::lcbQueryDataHandler(lcb_INSTANCE *instance, int cbtype,
350
350
  }
351
351
  }
352
352
 
353
- void Connection::lcbAnalyticsDataHandler(lcb_INSTANCE *instance, int cbtype,
354
- const lcb_RESPANALYTICS *resp)
353
+ void Instance::lcbAnalyticsDataHandler(lcb_INSTANCE *instance, int cbtype,
354
+ const lcb_RESPANALYTICS *resp)
355
355
  {
356
356
  Nan::HandleScope scope;
357
357
  RespReader<lcb_RESPANALYTICS, &lcb_respanalytics_cookie> rdr(instance,
@@ -375,8 +375,8 @@ void Connection::lcbAnalyticsDataHandler(lcb_INSTANCE *instance, int cbtype,
375
375
  }
376
376
  }
377
377
 
378
- void Connection::lcbSearchDataHandler(lcb_INSTANCE *instance, int cbtype,
379
- const lcb_RESPSEARCH *resp)
378
+ void Instance::lcbSearchDataHandler(lcb_INSTANCE *instance, int cbtype,
379
+ const lcb_RESPSEARCH *resp)
380
380
  {
381
381
  Nan::HandleScope scope;
382
382
  RespReader<lcb_RESPSEARCH, &lcb_respsearch_cookie> rdr(instance, resp);
@@ -399,8 +399,8 @@ void Connection::lcbSearchDataHandler(lcb_INSTANCE *instance, int cbtype,
399
399
  }
400
400
  }
401
401
 
402
- void Connection::lcbHttpDataHandler(lcb_INSTANCE *instance, int cbtype,
403
- const lcb_RESPHTTP *resp)
402
+ void Instance::lcbHttpDataHandler(lcb_INSTANCE *instance, int cbtype,
403
+ const lcb_RESPHTTP *resp)
404
404
  {
405
405
  Nan::HandleScope scope;
406
406
  RespReader<lcb_RESPHTTP, &lcb_resphttp_cookie> rdr(instance, resp);
@@ -445,8 +445,8 @@ void Connection::lcbHttpDataHandler(lcb_INSTANCE *instance, int cbtype,
445
445
  }
446
446
  }
447
447
 
448
- void Connection::lcbPingRespHandler(lcb_INSTANCE *instance, int cbtype,
449
- const lcb_RESPPING *resp)
448
+ void Instance::lcbPingRespHandler(lcb_INSTANCE *instance, int cbtype,
449
+ const lcb_RESPPING *resp)
450
450
  {
451
451
  Nan::HandleScope scope;
452
452
  RespReader<lcb_RESPPING, &lcb_respping_cookie> rdr(instance, resp);
@@ -464,8 +464,8 @@ void Connection::lcbPingRespHandler(lcb_INSTANCE *instance, int cbtype,
464
464
  rdr.invokeCallback(errVal, dataVal);
465
465
  }
466
466
 
467
- void Connection::lcbDiagRespHandler(lcb_INSTANCE *instance, int cbtype,
468
- const lcb_RESPDIAG *resp)
467
+ void Instance::lcbDiagRespHandler(lcb_INSTANCE *instance, int cbtype,
468
+ const lcb_RESPDIAG *resp)
469
469
  {
470
470
  Nan::HandleScope scope;
471
471
  RespReader<lcb_RESPDIAG, &lcb_respdiag_cookie> rdr(instance, resp);
package/src/logger.cpp CHANGED
@@ -4,7 +4,8 @@ namespace couchnode
4
4
  {
5
5
 
6
6
  Logger::Logger(Local<Function> callback)
7
- : _callback(callback)
7
+ : _enabled(true)
8
+ , _callback(callback)
8
9
  , _logBuffer(nullptr)
9
10
  , _logBufferLen(0)
10
11
  {
@@ -23,10 +24,19 @@ const lcb_LOGGER *Logger::lcbProcs() const
23
24
  return _lcbLogger;
24
25
  }
25
26
 
27
+ void Logger::disconnect()
28
+ {
29
+ _enabled = false;
30
+ }
31
+
26
32
  void Logger::handler(unsigned int iid, const char *subsys, int severity,
27
33
  const char *srcfile, int srcline, const char *fmt,
28
34
  va_list ap)
29
35
  {
36
+ if (!_enabled) {
37
+ return;
38
+ }
39
+
30
40
  Nan::HandleScope scope;
31
41
  va_list apCopy;
32
42
 
package/src/logger.h CHANGED
@@ -19,6 +19,8 @@ public:
19
19
 
20
20
  const lcb_LOGGER *lcbProcs() const;
21
21
 
22
+ void disconnect();
23
+
22
24
  private:
23
25
  void handler(unsigned int iid, const char *subsys, int severity,
24
26
  const char *srcfile, int srcline, const char *fmt, va_list ap);
@@ -28,6 +30,7 @@ private:
28
30
  const char *srcfile, int srcline, const char *fmt,
29
31
  va_list ap);
30
32
 
33
+ bool _enabled;
31
34
  lcb_LOGGER *_lcbLogger;
32
35
  Nan::Callback _callback;
33
36
  char *_logBuffer;
package/src/metrics.cpp CHANGED
@@ -59,6 +59,7 @@ void lcbValueRecorderRecordValue(const lcbmetrics_VALUERECORDER *procs,
59
59
  }
60
60
 
61
61
  Meter::Meter(Local<Object> impl)
62
+ : _enabled(true)
62
63
  {
63
64
  lcbmetrics_meter_create(&_lcbMeter, this);
64
65
  lcbmetrics_meter_dtor_callback(_lcbMeter, &lcbMeterDtor);
@@ -84,6 +85,11 @@ const lcbmetrics_METER *Meter::lcbProcs() const
84
85
  return _lcbMeter;
85
86
  }
86
87
 
88
+ void Meter::disconnect()
89
+ {
90
+ _enabled = false;
91
+ }
92
+
87
93
  void Meter::destroy(const Meter *meter)
88
94
  {
89
95
  delete meter;
@@ -93,6 +99,10 @@ const lcbmetrics_VALUERECORDER *Meter::valueRecorder(const char *name,
93
99
  const lcbmetrics_TAG *tags,
94
100
  size_t ntags) const
95
101
  {
102
+ if (!_enabled) {
103
+ return nullptr;
104
+ }
105
+
96
106
  // We don't perform any cacheing to avoid calls into v8 here as libcouchbase
97
107
  // already contractually provides cacheing to reduce the calls to this
98
108
  // method.
package/src/metrics.h CHANGED
@@ -24,7 +24,10 @@ public:
24
24
  const lcbmetrics_TAG *tags,
25
25
  size_t ntags) const;
26
26
 
27
+ void disconnect();
28
+
27
29
  protected:
30
+ bool _enabled;
28
31
  lcbmetrics_METER *_lcbMeter;
29
32
  Nan::Persistent<Object> _impl;
30
33
  Nan::Persistent<Function> _valueRecorderImpl;
@@ -2,6 +2,7 @@
2
2
  #ifndef TOKEN_H
3
3
  #define TOKEN_H
4
4
 
5
+ #include "addondata.h"
5
6
  #include <libcouchbase/couchbase.h>
6
7
  #include <nan.h>
7
8
  #include <node.h>
@@ -24,8 +25,7 @@ public:
24
25
 
25
26
  static inline Nan::Persistent<Function> &constructor()
26
27
  {
27
- static Nan::Persistent<Function> class_constructor;
28
- return class_constructor;
28
+ return addondata::Get()->_mutationtokenConstructor;
29
29
  }
30
30
 
31
31
  private: