couchbase 3.8.2 → 3.9.1

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 +136 -23
  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 +82 -7
  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 +1551 -397
  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 +60 -6
  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 +13 -37
  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 +33 -1
  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
@@ -68,6 +68,7 @@ VALUE eDocumentLocked;
68
68
  VALUE eDocumentNotFound;
69
69
  VALUE eDocumentNotLocked;
70
70
  VALUE eDocumentNotJson;
71
+ VALUE eDocumentNotFoundOnReplica;
71
72
  VALUE eDurabilityAmbiguous;
72
73
  VALUE eDurabilityImpossible;
73
74
  VALUE eDurabilityLevelNotAvailable;
@@ -96,6 +97,8 @@ VALUE ePathTooBig;
96
97
  VALUE ePathTooDeep;
97
98
  VALUE ePlanningFailure;
98
99
  VALUE ePreparedStatementFailure;
100
+ VALUE eReplicaIndexCurrentlyUnavailable;
101
+ VALUE eReplicaIndexOutOfBounds;
99
102
  VALUE eRequestCanceled;
100
103
  VALUE eScopeExists;
101
104
  VALUE eScopeNotFound;
@@ -143,6 +146,27 @@ VALUE eBucketClosed;
143
146
 
144
147
  } // namespace
145
148
 
149
+ auto
150
+ cb_exc_new(VALUE exc_type, const std::string& message) -> VALUE
151
+ {
152
+ VALUE exc = Qnil;
153
+ const char* text = message.c_str();
154
+ cb_protect([exc_type, text, &exc] {
155
+ exc = rb_exc_new_cstr(exc_type, text);
156
+ });
157
+ return exc;
158
+ }
159
+
160
+ auto
161
+ cb_exc_new(VALUE exc_type, VALUE message) -> VALUE
162
+ {
163
+ VALUE exc = Qnil;
164
+ cb_protect([exc_type, message, &exc] {
165
+ exc = rb_exc_new_str(exc_type, message);
166
+ });
167
+ return exc;
168
+ }
169
+
146
170
  ruby_exception::ruby_exception(VALUE exc)
147
171
  : std::runtime_error("ruby_exception")
148
172
  , exc_{ exc }
@@ -151,13 +175,13 @@ ruby_exception::ruby_exception(VALUE exc)
151
175
 
152
176
  ruby_exception::ruby_exception(VALUE exc_type, VALUE exc_message)
153
177
  : std::runtime_error("ruby_exception")
154
- , exc_{ rb_exc_new_str(exc_type, exc_message) }
178
+ , exc_{ cb_exc_new(exc_type, exc_message) }
155
179
  {
156
180
  }
157
181
 
158
182
  ruby_exception::ruby_exception(VALUE exc_type, const std::string& exc_message)
159
183
  : std::runtime_error("ruby_exception")
160
- , exc_{ rb_exc_new_cstr(exc_type, exc_message.c_str()) }
184
+ , exc_{ cb_exc_new(exc_type, exc_message) }
161
185
  {
162
186
  }
163
187
 
@@ -167,6 +191,17 @@ ruby_exception::exception_object() const
167
191
  return exc_;
168
192
  }
169
193
 
194
+ ruby_jump::ruby_jump(int state)
195
+ : state_{ state }
196
+ {
197
+ }
198
+
199
+ auto
200
+ ruby_jump::state() const -> int
201
+ {
202
+ return state_;
203
+ }
204
+
170
205
  void
171
206
  init_exceptions(VALUE mCouchbase)
172
207
  {
@@ -197,6 +232,8 @@ init_exceptions(VALUE mCouchbase)
197
232
  eDocumentIrretrievable = rb_define_class_under(mError, "DocumentIrretrievable", eCouchbaseError);
198
233
  eDocumentLocked = rb_define_class_under(mError, "DocumentLocked", eCouchbaseError);
199
234
  eDocumentNotFound = rb_define_class_under(mError, "DocumentNotFound", eCouchbaseError);
235
+ eDocumentNotFoundOnReplica =
236
+ rb_define_class_under(mError, "DocumentNotFoundOnReplica", eDocumentNotFound);
200
237
  eDocumentNotLocked = rb_define_class_under(mError, "DocumentNotLocked", eCouchbaseError);
201
238
  eDocumentNotJson = rb_define_class_under(mError, "DocumentNotJson", eCouchbaseError);
202
239
  eDurabilityAmbiguous = rb_define_class_under(mError, "DurabilityAmbiguous", eCouchbaseError);
@@ -231,6 +268,10 @@ init_exceptions(VALUE mCouchbase)
231
268
  ePlanningFailure = rb_define_class_under(mError, "PlanningFailure", eCouchbaseError);
232
269
  ePreparedStatementFailure =
233
270
  rb_define_class_under(mError, "PreparedStatementFailure", eCouchbaseError);
271
+ eReplicaIndexCurrentlyUnavailable =
272
+ rb_define_class_under(mError, "ReplicaIndexCurrentlyUnavailable", eCouchbaseError);
273
+ eReplicaIndexOutOfBounds =
274
+ rb_define_class_under(mError, "ReplicaIndexOutOfBounds", eCouchbaseError);
234
275
  eRequestCanceled = rb_define_class_under(mError, "RequestCanceled", eCouchbaseError);
235
276
  eScopeExists = rb_define_class_under(mError, "ScopeExists", eCouchbaseError);
236
277
  eScopeNotFound = rb_define_class_under(mError, "ScopeNotFound", eCouchbaseError);
@@ -301,304 +342,313 @@ cb_map_error_code(std::error_code ec, const std::string& message, bool include_e
301
342
  if (ec.category() == core::impl::common_category()) {
302
343
  switch (static_cast<errc::common>(ec.value())) {
303
344
  case errc::common::unambiguous_timeout:
304
- return rb_exc_new_cstr(eUnambiguousTimeout, what.c_str());
345
+ return cb_exc_new(eUnambiguousTimeout, what);
305
346
 
306
347
  case errc::common::ambiguous_timeout:
307
- return rb_exc_new_cstr(eAmbiguousTimeout, what.c_str());
348
+ return cb_exc_new(eAmbiguousTimeout, what);
308
349
 
309
350
  case errc::common::request_canceled:
310
- return rb_exc_new_cstr(eRequestCanceled, what.c_str());
351
+ return cb_exc_new(eRequestCanceled, what);
311
352
 
312
353
  case errc::common::invalid_argument:
313
- return rb_exc_new_cstr(eInvalidArgument, what.c_str());
354
+ return cb_exc_new(eInvalidArgument, what);
314
355
 
315
356
  case errc::common::service_not_available:
316
- return rb_exc_new_cstr(eServiceNotAvailable, what.c_str());
357
+ return cb_exc_new(eServiceNotAvailable, what);
317
358
 
318
359
  case errc::common::internal_server_failure:
319
- return rb_exc_new_cstr(eInternalServerFailure, what.c_str());
360
+ return cb_exc_new(eInternalServerFailure, what);
320
361
 
321
362
  case errc::common::authentication_failure:
322
- return rb_exc_new_cstr(eAuthenticationFailure, what.c_str());
363
+ return cb_exc_new(eAuthenticationFailure, what);
323
364
 
324
365
  case errc::common::temporary_failure:
325
- return rb_exc_new_cstr(eTemporaryFailure, what.c_str());
366
+ return cb_exc_new(eTemporaryFailure, what);
326
367
 
327
368
  case errc::common::parsing_failure:
328
- return rb_exc_new_cstr(eParsingFailure, what.c_str());
369
+ return cb_exc_new(eParsingFailure, what);
329
370
 
330
371
  case errc::common::cas_mismatch:
331
- return rb_exc_new_cstr(eCasMismatch, what.c_str());
372
+ return cb_exc_new(eCasMismatch, what);
332
373
 
333
374
  case errc::common::bucket_not_found:
334
- return rb_exc_new_cstr(eBucketNotFound, what.c_str());
375
+ return cb_exc_new(eBucketNotFound, what);
335
376
 
336
377
  case errc::common::scope_not_found:
337
- return rb_exc_new_cstr(eScopeNotFound, what.c_str());
378
+ return cb_exc_new(eScopeNotFound, what);
338
379
 
339
380
  case errc::common::collection_not_found:
340
- return rb_exc_new_cstr(eCollectionNotFound, what.c_str());
381
+ return cb_exc_new(eCollectionNotFound, what);
341
382
 
342
383
  case errc::common::unsupported_operation:
343
- return rb_exc_new_cstr(eUnsupportedOperation, what.c_str());
384
+ return cb_exc_new(eUnsupportedOperation, what);
344
385
 
345
386
  case errc::common::feature_not_available:
346
- return rb_exc_new_cstr(eFeatureNotAvailable, what.c_str());
387
+ return cb_exc_new(eFeatureNotAvailable, what);
347
388
 
348
389
  case errc::common::encoding_failure:
349
- return rb_exc_new_cstr(eEncodingFailure, what.c_str());
390
+ return cb_exc_new(eEncodingFailure, what);
350
391
 
351
392
  case errc::common::decoding_failure:
352
- return rb_exc_new_cstr(eDecodingFailure, what.c_str());
393
+ return cb_exc_new(eDecodingFailure, what);
353
394
 
354
395
  case errc::common::index_not_found:
355
- return rb_exc_new_cstr(eIndexNotFound, what.c_str());
396
+ return cb_exc_new(eIndexNotFound, what);
356
397
 
357
398
  case errc::common::index_exists:
358
- return rb_exc_new_cstr(eIndexExists, what.c_str());
399
+ return cb_exc_new(eIndexExists, what);
359
400
 
360
401
  case errc::common::rate_limited:
361
- return rb_exc_new_cstr(eRateLimited, what.c_str());
402
+ return cb_exc_new(eRateLimited, what);
362
403
 
363
404
  case errc::common::quota_limited:
364
- return rb_exc_new_cstr(eQuotaLimited, what.c_str());
405
+ return cb_exc_new(eQuotaLimited, what);
365
406
  }
366
407
  } else if (ec.category() == core::impl::key_value_category()) {
367
408
  switch (static_cast<errc::key_value>(ec.value())) {
368
409
  case errc::key_value::document_not_found:
369
- return rb_exc_new_cstr(eDocumentNotFound, what.c_str());
410
+ return cb_exc_new(eDocumentNotFound, what);
370
411
 
371
412
  case errc::key_value::document_irretrievable:
372
- return rb_exc_new_cstr(eDocumentIrretrievable, what.c_str());
413
+ return cb_exc_new(eDocumentIrretrievable, what);
414
+
415
+ case errc::key_value::document_not_found_on_replica:
416
+ return cb_exc_new(eDocumentNotFoundOnReplica, what);
417
+
418
+ case errc::key_value::replica_index_out_of_bounds:
419
+ return cb_exc_new(eReplicaIndexOutOfBounds, what);
420
+
421
+ case errc::key_value::replica_index_currently_unavailable:
422
+ return cb_exc_new(eReplicaIndexCurrentlyUnavailable, what);
373
423
 
374
424
  case errc::key_value::document_locked:
375
- return rb_exc_new_cstr(eDocumentLocked, what.c_str());
425
+ return cb_exc_new(eDocumentLocked, what);
376
426
 
377
427
  case errc::key_value::document_not_locked:
378
- return rb_exc_new_cstr(eDocumentNotLocked, what.c_str());
428
+ return cb_exc_new(eDocumentNotLocked, what);
379
429
 
380
430
  case errc::key_value::value_too_large:
381
- return rb_exc_new_cstr(eValueTooLarge, what.c_str());
431
+ return cb_exc_new(eValueTooLarge, what);
382
432
 
383
433
  case errc::key_value::document_exists:
384
- return rb_exc_new_cstr(eDocumentExists, what.c_str());
434
+ return cb_exc_new(eDocumentExists, what);
385
435
 
386
436
  case errc::key_value::durability_level_not_available:
387
- return rb_exc_new_cstr(eDurabilityLevelNotAvailable, what.c_str());
437
+ return cb_exc_new(eDurabilityLevelNotAvailable, what);
388
438
 
389
439
  case errc::key_value::durability_impossible:
390
- return rb_exc_new_cstr(eDurabilityImpossible, what.c_str());
440
+ return cb_exc_new(eDurabilityImpossible, what);
391
441
 
392
442
  case errc::key_value::durability_ambiguous:
393
- return rb_exc_new_cstr(eDurabilityAmbiguous, what.c_str());
443
+ return cb_exc_new(eDurabilityAmbiguous, what);
394
444
 
395
445
  case errc::key_value::durable_write_in_progress:
396
- return rb_exc_new_cstr(eDurableWriteInProgress, what.c_str());
446
+ return cb_exc_new(eDurableWriteInProgress, what);
397
447
 
398
448
  case errc::key_value::durable_write_re_commit_in_progress:
399
- return rb_exc_new_cstr(eDurableWriteReCommitInProgress, what.c_str());
449
+ return cb_exc_new(eDurableWriteReCommitInProgress, what);
400
450
 
401
451
  case errc::key_value::mutation_token_outdated:
402
- return rb_exc_new_cstr(eMutationTokenOutdated, what.c_str());
452
+ return cb_exc_new(eMutationTokenOutdated, what);
403
453
 
404
454
  case errc::key_value::path_not_found:
405
- return rb_exc_new_cstr(ePathNotFound, what.c_str());
455
+ return cb_exc_new(ePathNotFound, what);
406
456
 
407
457
  case errc::key_value::path_mismatch:
408
- return rb_exc_new_cstr(ePathMismatch, what.c_str());
458
+ return cb_exc_new(ePathMismatch, what);
409
459
 
410
460
  case errc::key_value::path_invalid:
411
- return rb_exc_new_cstr(ePathInvalid, what.c_str());
461
+ return cb_exc_new(ePathInvalid, what);
412
462
 
413
463
  case errc::key_value::path_too_big:
414
- return rb_exc_new_cstr(ePathTooBig, what.c_str());
464
+ return cb_exc_new(ePathTooBig, what);
415
465
 
416
466
  case errc::key_value::path_too_deep:
417
- return rb_exc_new_cstr(ePathTooDeep, what.c_str());
467
+ return cb_exc_new(ePathTooDeep, what);
418
468
 
419
469
  case errc::key_value::value_too_deep:
420
- return rb_exc_new_cstr(eValueTooDeep, what.c_str());
470
+ return cb_exc_new(eValueTooDeep, what);
421
471
 
422
472
  case errc::key_value::value_invalid:
423
- return rb_exc_new_cstr(eValueInvalid, what.c_str());
473
+ return cb_exc_new(eValueInvalid, what);
424
474
 
425
475
  case errc::key_value::document_not_json:
426
- return rb_exc_new_cstr(eDocumentNotJson, what.c_str());
476
+ return cb_exc_new(eDocumentNotJson, what);
427
477
 
428
478
  case errc::key_value::number_too_big:
429
- return rb_exc_new_cstr(eNumberTooBig, what.c_str());
479
+ return cb_exc_new(eNumberTooBig, what);
430
480
 
431
481
  case errc::key_value::delta_invalid:
432
- return rb_exc_new_cstr(eDeltaInvalid, what.c_str());
482
+ return cb_exc_new(eDeltaInvalid, what);
433
483
 
434
484
  case errc::key_value::path_exists:
435
- return rb_exc_new_cstr(ePathExists, what.c_str());
485
+ return cb_exc_new(ePathExists, what);
436
486
 
437
487
  case errc::key_value::xattr_unknown_macro:
438
- return rb_exc_new_cstr(eXattrUnknownMacro, what.c_str());
488
+ return cb_exc_new(eXattrUnknownMacro, what);
439
489
 
440
490
  case errc::key_value::xattr_invalid_key_combo:
441
- return rb_exc_new_cstr(eXattrInvalidKeyCombo, what.c_str());
491
+ return cb_exc_new(eXattrInvalidKeyCombo, what);
442
492
 
443
493
  case errc::key_value::xattr_unknown_virtual_attribute:
444
- return rb_exc_new_cstr(eXattrUnknownVirtualAttribute, what.c_str());
494
+ return cb_exc_new(eXattrUnknownVirtualAttribute, what);
445
495
 
446
496
  case errc::key_value::xattr_cannot_modify_virtual_attribute:
447
- return rb_exc_new_cstr(eXattrCannotModifyVirtualAttribute, what.c_str());
497
+ return cb_exc_new(eXattrCannotModifyVirtualAttribute, what);
448
498
 
449
499
  case errc::key_value::xattr_no_access:
450
- return rb_exc_new_cstr(eXattrNoAccess, what.c_str());
500
+ return cb_exc_new(eXattrNoAccess, what);
451
501
 
452
502
  case errc::key_value::cannot_revive_living_document:
453
- return rb_exc_new_cstr(eCannotReviveLivingDocument, what.c_str());
503
+ return cb_exc_new(eCannotReviveLivingDocument, what);
454
504
 
455
505
  case errc::key_value::range_scan_completed:
456
506
  // Should not be exposed to the Ruby SDK, map it to a BackendError
457
- return rb_exc_new_cstr(eBackendError, what.c_str());
507
+ return cb_exc_new(eBackendError, what);
458
508
  }
459
509
  } else if (ec.category() == core::impl::query_category()) {
460
510
  switch (static_cast<errc::query>(ec.value())) {
461
511
  case errc::query::planning_failure:
462
- return rb_exc_new_cstr(ePlanningFailure, what.c_str());
512
+ return cb_exc_new(ePlanningFailure, what);
463
513
 
464
514
  case errc::query::index_failure:
465
- return rb_exc_new_cstr(eIndexFailure, what.c_str());
515
+ return cb_exc_new(eIndexFailure, what);
466
516
 
467
517
  case errc::query::prepared_statement_failure:
468
- return rb_exc_new_cstr(ePreparedStatementFailure, what.c_str());
518
+ return cb_exc_new(ePreparedStatementFailure, what);
469
519
 
470
520
  case errc::query::dml_failure:
471
- return rb_exc_new_cstr(eDmlFailure, what.c_str());
521
+ return cb_exc_new(eDmlFailure, what);
472
522
  }
473
523
  } else if (ec.category() == core::impl::search_category()) {
474
524
  switch (static_cast<errc::search>(ec.value())) {
475
525
  case errc::search::index_not_ready:
476
- return rb_exc_new_cstr(eIndexNotReady, what.c_str());
526
+ return cb_exc_new(eIndexNotReady, what);
477
527
  case errc::search::consistency_mismatch:
478
- return rb_exc_new_cstr(eConsistencyMismatch, what.c_str());
528
+ return cb_exc_new(eConsistencyMismatch, what);
479
529
  }
480
530
  } else if (ec.category() == core::impl::view_category()) {
481
531
  switch (static_cast<errc::view>(ec.value())) {
482
532
  case errc::view::view_not_found:
483
- return rb_exc_new_cstr(eViewNotFound, what.c_str());
533
+ return cb_exc_new(eViewNotFound, what);
484
534
 
485
535
  case errc::view::design_document_not_found:
486
- return rb_exc_new_cstr(eDesignDocumentNotFound, what.c_str());
536
+ return cb_exc_new(eDesignDocumentNotFound, what);
487
537
  }
488
538
  } else if (ec.category() == core::impl::analytics_category()) {
489
539
  switch (static_cast<errc::analytics>(ec.value())) {
490
540
  case errc::analytics::compilation_failure:
491
- return rb_exc_new_cstr(eCompilationFailure, what.c_str());
541
+ return cb_exc_new(eCompilationFailure, what);
492
542
 
493
543
  case errc::analytics::job_queue_full:
494
- return rb_exc_new_cstr(eJobQueueFull, what.c_str());
544
+ return cb_exc_new(eJobQueueFull, what);
495
545
 
496
546
  case errc::analytics::dataset_not_found:
497
- return rb_exc_new_cstr(eDatasetNotFound, what.c_str());
547
+ return cb_exc_new(eDatasetNotFound, what);
498
548
 
499
549
  case errc::analytics::dataverse_not_found:
500
- return rb_exc_new_cstr(eDataverseNotFound, what.c_str());
550
+ return cb_exc_new(eDataverseNotFound, what);
501
551
 
502
552
  case errc::analytics::dataset_exists:
503
- return rb_exc_new_cstr(eDatasetExists, what.c_str());
553
+ return cb_exc_new(eDatasetExists, what);
504
554
 
505
555
  case errc::analytics::dataverse_exists:
506
- return rb_exc_new_cstr(eDataverseExists, what.c_str());
556
+ return cb_exc_new(eDataverseExists, what);
507
557
 
508
558
  case errc::analytics::link_not_found:
509
- return rb_exc_new_cstr(eLinkNotFound, what.c_str());
559
+ return cb_exc_new(eLinkNotFound, what);
510
560
 
511
561
  case errc::analytics::link_exists:
512
- return rb_exc_new_cstr(eLinkExists, what.c_str());
562
+ return cb_exc_new(eLinkExists, what);
513
563
  }
514
564
  } else if (ec.category() == core::impl::management_category()) {
515
565
  switch (static_cast<errc::management>(ec.value())) {
516
566
  case errc::management::collection_exists:
517
- return rb_exc_new_cstr(eCollectionExists, what.c_str());
567
+ return cb_exc_new(eCollectionExists, what);
518
568
 
519
569
  case errc::management::scope_exists:
520
- return rb_exc_new_cstr(eScopeExists, what.c_str());
570
+ return cb_exc_new(eScopeExists, what);
521
571
 
522
572
  case errc::management::user_not_found:
523
- return rb_exc_new_cstr(eUserNotFound, what.c_str());
573
+ return cb_exc_new(eUserNotFound, what);
524
574
 
525
575
  case errc::management::group_not_found:
526
- return rb_exc_new_cstr(eGroupNotFound, what.c_str());
576
+ return cb_exc_new(eGroupNotFound, what);
527
577
 
528
578
  case errc::management::user_exists:
529
- return rb_exc_new_cstr(eUserExists, what.c_str());
579
+ return cb_exc_new(eUserExists, what);
530
580
 
531
581
  case errc::management::bucket_exists:
532
- return rb_exc_new_cstr(eBucketExists, what.c_str());
582
+ return cb_exc_new(eBucketExists, what);
533
583
 
534
584
  case errc::management::bucket_not_flushable:
535
- return rb_exc_new_cstr(eBucketNotFlushable, what.c_str());
585
+ return cb_exc_new(eBucketNotFlushable, what);
536
586
 
537
587
  case errc::management::eventing_function_not_found:
538
- return rb_exc_new_cstr(eEventingFunctionNotFound, what.c_str());
588
+ return cb_exc_new(eEventingFunctionNotFound, what);
539
589
 
540
590
  case errc::management::eventing_function_not_deployed:
541
- return rb_exc_new_cstr(eEventingFunctionNotDeployed, what.c_str());
591
+ return cb_exc_new(eEventingFunctionNotDeployed, what);
542
592
 
543
593
  case errc::management::eventing_function_compilation_failure:
544
- return rb_exc_new_cstr(eEventingFunctionCompilationFailure, what.c_str());
594
+ return cb_exc_new(eEventingFunctionCompilationFailure, what);
545
595
 
546
596
  case errc::management::eventing_function_identical_keyspace:
547
- return rb_exc_new_cstr(eEventingFunctionIdentialKeyspace, what.c_str());
597
+ return cb_exc_new(eEventingFunctionIdentialKeyspace, what);
548
598
 
549
599
  case errc::management::eventing_function_not_bootstrapped:
550
- return rb_exc_new_cstr(eEventingFunctionNotBootstrapped, what.c_str());
600
+ return cb_exc_new(eEventingFunctionNotBootstrapped, what);
551
601
 
552
602
  case errc::management::eventing_function_deployed:
553
- return rb_exc_new_cstr(eEventingFunctionDeployed, what.c_str());
603
+ return cb_exc_new(eEventingFunctionDeployed, what);
554
604
 
555
605
  case errc::management::eventing_function_paused:
556
- return rb_exc_new_cstr(eEventingFunctionPaused, what.c_str());
606
+ return cb_exc_new(eEventingFunctionPaused, what);
557
607
  }
558
608
  } else if (ec.category() == core::impl::network_category()) {
559
609
  switch (static_cast<errc::network>(ec.value())) {
560
610
  case errc::network::resolve_failure:
561
- return rb_exc_new_cstr(eResolveFailure, what.c_str());
611
+ return cb_exc_new(eResolveFailure, what);
562
612
 
563
613
  case errc::network::no_endpoints_left:
564
- return rb_exc_new_cstr(eNoEndpointsLeft, what.c_str());
614
+ return cb_exc_new(eNoEndpointsLeft, what);
565
615
 
566
616
  case errc::network::handshake_failure:
567
- return rb_exc_new_cstr(eHandshakeFailure, what.c_str());
617
+ return cb_exc_new(eHandshakeFailure, what);
568
618
 
569
619
  case errc::network::protocol_error:
570
- return rb_exc_new_cstr(eProtocolError, what.c_str());
620
+ return cb_exc_new(eProtocolError, what);
571
621
 
572
622
  case errc::network::configuration_not_available:
573
- return rb_exc_new_cstr(eConfigurationNotAvailable, what.c_str());
623
+ return cb_exc_new(eConfigurationNotAvailable, what);
574
624
 
575
625
  case errc::network::cluster_closed:
576
- return rb_exc_new_cstr(eClusterClosed, what.c_str());
626
+ return cb_exc_new(eClusterClosed, what);
577
627
 
578
628
  case errc::network::end_of_stream:
579
- return rb_exc_new_cstr(eEndOfStream, what.c_str());
629
+ return cb_exc_new(eEndOfStream, what);
580
630
 
581
631
  case errc::network::need_more_data:
582
- return rb_exc_new_cstr(eNeedMoreData, what.c_str());
632
+ return cb_exc_new(eNeedMoreData, what);
583
633
 
584
634
  case errc::network::operation_queue_closed:
585
- return rb_exc_new_cstr(eOperationQueueClosed, what.c_str());
635
+ return cb_exc_new(eOperationQueueClosed, what);
586
636
 
587
637
  case errc::network::operation_queue_full:
588
- return rb_exc_new_cstr(eOperationQueueFull, what.c_str());
638
+ return cb_exc_new(eOperationQueueFull, what);
589
639
 
590
640
  case errc::network::request_already_queued:
591
- return rb_exc_new_cstr(eRequestAlreadyQueued, what.c_str());
641
+ return cb_exc_new(eRequestAlreadyQueued, what);
592
642
 
593
643
  case errc::network::request_cancelled:
594
- return rb_exc_new_cstr(eNetworkRequestCanceled, what.c_str());
644
+ return cb_exc_new(eNetworkRequestCanceled, what);
595
645
 
596
646
  case errc::network::bucket_closed:
597
- return rb_exc_new_cstr(eBucketClosed, what.c_str());
647
+ return cb_exc_new(eBucketClosed, what);
598
648
  }
599
649
  }
600
650
 
601
- return rb_exc_new_cstr(eBackendError, what.c_str());
651
+ return cb_exc_new(eBackendError, what);
602
652
  }
603
653
 
604
654
  [[noreturn]] void
@@ -912,8 +962,11 @@ cb_map_error(const core::error_context::search& ctx, const std::string& message)
912
962
  cb_map_error(const error& err, const std::string& message)
913
963
  {
914
964
  VALUE exc = cb_map_error_code(err.ec(), fmt::format("{}: {}", message, err.message()), true);
915
- static const auto id_context_eq = rb_intern("context=");
916
- rb_funcall(exc, id_context_eq, 1, cb_str_new(err.ctx().to_json()));
965
+ VALUE context = cb_str_new(err.ctx().to_json());
966
+ cb_protect([exc, context] {
967
+ static const auto id_context_eq = rb_intern("context=");
968
+ rb_funcall(exc, id_context_eq, 1, context);
969
+ });
917
970
  if (auto cause = err.cause(); cause) {
918
971
  rb_iv_set(exc, "@cause", cb_map_error(cause.value(), "Caused by"));
919
972
  }
@@ -48,6 +48,8 @@ class ruby_exception : public std::runtime_error
48
48
  {
49
49
  public:
50
50
  explicit ruby_exception(VALUE exc);
51
+ // These build the exception through cb_exc_new, so they may be thrown only from a method body
52
+ // registered through cb_method.
51
53
  ruby_exception(VALUE exc_type, VALUE exc_message);
52
54
  ruby_exception(VALUE exc_type, const std::string& exc_message);
53
55
 
@@ -57,6 +59,21 @@ private:
57
59
  VALUE exc_;
58
60
  };
59
61
 
62
+ // A Ruby non-local exit (raise, throw, Thread#kill) stopped by rb_protect, carried through C++
63
+ // frames so that they unwind until cb_method resumes it with rb_jump_tag. What the exit carries
64
+ // stays in ec->errinfo, which GC marks. No Ruby code may run between the failed rb_protect and
65
+ // cb_method: code that rescues replaces errinfo, and rb_jump_tag would resume that instead.
66
+ class ruby_jump : public std::exception
67
+ {
68
+ public:
69
+ explicit ruby_jump(int state);
70
+
71
+ [[nodiscard]] auto state() const -> int;
72
+
73
+ private:
74
+ int state_;
75
+ };
76
+
60
77
  auto
61
78
  exc_feature_not_available() -> VALUE;
62
79
 
@@ -69,6 +86,14 @@ exc_cluster_closed() -> VALUE;
69
86
  auto
70
87
  exc_invalid_argument() -> VALUE;
71
88
 
89
+ // Builds an exception of exc_type under cb_protect: the exception classes define initialize in
90
+ // Ruby. Call it only from a method body registered through cb_method.
91
+ [[nodiscard]] auto
92
+ cb_exc_new(VALUE exc_type, const std::string& message) -> VALUE;
93
+
94
+ [[nodiscard]] auto
95
+ cb_exc_new(VALUE exc_type, VALUE message) -> VALUE;
96
+
72
97
  [[nodiscard]] auto
73
98
  cb_map_error_code(std::error_code ec,
74
99
  const std::string& message,
data/ext/rcb_extras.cxx CHANGED
@@ -52,7 +52,7 @@ cb_Backend_collections_manifest_get(VALUE self, VALUE bucket_name, VALUE timeout
52
52
  {
53
53
  auto cluster = cb_backend_to_core_api_cluster(self);
54
54
 
55
- Check_Type(bucket_name, T_STRING);
55
+ cb_check_type(bucket_name, T_STRING);
56
56
 
57
57
  try {
58
58
  core::operations::management::collections_manifest_get_request req{ core::document_id{
@@ -91,10 +91,8 @@ cb_Backend_collections_manifest_get(VALUE self, VALUE bucket_name, VALUE timeout
91
91
 
92
92
  return res;
93
93
  } catch (const std::system_error& se) {
94
- rb_exc_raise(cb_map_error_code(
94
+ throw ruby_exception(cb_map_error_code(
95
95
  se.code(), fmt::format("failed to perform {}: {}", __func__, se.what()), false));
96
- } catch (const ruby_exception& e) {
97
- rb_exc_raise(e.exception_object());
98
96
  }
99
97
  return Qnil;
100
98
  }
@@ -103,8 +101,8 @@ VALUE
103
101
  cb_Backend_dns_srv(VALUE self, VALUE hostname, VALUE service)
104
102
  {
105
103
  (void)self;
106
- Check_Type(hostname, T_STRING);
107
- Check_Type(service, T_SYMBOL);
104
+ cb_check_type(hostname, T_STRING);
105
+ cb_check_type(service, T_SYMBOL);
108
106
 
109
107
  bool tls = false;
110
108
 
@@ -113,8 +111,8 @@ cb_Backend_dns_srv(VALUE self, VALUE hostname, VALUE service)
113
111
  } else if (type == rb_intern("couchbases")) {
114
112
  tls = true;
115
113
  } else {
116
- rb_raise(rb_eArgError, "Unsupported service type: %+" PRIsVALUE, service);
117
- return Qnil;
114
+ throw ruby_exception(rb_eArgError,
115
+ cb_sprintf("Unsupported service type: %+" PRIsVALUE, service));
118
116
  }
119
117
 
120
118
  try {
@@ -152,10 +150,8 @@ cb_Backend_dns_srv(VALUE self, VALUE hostname, VALUE service)
152
150
  }
153
151
  return res;
154
152
  } catch (const std::system_error& se) {
155
- rb_exc_raise(cb_map_error_code(
153
+ throw ruby_exception(cb_map_error_code(
156
154
  se.code(), fmt::format("failed to perform {}: {}", __func__, se.what()), false));
157
- } catch (const ruby_exception& e) {
158
- rb_exc_raise(e.exception_object());
159
155
  }
160
156
  return Qnil;
161
157
  }
@@ -370,10 +366,8 @@ cb_Backend_cluster_enable_developer_preview(VALUE self)
370
366
  "upgrade. DO NOT USE IN PRODUCTION.");
371
367
  return Qtrue;
372
368
  } catch (const std::system_error& se) {
373
- rb_exc_raise(cb_map_error_code(
369
+ throw ruby_exception(cb_map_error_code(
374
370
  se.code(), fmt::format("failed to perform {}: {}", __func__, se.what()), false));
375
- } catch (const ruby_exception& e) {
376
- rb_exc_raise(e.exception_object());
377
371
  }
378
372
  return Qnil;
379
373
  }
@@ -384,11 +378,16 @@ void
384
378
  init_extras(VALUE cBackend)
385
379
  {
386
380
  /* utility function that are not intended for public usage */
387
- rb_define_method(cBackend, "collections_manifest_get", cb_Backend_collections_manifest_get, 2);
388
- rb_define_method(
389
- cBackend, "cluster_enable_developer_preview!", cb_Backend_cluster_enable_developer_preview, 0);
390
-
391
- rb_define_singleton_method(cBackend, "dns_srv", cb_Backend_dns_srv, 2);
381
+ rb_define_method(cBackend,
382
+ "collections_manifest_get",
383
+ cb_method<cb_Backend_collections_manifest_get>::invoke,
384
+ 2);
385
+ rb_define_method(cBackend,
386
+ "cluster_enable_developer_preview!",
387
+ cb_method<cb_Backend_cluster_enable_developer_preview>::invoke,
388
+ 0);
389
+
390
+ rb_define_singleton_method(cBackend, "dns_srv", cb_method<cb_Backend_dns_srv>::invoke, 2);
392
391
  rb_define_singleton_method(
393
392
  cBackend, "parse_connection_string", cb_Backend_parse_connection_string, 1);
394
393
  rb_define_singleton_method(cBackend, "snappy_compress", cb_Backend_snappy_compress, 1);