couchbase 3.7.0 → 3.8.0

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 (286) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -3
  3. data/ext/CMakeLists.txt +4 -1
  4. data/ext/cache/extconf_include.rb +4 -3
  5. data/ext/cache/mozilla-ca-bundle.crt +66 -93
  6. data/ext/cache/mozilla-ca-bundle.sha256 +1 -1
  7. data/ext/couchbase/CMakeLists.txt +24 -11
  8. data/ext/couchbase/cmake/APKBUILD.in +17 -1
  9. data/ext/couchbase/cmake/Bundler.cmake +9 -1
  10. data/ext/couchbase/cmake/Cache.cmake +48 -19
  11. data/ext/couchbase/cmake/CompilerOptions.cmake +3 -1
  12. data/ext/couchbase/cmake/OpenSSL.cmake +10 -2
  13. data/ext/couchbase/cmake/Packaging.cmake +48 -8
  14. data/ext/couchbase/cmake/ThirdPartyDependencies.cmake +43 -1
  15. data/ext/couchbase/cmake/build_config.hxx.in +2 -0
  16. data/ext/couchbase/cmake/couchbase-cxx-client.spec.in +18 -0
  17. data/ext/couchbase/cmake/tarball_glob.txt +10 -0
  18. data/ext/couchbase/core/app_telemetry_meter.cxx +1 -0
  19. data/ext/couchbase/core/app_telemetry_reporter.cxx +45 -43
  20. data/ext/couchbase/core/app_telemetry_reporter.hxx +4 -3
  21. data/ext/couchbase/core/bucket.cxx +128 -13
  22. data/ext/couchbase/core/bucket.hxx +12 -2
  23. data/ext/couchbase/core/cluster.cxx +304 -152
  24. data/ext/couchbase/core/cluster.hxx +32 -0
  25. data/ext/couchbase/core/cluster_credentials.cxx +25 -0
  26. data/ext/couchbase/core/cluster_credentials.hxx +5 -0
  27. data/ext/couchbase/core/cluster_label_listener.cxx +72 -0
  28. data/ext/couchbase/core/cluster_label_listener.hxx +46 -0
  29. data/ext/couchbase/core/cluster_options.hxx +4 -0
  30. data/ext/couchbase/core/deprecation_utils.hxx +26 -0
  31. data/ext/couchbase/core/error.hxx +27 -0
  32. data/ext/couchbase/core/free_form_http_request.hxx +0 -2
  33. data/ext/couchbase/core/http_component.cxx +12 -48
  34. data/ext/couchbase/core/impl/analytics.cxx +3 -2
  35. data/ext/couchbase/core/impl/analytics.hxx +2 -1
  36. data/ext/couchbase/core/impl/analytics_index_manager.cxx +249 -137
  37. data/ext/couchbase/core/impl/binary_collection.cxx +134 -58
  38. data/ext/couchbase/core/impl/bucket_manager.cxx +87 -35
  39. data/ext/couchbase/core/impl/collection.cxx +560 -245
  40. data/ext/couchbase/core/impl/collection_manager.cxx +89 -49
  41. data/ext/couchbase/core/impl/dns_srv_tracker.cxx +4 -4
  42. data/ext/couchbase/core/impl/error.cxx +20 -13
  43. data/ext/couchbase/core/impl/error.hxx +15 -10
  44. data/ext/couchbase/core/impl/get_all_replicas.hxx +1 -1
  45. data/ext/couchbase/core/impl/get_any_replica.hxx +2 -1
  46. data/ext/couchbase/core/impl/get_replica.hxx +2 -0
  47. data/ext/couchbase/core/impl/lookup_in_replica.hxx +1 -1
  48. data/ext/couchbase/core/impl/observability_recorder.cxx +161 -0
  49. data/ext/couchbase/core/impl/observability_recorder.hxx +77 -0
  50. data/ext/couchbase/core/impl/observe_seqno.hxx +2 -0
  51. data/ext/couchbase/core/impl/public_bucket.cxx +31 -7
  52. data/ext/couchbase/core/impl/public_cluster.cxx +107 -19
  53. data/ext/couchbase/core/impl/query.cxx +6 -3
  54. data/ext/couchbase/core/impl/query.hxx +3 -1
  55. data/ext/couchbase/core/impl/query_index_manager.cxx +267 -102
  56. data/ext/couchbase/core/impl/scope.cxx +53 -11
  57. data/ext/couchbase/core/impl/search.cxx +8 -4
  58. data/ext/couchbase/core/impl/search.hxx +6 -2
  59. data/ext/couchbase/core/impl/search_index_manager.cxx +131 -41
  60. data/ext/couchbase/core/impl/with_cancellation.hxx +75 -0
  61. data/ext/couchbase/core/io/config_tracker.cxx +9 -9
  62. data/ext/couchbase/core/io/config_tracker.hxx +2 -1
  63. data/ext/couchbase/core/io/http_command.hxx +98 -49
  64. data/ext/couchbase/core/io/http_context.hxx +2 -0
  65. data/ext/couchbase/core/io/http_session.cxx +23 -10
  66. data/ext/couchbase/core/io/http_session.hxx +17 -9
  67. data/ext/couchbase/core/io/http_session_manager.hxx +163 -228
  68. data/ext/couchbase/core/io/http_traits.hxx +0 -7
  69. data/ext/couchbase/core/io/mcbp_command.hxx +123 -44
  70. data/ext/couchbase/core/io/mcbp_session.cxx +251 -26
  71. data/ext/couchbase/core/io/mcbp_session.hxx +9 -1
  72. data/ext/couchbase/core/io/mcbp_traits.hxx +0 -8
  73. data/ext/couchbase/core/io/streams.cxx +3 -3
  74. data/ext/couchbase/core/io/streams.hxx +3 -2
  75. data/ext/couchbase/core/meta/features.hxx +15 -0
  76. data/ext/couchbase/core/meta/version.cxx +13 -0
  77. data/ext/couchbase/core/meta/version.hxx +3 -0
  78. data/ext/couchbase/core/metrics/constants.hxx +23 -0
  79. data/ext/couchbase/core/metrics/logging_meter.cxx +5 -5
  80. data/ext/couchbase/core/metrics/meter_wrapper.cxx +65 -63
  81. data/ext/couchbase/core/metrics/meter_wrapper.hxx +12 -10
  82. data/ext/couchbase/core/operations/document_analytics.hxx +0 -5
  83. data/ext/couchbase/core/operations/document_append.hxx +0 -4
  84. data/ext/couchbase/core/operations/document_decrement.hxx +0 -5
  85. data/ext/couchbase/core/operations/document_exists.hxx +0 -7
  86. data/ext/couchbase/core/operations/document_get.hxx +0 -7
  87. data/ext/couchbase/core/operations/document_get_all_replicas.hxx +77 -27
  88. data/ext/couchbase/core/operations/document_get_and_lock.hxx +0 -9
  89. data/ext/couchbase/core/operations/document_get_and_touch.hxx +0 -9
  90. data/ext/couchbase/core/operations/document_get_any_replica.hxx +83 -2
  91. data/ext/couchbase/core/operations/document_get_projected.hxx +0 -9
  92. data/ext/couchbase/core/operations/document_increment.hxx +0 -5
  93. data/ext/couchbase/core/operations/document_insert.hxx +0 -4
  94. data/ext/couchbase/core/operations/document_lookup_in.hxx +0 -9
  95. data/ext/couchbase/core/operations/document_lookup_in_all_replicas.hxx +46 -4
  96. data/ext/couchbase/core/operations/document_lookup_in_any_replica.hxx +121 -43
  97. data/ext/couchbase/core/operations/document_mutate_in.hxx +0 -5
  98. data/ext/couchbase/core/operations/document_prepend.hxx +0 -4
  99. data/ext/couchbase/core/operations/document_query.hxx +0 -4
  100. data/ext/couchbase/core/operations/document_remove.hxx +0 -4
  101. data/ext/couchbase/core/operations/document_replace.hxx +0 -4
  102. data/ext/couchbase/core/operations/document_search.hxx +0 -7
  103. data/ext/couchbase/core/operations/document_touch.hxx +0 -7
  104. data/ext/couchbase/core/operations/document_unlock.hxx +0 -6
  105. data/ext/couchbase/core/operations/document_upsert.hxx +0 -4
  106. data/ext/couchbase/core/operations/document_view.cxx +2 -0
  107. data/ext/couchbase/core/operations/document_view.hxx +10 -13
  108. data/ext/couchbase/core/operations/http_noop.hxx +2 -0
  109. data/ext/couchbase/core/operations/management/analytics_dataset_create.hxx +2 -0
  110. data/ext/couchbase/core/operations/management/analytics_dataset_drop.hxx +2 -0
  111. data/ext/couchbase/core/operations/management/analytics_dataset_get_all.hxx +2 -0
  112. data/ext/couchbase/core/operations/management/analytics_dataverse_create.hxx +2 -0
  113. data/ext/couchbase/core/operations/management/analytics_dataverse_drop.hxx +2 -0
  114. data/ext/couchbase/core/operations/management/analytics_get_pending_mutations.hxx +2 -0
  115. data/ext/couchbase/core/operations/management/analytics_index_create.hxx +2 -0
  116. data/ext/couchbase/core/operations/management/analytics_index_drop.hxx +2 -0
  117. data/ext/couchbase/core/operations/management/analytics_index_get_all.hxx +2 -0
  118. data/ext/couchbase/core/operations/management/analytics_link_connect.hxx +2 -0
  119. data/ext/couchbase/core/operations/management/analytics_link_create.hxx +2 -0
  120. data/ext/couchbase/core/operations/management/analytics_link_disconnect.hxx +2 -0
  121. data/ext/couchbase/core/operations/management/analytics_link_drop.hxx +2 -0
  122. data/ext/couchbase/core/operations/management/analytics_link_get_all.hxx +2 -0
  123. data/ext/couchbase/core/operations/management/analytics_link_replace.hxx +2 -0
  124. data/ext/couchbase/core/operations/management/bucket_create.hxx +2 -0
  125. data/ext/couchbase/core/operations/management/bucket_describe.hxx +2 -0
  126. data/ext/couchbase/core/operations/management/bucket_drop.hxx +2 -0
  127. data/ext/couchbase/core/operations/management/bucket_flush.hxx +2 -0
  128. data/ext/couchbase/core/operations/management/bucket_get.hxx +2 -0
  129. data/ext/couchbase/core/operations/management/bucket_get_all.hxx +2 -0
  130. data/ext/couchbase/core/operations/management/bucket_update.hxx +2 -0
  131. data/ext/couchbase/core/operations/management/change_password.hxx +2 -0
  132. data/ext/couchbase/core/operations/management/cluster_describe.hxx +2 -0
  133. data/ext/couchbase/core/operations/management/cluster_developer_preview_enable.hxx +2 -0
  134. data/ext/couchbase/core/operations/management/collection_create.hxx +2 -0
  135. data/ext/couchbase/core/operations/management/collection_drop.hxx +2 -0
  136. data/ext/couchbase/core/operations/management/collection_update.hxx +2 -0
  137. data/ext/couchbase/core/operations/management/collections_manifest_get.hxx +2 -0
  138. data/ext/couchbase/core/operations/management/error_utils.cxx +4 -1
  139. data/ext/couchbase/core/operations/management/eventing_deploy_function.hxx +2 -0
  140. data/ext/couchbase/core/operations/management/eventing_drop_function.hxx +2 -0
  141. data/ext/couchbase/core/operations/management/eventing_get_all_functions.hxx +2 -0
  142. data/ext/couchbase/core/operations/management/eventing_get_function.hxx +2 -0
  143. data/ext/couchbase/core/operations/management/eventing_get_status.hxx +2 -0
  144. data/ext/couchbase/core/operations/management/eventing_pause_function.hxx +2 -0
  145. data/ext/couchbase/core/operations/management/eventing_resume_function.hxx +2 -0
  146. data/ext/couchbase/core/operations/management/eventing_undeploy_function.hxx +2 -0
  147. data/ext/couchbase/core/operations/management/eventing_upsert_function.hxx +2 -0
  148. data/ext/couchbase/core/operations/management/freeform.hxx +2 -0
  149. data/ext/couchbase/core/operations/management/group_drop.hxx +2 -0
  150. data/ext/couchbase/core/operations/management/group_get.hxx +2 -0
  151. data/ext/couchbase/core/operations/management/group_get_all.hxx +2 -0
  152. data/ext/couchbase/core/operations/management/group_upsert.hxx +2 -0
  153. data/ext/couchbase/core/operations/management/query_index_build.hxx +2 -0
  154. data/ext/couchbase/core/operations/management/query_index_build_deferred.hxx +68 -30
  155. data/ext/couchbase/core/operations/management/query_index_create.hxx +2 -0
  156. data/ext/couchbase/core/operations/management/query_index_drop.hxx +2 -0
  157. data/ext/couchbase/core/operations/management/query_index_get_all.hxx +4 -3
  158. data/ext/couchbase/core/operations/management/query_index_get_all_deferred.hxx +2 -1
  159. data/ext/couchbase/core/operations/management/role_get_all.hxx +2 -0
  160. data/ext/couchbase/core/operations/management/scope_create.hxx +2 -0
  161. data/ext/couchbase/core/operations/management/scope_drop.hxx +2 -0
  162. data/ext/couchbase/core/operations/management/scope_get_all.hxx +2 -0
  163. data/ext/couchbase/core/operations/management/search_get_stats.hxx +2 -0
  164. data/ext/couchbase/core/operations/management/search_index_analyze_document.hxx +2 -0
  165. data/ext/couchbase/core/operations/management/search_index_control_ingest.hxx +2 -0
  166. data/ext/couchbase/core/operations/management/search_index_control_plan_freeze.hxx +2 -0
  167. data/ext/couchbase/core/operations/management/search_index_control_query.hxx +2 -0
  168. data/ext/couchbase/core/operations/management/search_index_drop.hxx +2 -0
  169. data/ext/couchbase/core/operations/management/search_index_get.hxx +2 -0
  170. data/ext/couchbase/core/operations/management/search_index_get_all.hxx +2 -0
  171. data/ext/couchbase/core/operations/management/search_index_get_documents_count.hxx +2 -0
  172. data/ext/couchbase/core/operations/management/search_index_get_stats.hxx +2 -0
  173. data/ext/couchbase/core/operations/management/search_index_upsert.hxx +2 -0
  174. data/ext/couchbase/core/operations/management/user_drop.hxx +2 -0
  175. data/ext/couchbase/core/operations/management/user_get.hxx +2 -0
  176. data/ext/couchbase/core/operations/management/user_get_all.hxx +2 -0
  177. data/ext/couchbase/core/operations/management/user_upsert.hxx +2 -0
  178. data/ext/couchbase/core/operations/management/view_index_drop.hxx +2 -0
  179. data/ext/couchbase/core/operations/management/view_index_get.hxx +2 -0
  180. data/ext/couchbase/core/operations/management/view_index_get_all.hxx +2 -0
  181. data/ext/couchbase/core/operations/management/view_index_upsert.hxx +2 -0
  182. data/ext/couchbase/core/operations/operation_traits.hxx +6 -0
  183. data/ext/couchbase/core/operations.hxx +0 -1
  184. data/ext/couchbase/core/operations_fwd.hxx +8 -0
  185. data/ext/couchbase/core/origin.cxx +67 -12
  186. data/ext/couchbase/core/origin.hxx +13 -8
  187. data/ext/couchbase/core/orphan_reporter.cxx +164 -0
  188. data/ext/couchbase/core/orphan_reporter.hxx +65 -0
  189. data/ext/couchbase/core/sasl/CMakeLists.txt +1 -0
  190. data/ext/couchbase/core/sasl/client.cc +6 -0
  191. data/ext/couchbase/core/sasl/mechanism.cc +2 -1
  192. data/ext/couchbase/core/sasl/mechanism.h +2 -1
  193. data/ext/couchbase/core/sasl/oauthbearer/oauthbearer.cc +41 -0
  194. data/ext/couchbase/core/sasl/oauthbearer/oauthbearer.h +47 -0
  195. data/ext/couchbase/core/tls_context_provider.cxx +44 -0
  196. data/ext/couchbase/core/tls_context_provider.hxx +44 -0
  197. data/ext/couchbase/core/tracing/attribute_helpers.hxx +45 -0
  198. data/ext/couchbase/core/tracing/constants.hxx +148 -68
  199. data/ext/couchbase/core/tracing/threshold_logging_options.hxx +0 -3
  200. data/ext/couchbase/core/tracing/threshold_logging_tracer.cxx +122 -170
  201. data/ext/couchbase/core/tracing/tracer_wrapper.cxx +17 -24
  202. data/ext/couchbase/core/tracing/tracer_wrapper.hxx +8 -10
  203. data/ext/couchbase/core/tracing/wrapper_sdk_tracer.cxx +114 -0
  204. data/ext/couchbase/core/tracing/wrapper_sdk_tracer.hxx +85 -0
  205. data/ext/couchbase/core/transactions/attempt_context_impl.cxx +16 -14
  206. data/ext/couchbase/core/transactions/attempt_context_impl.hxx +4 -4
  207. data/ext/couchbase/core/transactions/transactions.cxx +1 -1
  208. data/ext/couchbase/core/transactions/transactions_cleanup.cxx +1 -2
  209. data/ext/couchbase/core/utils/byteswap.hxx +12 -0
  210. data/ext/couchbase/core/utils/concurrent_fixed_priority_queue.hxx +102 -0
  211. data/ext/couchbase/core/utils/connection_string.cxx +2 -0
  212. data/ext/couchbase/couchbase/certificate_authenticator.hxx +1 -0
  213. data/ext/couchbase/couchbase/cluster.hxx +47 -0
  214. data/ext/couchbase/couchbase/cluster_options.hxx +16 -0
  215. data/ext/couchbase/couchbase/collection.hxx +60 -15
  216. data/ext/couchbase/couchbase/error_codes.hxx +48 -48
  217. data/ext/couchbase/couchbase/jwt_authenticator.hxx +52 -0
  218. data/ext/couchbase/couchbase/metrics/meter.hxx +2 -1
  219. data/ext/couchbase/couchbase/metrics/otel_meter.hxx +75 -80
  220. data/ext/couchbase/couchbase/network_options.hxx +19 -0
  221. data/ext/couchbase/couchbase/password_authenticator.hxx +1 -0
  222. data/ext/couchbase/couchbase/tracing/otel_tracer.hxx +15 -17
  223. data/ext/couchbase/couchbase/tracing/request_span.hxx +2 -2
  224. data/ext/couchbase.cxx +4 -0
  225. data/ext/extconf.rb +1 -0
  226. data/ext/rcb_analytics.cxx +157 -47
  227. data/ext/rcb_backend.cxx +118 -71
  228. data/ext/rcb_buckets.cxx +39 -16
  229. data/ext/rcb_collections.cxx +36 -12
  230. data/ext/rcb_crud.cxx +587 -294
  231. data/ext/rcb_hdr_histogram.cxx +219 -0
  232. data/ext/rcb_hdr_histogram.hxx +28 -0
  233. data/ext/rcb_multi.cxx +142 -59
  234. data/ext/rcb_observability.cxx +132 -0
  235. data/ext/rcb_observability.hxx +49 -0
  236. data/ext/rcb_query.cxx +77 -27
  237. data/ext/rcb_search.cxx +92 -31
  238. data/ext/rcb_users.cxx +69 -26
  239. data/ext/rcb_utils.cxx +91 -0
  240. data/ext/rcb_utils.hxx +141 -168
  241. data/ext/rcb_views.cxx +36 -12
  242. data/lib/active_support/cache/couchbase_store.rb +6 -6
  243. data/lib/couchbase/authenticator.rb +14 -0
  244. data/lib/couchbase/binary_collection.rb +37 -22
  245. data/lib/couchbase/bucket.rb +46 -31
  246. data/lib/couchbase/cluster.rb +146 -61
  247. data/lib/couchbase/collection.rb +257 -186
  248. data/lib/couchbase/datastructures/couchbase_list.rb +81 -50
  249. data/lib/couchbase/datastructures/couchbase_map.rb +86 -50
  250. data/lib/couchbase/datastructures/couchbase_queue.rb +64 -38
  251. data/lib/couchbase/datastructures/couchbase_set.rb +57 -41
  252. data/lib/couchbase/deprecations.rb +1 -1
  253. data/lib/couchbase/diagnostics.rb +8 -8
  254. data/lib/couchbase/errors.rb +6 -0
  255. data/lib/couchbase/management/analytics_index_manager.rb +90 -59
  256. data/lib/couchbase/management/bucket_manager.rb +73 -45
  257. data/lib/couchbase/management/collection_manager.rb +86 -43
  258. data/lib/couchbase/management/collection_query_index_manager.rb +56 -33
  259. data/lib/couchbase/management/query_index_manager.rb +88 -36
  260. data/lib/couchbase/management/scope_search_index_manager.rb +119 -52
  261. data/lib/couchbase/management/search_index_manager.rb +401 -178
  262. data/lib/couchbase/management/user_manager.rb +343 -174
  263. data/lib/couchbase/management/view_index_manager.rb +166 -73
  264. data/lib/couchbase/metrics/logging_meter.rb +108 -0
  265. data/lib/couchbase/metrics/logging_value_recorder.rb +50 -0
  266. data/lib/couchbase/metrics/meter.rb +27 -0
  267. data/lib/couchbase/metrics/noop_meter.rb +30 -0
  268. data/lib/couchbase/metrics/noop_value_recorder.rb +27 -0
  269. data/lib/couchbase/metrics/value_recorder.rb +25 -0
  270. data/lib/couchbase/options.rb +69 -3
  271. data/lib/couchbase/protostellar/cluster.rb +3 -0
  272. data/lib/couchbase/scope.rb +62 -48
  273. data/lib/couchbase/search_options.rb +18 -18
  274. data/lib/couchbase/tracing/noop_span.rb +29 -0
  275. data/lib/couchbase/tracing/noop_tracer.rb +29 -0
  276. data/lib/couchbase/tracing/request_span.rb +34 -0
  277. data/lib/couchbase/tracing/request_tracer.rb +28 -0
  278. data/lib/couchbase/tracing/threshold_logging_span.rb +112 -0
  279. data/lib/couchbase/tracing/threshold_logging_tracer.rb +231 -0
  280. data/lib/couchbase/utils/hdr_histogram.rb +55 -0
  281. data/lib/couchbase/utils/observability.rb +257 -0
  282. data/lib/couchbase/utils/observability_constants.rb +200 -0
  283. data/lib/couchbase/utils/stdlib_logger_adapter.rb +1 -3
  284. data/lib/couchbase/version.rb +1 -1
  285. data/lib/couchbase.rb +2 -2
  286. metadata +58 -6
@@ -0,0 +1,85 @@
1
+ /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2025. Couchbase, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ #pragma once
19
+
20
+ #include <couchbase/tracing/request_tracer.hxx>
21
+
22
+ #include "core/tracing/noop_tracer.hxx"
23
+
24
+ #include <chrono>
25
+ #include <map>
26
+ #include <memory>
27
+ #include <mutex>
28
+ #include <string>
29
+ #include <vector>
30
+
31
+ namespace couchbase::core::tracing
32
+ {
33
+ /**
34
+ * Tracer for use by C++ SDK wrappers. It is intended for storing spans & tags in memory, so that
35
+ * wrappers can then use their own tracing infrastructure to create them.
36
+ */
37
+ class wrapper_sdk_tracer : public couchbase::tracing::request_tracer
38
+ {
39
+ public:
40
+ auto start_span(std::string name, std::shared_ptr<couchbase::tracing::request_span> parent)
41
+ -> std::shared_ptr<couchbase::tracing::request_span> override;
42
+
43
+ private:
44
+ std::shared_ptr<noop_span> noop_instance_{ std::make_shared<noop_span>() };
45
+ };
46
+
47
+ class wrapper_sdk_span : public couchbase::tracing::request_span
48
+ {
49
+ public:
50
+ wrapper_sdk_span() = default;
51
+ explicit wrapper_sdk_span(std::string name);
52
+ wrapper_sdk_span(std::string name,
53
+ const std::shared_ptr<couchbase::tracing::request_span>& parent);
54
+
55
+ void add_child(const std::shared_ptr<wrapper_sdk_span>& child);
56
+
57
+ void add_tag(const std::string& name, std::uint64_t value) override;
58
+ void add_tag(const std::string& name, const std::string& value) override;
59
+
60
+ void end() override;
61
+
62
+ [[nodiscard]] auto uint_tags() const -> const std::map<std::string, std::uint64_t>&;
63
+ [[nodiscard]] auto string_tags() const -> const std::map<std::string, std::string>&;
64
+ [[nodiscard]] auto children() -> std::vector<std::shared_ptr<wrapper_sdk_span>>;
65
+ [[nodiscard]] auto start_time() const -> const std::chrono::system_clock::time_point&;
66
+ [[nodiscard]] auto end_time() const -> const std::chrono::system_clock::time_point&;
67
+
68
+ [[nodiscard]] auto parent() const -> std::shared_ptr<couchbase::tracing::request_span> override;
69
+
70
+ private:
71
+ std::map<std::string, std::uint64_t> uint_tags_{};
72
+ std::map<std::string, std::string> string_tags_{};
73
+ std::chrono::system_clock::time_point start_time_{ std::chrono::system_clock::now() };
74
+ std::chrono::system_clock::time_point end_time_{};
75
+
76
+ // The only way to access spans is through their parents, so parents must hold owning references
77
+ // to their children.
78
+ std::vector<std::shared_ptr<wrapper_sdk_span>> children_{};
79
+ std::mutex children_mutex_;
80
+
81
+ // A weak pointer is used instead of the shared pointer in the parent class, to avoid circular
82
+ // references.
83
+ std::weak_ptr<couchbase::tracing::request_span> parent_{};
84
+ };
85
+ } // namespace couchbase::core::tracing
@@ -634,8 +634,8 @@ void
634
634
  attempt_context_impl::get_multi(
635
635
  const std::vector<couchbase::transactions::transaction_get_multi_spec>& specs,
636
636
  const couchbase::transactions::transaction_get_multi_options& options,
637
- std::function<void(error, std::optional<couchbase::transactions::transaction_get_multi_result>)>&&
638
- cb)
637
+ std::function<void(couchbase::error,
638
+ std::optional<couchbase::transactions::transaction_get_multi_result>)>&& cb)
639
639
  {
640
640
  std::vector<core::document_id> ids;
641
641
  ids.reserve(specs.size());
@@ -666,17 +666,19 @@ auto
666
666
  attempt_context_impl::get_multi(
667
667
  const std::vector<couchbase::transactions::transaction_get_multi_spec>& specs,
668
668
  const couchbase::transactions::transaction_get_multi_options& options)
669
- -> std::pair<error, std::optional<couchbase::transactions::transaction_get_multi_result>>
669
+ -> std::pair<couchbase::error,
670
+ std::optional<couchbase::transactions::transaction_get_multi_result>>
670
671
  {
671
672
  auto barrier = std::make_shared<std::promise<
672
- std::pair<error, std::optional<couchbase::transactions::transaction_get_multi_result>>>>();
673
+ std::pair<couchbase::error,
674
+ std::optional<couchbase::transactions::transaction_get_multi_result>>>>();
673
675
  auto f = barrier->get_future();
674
- get_multi(
675
- specs,
676
- options,
677
- [barrier](error err, std::optional<couchbase::transactions::transaction_get_multi_result> res) {
678
- return barrier->set_value(std::make_pair(std::move(err), std::move(res)));
679
- });
676
+ get_multi(specs,
677
+ options,
678
+ [barrier](couchbase::error err,
679
+ std::optional<couchbase::transactions::transaction_get_multi_result> res) {
680
+ return barrier->set_value(std::make_pair(std::move(err), std::move(res)));
681
+ });
680
682
  return f.get();
681
683
  }
682
684
 
@@ -749,7 +751,7 @@ attempt_context_impl::get_multi_replicas_from_preferred_server_group(
749
751
  const couchbase::transactions::transaction_get_multi_replicas_from_preferred_server_group_options&
750
752
  options,
751
753
  std::function<
752
- void(error,
754
+ void(couchbase::error,
753
755
  std::optional<couchbase::transactions::
754
756
  transaction_get_multi_replicas_from_preferred_server_group_result>)>&& cb)
755
757
  {
@@ -790,12 +792,12 @@ attempt_context_impl::get_multi_replicas_from_preferred_server_group(
790
792
  const couchbase::transactions::transaction_get_multi_replicas_from_preferred_server_group_options&
791
793
  options)
792
794
  -> std::pair<
793
- error,
795
+ couchbase::error,
794
796
  std::optional<
795
797
  couchbase::transactions::transaction_get_multi_replicas_from_preferred_server_group_result>>
796
798
  {
797
799
  auto barrier = std::make_shared<std::promise<std::pair<
798
- error,
800
+ couchbase::error,
799
801
  std::optional<couchbase::transactions::
800
802
  transaction_get_multi_replicas_from_preferred_server_group_result>>>>();
801
803
  auto f = barrier->get_future();
@@ -803,7 +805,7 @@ attempt_context_impl::get_multi_replicas_from_preferred_server_group(
803
805
  specs,
804
806
  options,
805
807
  [barrier](
806
- error err,
808
+ couchbase::error err,
807
809
  std::optional<
808
810
  couchbase::transactions::transaction_get_multi_replicas_from_preferred_server_group_result>
809
811
  res) {
@@ -357,12 +357,12 @@ public:
357
357
  std::optional<transaction_get_multi_result>)>&& cb) override;
358
358
  auto get_multi(const std::vector<couchbase::transactions::transaction_get_multi_spec>& specs,
359
359
  const couchbase::transactions::transaction_get_multi_options& options)
360
- -> std::pair<error,
360
+ -> std::pair<couchbase::error,
361
361
  std::optional<couchbase::transactions::transaction_get_multi_result>> override;
362
362
  void get_multi(
363
363
  const std::vector<couchbase::transactions::transaction_get_multi_spec>& specs,
364
364
  const couchbase::transactions::transaction_get_multi_options& options,
365
- std::function<void(error,
365
+ std::function<void(couchbase::error,
366
366
  std::optional<couchbase::transactions::transaction_get_multi_result>)>&& cb)
367
367
  override;
368
368
 
@@ -384,7 +384,7 @@ public:
384
384
  const couchbase::transactions::
385
385
  transaction_get_multi_replicas_from_preferred_server_group_options& options)
386
386
  -> std::pair<
387
- error,
387
+ couchbase::error,
388
388
  std::optional<couchbase::transactions::
389
389
  transaction_get_multi_replicas_from_preferred_server_group_result>> override;
390
390
  void get_multi_replicas_from_preferred_server_group(
@@ -394,7 +394,7 @@ public:
394
394
  const couchbase::transactions::
395
395
  transaction_get_multi_replicas_from_preferred_server_group_options& options,
396
396
  std::function<void(
397
- error,
397
+ couchbase::error,
398
398
  std::optional<couchbase::transactions::
399
399
  transaction_get_multi_replicas_from_preferred_server_group_result>)>&& cb)
400
400
  override;
@@ -204,7 +204,7 @@ transactions::run(const couchbase::transactions::transaction_options& config, lo
204
204
  auto
205
205
  transactions::run(couchbase::transactions::txn_logic&& code,
206
206
  const couchbase::transactions::transaction_options& config)
207
- -> std::pair<error, couchbase::transactions::transaction_result>
207
+ -> std::pair<couchbase::error, couchbase::transactions::transaction_result>
208
208
  {
209
209
  try {
210
210
  return { {}, wrap_public_api_run(*this, config, max_attempts_, std::move(code)) };
@@ -77,8 +77,7 @@ parse_mutation_cas(const std::string& cas) -> std::uint64_t
77
77
  if (cas.empty()) {
78
78
  return 0;
79
79
  }
80
- return core::utils::byte_swap(static_cast<std::uint64_t>(std::stoull(cas, nullptr, 16))) /
81
- 1000000;
80
+ return core::utils::byte_swap(std::stoull(cas, nullptr, 16)) / 1000000;
82
81
  }
83
82
 
84
83
  // TODO(CXXCBC-549)
@@ -18,6 +18,7 @@
18
18
  #pragma once
19
19
 
20
20
  #include <cstdint>
21
+ #include <type_traits>
21
22
 
22
23
  namespace couchbase::core::utils
23
24
  {
@@ -46,4 +47,15 @@ byte_swap(std::uint64_t value) -> std::uint64_t
46
47
  std::uint32_t lo = byte_swap(static_cast<std::uint32_t>(value >> 32));
47
48
  return (hi << 32) | lo;
48
49
  }
50
+
51
+ // when 'unsigned long long' is not the same as 'std::uint64_t'
52
+ template<typename Dummy = void>
53
+ static constexpr auto
54
+ byte_swap(unsigned long long value,
55
+ std::enable_if_t<!std::is_same_v<unsigned long long, std::uint64_t>, Dummy>* /* dummy */ =
56
+ nullptr) -> std::uint64_t
57
+ {
58
+ return byte_swap(static_cast<std::uint64_t>(value));
59
+ }
60
+
49
61
  } // namespace couchbase::core::utils
@@ -0,0 +1,102 @@
1
+ /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2025 Couchbase, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ #pragma once
19
+
20
+ #include <mutex>
21
+ #include <queue>
22
+
23
+ namespace couchbase::core::utils
24
+ {
25
+ template<typename T>
26
+ class concurrent_fixed_priority_queue
27
+ {
28
+ private:
29
+ std::mutex mutex_;
30
+ std::priority_queue<T, std::vector<T>, std::greater<T>> data_;
31
+ std::size_t dropped_count_{ 0 };
32
+ std::size_t capacity_{};
33
+
34
+ public:
35
+ using size_type = typename std::priority_queue<T, std::vector<T>, std::greater<T>>::size_type;
36
+
37
+ explicit concurrent_fixed_priority_queue(std::size_t capacity)
38
+ : capacity_(capacity)
39
+ {
40
+ }
41
+
42
+ concurrent_fixed_priority_queue(const concurrent_fixed_priority_queue&) = delete;
43
+ concurrent_fixed_priority_queue(concurrent_fixed_priority_queue&&) = delete;
44
+ auto operator=(const concurrent_fixed_priority_queue&)
45
+ -> concurrent_fixed_priority_queue& = delete;
46
+ auto operator=(concurrent_fixed_priority_queue&&) -> concurrent_fixed_priority_queue& = delete;
47
+ ~concurrent_fixed_priority_queue() = default;
48
+
49
+ auto size() -> size_type
50
+ {
51
+ std::unique_lock<std::mutex> lock(mutex_);
52
+ return data_.size();
53
+ }
54
+
55
+ auto empty() -> bool
56
+ {
57
+ const std::unique_lock<std::mutex> lock(mutex_);
58
+ return data_.empty();
59
+ }
60
+
61
+ void emplace(const T&& item)
62
+ {
63
+ const std::unique_lock<std::mutex> lock(mutex_);
64
+
65
+ if (data_.size() < capacity_) {
66
+ data_.emplace(std::forward<const T>(item));
67
+ } else {
68
+ // We need to either drop the new item, or an existing item
69
+ ++dropped_count_;
70
+ if (item > data_.top()) {
71
+ // The new item is greater than the smallest item, so we will replace the smallest with the
72
+ // new item
73
+ data_.pop();
74
+ data_.emplace(std::forward<const T>(item));
75
+ }
76
+ }
77
+ }
78
+
79
+ /**
80
+ * Clears the internal queue, and returns the data along with the number of items that have been
81
+ * dropped.
82
+ */
83
+ auto steal_data() -> std::pair<std::priority_queue<T>, std::size_t>
84
+ {
85
+ std::priority_queue<T, std::vector<T>, std::greater<T>> reversed_data;
86
+ std::size_t dropped_count{};
87
+ {
88
+ const std::unique_lock<std::mutex> lock(mutex_);
89
+ std::swap(reversed_data, data_);
90
+ std::swap(dropped_count, dropped_count_);
91
+ }
92
+
93
+ std::priority_queue<T> data{};
94
+ while (!reversed_data.empty()) {
95
+ data.emplace(std::move(reversed_data.top()));
96
+ reversed_data.pop();
97
+ }
98
+
99
+ return std::make_pair(std::move(data), dropped_count);
100
+ }
101
+ };
102
+ } // namespace couchbase::core::utils
@@ -590,6 +590,8 @@ extract_options(connection_string& connstr)
590
590
  parse_option(connstr.options.preserve_bootstrap_nodes_order, name, value, connstr.warnings);
591
591
  } else if (name == "allow_enterprise_analytics") {
592
592
  parse_option(connstr.options.allow_enterprise_analytics, name, value, connstr.warnings);
593
+ } else if (name == "enable_lazy_connections") {
594
+ parse_option(connstr.options.enable_lazy_connections, name, value, connstr.warnings);
593
595
  } else {
594
596
  connstr.warnings.push_back(
595
597
  fmt::format(R"(unknown parameter "{}" in connection string (value "{}"))", name, value));
@@ -35,5 +35,6 @@ private:
35
35
  std::string key_path_;
36
36
 
37
37
  friend class cluster_options;
38
+ friend class cluster;
38
39
  };
39
40
  } // namespace couchbase
@@ -102,6 +102,53 @@ public:
102
102
  void close(std::function<void()>&& handler);
103
103
  [[nodiscard]] auto close() -> std::future<void>;
104
104
 
105
+ /**
106
+ * Replaces the current authenticator used by this cluster.
107
+ *
108
+ * NOTE: Setting a new authenticator does not change the authentication status of existing
109
+ * connections.
110
+ *
111
+ * @param authenticator the authenticator to replace
112
+ *
113
+ * @return error
114
+ *
115
+ * @since 1.3.0
116
+ * @committed
117
+ */
118
+ auto set_authenticator(const password_authenticator& authenticator) -> error;
119
+
120
+ /**
121
+ * Replaces the current authenticator used by this cluster.
122
+ *
123
+ * NOTE: Setting a new authenticator does not change the authentication status of existing
124
+ connections.
125
+ *
126
+ * @param authenticator the authenticator to replace
127
+
128
+ * @exception errc::common::invalid_argument if TLS is not enabled.
129
+ *
130
+ * @return error
131
+ *
132
+ * @since 1.3.0
133
+ * @committed
134
+ */
135
+ auto set_authenticator(const certificate_authenticator& authenticator) -> error;
136
+
137
+ /**
138
+ * Replaces the current authenticator used by this cluster.
139
+ *
140
+ * NOTE: Setting a new authenticator does not change the authentication status of existing
141
+ connections.
142
+ *
143
+ * @param authenticator the authenticator to replace
144
+ *
145
+ * @return error
146
+ *
147
+ * @since 1.3.0
148
+ * @uncommitted
149
+ */
150
+ auto set_authenticator(const jwt_authenticator& authenticator) -> error;
151
+
105
152
  /**
106
153
  * Opens a {@link bucket} with the given name.
107
154
  *
@@ -24,6 +24,7 @@
24
24
  #include <couchbase/configuration_profiles_registry.hxx>
25
25
  #include <couchbase/dns_options.hxx>
26
26
  #include <couchbase/error.hxx>
27
+ #include <couchbase/jwt_authenticator.hxx>
27
28
  #include <couchbase/metrics_options.hxx>
28
29
  #include <couchbase/network_options.hxx>
29
30
  #include <couchbase/password_authenticator.hxx>
@@ -93,6 +94,18 @@ public:
93
94
  {
94
95
  }
95
96
 
97
+ /**
98
+ *
99
+ * @param authenticator
100
+ *
101
+ * @since 1.3.0
102
+ * @uncommitted
103
+ */
104
+ explicit cluster_options(jwt_authenticator authenticator)
105
+ : jwt_token_{ std::move(authenticator.token_) }
106
+ {
107
+ }
108
+
96
109
  /**
97
110
  * Apply settings profile by name.
98
111
  *
@@ -272,6 +285,7 @@ public:
272
285
  std::string password;
273
286
  std::string certificate_path;
274
287
  std::string key_path;
288
+ std::string jwt_token;
275
289
  std::optional<std::vector<std::string>> allowed_sasl_mechanisms;
276
290
  compression_options::built compression;
277
291
  timeout_options::built timeouts;
@@ -294,6 +308,7 @@ public:
294
308
  password_,
295
309
  certificate_path_,
296
310
  key_path_,
311
+ jwt_token_,
297
312
  sasl_mechanisms_,
298
313
  compression_.build(),
299
314
  timeouts_.build(),
@@ -315,6 +330,7 @@ private:
315
330
  std::string password_{};
316
331
  std::string certificate_path_{};
317
332
  std::string key_path_{};
333
+ std::string jwt_token_{};
318
334
  std::optional<std::vector<std::string>> sasl_mechanisms_{};
319
335
 
320
336
  compression_options compression_{};
@@ -463,8 +463,10 @@ public:
463
463
  const upsert_options& options,
464
464
  upsert_handler&& handler) const
465
465
  {
466
- return upsert(
467
- std::move(document_id), encode_document<Transcoder>(document), options, std::move(handler));
466
+ return upsert(std::move(document_id),
467
+ create_encode_fn<Transcoder, Document>(std::move(document)),
468
+ options,
469
+ std::move(handler));
468
470
  }
469
471
 
470
472
  /**
@@ -506,11 +508,12 @@ public:
506
508
  */
507
509
  template<typename Transcoder = codec::default_json_transcoder, typename Document>
508
510
  [[nodiscard]] auto upsert(std::string document_id,
509
- const Document& document,
511
+ Document document,
510
512
  const upsert_options& options = {}) const
511
513
  -> std::future<std::pair<error, mutation_result>>
512
514
  {
513
- return upsert(std::move(document_id), encode_document<Transcoder>(document), options);
515
+ return upsert(
516
+ std::move(document_id), create_encode_fn<Transcoder, Document>(std::move(document)), options);
514
517
  }
515
518
 
516
519
  /**
@@ -559,8 +562,10 @@ public:
559
562
  const insert_options& options,
560
563
  insert_handler&& handler) const
561
564
  {
562
- return insert(
563
- std::move(document_id), encode_document<Transcoder>(document), options, std::move(handler));
565
+ return insert(std::move(document_id),
566
+ create_encode_fn<Transcoder, Document>(std::move(document)),
567
+ options,
568
+ std::move(handler));
564
569
  }
565
570
 
566
571
  /**
@@ -605,11 +610,12 @@ public:
605
610
  typename Document,
606
611
  std::enable_if_t<!std::is_same_v<codec::encoded_value, Document>, bool> = true>
607
612
  [[nodiscard]] auto insert(std::string document_id,
608
- const Document& document,
613
+ Document document,
609
614
  const insert_options& options = {}) const
610
615
  -> std::future<std::pair<error, mutation_result>>
611
616
  {
612
- return insert(std::move(document_id), encode_document<Transcoder>(document), options);
617
+ return insert(
618
+ std::move(document_id), create_encode_fn<Transcoder, Document>(std::move(document)), options);
613
619
  }
614
620
 
615
621
  /**
@@ -660,8 +666,10 @@ public:
660
666
  const replace_options& options,
661
667
  replace_handler&& handler) const
662
668
  {
663
- return replace(
664
- std::move(document_id), encode_document<Transcoder>(document), options, std::move(handler));
669
+ return replace(std::move(document_id),
670
+ create_encode_fn<Transcoder, Document>(std::move(document)),
671
+ options,
672
+ std::move(handler));
665
673
  }
666
674
 
667
675
  /**
@@ -708,11 +716,12 @@ public:
708
716
  typename Document,
709
717
  std::enable_if_t<!std::is_same_v<codec::encoded_value, Document>, bool> = true>
710
718
  [[nodiscard]] auto replace(std::string document_id,
711
- const Document& document,
719
+ Document document,
712
720
  const replace_options& options = {}) const
713
721
  -> std::future<std::pair<error, mutation_result>>
714
722
  {
715
- return replace(std::move(document_id), encode_document<Transcoder>(document), options);
723
+ return replace(
724
+ std::move(document_id), create_encode_fn<Transcoder, Document>(std::move(document)), options);
716
725
  }
717
726
 
718
727
  /**
@@ -1090,15 +1099,51 @@ private:
1090
1099
  [[nodiscard]] auto crypto_manager() const -> const std::shared_ptr<crypto::manager>&;
1091
1100
 
1092
1101
  template<typename Transcoder, typename Document>
1093
- [[nodiscard]] auto encode_document(const Document& document) const -> codec::encoded_value
1102
+ [[nodiscard]] auto create_encode_fn(Document document) const
1103
+ -> std::function<codec::encoded_value()>
1094
1104
  {
1095
1105
  if constexpr (codec::is_crypto_transcoder_v<Transcoder>) {
1096
- return Transcoder::encode(document, crypto_manager());
1106
+ return [crypto_manager = crypto_manager(),
1107
+ document = std::move(document)]() -> codec::encoded_value {
1108
+ return Transcoder::encode(document, crypto_manager);
1109
+ };
1097
1110
  } else {
1098
- return Transcoder::encode(document);
1111
+ return [document = std::move(document)]() -> codec::encoded_value {
1112
+ return Transcoder::encode(document);
1113
+ };
1099
1114
  }
1100
1115
  }
1101
1116
 
1117
+ void replace(std::string document_id,
1118
+ std::function<codec::encoded_value()> document_fn,
1119
+ const replace_options& options,
1120
+ replace_handler&& handler) const;
1121
+
1122
+ auto replace(std::string document_id,
1123
+ std::function<codec::encoded_value()> document_fn,
1124
+ const replace_options& options) const
1125
+ -> std::future<std::pair<error, mutation_result>>;
1126
+
1127
+ void upsert(std::string document_id,
1128
+ std::function<codec::encoded_value()> document_fn,
1129
+ const upsert_options& options,
1130
+ upsert_handler&& handler) const;
1131
+
1132
+ auto upsert(std::string document_id,
1133
+ std::function<codec::encoded_value()> document_fn,
1134
+ const upsert_options& options) const
1135
+ -> std::future<std::pair<error, mutation_result>>;
1136
+
1137
+ void insert(std::string document_id,
1138
+ std::function<codec::encoded_value()> document_fn,
1139
+ const insert_options& options,
1140
+ insert_handler&& handler) const;
1141
+
1142
+ auto insert(std::string document_id,
1143
+ std::function<codec::encoded_value()> document_fn,
1144
+ const insert_options& options) const
1145
+ -> std::future<std::pair<error, mutation_result>>;
1146
+
1102
1147
  collection(core::cluster core,
1103
1148
  std::string_view bucket_name,
1104
1149
  std::string_view scope_name,