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
@@ -6,7 +6,7 @@ Standards-Version: 3.9.2
6
6
  Section: libs
7
7
  Homepage: http://www.couchbase.com/develop/c/current
8
8
  Vcs-Browser: https://github.com/couchbase/libcouchbase
9
- Vcs-Git: git://github.com/couchbase/libcouchbase.git
9
+ Vcs-Git: https://github.com/couchbase/libcouchbase.git
10
10
 
11
11
  Package: libcouchbase3-libevent
12
12
  Architecture: any
@@ -225,7 +225,7 @@ lcb_ANALYTICS_HANDLE_::lcb_ANALYTICS_HANDLE_(lcb_INSTANCE *obj, void *user_cooki
225
225
  query_params_ = Json::FastWriter().write(cmd->root());
226
226
 
227
227
  if (instance_->settings->tracer) {
228
- span_ = cmd->parent_span();
228
+ parent_span_ = cmd->parent_span();
229
229
  }
230
230
 
231
231
  if (ingest_options().method != LCB_INGEST_METHOD_NONE) {
@@ -237,6 +237,9 @@ lcb_ANALYTICS_HANDLE_::lcb_ANALYTICS_HANDLE_(lcb_INSTANCE *obj, void *user_cooki
237
237
  // TODO: docq->max_pending_response;
238
238
  lcb_aspend_add(&instance_->pendops, LCB_PENDTYPE_COUNTER, nullptr);
239
239
  }
240
+ if (cmd->want_impersonation()) {
241
+ impostor_ = cmd->impostor();
242
+ }
240
243
  }
241
244
 
242
245
  lcb_ANALYTICS_HANDLE_::lcb_ANALYTICS_HANDLE_(lcb_INSTANCE *obj, void *user_cookie, lcb_DEFERRED_HANDLE *handle)
@@ -277,9 +280,11 @@ lcb_STATUS lcb_ANALYTICS_HANDLE_::issue_htreq(const std::string &body)
277
280
  if (!hostname.empty()) {
278
281
  lcb_cmdhttp_host(htcmd, hostname.c_str(), hostname.size());
279
282
  }
283
+ if (!impostor_.empty()) {
284
+ htcmd->set_header("cb-on-behalf-of", impostor_);
285
+ }
280
286
 
281
- LCBTRACE_HTTP_START(instance_->settings, client_context_id_.c_str(), span_, LCBTRACE_TAG_SERVICE_ANALYTICS,
282
- LCBTRACE_THRESHOLD_ANALYTICS, span_);
287
+ span_ = lcb::trace::start_http_span_with_statement(instance_->settings, this, statement_);
283
288
  lcb_cmdhttp_parent_span(htcmd, span_);
284
289
 
285
290
  lcb_STATUS rc = lcb_http(instance_, this, htcmd);
@@ -388,7 +393,7 @@ void lcb_ANALYTICS_HANDLE_::invoke_row(lcb_RESPANALYTICS *resp, bool is_last)
388
393
  resp->rflags |= LCB_RESP_F_EXTDATA;
389
394
  }
390
395
  Json::Value meta;
391
- if (Json::Reader().parse(resp->row, resp->row + resp->nrow, meta)) {
396
+ if (Json::Reader(Json::Features::strictMode()).parse(resp->row, resp->row + resp->nrow, meta)) {
392
397
  const Json::Value &errors = meta["errors"];
393
398
  if (errors.isArray() && !errors.empty()) {
394
399
  const Json::Value &err = errors[0];
@@ -450,7 +455,10 @@ void lcb_ANALYTICS_HANDLE_::invoke_row(lcb_RESPANALYTICS *resp, bool is_last)
450
455
  }
451
456
  }
452
457
 
453
- LCBTRACE_HTTP_FINISH(span_);
458
+ if (span_ != nullptr) {
459
+ lcb::trace::finish_http_span(span_, this);
460
+ span_ = nullptr;
461
+ }
454
462
  if (http_request_ != nullptr) {
455
463
  http_request_->span = nullptr;
456
464
  }
@@ -208,6 +208,32 @@ struct lcb_ANALYTICS_HANDLE_ : lcb::jsparse::Parser::Actions {
208
208
  return last_error_;
209
209
  }
210
210
 
211
+ static lcbtrace_THRESHOLDOPTS service()
212
+ {
213
+ return LCBTRACE_THRESHOLD_ANALYTICS;
214
+ }
215
+
216
+ static const std::string &operation_name()
217
+ {
218
+ static std::string name = LCBTRACE_OP_ANALYTICS;
219
+ return name;
220
+ }
221
+
222
+ lcbtrace_SPAN *parent_span() const
223
+ {
224
+ return parent_span_;
225
+ }
226
+
227
+ const std::string &client_context_id() const
228
+ {
229
+ return client_context_id_;
230
+ }
231
+
232
+ int retries() const
233
+ {
234
+ return retries_;
235
+ }
236
+
211
237
  private:
212
238
  const lcb_RESPHTTP *http_response_{nullptr};
213
239
  lcb_HTTP_HANDLE *http_request_{nullptr};
@@ -219,6 +245,7 @@ struct lcb_ANALYTICS_HANDLE_ : lcb::jsparse::Parser::Actions {
219
245
  lcb_U32 timeout_{0};
220
246
  // How many rows were received. Used to avoid parsing the meta
221
247
  size_t rows_number_{0};
248
+ int retries_{0};
222
249
 
223
250
  /** Request body as received from the application */
224
251
  Json::Value json{};
@@ -240,7 +267,9 @@ struct lcb_ANALYTICS_HANDLE_ : lcb::jsparse::Parser::Actions {
240
267
  lcb::docreq::Queue *document_queue_{nullptr};
241
268
  unsigned refcount{1};
242
269
 
270
+ lcbtrace_SPAN *parent_span_{nullptr};
243
271
  lcbtrace_SPAN *span_{nullptr};
272
+ std::string impostor_{};
244
273
  };
245
274
 
246
275
  #endif // LIBCOUCHBASE_ANALYTICS_HANDLE_HH
@@ -37,8 +37,11 @@ void Bootstrap::config_callback(EventType event, ConfigInfo *info)
37
37
  lcb_INSTANCE *instance = parent;
38
38
 
39
39
  if (event != CLCONFIG_EVENT_GOT_NEW_CONFIG) {
40
- if (event == CLCONFIG_EVENT_PROVIDERS_CYCLED) {
41
- if (!LCBT_VBCONFIG(instance)) {
40
+ if (event == CLCONFIG_EVENT_PROVIDERS_CYCLED && !LCBT_VBCONFIG(instance)) {
41
+ if (parent->confmon->get_last_error() == LCB_ERR_CONNECTION_REFUSED) {
42
+ initial_error(LCB_ERR_NO_MATCHING_SERVER,
43
+ "Unable to bootstrap, check ports and cluster encryption setting");
44
+ } else {
42
45
  initial_error(LCB_ERR_NO_MATCHING_SERVER, "No more bootstrap providers remain");
43
46
  }
44
47
  }
@@ -199,7 +202,7 @@ void Bootstrap::initial_error(lcb_STATUS err, const char *errinfo)
199
202
  if (parent->last_error == LCB_SUCCESS) {
200
203
  parent->last_error = err;
201
204
  }
202
- lcb_log(LOGARGS(parent, ERR), "Failed to bootstrap client=%p. Error=%s (Last=%s), Message=%s", (void *)parent,
205
+ lcb_log(LOGARGS(parent, ERR), "Failed to bootstrap client=%p. Error=%s (Last=%s), Message=\"%s\"", (void *)parent,
203
206
  lcb_strerror_short(err), lcb_strerror_short(parent->last_error), errinfo);
204
207
  tm.cancel();
205
208
 
@@ -222,10 +222,16 @@ LIBCOUCHBASE_API lcb_STATUS lcb_cmdanalytics_named_param(lcb_CMDANALYTICS *cmd,
222
222
  return cmd->option(name, name_len, value, value_len);
223
223
  }
224
224
 
225
+ LIBCOUCHBASE_API lcb_STATUS lcb_cmdanalytics_positional_params(lcb_CMDANALYTICS *cmd, const char *value,
226
+ size_t value_len)
227
+ {
228
+ return cmd->option_array("args", value, value_len);
229
+ }
230
+
225
231
  LIBCOUCHBASE_API lcb_STATUS lcb_cmdanalytics_positional_param(lcb_CMDANALYTICS *cmd, const char *value,
226
232
  size_t value_len)
227
233
  {
228
- return cmd->option_array("args", value, value_len);
234
+ return cmd->option_array_append("args", value, value_len);
229
235
  }
230
236
 
231
237
  LIBCOUCHBASE_API lcb_STATUS lcb_cmdanalytics_deferred(lcb_CMDANALYTICS *cmd, int deferred)
@@ -238,6 +244,11 @@ LIBCOUCHBASE_API lcb_STATUS lcb_cmdanalytics_ingest_options(lcb_CMDANALYTICS *cm
238
244
  return cmd->ingest_options(options);
239
245
  }
240
246
 
247
+ LIBCOUCHBASE_API lcb_STATUS lcb_cmdanalytics_on_behalf_of(lcb_CMDANALYTICS *cmd, const char *data, size_t data_len)
248
+ {
249
+ return cmd->on_behalf_of(std::string(data, data_len));
250
+ }
251
+
241
252
  LIBCOUCHBASE_API lcb_STATUS lcb_ingest_options_create(lcb_INGEST_OPTIONS **options)
242
253
  {
243
254
  *options = new lcb_INGEST_OPTIONS();
@@ -222,6 +222,19 @@ struct lcb_CMDANALYTICS_ {
222
222
  return LCB_SUCCESS;
223
223
  }
224
224
 
225
+ lcb_STATUS option_array_append(const std::string &name, const char *value, std::size_t value_len)
226
+ {
227
+ if (name.empty() || value == nullptr) {
228
+ return LCB_ERR_INVALID_ARGUMENT;
229
+ }
230
+ Json::Value json_value;
231
+ if (!Json::Reader().parse(value, value + value_len, json_value)) {
232
+ return LCB_ERR_INVALID_ARGUMENT;
233
+ }
234
+ root_[name].append(json_value);
235
+ return LCB_SUCCESS;
236
+ }
237
+
225
238
  lcb_STATUS option_string(const std::string &name, const char *value, std::size_t value_len)
226
239
  {
227
240
  if (name.empty() || value == nullptr || value_len == 0) {
@@ -346,6 +359,22 @@ struct lcb_CMDANALYTICS_ {
346
359
  return priority_;
347
360
  }
348
361
 
362
+ lcb_STATUS on_behalf_of(std::string user)
363
+ {
364
+ impostor_ = std::move(user);
365
+ return LCB_SUCCESS;
366
+ }
367
+
368
+ bool want_impersonation() const
369
+ {
370
+ return !impostor_.empty();
371
+ }
372
+
373
+ const std::string &impostor() const
374
+ {
375
+ return impostor_;
376
+ }
377
+
349
378
  private:
350
379
  std::chrono::microseconds timeout_{0};
351
380
  std::chrono::nanoseconds start_time_{0};
@@ -359,6 +388,7 @@ struct lcb_CMDANALYTICS_ {
359
388
  bool priority_{false};
360
389
  std::string scope_qualifier_{};
361
390
  std::string scope_name_{};
391
+ std::string impostor_{};
362
392
  };
363
393
 
364
394
  #endif // LIBCOUCHBASE_CAPI_ANALYTICS_HH
@@ -30,6 +30,12 @@
30
30
  */
31
31
  struct lcb_CMDCOUNTER_ {
32
32
  public:
33
+ static const std::string &operation_name()
34
+ {
35
+ static std::string name = LCBTRACE_OP_COUNTER;
36
+ return name;
37
+ }
38
+
33
39
  lcb_STATUS expiry(std::uint32_t expiry)
34
40
  {
35
41
  if (!initialize_if_does_not_exist_) {
@@ -175,6 +181,22 @@ struct lcb_CMDCOUNTER_ {
175
181
  return cookie_;
176
182
  }
177
183
 
184
+ lcb_STATUS on_behalf_of(std::string user)
185
+ {
186
+ impostor_ = std::move(user);
187
+ return LCB_SUCCESS;
188
+ }
189
+
190
+ bool want_impersonation() const
191
+ {
192
+ return !impostor_.empty();
193
+ }
194
+
195
+ const std::string &impostor() const
196
+ {
197
+ return impostor_;
198
+ }
199
+
178
200
  private:
179
201
  lcb::collection_qualifier collection_{};
180
202
  std::uint32_t expiry_{0};
@@ -187,6 +209,7 @@ struct lcb_CMDCOUNTER_ {
187
209
  std::string key_{};
188
210
  bool initialize_if_does_not_exist_{false};
189
211
  lcb_DURABILITY_LEVEL durability_level_{LCB_DURABILITYLEVEL_NONE};
212
+ std::string impostor_{};
190
213
  };
191
214
 
192
215
  /**
@@ -28,6 +28,12 @@
28
28
  * @private
29
29
  */
30
30
  struct lcb_CMDEXISTS_ {
31
+ static const std::string &operation_name()
32
+ {
33
+ static std::string name = LCBTRACE_OP_EXISTS;
34
+ return name;
35
+ }
36
+
31
37
  lcb_STATUS key(std::string key)
32
38
  {
33
39
  key_ = std::move(key);
@@ -115,13 +121,30 @@ struct lcb_CMDEXISTS_ {
115
121
  return cookie_;
116
122
  }
117
123
 
124
+ lcb_STATUS on_behalf_of(std::string user)
125
+ {
126
+ impostor_ = std::move(user);
127
+ return LCB_SUCCESS;
128
+ }
129
+
130
+ bool want_impersonation() const
131
+ {
132
+ return !impostor_.empty();
133
+ }
134
+
135
+ const std::string &impostor() const
136
+ {
137
+ return impostor_;
138
+ }
139
+
118
140
  private:
119
141
  lcb::collection_qualifier collection_{};
120
142
  std::chrono::microseconds timeout_{0};
121
143
  std::chrono::nanoseconds start_time_{0};
122
144
  lcbtrace_SPAN *parent_span_{nullptr};
123
- void *cookie_;
145
+ void *cookie_{nullptr};
124
146
  std::string key_{};
147
+ std::string impostor_{};
125
148
  };
126
149
 
127
150
  /**
@@ -34,6 +34,11 @@ enum class get_mode {
34
34
  * @private
35
35
  */
36
36
  struct lcb_CMDGET_ {
37
+ static const std::string &operation_name()
38
+ {
39
+ static std::string name = LCBTRACE_OP_GET;
40
+ return name;
41
+ }
37
42
 
38
43
  lcb_STATUS with_touch(std::uint32_t expiry)
39
44
  {
@@ -175,6 +180,22 @@ struct lcb_CMDGET_ {
175
180
  return cookie_is_callback_;
176
181
  }
177
182
 
183
+ lcb_STATUS on_behalf_of(std::string user)
184
+ {
185
+ impostor_ = std::move(user);
186
+ return LCB_SUCCESS;
187
+ }
188
+
189
+ bool want_impersonation() const
190
+ {
191
+ return !impostor_.empty();
192
+ }
193
+
194
+ const std::string &impostor() const
195
+ {
196
+ return impostor_;
197
+ }
198
+
178
199
  private:
179
200
  lcb::collection_qualifier collection_{};
180
201
  std::chrono::microseconds timeout_{0};
@@ -186,6 +207,7 @@ struct lcb_CMDGET_ {
186
207
  std::string key_{};
187
208
  get_mode mode_{get_mode::normal};
188
209
  bool cookie_is_callback_{false};
210
+ std::string impostor_{};
189
211
  };
190
212
 
191
213
  /** @private */
@@ -36,6 +36,12 @@ enum class get_replica_mode {
36
36
  * @private
37
37
  */
38
38
  struct lcb_CMDGETREPLICA_ {
39
+ static const std::string &operation_name()
40
+ {
41
+ static std::string name = LCBTRACE_OP_GET_FROM_REPLICA;
42
+ return name;
43
+ }
44
+
39
45
  lcb_STATUS mode(get_replica_mode mode)
40
46
  {
41
47
  mode_ = mode;
@@ -150,6 +156,22 @@ struct lcb_CMDGETREPLICA_ {
150
156
  return cookie_;
151
157
  }
152
158
 
159
+ lcb_STATUS on_behalf_of(std::string user)
160
+ {
161
+ impostor_ = std::move(user);
162
+ return LCB_SUCCESS;
163
+ }
164
+
165
+ bool want_impersonation() const
166
+ {
167
+ return !impostor_.empty();
168
+ }
169
+
170
+ const std::string &impostor() const
171
+ {
172
+ return impostor_;
173
+ }
174
+
153
175
  private:
154
176
  lcb::collection_qualifier collection_{};
155
177
  std::chrono::microseconds timeout_{0};
@@ -159,6 +181,7 @@ struct lcb_CMDGETREPLICA_ {
159
181
  std::string key_{};
160
182
  get_replica_mode mode_{get_replica_mode::any};
161
183
  int select_index_{0};
184
+ std::string impostor_{};
162
185
  };
163
186
 
164
187
  struct lcb_RESPGETREPLICA_ {
@@ -50,6 +50,11 @@
50
50
  * Note that the key and nkey fields indicate the _path_ for the API
51
51
  */
52
52
  struct lcb_CMDHTTP_ {
53
+ void set_header(const std::string &name, const std::string &value)
54
+ {
55
+ headers_.emplace(name, value);
56
+ }
57
+
53
58
  /**Common flags for the command. These modify the command itself. Currently
54
59
  the lower 16 bits of this field are reserved, and the higher 16 bits are
55
60
  used for individual commands.*/
@@ -118,6 +123,8 @@ struct lcb_CMDHTTP_ {
118
123
  /** If set, this must be a string in the form of `http://host:port`. Should
119
124
  * only be used for raw requests. */
120
125
  const char *host;
126
+
127
+ std::map<std::string, std::string> headers_{};
121
128
  };
122
129
 
123
130
  /**
@@ -142,11 +142,16 @@ LIBCOUCHBASE_API lcb_STATUS lcb_cmdquery_named_param(lcb_CMDQUERY *cmd, const ch
142
142
  return cmd->option("$" + std::string(name, name_len), value, value_len);
143
143
  }
144
144
 
145
- LIBCOUCHBASE_API lcb_STATUS lcb_cmdquery_positional_param(lcb_CMDQUERY *cmd, const char *value, size_t value_len)
145
+ LIBCOUCHBASE_API lcb_STATUS lcb_cmdquery_positional_params(lcb_CMDQUERY *cmd, const char *value, size_t value_len)
146
146
  {
147
147
  return cmd->option_array("args", value, value_len);
148
148
  }
149
149
 
150
+ LIBCOUCHBASE_API lcb_STATUS lcb_cmdquery_positional_param(lcb_CMDQUERY *cmd, const char *value, size_t value_len)
151
+ {
152
+ return cmd->option_array_append("args", value, value_len);
153
+ }
154
+
150
155
  LIBCOUCHBASE_API lcb_STATUS lcb_cmdquery_adhoc(lcb_CMDQUERY *cmd, int adhoc)
151
156
  {
152
157
  return cmd->prepare_statement(!adhoc);
@@ -258,6 +263,11 @@ LIBCOUCHBASE_API lcb_STATUS lcb_cmdquery_handle(lcb_CMDQUERY *cmd, lcb_QUERY_HAN
258
263
  return cmd->store_handle_refence_to(handle);
259
264
  }
260
265
 
266
+ LIBCOUCHBASE_API lcb_STATUS lcb_cmdquery_on_behalf_of(lcb_CMDQUERY *cmd, const char *data, size_t data_len)
267
+ {
268
+ return cmd->on_behalf_of(std::string(data, data_len));
269
+ }
270
+
261
271
  LIBCOUCHBASE_API lcb_STATUS lcb_errctx_query_rc(const lcb_QUERY_ERROR_CONTEXT *ctx)
262
272
  {
263
273
  return ctx->rc;
@@ -381,6 +381,19 @@ struct lcb_CMDQUERY_ {
381
381
  return LCB_SUCCESS;
382
382
  }
383
383
 
384
+ lcb_STATUS option_array_append(const std::string &name, const char *value, std::size_t value_len)
385
+ {
386
+ if (name.empty() || value == nullptr) {
387
+ return LCB_ERR_INVALID_ARGUMENT;
388
+ }
389
+ Json::Value json_value;
390
+ if (!Json::Reader().parse(value, value + value_len, json_value)) {
391
+ return LCB_ERR_INVALID_ARGUMENT;
392
+ }
393
+ root_[name].append(json_value);
394
+ return LCB_SUCCESS;
395
+ }
396
+
384
397
  lcb_STATUS option_string(const std::string &name, const char *value, std::size_t value_len)
385
398
  {
386
399
  if (name.empty() || value == nullptr || value_len == 0) {
@@ -417,6 +430,22 @@ struct lcb_CMDQUERY_ {
417
430
  cookie_ = cookie;
418
431
  }
419
432
 
433
+ lcb_STATUS on_behalf_of(std::string user)
434
+ {
435
+ impostor_ = std::move(user);
436
+ return LCB_SUCCESS;
437
+ }
438
+
439
+ bool want_impersonation() const
440
+ {
441
+ return !impostor_.empty();
442
+ }
443
+
444
+ const std::string &impostor() const
445
+ {
446
+ return impostor_;
447
+ }
448
+
420
449
  private:
421
450
  std::string scope_{};
422
451
  std::string scope_qualifier_{};
@@ -450,6 +479,8 @@ struct lcb_CMDQUERY_ {
450
479
  /**Request handle. Will be set to the handle which may be passed to
451
480
  * lcb_query_cancel() */
452
481
  lcb_QUERY_HANDLE **handle_{nullptr};
482
+
483
+ std::string impostor_{};
453
484
  };
454
485
 
455
486
  /**
@@ -28,6 +28,12 @@
28
28
  * @private
29
29
  */
30
30
  struct lcb_CMDREMOVE_ {
31
+ static const std::string &operation_name()
32
+ {
33
+ static std::string name = LCBTRACE_OP_REMOVE;
34
+ return name;
35
+ }
36
+
31
37
  lcb_STATUS cas(std::uint64_t cas)
32
38
  {
33
39
  cas_ = cas;
@@ -142,6 +148,22 @@ struct lcb_CMDREMOVE_ {
142
148
  return cookie_;
143
149
  }
144
150
 
151
+ lcb_STATUS on_behalf_of(std::string user)
152
+ {
153
+ impostor_ = std::move(user);
154
+ return LCB_SUCCESS;
155
+ }
156
+
157
+ bool want_impersonation() const
158
+ {
159
+ return !impostor_.empty();
160
+ }
161
+
162
+ const std::string &impostor() const
163
+ {
164
+ return impostor_;
165
+ }
166
+
145
167
  private:
146
168
  lcb::collection_qualifier collection_{};
147
169
  std::chrono::microseconds timeout_{0};
@@ -151,6 +173,7 @@ struct lcb_CMDREMOVE_ {
151
173
  std::string key_{};
152
174
  std::uint64_t cas_{0};
153
175
  lcb_DURABILITY_LEVEL durability_level_{LCB_DURABILITYLEVEL_NONE};
176
+ std::string impostor_{};
154
177
  };
155
178
 
156
179
  /**
@@ -97,6 +97,12 @@ LIBCOUCHBASE_API lcb_STATUS lcb_cmdsearch_handle(lcb_CMDSEARCH *cmd, lcb_SEARCH_
97
97
  {
98
98
  return cmd->store_handle_refence_to(handle);
99
99
  }
100
+
101
+ LIBCOUCHBASE_API lcb_STATUS lcb_cmdsearch_on_behalf_of(lcb_CMDSEARCH *cmd, const char *data, size_t data_len)
102
+ {
103
+ return cmd->on_behalf_of(std::string(data, data_len));
104
+ }
105
+
100
106
  LIBCOUCHBASE_API lcb_STATUS lcb_errctx_search_rc(const lcb_SEARCH_ERROR_CONTEXT *ctx)
101
107
  {
102
108
  return ctx->rc;
@@ -70,6 +70,12 @@ struct lcb_RESPSEARCH_ {
70
70
  * @private
71
71
  */
72
72
  struct lcb_CMDSEARCH_ {
73
+ static const std::string &operation_name()
74
+ {
75
+ static std::string name = LCBTRACE_OP_SEARCH;
76
+ return name;
77
+ }
78
+
73
79
  bool has_callback() const
74
80
  {
75
81
  return callback_ != nullptr;
@@ -168,6 +174,22 @@ struct lcb_CMDSEARCH_ {
168
174
  return LCB_SUCCESS;
169
175
  }
170
176
 
177
+ lcb_STATUS on_behalf_of(std::string user)
178
+ {
179
+ impostor_ = std::move(user);
180
+ return LCB_SUCCESS;
181
+ }
182
+
183
+ bool want_impersonation() const
184
+ {
185
+ return !impostor_.empty();
186
+ }
187
+
188
+ const std::string &impostor() const
189
+ {
190
+ return impostor_;
191
+ }
192
+
171
193
  private:
172
194
  std::chrono::microseconds timeout_{0};
173
195
  std::chrono::nanoseconds start_time_{0};
@@ -176,6 +198,7 @@ struct lcb_CMDSEARCH_ {
176
198
  void *cookie_{nullptr};
177
199
  lcb_SEARCH_CALLBACK callback_{nullptr};
178
200
  lcb_SEARCH_HANDLE **handle_{nullptr};
201
+ std::string impostor_{};
179
202
  };
180
203
 
181
204
  #endif // LIBCOUCHBASE_CAPI_SEARCH_HH
@@ -35,6 +35,16 @@ enum class durability_mode {
35
35
  * @private
36
36
  */
37
37
  struct lcb_CMDSTORE_ {
38
+ const std::string &operation_name() const
39
+ {
40
+ static std::map<int, std::string> names{
41
+ {LCB_STORE_UPSERT, LCBTRACE_OP_UPSERT}, {LCB_STORE_REPLACE, LCBTRACE_OP_REPLACE},
42
+ {LCB_STORE_APPEND, LCBTRACE_OP_APPEND}, {LCB_STORE_PREPEND, LCBTRACE_OP_PREPEND},
43
+ {LCB_STORE_INSERT, LCBTRACE_OP_INSERT},
44
+ };
45
+ return names[operation_];
46
+ }
47
+
38
48
  lcb_STATUS operation(lcb_STORE_OPERATION operation)
39
49
  {
40
50
  operation_ = operation;
@@ -123,24 +133,6 @@ struct lcb_CMDSTORE_ {
123
133
  return false;
124
134
  }
125
135
 
126
- const char *operation_name() const
127
- {
128
- switch (operation_) {
129
- case LCB_STORE_UPSERT:
130
- return LCBTRACE_OP_UPSERT;
131
- case LCB_STORE_REPLACE:
132
- return LCBTRACE_OP_REPLACE;
133
- case LCB_STORE_APPEND:
134
- return LCBTRACE_OP_APPEND;
135
- case LCB_STORE_PREPEND:
136
- return LCBTRACE_OP_PREPEND;
137
- case LCB_STORE_INSERT:
138
- return LCBTRACE_OP_INSERT;
139
- }
140
- lcb_assert(false && "unknown operation name");
141
- return "unknown";
142
- }
143
-
144
136
  lcb_STATUS flags(std::uint32_t flags)
145
137
  {
146
138
  if (operation_ == LCB_STORE_APPEND || operation_ == LCB_STORE_PREPEND) {
@@ -245,13 +237,16 @@ struct lcb_CMDSTORE_ {
245
237
 
246
238
  lcb_STATUS value(const lcb_IOV *iov, std::size_t iov_len)
247
239
  {
248
- std::stringstream ss;
240
+ std::size_t total_size = 0;
241
+ for (std::size_t i = 0; i < iov_len; ++i) {
242
+ total_size += iov[i].iov_len;
243
+ }
244
+ value_.reserve(total_size);
249
245
  for (std::size_t i = 0; i < iov_len; ++i) {
250
246
  if (iov[i].iov_len > 0 && iov[i].iov_base != nullptr) {
251
- ss << std::string(static_cast<const char *>(iov[i].iov_base), iov[i].iov_len);
247
+ value_.append(static_cast<const char *>(iov[i].iov_base), iov[i].iov_len);
252
248
  }
253
249
  }
254
- value_ = ss.str();
255
250
  return LCB_SUCCESS;
256
251
  }
257
252
 
@@ -370,6 +365,22 @@ struct lcb_CMDSTORE_ {
370
365
  return preserve_expiry_;
371
366
  }
372
367
 
368
+ lcb_STATUS on_behalf_of(std::string user)
369
+ {
370
+ impostor_ = std::move(user);
371
+ return LCB_SUCCESS;
372
+ }
373
+
374
+ bool want_impersonation() const
375
+ {
376
+ return !impostor_.empty();
377
+ }
378
+
379
+ const std::string &impostor() const
380
+ {
381
+ return impostor_;
382
+ }
383
+
373
384
  private:
374
385
  lcb::collection_qualifier collection_{};
375
386
  std::chrono::microseconds timeout_{0};
@@ -390,6 +401,7 @@ struct lcb_CMDSTORE_ {
390
401
  bool compressed_{false};
391
402
  bool cookie_is_callback_{false};
392
403
  bool preserve_expiry_{false};
404
+ std::string impostor_{};
393
405
  };
394
406
 
395
407
  /**