couchbase 3.8.2 → 3.9.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 (473) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/ext/CMakeLists.txt +16 -1
  4. data/ext/cache/cpm/{CPM_0.42.0.cmake → CPM_0.43.1.cmake} +18 -2
  5. data/ext/cache/extconf_include.rb +6 -6
  6. data/ext/cache/mozilla-ca-bundle.crt +121 -55
  7. data/ext/cache/mozilla-ca-bundle.sha256 +1 -1
  8. data/ext/couchbase/CMakeLists.txt +130 -21
  9. data/ext/couchbase/cmake/APKBUILD.in +25 -4
  10. data/ext/couchbase/cmake/Bundler.cmake +143 -34
  11. data/ext/couchbase/cmake/CPM.cmake +126 -12
  12. data/ext/couchbase/cmake/Cache.cmake +7 -1
  13. data/ext/couchbase/cmake/CompilerOptions.cmake +1 -1
  14. data/ext/couchbase/cmake/CompilerWarnings.cmake +17 -6
  15. data/ext/couchbase/cmake/GrpcProtobuf.cmake +481 -0
  16. data/ext/couchbase/cmake/OpenSSL.cmake +10 -3
  17. data/ext/couchbase/cmake/Packaging.cmake +519 -65
  18. data/ext/couchbase/cmake/Protostellar.cmake +250 -0
  19. data/ext/couchbase/cmake/Sanitizers.cmake +61 -50
  20. data/ext/couchbase/cmake/StaticAnalyzers.cmake +16 -5
  21. data/ext/couchbase/cmake/TestFramework.cmake +283 -0
  22. data/ext/couchbase/cmake/TestFrameworkAddTests.cmake +51 -0
  23. data/ext/couchbase/cmake/Testing.cmake +27 -9
  24. data/ext/couchbase/cmake/ThirdPartyDependencies.cmake +141 -8
  25. data/ext/couchbase/cmake/VersionInfo.cmake +50 -0
  26. data/ext/couchbase/cmake/build_config.hxx.in +2 -1
  27. data/ext/couchbase/cmake/couchbase-cxx-client.spec.in +101 -23
  28. data/ext/couchbase/cmake/couchbase_cxx_client_static-config.cmake.in +7 -0
  29. data/ext/couchbase/cmake/couchbase_cxx_client_static.pc.in +2 -0
  30. data/ext/couchbase/cmake/gRPC_Generate.cmake +58 -0
  31. data/ext/couchbase/cmake/protobuf_Generate.cmake +69 -0
  32. data/ext/couchbase/cmake/require-git-checkout.cmake +25 -0
  33. data/ext/couchbase/cmake/tarball_glob.txt +49 -0
  34. data/ext/couchbase/core/agent_group.cxx +0 -8
  35. data/ext/couchbase/core/agent_group.hxx +0 -4
  36. data/ext/couchbase/core/analytics_stream.cxx +314 -0
  37. data/ext/couchbase/core/analytics_stream.hxx +129 -0
  38. data/ext/couchbase/core/analytics_stream_component.cxx +245 -0
  39. data/ext/couchbase/core/analytics_stream_component.hxx +67 -0
  40. data/ext/couchbase/core/app_telemetry_meter.cxx +25 -3
  41. data/ext/couchbase/core/app_telemetry_meter.hxx +77 -0
  42. data/ext/couchbase/core/app_telemetry_reporter.cxx +7 -6
  43. data/ext/couchbase/core/bucket.cxx +381 -87
  44. data/ext/couchbase/core/bucket.hxx +105 -25
  45. data/ext/couchbase/core/bucket_unit_test_api.hxx +57 -0
  46. data/ext/couchbase/core/capella.hxx +91 -0
  47. data/ext/couchbase/core/cluster.cxx +1554 -398
  48. data/ext/couchbase/core/cluster.hxx +39 -8
  49. data/ext/couchbase/core/cluster_agent.cxx +0 -8
  50. data/ext/couchbase/core/cluster_agent.hxx +0 -4
  51. data/ext/couchbase/core/cluster_options.hxx +26 -3
  52. data/ext/couchbase/core/collections_component.cxx +39 -15
  53. data/ext/couchbase/core/config_profiles.cxx +1 -1
  54. data/ext/couchbase/core/crud_component.cxx +2 -2
  55. data/ext/couchbase/core/crud_options.hxx +34 -0
  56. data/ext/couchbase/core/crypto/cbcrypto.cc +18 -13
  57. data/ext/couchbase/core/document_id_redaction.hxx +81 -0
  58. data/ext/couchbase/core/error_context/base_error_context.hxx +7 -6
  59. data/ext/couchbase/core/error_context/key_value.cxx +25 -2
  60. data/ext/couchbase/core/error_context/key_value.hxx +60 -33
  61. data/ext/couchbase/core/error_context/key_value_error_context.hxx +16 -15
  62. data/ext/couchbase/core/error_context/search.hxx +5 -0
  63. data/ext/couchbase/core/error_context/search_json.hxx +3 -0
  64. data/ext/couchbase/core/error_context/subdocument_error_context.hxx +19 -18
  65. data/ext/couchbase/core/error_context/view.hxx +5 -0
  66. data/ext/couchbase/core/free_form_http_request.cxx +237 -4
  67. data/ext/couchbase/core/free_form_http_request.hxx +41 -8
  68. data/ext/couchbase/core/http_component.cxx +300 -284
  69. data/ext/couchbase/core/http_component.hxx +0 -4
  70. data/ext/couchbase/core/impl/analytics.cxx +38 -5
  71. data/ext/couchbase/core/impl/analytics.hxx +34 -0
  72. data/ext/couchbase/core/impl/bootstrap_error.hxx +0 -3
  73. data/ext/couchbase/core/impl/collection.cxx +215 -202
  74. data/ext/couchbase/core/impl/collection_manager.cxx +1 -1
  75. data/ext/couchbase/core/impl/dns_srv_tracker.cxx +45 -18
  76. data/ext/couchbase/core/impl/error.cxx +22 -2
  77. data/ext/couchbase/core/impl/internal_analytics_stream_result.hxx +111 -0
  78. data/ext/couchbase/core/impl/internal_query_stream_result.hxx +110 -0
  79. data/ext/couchbase/core/impl/invoke_with_node_id.hxx +15 -7
  80. data/ext/couchbase/core/impl/key_value_error_category.cxx +6 -0
  81. data/ext/couchbase/core/impl/lookup_in_replica.cxx +10 -10
  82. data/ext/couchbase/core/impl/lookup_in_replica.hxx +4 -4
  83. data/ext/couchbase/core/impl/node_id.cxx +49 -13
  84. data/ext/couchbase/core/impl/observability_recorder.cxx +12 -2
  85. data/ext/couchbase/core/impl/observe_poll.cxx +63 -23
  86. data/ext/couchbase/core/impl/public_analytics_stream_result.cxx +372 -0
  87. data/ext/couchbase/core/impl/public_bucket.cxx +48 -2
  88. data/ext/couchbase/core/impl/public_cluster.cxx +229 -42
  89. data/ext/couchbase/core/impl/public_query_stream_result.cxx +380 -0
  90. data/ext/couchbase/core/impl/public_transaction_get_multi_replicas_from_preferred_server_group_result.cxx +42 -0
  91. data/ext/couchbase/core/impl/public_transaction_get_multi_result.cxx +42 -0
  92. data/ext/couchbase/core/impl/query.cxx +76 -7
  93. data/ext/couchbase/core/impl/query.hxx +36 -0
  94. data/ext/couchbase/core/impl/query_index_manager.cxx +54 -1
  95. data/ext/couchbase/core/impl/replica_utils.cxx +101 -0
  96. data/ext/couchbase/core/impl/replica_utils.hxx +64 -0
  97. data/ext/couchbase/core/impl/resolve_node_id.hxx +125 -0
  98. data/ext/couchbase/core/impl/scope.cxx +70 -0
  99. data/ext/couchbase/core/impl/search.cxx +31 -1
  100. data/ext/couchbase/core/impl/transactions.cxx +130 -0
  101. data/ext/couchbase/core/impl/wait_until_ready.cxx +439 -0
  102. data/ext/couchbase/core/impl/wait_until_ready.hxx +110 -0
  103. data/ext/couchbase/core/impl/with_bucket_config_or_timeout.hxx +180 -0
  104. data/ext/couchbase/core/impl/with_cancellation.hxx +11 -3
  105. data/ext/couchbase/core/io/configuration_belongs_to_session.hxx +1 -2
  106. data/ext/couchbase/core/io/dns_client.cxx +122 -45
  107. data/ext/couchbase/core/io/dns_codec.hxx +21 -21
  108. data/ext/couchbase/core/io/dns_config.cxx +21 -6
  109. data/ext/couchbase/core/io/http_command.hxx +149 -121
  110. data/ext/couchbase/core/io/http_error.hxx +107 -0
  111. data/ext/couchbase/core/io/http_parser.cxx +4 -0
  112. data/ext/couchbase/core/io/http_session.cxx +606 -154
  113. data/ext/couchbase/core/io/http_session.hxx +147 -30
  114. data/ext/couchbase/core/io/http_session_manager.hxx +329 -382
  115. data/ext/couchbase/core/io/http_streaming_parser.cxx +4 -0
  116. data/ext/couchbase/core/io/http_streaming_response.cxx +328 -43
  117. data/ext/couchbase/core/io/http_streaming_response.hxx +37 -3
  118. data/ext/couchbase/core/io/mcbp_buffer_pool.hxx +122 -0
  119. data/ext/couchbase/core/io/mcbp_command.hxx +150 -51
  120. data/ext/couchbase/core/io/mcbp_command_id.hxx +45 -0
  121. data/ext/couchbase/core/io/mcbp_message.cxx +9 -1
  122. data/ext/couchbase/core/io/mcbp_message.hxx +19 -0
  123. data/ext/couchbase/core/io/mcbp_output_queue.hxx +150 -0
  124. data/ext/couchbase/core/io/mcbp_parser.cxx +24 -7
  125. data/ext/couchbase/core/io/mcbp_session.cxx +309 -301
  126. data/ext/couchbase/core/io/mcbp_session.hxx +27 -18
  127. data/ext/couchbase/core/io/opaque_ring_table.hxx +145 -0
  128. data/ext/couchbase/core/io/retry_orchestrator.hxx +6 -5
  129. data/ext/couchbase/core/io/stream_deadline.hxx +50 -0
  130. data/ext/couchbase/core/io/streams.cxx +151 -21
  131. data/ext/couchbase/core/io/streams.hxx +48 -1
  132. data/ext/couchbase/core/logger/logger.cxx +36 -0
  133. data/ext/couchbase/core/logger/logger.hxx +46 -6
  134. data/ext/couchbase/core/logger/redaction.hxx +503 -0
  135. data/ext/couchbase/core/management/eventing_status.hxx +10 -0
  136. data/ext/couchbase/core/management/eventing_status_json.hxx +4 -0
  137. data/ext/couchbase/core/mcbp/big_endian.cxx +1 -1
  138. data/ext/couchbase/core/mcbp/codec.cxx +27 -18
  139. data/ext/couchbase/core/mcbp/operation_queue.cxx +2 -2
  140. data/ext/couchbase/core/mcbp/packet.hxx +2 -2
  141. data/ext/couchbase/core/mcbp/queue_request.cxx +23 -6
  142. data/ext/couchbase/core/mcbp/queue_request.hxx +21 -0
  143. data/ext/couchbase/core/meta/features.hxx +13 -0
  144. data/ext/couchbase/core/meta/version.cxx +6 -3
  145. data/ext/couchbase/core/metrics/logging_meter.cxx +5 -10
  146. data/ext/couchbase/core/metrics/meter_wrapper.cxx +63 -33
  147. data/ext/couchbase/core/metrics/meter_wrapper.hxx +55 -3
  148. data/ext/couchbase/core/operations/analytics_response_parsing.cxx +177 -0
  149. data/ext/couchbase/core/operations/analytics_response_parsing.hxx +55 -0
  150. data/ext/couchbase/core/operations/document_analytics.cxx +48 -130
  151. data/ext/couchbase/core/operations/document_analytics.hxx +14 -2
  152. data/ext/couchbase/core/operations/document_get_all_replicas.hxx +15 -7
  153. data/ext/couchbase/core/operations/document_get_any_replica.hxx +19 -8
  154. data/ext/couchbase/core/operations/document_get_projected.cxx +1 -1
  155. data/ext/couchbase/core/{impl/get_replica.cxx → operations/document_get_replica.cxx} +21 -3
  156. data/ext/couchbase/core/{impl/get_replica.hxx → operations/document_get_replica.hxx} +31 -4
  157. data/ext/couchbase/core/operations/document_lookup_in.cxx +10 -10
  158. data/ext/couchbase/core/operations/document_lookup_in_all_replicas.hxx +228 -198
  159. data/ext/couchbase/core/operations/document_lookup_in_any_replica.hxx +215 -217
  160. data/ext/couchbase/core/operations/document_query.cxx +108 -221
  161. data/ext/couchbase/core/operations/document_query.hxx +18 -4
  162. data/ext/couchbase/core/operations/document_search.cxx +52 -8
  163. data/ext/couchbase/core/operations/document_search.hxx +3 -0
  164. data/ext/couchbase/core/operations/document_view.cxx +3 -3
  165. data/ext/couchbase/core/operations/management/analytics_dataset_create.cxx +15 -8
  166. data/ext/couchbase/core/operations/management/analytics_dataset_create.hxx +4 -0
  167. data/ext/couchbase/core/operations/management/analytics_dataset_drop.cxx +11 -6
  168. data/ext/couchbase/core/operations/management/analytics_dataset_get_all.cxx +3 -2
  169. data/ext/couchbase/core/operations/management/analytics_dataverse_create.cxx +10 -5
  170. data/ext/couchbase/core/operations/management/analytics_dataverse_drop.cxx +10 -5
  171. data/ext/couchbase/core/operations/management/analytics_get_pending_mutations.cxx +2 -1
  172. data/ext/couchbase/core/operations/management/analytics_index_create.cxx +33 -8
  173. data/ext/couchbase/core/operations/management/analytics_index_drop.cxx +12 -7
  174. data/ext/couchbase/core/operations/management/analytics_index_get_all.cxx +3 -2
  175. data/ext/couchbase/core/operations/management/analytics_link_connect.cxx +11 -6
  176. data/ext/couchbase/core/operations/management/analytics_link_create.cxx +3 -3
  177. data/ext/couchbase/core/operations/management/analytics_link_disconnect.cxx +10 -4
  178. data/ext/couchbase/core/operations/management/analytics_link_drop.cxx +6 -4
  179. data/ext/couchbase/core/operations/management/analytics_link_get_all.cxx +4 -3
  180. data/ext/couchbase/core/operations/management/analytics_link_replace.cxx +3 -3
  181. data/ext/couchbase/core/operations/management/analytics_link_utils.hxx +1 -1
  182. data/ext/couchbase/core/operations/management/change_password.cxx +2 -0
  183. data/ext/couchbase/core/operations/management/collection_drop.cxx +5 -1
  184. data/ext/couchbase/core/operations/management/error_utils.cxx +59 -5
  185. data/ext/couchbase/core/operations/management/error_utils.hxx +29 -1
  186. data/ext/couchbase/core/operations/management/eventing_deploy_function.cxx +9 -3
  187. data/ext/couchbase/core/operations/management/eventing_drop_function.cxx +8 -3
  188. data/ext/couchbase/core/operations/management/eventing_get_all_functions.cxx +4 -2
  189. data/ext/couchbase/core/operations/management/eventing_get_function.cxx +5 -3
  190. data/ext/couchbase/core/operations/management/eventing_get_status.cxx +4 -2
  191. data/ext/couchbase/core/operations/management/eventing_pause_function.cxx +9 -3
  192. data/ext/couchbase/core/operations/management/eventing_resume_function.cxx +9 -3
  193. data/ext/couchbase/core/operations/management/eventing_undeploy_function.cxx +9 -3
  194. data/ext/couchbase/core/operations/management/eventing_upsert_function.cxx +9 -3
  195. data/ext/couchbase/core/operations/management/group_drop.cxx +3 -1
  196. data/ext/couchbase/core/operations/management/group_get.cxx +3 -1
  197. data/ext/couchbase/core/operations/management/group_upsert.cxx +11 -8
  198. data/ext/couchbase/core/operations/management/query_index_build.cxx +5 -2
  199. data/ext/couchbase/core/operations/management/query_index_create.cxx +9 -3
  200. data/ext/couchbase/core/operations/management/query_index_drop.cxx +11 -4
  201. data/ext/couchbase/core/operations/management/query_index_get_all.cxx +1 -1
  202. data/ext/couchbase/core/operations/management/query_index_get_all_deferred.cxx +1 -1
  203. data/ext/couchbase/core/operations/management/scope_drop.cxx +5 -1
  204. data/ext/couchbase/core/operations/management/scope_get_all.cxx +6 -1
  205. data/ext/couchbase/core/operations/management/search_get_stats.cxx +10 -0
  206. data/ext/couchbase/core/operations/management/search_index_analyze_document.cxx +3 -2
  207. data/ext/couchbase/core/operations/management/search_index_control_ingest.cxx +4 -3
  208. data/ext/couchbase/core/operations/management/search_index_control_plan_freeze.cxx +4 -3
  209. data/ext/couchbase/core/operations/management/search_index_control_query.cxx +4 -3
  210. data/ext/couchbase/core/operations/management/search_index_drop.cxx +2 -2
  211. data/ext/couchbase/core/operations/management/search_index_get.cxx +2 -2
  212. data/ext/couchbase/core/operations/management/search_index_get_documents_count.cxx +3 -2
  213. data/ext/couchbase/core/operations/management/search_index_get_stats.cxx +3 -1
  214. data/ext/couchbase/core/operations/management/search_index_upsert.cxx +2 -2
  215. data/ext/couchbase/core/operations/management/user_drop.cxx +3 -1
  216. data/ext/couchbase/core/operations/management/user_get.cxx +3 -1
  217. data/ext/couchbase/core/operations/management/user_upsert.cxx +12 -9
  218. data/ext/couchbase/core/operations/management/view_index_drop.cxx +1 -1
  219. data/ext/couchbase/core/operations/management/view_index_get.cxx +1 -1
  220. data/ext/couchbase/core/operations/management/view_index_upsert.cxx +1 -1
  221. data/ext/couchbase/core/operations/operation_traits.hxx +18 -0
  222. data/ext/couchbase/core/operations/query_response_parsing.cxx +211 -0
  223. data/ext/couchbase/core/operations/query_response_parsing.hxx +60 -0
  224. data/ext/couchbase/core/operations_fwd.hxx +3 -3
  225. data/ext/couchbase/core/origin.cxx +54 -26
  226. data/ext/couchbase/core/origin.hxx +12 -0
  227. data/ext/couchbase/core/orphan_reporter.cxx +2 -1
  228. data/ext/couchbase/core/platform/random.cc +7 -7
  229. data/ext/couchbase/core/protocol/client_request.cxx +2 -2
  230. data/ext/couchbase/core/protocol/client_request.hxx +38 -21
  231. data/ext/couchbase/core/protocol/client_response.cxx +11 -3
  232. data/ext/couchbase/core/protocol/client_response.hxx +27 -6
  233. data/ext/couchbase/core/protocol/cmd_append.cxx +2 -2
  234. data/ext/couchbase/core/protocol/cmd_cluster_map_change_notification.cxx +2 -2
  235. data/ext/couchbase/core/protocol/cmd_decrement.cxx +6 -6
  236. data/ext/couchbase/core/protocol/cmd_get.cxx +1 -1
  237. data/ext/couchbase/core/protocol/cmd_get_and_lock.cxx +2 -2
  238. data/ext/couchbase/core/protocol/cmd_get_and_touch.cxx +2 -2
  239. data/ext/couchbase/core/protocol/cmd_get_cluster_config.cxx +6 -4
  240. data/ext/couchbase/core/protocol/cmd_get_collection_id.cxx +2 -2
  241. data/ext/couchbase/core/protocol/cmd_get_error_map.cxx +1 -1
  242. data/ext/couchbase/core/protocol/cmd_get_meta.cxx +4 -4
  243. data/ext/couchbase/core/protocol/cmd_get_replica.cxx +1 -1
  244. data/ext/couchbase/core/protocol/cmd_hello.cxx +1 -1
  245. data/ext/couchbase/core/protocol/cmd_increment.cxx +6 -6
  246. data/ext/couchbase/core/protocol/cmd_insert.cxx +4 -4
  247. data/ext/couchbase/core/protocol/cmd_lookup_in.cxx +4 -3
  248. data/ext/couchbase/core/protocol/cmd_lookup_in_replica.cxx +4 -3
  249. data/ext/couchbase/core/protocol/cmd_mutate_in.cxx +10 -9
  250. data/ext/couchbase/core/protocol/cmd_mutate_in.hxx +10 -10
  251. data/ext/couchbase/core/protocol/cmd_observe_seqno.cxx +7 -7
  252. data/ext/couchbase/core/protocol/cmd_prepend.cxx +2 -2
  253. data/ext/couchbase/core/protocol/cmd_remove.cxx +2 -2
  254. data/ext/couchbase/core/protocol/cmd_replace.cxx +4 -4
  255. data/ext/couchbase/core/protocol/cmd_touch.cxx +1 -1
  256. data/ext/couchbase/core/protocol/cmd_upsert.cxx +4 -4
  257. data/ext/couchbase/core/protocol/datatype.hxx +118 -1
  258. data/ext/couchbase/core/protocol/frame_info_utils.cxx +1 -1
  259. data/ext/couchbase/core/protocol/magic.hxx +4 -0
  260. data/ext/couchbase/core/protocol/magic_fmt.hxx +3 -0
  261. data/ext/couchbase/core/protocol/server_request.hxx +3 -1
  262. data/ext/couchbase/core/protocol/status.cxx +1 -1
  263. data/ext/couchbase/core/protostellar/analytics_converter.hxx +171 -0
  264. data/ext/couchbase/core/protostellar/bucket_admin_converter.hxx +301 -0
  265. data/ext/couchbase/core/protostellar/collection_admin_converter.hxx +92 -0
  266. data/ext/couchbase/core/protostellar/component.cxx +2445 -0
  267. data/ext/couchbase/core/protostellar/component.hxx +391 -0
  268. data/ext/couchbase/core/{columnar/bootstrap_notification_subscriber.hxx → protostellar/compression_settings.hxx} +11 -10
  269. data/ext/couchbase/core/protostellar/credentials.cxx +233 -0
  270. data/ext/couchbase/core/protostellar/credentials.hxx +88 -0
  271. data/ext/couchbase/core/protostellar/dispatcher.cxx +57 -0
  272. data/ext/couchbase/core/protostellar/dispatcher.hxx +482 -0
  273. data/ext/couchbase/core/protostellar/error_utils.cxx +293 -0
  274. data/ext/couchbase/core/protostellar/error_utils.hxx +97 -0
  275. data/ext/couchbase/core/protostellar/json_payload.hxx +49 -0
  276. data/ext/couchbase/core/protostellar/kv_converter.cxx +70 -0
  277. data/ext/couchbase/core/protostellar/kv_converter.hxx +600 -0
  278. data/ext/couchbase/core/protostellar/query_converter.hxx +265 -0
  279. data/ext/couchbase/core/protostellar/query_index_admin_converter.hxx +291 -0
  280. data/ext/couchbase/core/protostellar/query_proto.hxx +73 -0
  281. data/ext/couchbase/core/protostellar/search_converter.hxx +244 -0
  282. data/ext/couchbase/core/protostellar/search_index_admin_converter.hxx +156 -0
  283. data/ext/couchbase/core/protostellar/view_converter.hxx +158 -0
  284. data/ext/couchbase/core/query_stream.cxx +447 -0
  285. data/ext/couchbase/core/query_stream.hxx +141 -0
  286. data/ext/couchbase/core/query_stream_component.cxx +243 -0
  287. data/ext/couchbase/core/query_stream_component.hxx +68 -0
  288. data/ext/couchbase/core/range_scan_load_balancer.cxx +15 -8
  289. data/ext/couchbase/core/range_scan_orchestrator.cxx +15 -3
  290. data/ext/couchbase/core/response_handler.hxx +41 -4
  291. data/ext/couchbase/core/row_streamer.cxx +332 -46
  292. data/ext/couchbase/core/row_streamer.hxx +31 -1
  293. data/ext/couchbase/core/row_streamer_options.hxx +55 -0
  294. data/ext/couchbase/core/sasl/client.h +3 -0
  295. data/ext/couchbase/core/search_scoring.hxx +66 -0
  296. data/ext/couchbase/core/stream_error_details.hxx +69 -0
  297. data/ext/couchbase/core/timeout_defaults.hxx +0 -1
  298. data/ext/couchbase/core/topology/capabilities.hxx +6 -0
  299. data/ext/couchbase/core/topology/capabilities_fmt.hxx +3 -0
  300. data/ext/couchbase/core/topology/configuration.cxx +21 -6
  301. data/ext/couchbase/core/topology/configuration.hxx +29 -8
  302. data/ext/couchbase/core/topology/configuration_json.hxx +3 -0
  303. data/ext/couchbase/core/topology/error_map_json.hxx +3 -1
  304. data/ext/couchbase/core/tracing/threshold_logging_tracer.cxx +70 -4
  305. data/ext/couchbase/core/tracing/threshold_logging_tracer.hxx +10 -0
  306. data/ext/couchbase/core/transactions/active_transaction_record.cxx +0 -34
  307. data/ext/couchbase/core/transactions/attempt_context_impl.cxx +108 -63
  308. data/ext/couchbase/core/transactions/attempt_context_impl.hxx +19 -2
  309. data/ext/couchbase/core/transactions/error_list.hxx +2 -2
  310. data/ext/couchbase/core/transactions/get_multi_fetch.hxx +160 -0
  311. data/ext/couchbase/core/transactions/get_multi_orchestrator.cxx +326 -125
  312. data/ext/couchbase/core/transactions/get_multi_transaction_id.hxx +62 -0
  313. data/ext/couchbase/core/transactions/internal/atr_entry.hxx +22 -2
  314. data/ext/couchbase/core/transactions/internal/transaction_context.hxx +2 -2
  315. data/ext/couchbase/core/transactions/internal/transactions_cleanup.hxx +23 -1
  316. data/ext/couchbase/core/transactions/internal/utils.hxx +50 -14
  317. data/ext/couchbase/core/transactions/staged_mutation.cxx +23 -18
  318. data/ext/couchbase/core/transactions/staged_mutation.hxx +15 -4
  319. data/ext/couchbase/core/transactions/transaction_context.cxx +55 -40
  320. data/ext/couchbase/core/transactions/transaction_get_result.hxx +16 -0
  321. data/ext/couchbase/core/transactions/transactions.cxx +3 -55
  322. data/ext/couchbase/core/transactions/transactions_cleanup.cxx +165 -72
  323. data/ext/couchbase/core/transactions/transactions_config.cxx +0 -11
  324. data/ext/couchbase/core/transactions/utils.cxx +10 -0
  325. data/ext/couchbase/core/transactions/waitable_op_list.hxx +2 -2
  326. data/ext/couchbase/core/transactions.hxx +9 -9
  327. data/ext/couchbase/core/utils/byteswap.hxx +166 -9
  328. data/ext/couchbase/core/utils/connection_string.cxx +50 -85
  329. data/ext/couchbase/core/utils/connection_string.hxx +15 -0
  330. data/ext/couchbase/core/{columnar/backoff_calculator.hxx → utils/deadline.hxx} +13 -13
  331. data/ext/couchbase/core/utils/duration_parser.cxx +1 -1
  332. data/ext/couchbase/core/utils/json_streaming_lexer.cxx +48 -5
  333. data/ext/couchbase/core/utils/json_streaming_lexer.hxx +4 -1
  334. data/ext/couchbase/core/utils/movable_function.hxx +301 -52
  335. data/ext/couchbase/core/utils/name_codec.hxx +154 -11
  336. data/ext/couchbase/core/{columnar/retry_info.hxx → utils/process_id.hxx} +18 -13
  337. data/ext/couchbase/core/utils/url_codec.cxx +12 -51
  338. data/ext/couchbase/core/websocket_codec.cxx +3 -29
  339. data/ext/couchbase/couchbase/analytics_options.hxx +21 -10
  340. data/ext/couchbase/couchbase/analytics_row.hxx +105 -0
  341. data/ext/couchbase/couchbase/analytics_stream_result.hxx +266 -0
  342. data/ext/couchbase/couchbase/boolean_query.hxx +3 -3
  343. data/ext/couchbase/couchbase/bucket.hxx +57 -0
  344. data/ext/couchbase/couchbase/cluster.hxx +183 -5
  345. data/ext/couchbase/{core/columnar/security_options.hxx → couchbase/cluster_state.hxx} +18 -14
  346. data/ext/couchbase/couchbase/codec/lenient_json_transcoder.hxx +69 -0
  347. data/ext/couchbase/couchbase/collection.hxx +234 -14
  348. data/ext/couchbase/couchbase/common_durability_options.hxx +18 -3
  349. data/ext/couchbase/couchbase/conjunction_query.hxx +1 -1
  350. data/ext/couchbase/couchbase/create_dataset_analytics_options.hxx +6 -1
  351. data/ext/couchbase/couchbase/date_range_query.hxx +2 -2
  352. data/ext/couchbase/couchbase/decrement_options.hxx +1 -1
  353. data/ext/couchbase/couchbase/disjunction_query.hxx +1 -1
  354. data/ext/couchbase/couchbase/error.hxx +32 -0
  355. data/ext/couchbase/couchbase/error_codes.hxx +32 -0
  356. data/ext/couchbase/couchbase/geo_bounding_box_query.hxx +1 -1
  357. data/ext/couchbase/couchbase/geo_distance_query.hxx +1 -1
  358. data/ext/couchbase/couchbase/geo_polygon_query.hxx +1 -1
  359. data/ext/couchbase/couchbase/get_replica_options.hxx +68 -0
  360. data/ext/couchbase/couchbase/get_replica_result.hxx +5 -3
  361. data/ext/couchbase/couchbase/get_replica_strategy.hxx +161 -0
  362. data/ext/couchbase/couchbase/get_result.hxx +1 -0
  363. data/ext/couchbase/couchbase/increment_options.hxx +1 -1
  364. data/ext/couchbase/couchbase/insert_options.hxx +1 -1
  365. data/ext/couchbase/couchbase/match_phrase_query.hxx +1 -1
  366. data/ext/couchbase/couchbase/match_query.hxx +1 -1
  367. data/ext/couchbase/couchbase/mutate_in_options.hxx +3 -3
  368. data/ext/couchbase/couchbase/network_options.hxx +1 -1
  369. data/ext/couchbase/couchbase/node_id.hxx +42 -14
  370. data/ext/couchbase/couchbase/node_id_for_options.hxx +7 -1
  371. data/ext/couchbase/couchbase/node_ids_options.hxx +8 -2
  372. data/ext/couchbase/couchbase/numeric_range_query.hxx +1 -1
  373. data/ext/couchbase/couchbase/phrase_query.hxx +1 -1
  374. data/ext/couchbase/couchbase/prefix_query.hxx +1 -1
  375. data/ext/couchbase/couchbase/query_options.hxx +23 -12
  376. data/ext/couchbase/couchbase/query_row.hxx +111 -0
  377. data/ext/couchbase/couchbase/query_stream_result.hxx +302 -0
  378. data/ext/couchbase/couchbase/query_string_query.hxx +3 -3
  379. data/ext/couchbase/couchbase/regexp_query.hxx +1 -1
  380. data/ext/couchbase/couchbase/replace_options.hxx +3 -3
  381. data/ext/couchbase/couchbase/result.hxx +14 -3
  382. data/ext/couchbase/couchbase/scan_result_item.hxx +1 -0
  383. data/ext/couchbase/couchbase/scope.hxx +85 -2
  384. data/ext/couchbase/couchbase/search_options.hxx +58 -8
  385. data/ext/couchbase/couchbase/search_scoring.hxx +94 -0
  386. data/ext/couchbase/couchbase/search_scoring_none.hxx +51 -0
  387. data/ext/couchbase/couchbase/search_scoring_reciprocal_rank_fusion.hxx +88 -0
  388. data/ext/couchbase/couchbase/search_scoring_relative_score_fusion.hxx +70 -0
  389. data/ext/couchbase/couchbase/term_range_query.hxx +1 -1
  390. data/ext/couchbase/couchbase/tracing/request_span.hxx +46 -0
  391. data/ext/couchbase/couchbase/transactions/transaction_get_multi_replicas_from_preferred_server_group_result.hxx +23 -21
  392. data/ext/couchbase/couchbase/transactions/transaction_get_multi_result.hxx +24 -19
  393. data/ext/couchbase/couchbase/transactions/transaction_get_result.hxx +17 -3
  394. data/ext/couchbase/couchbase/transactions/transactions_config.hxx +4 -2
  395. data/ext/couchbase/couchbase/transactions.hxx +27 -18
  396. data/ext/couchbase/couchbase/upsert_options.hxx +3 -3
  397. data/ext/couchbase/couchbase/vector_query.hxx +1 -1
  398. data/ext/couchbase/couchbase/wait_until_ready_options.hxx +111 -0
  399. data/ext/couchbase/couchbase/wildcard_query.hxx +1 -1
  400. data/ext/extconf.rb +15 -10
  401. data/ext/rcb_analytics.cxx +82 -102
  402. data/ext/rcb_backend.cxx +42 -36
  403. data/ext/rcb_backend.hxx +2 -0
  404. data/ext/rcb_buckets.cxx +47 -59
  405. data/ext/rcb_collections.cxx +42 -52
  406. data/ext/rcb_crud.cxx +345 -224
  407. data/ext/rcb_diagnostics.cxx +117 -27
  408. data/ext/rcb_exceptions.cxx +152 -99
  409. data/ext/rcb_exceptions.hxx +25 -0
  410. data/ext/rcb_extras.cxx +18 -19
  411. data/ext/rcb_hdr_histogram.cxx +19 -4
  412. data/ext/rcb_logger.cxx +202 -27
  413. data/ext/rcb_logger.hxx +12 -0
  414. data/ext/rcb_multi.cxx +40 -40
  415. data/ext/rcb_observability.cxx +7 -5
  416. data/ext/rcb_query.cxx +99 -142
  417. data/ext/rcb_range_scan.cxx +41 -35
  418. data/ext/rcb_search.cxx +98 -99
  419. data/ext/rcb_users.cxx +36 -56
  420. data/ext/rcb_utils.cxx +100 -37
  421. data/ext/rcb_utils.hxx +287 -33
  422. data/ext/rcb_version.cxx +1 -1
  423. data/ext/rcb_views.cxx +55 -51
  424. data/lib/active_support/cache/couchbase_store.rb +77 -12
  425. data/lib/couchbase/bucket.rb +20 -0
  426. data/lib/couchbase/cluster.rb +17 -0
  427. data/lib/couchbase/collection.rb +36 -1
  428. data/lib/couchbase/errors.rb +18 -0
  429. data/lib/couchbase/fork_hooks.rb +16 -7
  430. data/lib/couchbase/get_replica_strategy.rb +89 -0
  431. data/lib/couchbase/logger.rb +1 -1
  432. data/lib/couchbase/management/analytics_index_manager.rb +15 -15
  433. data/lib/couchbase/management/bucket_manager.rb +6 -6
  434. data/lib/couchbase/management/collection_manager.rb +6 -6
  435. data/lib/couchbase/management/query_index_manager.rb +7 -7
  436. data/lib/couchbase/management/search_index_manager.rb +13 -13
  437. data/lib/couchbase/management/user_manager.rb +10 -10
  438. data/lib/couchbase/management/view_index_manager.rb +5 -5
  439. data/lib/couchbase/options.rb +174 -42
  440. data/lib/couchbase/protostellar/bucket.rb +4 -0
  441. data/lib/couchbase/protostellar/cluster.rb +4 -0
  442. data/lib/couchbase/protostellar/collection.rb +4 -0
  443. data/lib/couchbase/protostellar/error_handling.rb +2 -1
  444. data/lib/couchbase/protostellar/request.rb +1 -0
  445. data/lib/couchbase/protostellar/request_generator/kv.rb +16 -2
  446. data/lib/couchbase/protostellar/request_generator/search.rb +17 -1
  447. data/lib/couchbase/protostellar/retry/orchestrator.rb +3 -2
  448. data/lib/couchbase/protostellar/retry/strategies/fail_fast.rb +33 -0
  449. data/lib/couchbase/protostellar/retry/strategies.rb +1 -0
  450. data/lib/couchbase/search_options.rb +95 -6
  451. data/lib/couchbase/version.rb +1 -1
  452. metadata +91 -33
  453. data/ext/0001-fix-build-for-mingw-w64-ucrt-x86_64-toolchain.patch +0 -40
  454. data/ext/couchbase/core/columnar/agent.hxx +0 -71
  455. data/ext/couchbase/core/columnar/agent_config.hxx +0 -59
  456. data/ext/couchbase/core/columnar/background_bootstrap_listener.hxx +0 -42
  457. data/ext/couchbase/core/columnar/backoff_calculator.cxx +0 -62
  458. data/ext/couchbase/core/columnar/columnar_agent.cxx +0 -147
  459. data/ext/couchbase/core/columnar/columnar_agent_config.cxx +0 -48
  460. data/ext/couchbase/core/columnar/columnar_error.cxx +0 -51
  461. data/ext/couchbase/core/columnar/database_management_options.hxx +0 -56
  462. data/ext/couchbase/core/columnar/error.hxx +0 -51
  463. data/ext/couchbase/core/columnar/error_codes.cxx +0 -107
  464. data/ext/couchbase/core/columnar/error_codes.hxx +0 -75
  465. data/ext/couchbase/core/columnar/management_component.cxx +0 -300
  466. data/ext/couchbase/core/columnar/management_component.hxx +0 -56
  467. data/ext/couchbase/core/columnar/query_component.cxx +0 -523
  468. data/ext/couchbase/core/columnar/query_component.hxx +0 -57
  469. data/ext/couchbase/core/columnar/query_options.hxx +0 -59
  470. data/ext/couchbase/core/columnar/query_result.cxx +0 -130
  471. data/ext/couchbase/core/columnar/query_result.hxx +0 -78
  472. data/ext/couchbase/core/io/config_tracker.cxx +0 -687
  473. data/ext/couchbase/core/io/config_tracker.hxx +0 -123
@@ -0,0 +1,68 @@
1
+ /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2026-Present 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/common_options.hxx>
21
+ #include <couchbase/error.hxx>
22
+ #include <couchbase/get_replica_result.hxx>
23
+
24
+ #include <functional>
25
+
26
+ namespace couchbase
27
+ {
28
+ /**
29
+ * Options for collection#get_replica().
30
+ *
31
+ * @since 1.5.0
32
+ * @committed
33
+ */
34
+ struct get_replica_options : public common_options<get_replica_options> {
35
+ /**
36
+ * Immutable value object representing consistent options.
37
+ *
38
+ * @since 1.5.0
39
+ * @internal
40
+ */
41
+ struct built : public common_options<get_replica_options>::built {
42
+ };
43
+
44
+ /**
45
+ * Validates options and returns them as an immutable value.
46
+ *
47
+ * @return consistent options as an immutable value
48
+ *
49
+ * @exception std::system_error with code errc::common::invalid_argument if the options are not
50
+ * valid
51
+ *
52
+ * @since 1.5.0
53
+ * @internal
54
+ */
55
+ [[nodiscard]] auto build() const -> built
56
+ {
57
+ return { build_common_options() };
58
+ }
59
+ };
60
+
61
+ /**
62
+ * The signature for the handler of the @ref collection#get_replica() operation
63
+ *
64
+ * @since 1.5.0
65
+ * @committed
66
+ */
67
+ using get_replica_handler = std::function<void(error, get_replica_result)>;
68
+ } // namespace couchbase
@@ -32,8 +32,8 @@ class manager;
32
32
  #endif
33
33
 
34
34
  /**
35
- * Represents result of @ref collection#get_any_replica operations, also returned by @ref
36
- * collection#get_all_replicas.
35
+ * Represents result of @ref collection#get_any_replica, @ref collection#get_all_replicas and
36
+ * @ref collection#get_replica operations
37
37
  *
38
38
  * @since 1.0.0
39
39
  * @committed
@@ -48,11 +48,13 @@ public:
48
48
  get_replica_result() = default;
49
49
 
50
50
  /**
51
- * Constructs result for get_any_replica operation, or an entry for get_all_replicas operation.
51
+ * Constructs result for get_any_replica or get_replica operation, or an entry for
52
+ * get_all_replicas operation.
52
53
  *
53
54
  * @param cas
54
55
  * @param is_replica true if the document originates from replica node
55
56
  * @param value raw document contents along with flags describing its structure
57
+ * @param crypto_manager manager handed to the transcoder to decrypt encrypted fields
56
58
  *
57
59
  * @since 1.0.0
58
60
  * @committed
@@ -0,0 +1,161 @@
1
+ /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2026-Present 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 <cstddef>
21
+
22
+ namespace couchbase
23
+ {
24
+ /**
25
+ * Replica to read from, where @ref replica_index::first is the first replica of
26
+ * the vbucket. The active copy cannot be selected.
27
+ *
28
+ * @since 1.5.0
29
+ * @committed
30
+ */
31
+ enum class replica_index {
32
+ first = 0,
33
+ second = 1,
34
+ third = 2,
35
+ };
36
+
37
+ /**
38
+ * Options for @ref get_replica_strategy::from_index().
39
+ *
40
+ * @since 1.5.0
41
+ * @committed
42
+ */
43
+ struct get_replica_strategy_from_index_options {
44
+ /**
45
+ * Immutable value object representing consistent options.
46
+ *
47
+ * @since 1.5.0
48
+ * @internal
49
+ */
50
+ struct built {
51
+ bool wrap;
52
+ };
53
+
54
+ /**
55
+ * Resolve an index that cannot be read as requested to the next one that can,
56
+ * instead of failing with @ref errc::key_value::replica_index_out_of_bounds or
57
+ * @ref errc::key_value::replica_index_currently_unavailable.
58
+ *
59
+ * The search walks the bucket's configured replica count, starting at the
60
+ * requested index modulo that count. An index beyond the vbucket map's
61
+ * current row therefore still reaches the replicas the row does list.
62
+ *
63
+ * Two failures remain. A bucket configured for no replicas reports
64
+ * @ref errc::key_value::replica_index_out_of_bounds. A full lap that finds
65
+ * nothing readable reports
66
+ * @ref errc::key_value::replica_index_currently_unavailable.
67
+ *
68
+ * Resolution follows the vbucket map, not node health: a replica the map
69
+ * places on a node is selected even when that node cannot be reached, and the
70
+ * operation retries against it until its timeout rather than moving on to
71
+ * another replica.
72
+ *
73
+ * @param value whether to wrap around the available replicas
74
+ * @return this options builder for chaining purposes.
75
+ *
76
+ * @since 1.5.0
77
+ * @committed
78
+ */
79
+ auto wrap(bool value) -> get_replica_strategy_from_index_options&
80
+ {
81
+ wrap_ = value;
82
+ return *this;
83
+ }
84
+
85
+ /**
86
+ * Returns the options as an immutable value.
87
+ *
88
+ * @return the options as an immutable value
89
+ *
90
+ * @since 1.5.0
91
+ * @internal
92
+ */
93
+ [[nodiscard]] auto build() const -> built
94
+ {
95
+ return { wrap_ };
96
+ }
97
+
98
+ private:
99
+ bool wrap_{ false };
100
+ };
101
+
102
+ /**
103
+ * Selects the replica that @ref collection#get_replica() reads from.
104
+ *
105
+ * @since 1.5.0
106
+ * @committed
107
+ */
108
+ class get_replica_strategy
109
+ {
110
+ public:
111
+ /**
112
+ * Read from the replica at the given index.
113
+ *
114
+ * @param index the replica to read from
115
+ * @param options the custom options
116
+ * @return the strategy to pass to @ref collection#get_replica()
117
+ *
118
+ * @since 1.5.0
119
+ * @committed
120
+ */
121
+ [[nodiscard]] static auto from_index(replica_index index,
122
+ const get_replica_strategy_from_index_options& options = {})
123
+ -> get_replica_strategy
124
+ {
125
+ return get_replica_strategy{ static_cast<std::size_t>(index), options.build() };
126
+ }
127
+
128
+ /**
129
+ * Immutable value object representing a consistent strategy.
130
+ *
131
+ * @since 1.5.0
132
+ * @internal
133
+ */
134
+ struct built {
135
+ std::size_t replica_index;
136
+ bool wrap;
137
+ };
138
+
139
+ /**
140
+ * Returns the strategy as an immutable value.
141
+ *
142
+ * @return the strategy as an immutable value
143
+ *
144
+ * @since 1.5.0
145
+ * @internal
146
+ */
147
+ [[nodiscard]] auto build() const -> built
148
+ {
149
+ return built_;
150
+ }
151
+
152
+ private:
153
+ get_replica_strategy(std::size_t index,
154
+ const get_replica_strategy_from_index_options::built& options)
155
+ : built_{ index, options.wrap }
156
+ {
157
+ }
158
+
159
+ built built_;
160
+ };
161
+ } // namespace couchbase
@@ -56,6 +56,7 @@ public:
56
56
  * @param cas
57
57
  * @param value raw document contents along with flags describing its structure
58
58
  * @param expiry_time optional point in time when the document will expire
59
+ * @param crypto_manager manager handed to the transcoder to decrypt encrypted fields
59
60
  *
60
61
  * @since 1.0.0
61
62
  * @committed
@@ -69,7 +69,7 @@ struct increment_options : public common_durability_options<increment_options> {
69
69
  * Sets the expiry for the document. By default the document will never expire.
70
70
  *
71
71
  * The duration must be less than 50 years. For expiry further in the future, use
72
- * {@link #expiry(std::chrono::system_clock::time_point)}.
72
+ * {@link #expiry expiry(std::chrono::system_clock::time_point)}.
73
73
  *
74
74
  * @param duration the duration after which the document will expire (zero duration means never
75
75
  * expire).
@@ -70,7 +70,7 @@ struct insert_options : public common_durability_options<insert_options> {
70
70
  * Sets the expiry for the document. By default the document will never expire.
71
71
  *
72
72
  * The duration must be less than 50 years. For expiry further in the future, use
73
- * {@link #expiry(std::chrono::system_clock::time_point)}.
73
+ * {@link #expiry expiry(std::chrono::system_clock::time_point)}.
74
74
  *
75
75
  * @param duration the duration after which the document will expire (zero duration means never
76
76
  * expire).
@@ -39,7 +39,7 @@ namespace couchbase
39
39
  * Following this processing, the tokens `"locat"` and
40
40
  * `"function"` are recognized as common to both input and target; and also as being both in the
41
41
  * same sequence as, and at the same distance from one another; and therefore a match is made.
42
- * @snippet{trimleft} test_unit_search.cxx search-match-phrase
42
+ * @snippet{trimleft} unit/management/search.cxx search-match-phrase
43
43
  *
44
44
  * @see https://docs.couchbase.com/server/current/fts/fts-supported-queries-match-phrase.html
45
45
  *
@@ -33,7 +33,7 @@ namespace couchbase
33
33
  *
34
34
  * Match documents with both `"location"` and `"hostel"` terms in the field `reviews.content`,
35
35
  * ensuring common prefix length `4`, maximum fuzziness and select standard analyzer.
36
- * @snippet{trimleft} test_unit_search.cxx search-match
36
+ * @snippet{trimleft} unit/management/search.cxx search-match
37
37
  *
38
38
  * @see https://docs.couchbase.com/server/current/fts/fts-supported-queries-match.html server
39
39
  * documentation
@@ -80,8 +80,8 @@ struct mutate_in_options : public common_durability_options<mutate_in_options> {
80
80
  *
81
81
  * If true, and the document exists, its expiry will not be modified. Otherwise the document's
82
82
  * expiry is determined by
83
- * {@link #expiry(std::chrono::seconds)} or {@link
84
- * #expiry(std::chrono::system_clock::time_point)}.
83
+ * {@link #expiry expiry(std::chrono::seconds)} or {@link #expiry
84
+ * expiry(std::chrono::system_clock::time_point)}.
85
85
  *
86
86
  * Requires Couchbase Server 7.0 or later.
87
87
  *
@@ -101,7 +101,7 @@ struct mutate_in_options : public common_durability_options<mutate_in_options> {
101
101
  * Sets the expiry for the document. By default the document will never expire.
102
102
  *
103
103
  * The duration must be less than 50 years. For expiry further in the future, use
104
- * {@link #expiry(std::chrono::system_clock::time_point)}.
104
+ * {@link #expiry expiry(std::chrono::system_clock::time_point)}.
105
105
  *
106
106
  * @param duration the duration after which the document will expire (zero duration means never
107
107
  * expire).
@@ -38,7 +38,7 @@ public:
38
38
  /**
39
39
  * Selects network to use.
40
40
  *
41
- * @param name network name as it is exposed in the configuration.
41
+ * @param network_name network name as it is exposed in the configuration.
42
42
  * @return this object for chaining purposes.
43
43
  *
44
44
  * @see
@@ -1,6 +1,6 @@
1
1
  /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
2
  /*
3
- * Copyright 2024-Present Couchbase, Inc.
3
+ * Copyright 2026-Present Couchbase, Inc.
4
4
  *
5
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
6
  * you may not use this file except in compliance with the License.
@@ -25,13 +25,13 @@ namespace couchbase
25
25
  {
26
26
 
27
27
  /**
28
- * Uniquely identifies a cluster node.
28
+ * @brief Identifies a cluster node.
29
29
  *
30
30
  * On Couchbase Server 8.0.1+ the identifier is the server-assigned node UUID.
31
31
  * On older releases, a stable opaque token is derived from the node's hostname
32
- * and management port.
32
+ * and KV port.
33
33
  *
34
- * The type is equality-comparable, ordered, and hashable.
34
+ * The type is equality-comparable, totally ordered, and hashable.
35
35
  *
36
36
  * @since 1.3.2
37
37
  * @uncommitted
@@ -42,23 +42,33 @@ public:
42
42
  /**
43
43
  * Creates an empty (invalid) node_id.
44
44
  *
45
+ * @see operator bool()
46
+ *
45
47
  * @since 1.3.2
46
48
  * @uncommitted
47
49
  */
48
50
  node_id() = default;
49
51
 
52
+ // Copy and move are noexcept: all members (std::string + std::uint16_t)
53
+ // have noexcept moves on every conforming implementation.
54
+ node_id(const node_id&) = default;
55
+ node_id(node_id&&) noexcept = default;
56
+ auto operator=(const node_id&) -> node_id& = default;
57
+ auto operator=(node_id&&) noexcept -> node_id& = default;
58
+ ~node_id() = default;
59
+
50
60
  /**
51
61
  * User-facing identifier string.
52
62
  *
53
63
  * Returns node_uuid when the server provides one, otherwise a stable
54
- * hex-encoded hash derived from hostname and management port.
64
+ * hex-encoded hash derived from hostname and KV port.
55
65
  *
56
66
  * @return opaque identifier string (empty for default-constructed instances)
57
67
  *
58
68
  * @since 1.3.2
59
69
  * @uncommitted
60
70
  */
61
- [[nodiscard]] auto id() const -> const std::string&;
71
+ [[nodiscard]] auto id() const noexcept -> const std::string&;
62
72
 
63
73
  /**
64
74
  * The server-assigned node UUID (empty on servers before 8.0.1).
@@ -66,7 +76,7 @@ public:
66
76
  * @since 1.3.2
67
77
  * @uncommitted
68
78
  */
69
- [[nodiscard]] auto node_uuid() const -> const std::string&;
79
+ [[nodiscard]] auto node_uuid() const noexcept -> const std::string&;
70
80
 
71
81
  /**
72
82
  * The hostname of the node.
@@ -74,18 +84,20 @@ public:
74
84
  * @since 1.3.2
75
85
  * @uncommitted
76
86
  */
77
- [[nodiscard]] auto hostname() const -> const std::string&;
87
+ [[nodiscard]] auto hostname() const noexcept -> const std::string&;
78
88
 
79
89
  /**
80
90
  * The port of the node's key-value service.
81
91
  *
82
92
  * This reflects the port actually used by the client: the TLS port when the
83
- * cluster connection is TLS-enabled, otherwise the plain port.
93
+ * cluster connection is TLS-enabled, otherwise the plain port. A value of
94
+ * @c 0 indicates the port is unknown or the node is not bound; in that case
95
+ * @c operator @c bool() also returns @c false.
84
96
  *
85
97
  * @since 1.3.2
86
98
  * @uncommitted
87
99
  */
88
- [[nodiscard]] auto port() const -> std::uint16_t;
100
+ [[nodiscard]] auto port() const noexcept -> std::uint16_t;
89
101
 
90
102
  /**
91
103
  * Returns true when the node_id was properly initialized (not default-constructed).
@@ -93,13 +105,25 @@ public:
93
105
  * @since 1.3.2
94
106
  * @uncommitted
95
107
  */
96
- explicit operator bool() const;
108
+ [[nodiscard]] explicit operator bool() const noexcept;
97
109
 
98
- auto operator==(const node_id& other) const -> bool;
99
- auto operator!=(const node_id& other) const -> bool;
100
- auto operator<(const node_id& other) const -> bool;
110
+ /** @since 1.3.2 @uncommitted */
111
+ [[nodiscard]] auto operator==(const node_id& other) const noexcept -> bool;
112
+ /** @since 1.3.2 @uncommitted */
113
+ [[nodiscard]] auto operator!=(const node_id& other) const noexcept -> bool;
114
+ /** @since 1.3.2 @uncommitted */
115
+ [[nodiscard]] auto operator<(const node_id& other) const noexcept -> bool;
116
+ /** @since 1.3.2 @uncommitted */
117
+ [[nodiscard]] auto operator<=(const node_id& other) const noexcept -> bool;
118
+ /** @since 1.3.2 @uncommitted */
119
+ [[nodiscard]] auto operator>(const node_id& other) const noexcept -> bool;
120
+ /** @since 1.3.2 @uncommitted */
121
+ [[nodiscard]] auto operator>=(const node_id& other) const noexcept -> bool;
101
122
 
102
123
  private:
124
+ // Construction from core-level data is restricted to internal_node_id,
125
+ // declared in core/impl/node_id.hxx. Public users cannot construct node_id
126
+ // directly.
103
127
  friend class internal_node_id;
104
128
 
105
129
  node_id(std::string node_uuid, std::string hostname, std::uint16_t port);
@@ -116,6 +140,10 @@ private:
116
140
 
117
141
  template<>
118
142
  struct std::hash<couchbase::node_id> {
143
+ // Hashes the full id_ string. For the fallback case id_ is 8 hex chars;
144
+ // for a server-assigned UUID it is typically 32-36 chars. The cost is well
145
+ // under 100ns per lookup and not on a critical path; if profiling shows
146
+ // otherwise, cache the hash on node_id and return it from a friend accessor.
119
147
  auto operator()(const couchbase::node_id& nid) const noexcept -> std::size_t
120
148
  {
121
149
  return std::hash<std::string>{}(nid.id());
@@ -27,7 +27,7 @@ namespace couchbase
27
27
  {
28
28
 
29
29
  /**
30
- * Options for @ref collection#node_id_for().
30
+ * Options for @ref couchbase::collection::node_id_for().
31
31
  *
32
32
  * @since 1.3.2
33
33
  * @uncommitted
@@ -56,6 +56,12 @@ struct node_id_for_options : public common_options<node_id_for_options> {
56
56
  }
57
57
  };
58
58
 
59
+ /**
60
+ * Handler signature for @ref couchbase::collection::node_id_for().
61
+ *
62
+ * @since 1.3.2
63
+ * @uncommitted
64
+ */
59
65
  using node_id_for_handler = std::function<void(error, node_id)>;
60
66
 
61
67
  } // namespace couchbase
@@ -1,6 +1,6 @@
1
1
  /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
2
  /*
3
- * Copyright 2024-Present Couchbase, Inc.
3
+ * Copyright 2026-Present Couchbase, Inc.
4
4
  *
5
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
6
  * you may not use this file except in compliance with the License.
@@ -28,7 +28,7 @@ namespace couchbase
28
28
  {
29
29
 
30
30
  /**
31
- * Options for @ref collection#node_ids().
31
+ * Options for @ref couchbase::collection::node_ids().
32
32
  *
33
33
  * @since 1.3.2
34
34
  * @uncommitted
@@ -57,6 +57,12 @@ struct node_ids_options : public common_options<node_ids_options> {
57
57
  }
58
58
  };
59
59
 
60
+ /**
61
+ * Handler signature for @ref couchbase::collection::node_ids().
62
+ *
63
+ * @since 1.3.2
64
+ * @uncommitted
65
+ */
60
66
  using node_ids_handler = std::function<void(error, std::vector<node_id>)>;
61
67
 
62
68
  } // namespace couchbase
@@ -34,7 +34,7 @@ namespace couchbase
34
34
  *
35
35
  * Match documents where field `id` contains numbers in the range `(100, 1000)`:
36
36
  *
37
- * @snippet{trimleft} test_unit_search.cxx search-numeric-range
37
+ * @snippet{trimleft} unit/management/search.cxx search-numeric-range
38
38
  *
39
39
  * @since 1.0.0
40
40
  * @committed
@@ -34,7 +34,7 @@ namespace couchbase
34
34
  * @ref match_phrase_query should usually be preferred for real-world use cases.
35
35
  *
36
36
  * Match documents with terms `"nice"` and `"view"` in field `reviews.content`:
37
- * @snippet{trimleft} test_unit_search.cxx search-phrase
37
+ * @snippet{trimleft} unit/management/search.cxx search-phrase
38
38
  *
39
39
  * @see https://docs.couchbase.com/server/current/fts/fts-supported-queries-phrase.html server
40
40
  * documentation
@@ -30,7 +30,7 @@ namespace couchbase
30
30
  * @ref match_query.
31
31
  *
32
32
  * Match documents where field `reviews.content` contains words starting with `"inter"`:
33
- * @snippet{trimleft} test_unit_search.cxx search-prefix
33
+ * @snippet{trimleft} unit/management/search.cxx search-prefix
34
34
  *
35
35
  * @see https://docs.couchbase.com/server/current/fts/fts-supported-queries-prefix-query.html server
36
36
  * documentation
@@ -23,6 +23,7 @@
23
23
  #include <couchbase/query_profile.hxx>
24
24
  #include <couchbase/query_result.hxx>
25
25
  #include <couchbase/query_scan_consistency.hxx>
26
+ #include <couchbase/query_stream_result.hxx>
26
27
 
27
28
  #include <chrono>
28
29
  #include <functional>
@@ -136,8 +137,9 @@ struct query_options : public common_options<query_options> {
136
137
  *
137
138
  * If this method is set to true, the server will send metrics back to the client which are
138
139
  * available through the
139
- * {@link query_meta_data#metrics()} section. As opposed to {@link #profile(query_profile)},
140
- * returning metrics is rather cheap and can also be enabled in production if needed.
140
+ * {@link query_meta_data#metrics()} section. As opposed to {@link #profile
141
+ * profile(query_profile)}, returning metrics is rather cheap and can also be enabled in
142
+ * production if needed.
141
143
  *
142
144
  * @param metrics set to true if the server should return simple query metrics.
143
145
  * @return this options builder for chaining purposes.
@@ -384,10 +386,11 @@ struct query_options : public common_options<query_options> {
384
386
  * mutations. If you want to include all the mutations up to the point of the query, use {@link
385
387
  * query_scan_consistency::request_plus}.
386
388
  *
387
- * Note that you cannot use this method and {@link #consistent_with(const mutation_state&)} at the
388
- * same time, since they are mutually exclusive. As a rule of thumb, if you only care to be
389
- * consistent with the mutation you just wrote on the same thread/app, use
390
- * {@link #consistent_with(const mutation_state&)}. If you need "global" scan consistency, use
389
+ * Note that you cannot use this method and {@link #consistent_with consistent_with(const
390
+ * mutation_state&)} at the same time, since they are mutually exclusive. As a rule of thumb, if
391
+ * you only care to be consistent with the mutation you just wrote on the same thread/app, use
392
+ * {@link #consistent_with consistent_with(const mutation_state&)}. If you need "global" scan
393
+ * consistency, use
391
394
  * {@link query_scan_consistency::request_plus} on this method.
392
395
  *
393
396
  * @param scan_consistency the index scan consistency to be used for this query
@@ -410,12 +413,12 @@ struct query_options : public common_options<query_options> {
410
413
  * and if you want your N1QL query to include those you need to pass the mutation tokens into a
411
414
  * {@link mutation_state}.
412
415
  *
413
- * Note that you cannot use this method and {@link #scan_consistency(query_scan_consistency)} at
414
- * the same time, since they are mutually exclusive. As a rule of thumb, if you only care to be
415
- * consistent with the mutation you just wrote on the same thread/app, use this method. If you
416
- * need "global" scan consistency, use
417
- * {@link query_scan_consistency#request_plus} on {@link
418
- * #scan_consistency(query_scan_consistency)}.
416
+ * Note that you cannot use this method and {@link #scan_consistency
417
+ * scan_consistency(query_scan_consistency)} at the same time, since they are mutually exclusive.
418
+ * As a rule of thumb, if you only care to be consistent with the mutation you just wrote on the
419
+ * same thread/app, use this method. If you need "global" scan consistency, use
420
+ * {@link query_scan_consistency#request_plus} on {@link #scan_consistency
421
+ * scan_consistency(query_scan_consistency)}.
419
422
  *
420
423
  * @param state the mutation state containing the mutation tokens.
421
424
  * @return this options builder for chaining purposes.
@@ -675,4 +678,12 @@ private:
675
678
  * @uncommitted
676
679
  */
677
680
  using query_handler = std::function<void(error, query_result)>;
681
+
682
+ /**
683
+ * The signature for the handler of a streaming query operation.
684
+ *
685
+ * @since 1.4.0
686
+ * @volatile
687
+ */
688
+ using query_stream_handler = std::function<void(error, query_stream_result)>;
678
689
  } // namespace couchbase