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,111 @@
1
+ /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2020-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/codec/encoded_value.hxx>
21
+ #include <couchbase/codec/serializer_traits.hxx>
22
+ #include <utility>
23
+
24
+ namespace couchbase
25
+ {
26
+
27
+ namespace codec
28
+ {
29
+ class tao_json_serializer;
30
+ } // namespace codec
31
+
32
+ /**
33
+ * Represents a single row of a streaming query result.
34
+ *
35
+ * The raw JSON bytes can be decoded via @ref content_as().
36
+ *
37
+ * @since 1.4.0
38
+ * @volatile
39
+ */
40
+ class query_row
41
+ {
42
+ public:
43
+ /**
44
+ * @since 1.4.0
45
+ * @volatile
46
+ */
47
+ query_row() = default;
48
+
49
+ /**
50
+ * Constructs a row from raw JSON bytes.
51
+ *
52
+ * @param content raw JSON bytes for this row
53
+ *
54
+ * @since 1.4.0
55
+ * @volatile
56
+ */
57
+ explicit query_row(codec::binary content)
58
+ : content_{ std::move(content) }
59
+ {
60
+ }
61
+
62
+ /**
63
+ * Decodes the row content into the requested document type using the given serializer.
64
+ *
65
+ * Only call this on a row obtained from a successful @ref query_stream_result#next() (falsy
66
+ * error, engaged optional). The end-of-stream and error sentinels carry an empty @ref query_row,
67
+ * and decoding empty/malformed content throws the serializer's parse exception — gate on the
68
+ * three-state next() contract (check the error, then the optional) before decoding.
69
+ *
70
+ * Any type with a serializer-compatible specialization works as the document type:
71
+ *
72
+ * @snippet{trimleft} test_integration_examples_streaming.cxx streaming-product
73
+ *
74
+ * Usage:
75
+ *
76
+ * @snippet{trimleft} test_integration_examples_streaming.cxx example-query-stream
77
+ *
78
+ * @tparam Serializer the serializer to use (defaults to @ref codec::tao_json_serializer)
79
+ * @tparam Document the document type to decode into (defaults to the serializer's document_type)
80
+ * @return the decoded document
81
+ * @throws the serializer's deserialization exception if the content is empty or not valid JSON
82
+ *
83
+ * @since 1.4.0
84
+ * @volatile
85
+ */
86
+ template<typename Serializer = codec::tao_json_serializer,
87
+ typename Document = typename Serializer::document_type,
88
+ std::enable_if_t<codec::is_serializer_v<Serializer>, bool> = true>
89
+ [[nodiscard]] auto content_as() const -> Document
90
+ {
91
+ return Serializer::template deserialize<Document>(content_);
92
+ }
93
+
94
+ /**
95
+ * Returns the raw binary content of this row.
96
+ *
97
+ * @return raw JSON bytes
98
+ *
99
+ * @since 1.4.0
100
+ * @volatile
101
+ */
102
+ [[nodiscard]] auto content_as_binary() const -> const codec::binary&
103
+ {
104
+ return content_;
105
+ }
106
+
107
+ private:
108
+ codec::binary content_{};
109
+ };
110
+
111
+ } // namespace couchbase
@@ -0,0 +1,302 @@
1
+ /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2026. 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/codec/encoded_value.hxx>
21
+ #include <couchbase/error.hxx>
22
+ #include <couchbase/query_meta_data.hxx>
23
+ #include <couchbase/query_row.hxx>
24
+
25
+ #include <functional>
26
+ #include <future>
27
+ #include <memory>
28
+ #include <optional>
29
+ #include <utility>
30
+
31
+ namespace couchbase
32
+ {
33
+ #ifndef COUCHBASE_CXX_CLIENT_DOXYGEN
34
+ class internal_query_stream_result;
35
+ #endif
36
+
37
+ /**
38
+ * The signature for the handler of the @ref query_stream_result#next() operation.
39
+ *
40
+ * @since 1.4.0
41
+ * @volatile
42
+ */
43
+ using query_row_handler = std::function<void(error, std::optional<query_row>)>;
44
+
45
+ /**
46
+ * A streaming result handle for N1QL queries.
47
+ *
48
+ * Rows are fetched one at a time via @ref next(). The stream must be fully drained
49
+ * (or @ref cancel() called) before @ref meta_data() resolves. Only a single @ref next()
50
+ * call may be outstanding at a time.
51
+ *
52
+ * @snippet{trimleft} test_integration_examples_streaming.cxx example-query-stream
53
+ *
54
+ * @note The future-returning overloads (`next()`, `meta_data()`) and the eager @ref iterator
55
+ * block the calling thread until the result is ready. They must not be called from within an SDK
56
+ * completion handler (i.e. the library's I/O thread) — doing so blocks that thread against itself
57
+ * and the stream can never advance. From a completion handler, use the callback @ref next()
58
+ * overload instead.
59
+ *
60
+ * @note Copies of a result handle share one underlying stream: they alias the same rows, the same
61
+ * single-outstanding-next() budget, and the same @ref cancel(). Copying does not fork the stream;
62
+ * a @ref next() on any copy consumes the next row for all of them. Use a single handle per stream.
63
+ *
64
+ * @since 1.4.0
65
+ * @volatile
66
+ */
67
+ class query_stream_result
68
+ {
69
+ public:
70
+ /**
71
+ * Constructs an empty (no-op) result handle.
72
+ *
73
+ * @since 1.4.0
74
+ * @internal
75
+ */
76
+ query_stream_result() = default;
77
+
78
+ /**
79
+ * Constructs a query stream result from an internal result.
80
+ *
81
+ * @param internal the internal result handle
82
+ *
83
+ * @since 1.4.0
84
+ * @internal
85
+ */
86
+ explicit query_stream_result(std::shared_ptr<internal_query_stream_result> internal);
87
+
88
+ /**
89
+ * Fetches the next row asynchronously, invoking the handler when ready.
90
+ *
91
+ * The handler receives ({}, row) for a real row, ({}, {}) at clean end-of-stream,
92
+ * or (error, {}) if the stream ended with an error.
93
+ *
94
+ * Only one outstanding call is allowed at a time.
95
+ *
96
+ * This is the overload to use from a completion handler: issuing the following pull from inside
97
+ * the handler drains the stream without ever blocking a thread.
98
+ *
99
+ * @snippet{trimleft} test_integration_examples_streaming.cxx example-query-stream-async
100
+ *
101
+ * @param handler callable that implements @ref query_row_handler
102
+ *
103
+ * @since 1.4.0
104
+ * @volatile
105
+ */
106
+ void next(query_row_handler&& handler) const;
107
+
108
+ /**
109
+ * Fetches the next row, returning a future.
110
+ *
111
+ * Only one outstanding call is allowed at a time.
112
+ *
113
+ * A failure reaches the caller through one of two channels — the error returned by the
114
+ * originating @ref cluster#query_stream() (the request never started) or the stream's terminal
115
+ * delivered here. Which one fires is not fixed, so both have to be handled. Once a terminal has
116
+ * been reached it is re-delivered on every further call rather than blocking on a drained stream:
117
+ *
118
+ * @snippet{trimleft} test_integration_examples_streaming.cxx example-query-stream-errors
119
+ *
120
+ * @return future object that carries the result of the operation
121
+ *
122
+ * @since 1.4.0
123
+ * @volatile
124
+ */
125
+ [[nodiscard]] auto next() const -> std::future<std::pair<error, std::optional<query_row>>>;
126
+
127
+ /**
128
+ * Returns the query signature captured from the response metadata, if present.
129
+ *
130
+ * The signature is part of the response preamble, so — unlike @ref meta_data() — it is available
131
+ * as soon as the stream has started, without draining it first:
132
+ *
133
+ * @snippet{trimleft} test_integration_examples_streaming.cxx example-query-stream
134
+ *
135
+ * @return optional binary JSON signature
136
+ *
137
+ * @since 1.4.0
138
+ * @volatile
139
+ */
140
+ [[nodiscard]] auto signature() const -> std::optional<codec::binary>;
141
+
142
+ /**
143
+ * Returns the query metadata.
144
+ *
145
+ * The returned future resolves only after the stream has been fully drained
146
+ * (all rows consumed or the stream cancelled). May be called more than once;
147
+ * each call returns its own future and all of them resolve together once the
148
+ * metadata becomes available.
149
+ *
150
+ * If the stream ended with an error, or was torn down by @ref cancel() before reaching a natural
151
+ * terminal, the returned future resolves with that error instead of waiting for a trailer that
152
+ * will never arrive:
153
+ *
154
+ * @snippet{trimleft} test_integration_examples_streaming.cxx example-query-stream-errors
155
+ *
156
+ * @return future carrying (error, query_meta_data)
157
+ *
158
+ * @since 1.4.0
159
+ * @volatile
160
+ */
161
+ [[nodiscard]] auto meta_data() const -> std::future<std::pair<error, query_meta_data>>;
162
+
163
+ /**
164
+ * Cancels the stream and closes the underlying HTTP connection.
165
+ *
166
+ * Simply dropping the last handle before the stream is fully drained also tears the stream down,
167
+ * but if a pull is in flight the underlying connection is not released until that pull settles
168
+ * (up to the inter-read idle timeout). Call cancel() explicitly for prompt, deterministic
169
+ * teardown of the connection and its timers.
170
+ *
171
+ * Part [2] of the example below consumes only a prefix of a large result and then cancels. The
172
+ * rows that were never pulled are never transferred, so the cost of a prefix read is proportional
173
+ * to the prefix rather than to the full result:
174
+ *
175
+ * @snippet{trimleft} test_integration_examples_streaming.cxx example-query-stream-iterator
176
+ *
177
+ * After cancel(), @ref next() reports @ref errc::common::request_canceled — a terminal that has
178
+ * to be told apart from a genuine failure. Rows consumed before the cancel remain valid:
179
+ *
180
+ * @snippet{trimleft} test_integration_examples_streaming.cxx example-query-stream-errors
181
+ *
182
+ * @since 1.4.0
183
+ * @volatile
184
+ */
185
+ void cancel() const;
186
+
187
+ /**
188
+ * Sentinel returned by @ref end(). An @ref iterator compares equal to it once the stream has been
189
+ * fully drained (after any terminal error element). Using a distinct end type means iterators are
190
+ * only ever compared against the end sentinel, never against one another.
191
+ *
192
+ * @since 1.4.0
193
+ * @volatile
194
+ */
195
+ struct end_sentinel {
196
+ };
197
+
198
+ /**
199
+ * A single-pass input iterator that synchronously fetches rows one at a time.
200
+ *
201
+ * Dereferencing yields `std::pair<error, query_row>`: for a data row the error is falsy; if the
202
+ * stream ends with an error, the iterator visits exactly one final element whose error is truthy
203
+ * (and whose row is empty) before comparing equal to @ref end(). A clean end-of-stream yields no
204
+ * such element. This guarantees a `for (auto [err, row] : result)` loop can observe a terminal
205
+ * error rather than silently stopping.
206
+ *
207
+ * @snippet{trimleft} test_integration_examples_streaming.cxx example-query-stream-iterator
208
+ *
209
+ * Part [2] of the error-handling example shows the terminal element being observed rather than
210
+ * silently truncating the result:
211
+ *
212
+ * @snippet{trimleft} test_integration_examples_streaming.cxx example-query-stream-errors
213
+ *
214
+ * This is a minimal single-pass iterator intended for range-based for and manual
215
+ * `while (it != result.end())` loops. It compares only against @ref end() (never against another
216
+ * iterator), and provides neither `operator->` nor post-increment, so it is deliberately not a
217
+ * `LegacyInputIterator` and does not work with `<algorithm>` or `std::distance`. @ref begin()
218
+ * must be called once.
219
+ *
220
+ * @since 1.4.0
221
+ * @volatile
222
+ */
223
+ class iterator
224
+ {
225
+ public:
226
+ auto operator*() const -> std::pair<error, query_row>;
227
+ auto operator++() -> iterator&;
228
+
229
+ /**
230
+ * Constructs an iterator over an internal result; prefer @ref begin().
231
+ *
232
+ * @since 1.4.0
233
+ * @internal
234
+ */
235
+ explicit iterator(std::shared_ptr<internal_query_stream_result> internal);
236
+
237
+ /**
238
+ * Compares an iterator against the end sentinel. Provided in both argument orders (and as
239
+ * both @c == and @c !=) so the range-for idiom, `while (it != result.end())` loops, and wrapper
240
+ * code all work regardless of which operand is written first. Iterators are intentionally never
241
+ * comparable to one another: a single-pass stream has one position, so iterator-to-iterator
242
+ * equality would be meaningless — the type only ever compares against @ref end().
243
+ */
244
+ friend auto operator==(const iterator& it, end_sentinel /* end */) -> bool
245
+ {
246
+ return it.terminal_;
247
+ }
248
+ friend auto operator==(end_sentinel end, const iterator& it) -> bool
249
+ {
250
+ return it == end;
251
+ }
252
+ friend auto operator!=(const iterator& it, end_sentinel end) -> bool
253
+ {
254
+ return !(it == end);
255
+ }
256
+ friend auto operator!=(end_sentinel end, const iterator& it) -> bool
257
+ {
258
+ return !(it == end);
259
+ }
260
+
261
+ // Intentionally no std::iterator_traits typedefs (notably no iterator_category). This is a
262
+ // deliberately minimal single-pass iterator for range-based for and `while (it !=
263
+ // result.end())` loops only (see the class doc); it omits post-increment and operator->.
264
+ // Declaring an input_iterator_tag while omitting those would falsely advertise
265
+ // LegacyInputIterator / std::input_iterator conformance and could break generic code that
266
+ // trusts iterator_traits. Range-based for needs none of these typedefs.
267
+
268
+ private:
269
+ void fetch_item();
270
+
271
+ std::shared_ptr<internal_query_stream_result> internal_{};
272
+ std::pair<error, query_row> item_{};
273
+ bool terminal_{ false };
274
+ // Set when fetch_item() lands on a terminal error: the error element is delivered once (the
275
+ // iterator is not yet equal to end()), and the next increment advances to true end.
276
+ bool error_pending_{ false };
277
+ };
278
+
279
+ /**
280
+ * Returns an iterator to the beginning.
281
+ *
282
+ * @return iterator to the first row
283
+ *
284
+ * @since 1.4.0
285
+ * @volatile
286
+ */
287
+ [[nodiscard]] auto begin() const -> iterator;
288
+
289
+ /**
290
+ * Returns the end sentinel.
291
+ *
292
+ * @return sentinel that an @ref iterator compares equal to once the stream is drained
293
+ *
294
+ * @since 1.4.0
295
+ * @volatile
296
+ */
297
+ [[nodiscard]] auto end() const -> end_sentinel;
298
+
299
+ private:
300
+ std::shared_ptr<internal_query_stream_result> internal_{};
301
+ };
302
+ } // namespace couchbase
@@ -31,15 +31,15 @@ namespace couchbase
31
31
  * parameter with the number to boost the search. For example perform
32
32
  * @ref match_query for pool in both the name and description fields, but documents having the term
33
33
  * in the name field score higher.
34
- * @snippet{trimleft} test_unit_search.cxx search-query-string-boosting
34
+ * @snippet{trimleft} unit/management/search.cxx search-query-string-boosting
35
35
  *
36
36
  * 2. You can perform date or numeric range searches by using the `>`, `>=`, `<`, and `<=`
37
37
  * operators, followed by a date value in quotes. For example, perform a @ref date_range_query on
38
38
  * the created field for values after September 21, 2016.
39
- * @snippet{trimleft} test_unit_search.cxx search-query-string-date-range
39
+ * @snippet{trimleft} unit/management/search.cxx search-query-string-date-range
40
40
  * Or, perform a @ref numeric_range_query on the `reviews.ratings.Cleanliness` field, for values
41
41
  * greater than 4.
42
- * @snippet{trimleft} test_unit_search.cxx search-query-string-numeric-range
42
+ * @snippet{trimleft} unit/management/search.cxx search-query-string-numeric-range
43
43
  *
44
44
  * @see https://docs.couchbase.com/server/current/fts/fts-query-string-syntax.html definition of
45
45
  * query syntax
@@ -28,7 +28,7 @@ namespace couchbase
28
28
  * Finds documents containing terms that match the specified regular expression.
29
29
  *
30
30
  * Match documents where field `reviews.content` contains words starting with `"inter"`:
31
- * @snippet{trimleft} test_unit_search.cxx search-regexp
31
+ * @snippet{trimleft} unit/management/search.cxx search-regexp
32
32
  *
33
33
  * @see https://docs.couchbase.com/server/current/fts/fts-supported-queries-regexp.html server
34
34
  * documentation
@@ -73,8 +73,8 @@ struct replace_options : public common_durability_options<replace_options> {
73
73
  *
74
74
  * If true, and the document exists, its expiry will not be modified. Otherwise the document's
75
75
  * expiry is determined by
76
- * {@link #expiry(std::chrono::seconds)} or {@link
77
- * #expiry(std::chrono::system_clock::time_point)}.
76
+ * {@link #expiry expiry(std::chrono::seconds)} or {@link #expiry
77
+ * expiry(std::chrono::system_clock::time_point)}.
78
78
  *
79
79
  * Requires Couchbase Server 7.0 or later.
80
80
  *
@@ -94,7 +94,7 @@ struct replace_options : public common_durability_options<replace_options> {
94
94
  * Sets the expiry for the document. By default the document will never expire.
95
95
  *
96
96
  * The duration must be less than 50 years. For expiry further in the future, use
97
- * {@link #expiry(std::chrono::system_clock::time_point)}.
97
+ * {@link #expiry expiry(std::chrono::system_clock::time_point)}.
98
98
  *
99
99
  * @param duration the duration after which the document will expire (zero duration means never
100
100
  * expire).
@@ -56,7 +56,7 @@ public:
56
56
  * @param node_id identity of the node that served the request
57
57
  *
58
58
  * @since 1.3.2
59
- * @uncommitted
59
+ * @internal
60
60
  */
61
61
  result(couchbase::cas cas, couchbase::node_id node_id)
62
62
  : cas_(cas)
@@ -65,7 +65,7 @@ public:
65
65
  }
66
66
 
67
67
  /**
68
- * @return
68
+ * @return CAS value associated with the operation result.
69
69
  *
70
70
  * @since 1.0.0
71
71
  * @committed
@@ -92,10 +92,21 @@ public:
92
92
  }
93
93
 
94
94
  /**
95
+ * Implementation-only setter used by @c core::impl::invoke_with_node_id to
96
+ * propagate the node identity from a KV error context onto the result.
97
+ *
98
+ * Despite living in the public header (it is needed to set the field on
99
+ * the public-facing result-derived types from a template instantiation in
100
+ * the impl layer), this is **not** part of the user-facing API. The name
101
+ * is deliberately noisy — @c @internal alone is documentation-only and
102
+ * does not stop a user discovering @c result.node_id(...) via
103
+ * autocomplete; @c set_node_id_internal is harder to mistake for a
104
+ * documented mutator.
105
+ *
95
106
  * @since 1.3.2
96
107
  * @internal
97
108
  */
98
- void node_id(couchbase::node_id id)
109
+ void set_node_id_internal(couchbase::node_id id)
99
110
  {
100
111
  node_id_ = std::move(id);
101
112
  }
@@ -62,6 +62,7 @@ public:
62
62
  * @param cas
63
63
  * @param value raw document contents along with flags describing its structure
64
64
  * @param expiry_time optional point in time when the document will expire
65
+ * @param crypto_manager manager handed to the transcoder to decrypt encrypted fields
65
66
  *
66
67
  * @since 1.0.0
67
68
  * @internal
@@ -113,6 +113,52 @@ public:
113
113
  [[nodiscard]] auto query(std::string statement, const query_options& options = {}) const
114
114
  -> std::future<std::pair<error, query_result>>;
115
115
 
116
+ /**
117
+ * Performs a streaming query against the query (N1QL) services.
118
+ *
119
+ * The handler resolves as soon as the response preamble has been parsed; rows are then pulled
120
+ * lazily from the @ref query_stream_result, so the full result is never buffered in memory.
121
+ *
122
+ * @note Prepared statements (@ref query_options#adhoc set to false) are not streamed: such a
123
+ * request falls back to the buffered @ref query() path and its rows are replayed through the
124
+ * returned handle.
125
+ *
126
+ * The handler runs on the library's I/O thread, so the stream must be drained with the callback
127
+ * @ref query_stream_result#next() overload rather than the blocking ones. The example is written
128
+ * against @ref cluster#query_stream(), but the scope-level overload behaves identically:
129
+ *
130
+ * @snippet{trimleft} test_integration_examples_streaming.cxx example-query-stream-async
131
+ *
132
+ * @param statement the N1QL query statement.
133
+ * @param options options to customize the query request.
134
+ * @param handler the handler that implements @ref query_stream_handler
135
+ *
136
+ * @since 1.4.0
137
+ * @volatile
138
+ */
139
+ void query_stream(std::string statement,
140
+ const query_options& options,
141
+ query_stream_handler&& handler) const;
142
+
143
+ /**
144
+ * Performs a streaming query against the query (N1QL) services.
145
+ *
146
+ * Unqualified keyspaces in the statement resolve against this scope, so it names the collection
147
+ * rather than the bucket. The result can be consumed with a range-based for loop, and abandoned
148
+ * early without transferring the rows that were never read:
149
+ *
150
+ * @snippet{trimleft} test_integration_examples_streaming.cxx example-query-stream-iterator
151
+ *
152
+ * @param statement the N1QL query statement.
153
+ * @param options options to customize the query request.
154
+ * @return future object that carries the streaming result handle
155
+ *
156
+ * @since 1.4.0
157
+ * @volatile
158
+ */
159
+ [[nodiscard]] auto query_stream(std::string statement, const query_options& options = {}) const
160
+ -> std::future<std::pair<error, query_stream_result>>;
161
+
116
162
  /**
117
163
  * Performs a request against the full text search services.
118
164
  *
@@ -190,8 +236,45 @@ public:
190
236
  * @since 1.0.0
191
237
  * @committed
192
238
  */
193
- [[nodiscard]] auto analytics_query(std::string statement, const analytics_options& options = {})
194
- const -> std::future<std::pair<error, analytics_result>>;
239
+ [[nodiscard]] auto analytics_query(std::string statement,
240
+ const analytics_options& options = {}) const
241
+ -> std::future<std::pair<error, analytics_result>>;
242
+
243
+ /**
244
+ * Performs a streaming query against the analytics services.
245
+ *
246
+ * The handler resolves as soon as the response preamble has been parsed; rows are then pulled
247
+ * lazily from the @ref analytics_stream_result, so the full result is never buffered in memory.
248
+ *
249
+ * @param statement the analytics query statement.
250
+ * @param options options to customize the query request.
251
+ * @param handler the handler that implements @ref analytics_stream_handler
252
+ *
253
+ * @since 1.4.0
254
+ * @volatile
255
+ */
256
+ void analytics_query_stream(std::string statement,
257
+ const analytics_options& options,
258
+ analytics_stream_handler&& handler) const;
259
+
260
+ /**
261
+ * Performs a streaming query against the analytics services.
262
+ *
263
+ * The example is written against @ref cluster#analytics_query_stream(), but the scope-level
264
+ * overload behaves identically apart from resolving the statement against this scope:
265
+ *
266
+ * @snippet{trimleft} test_integration_examples_streaming.cxx example-analytics-stream
267
+ *
268
+ * @param statement the analytics query statement.
269
+ * @param options options to customize the query request.
270
+ * @return future object that carries the streaming result handle
271
+ *
272
+ * @since 1.4.0
273
+ * @volatile
274
+ */
275
+ [[nodiscard]] auto analytics_query_stream(std::string statement,
276
+ const analytics_options& options = {}) const
277
+ -> std::future<std::pair<error, analytics_stream_result>>;
195
278
 
196
279
  /**
197
280
  * Provides access to search index management services at the scope level