couchbase 3.8.1 → 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 (475) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  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 +214 -155
  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 +325 -25
  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 +66 -0
  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 +316 -317
  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 +275 -14
  131. data/ext/couchbase/core/io/streams.hxx +53 -0
  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/bucket_create.cxx +37 -38
  183. data/ext/couchbase/core/operations/management/bucket_update.cxx +26 -28
  184. data/ext/couchbase/core/operations/management/change_password.cxx +2 -0
  185. data/ext/couchbase/core/operations/management/collection_drop.cxx +5 -1
  186. data/ext/couchbase/core/operations/management/error_utils.cxx +59 -5
  187. data/ext/couchbase/core/operations/management/error_utils.hxx +29 -1
  188. data/ext/couchbase/core/operations/management/eventing_deploy_function.cxx +9 -3
  189. data/ext/couchbase/core/operations/management/eventing_drop_function.cxx +8 -3
  190. data/ext/couchbase/core/operations/management/eventing_get_all_functions.cxx +4 -2
  191. data/ext/couchbase/core/operations/management/eventing_get_function.cxx +5 -3
  192. data/ext/couchbase/core/operations/management/eventing_get_status.cxx +4 -2
  193. data/ext/couchbase/core/operations/management/eventing_pause_function.cxx +9 -3
  194. data/ext/couchbase/core/operations/management/eventing_resume_function.cxx +9 -3
  195. data/ext/couchbase/core/operations/management/eventing_undeploy_function.cxx +9 -3
  196. data/ext/couchbase/core/operations/management/eventing_upsert_function.cxx +9 -3
  197. data/ext/couchbase/core/operations/management/group_drop.cxx +3 -1
  198. data/ext/couchbase/core/operations/management/group_get.cxx +3 -1
  199. data/ext/couchbase/core/operations/management/group_upsert.cxx +11 -8
  200. data/ext/couchbase/core/operations/management/query_index_build.cxx +5 -2
  201. data/ext/couchbase/core/operations/management/query_index_create.cxx +9 -3
  202. data/ext/couchbase/core/operations/management/query_index_drop.cxx +11 -4
  203. data/ext/couchbase/core/operations/management/query_index_get_all.cxx +1 -1
  204. data/ext/couchbase/core/operations/management/query_index_get_all_deferred.cxx +1 -1
  205. data/ext/couchbase/core/operations/management/scope_drop.cxx +5 -1
  206. data/ext/couchbase/core/operations/management/scope_get_all.cxx +6 -1
  207. data/ext/couchbase/core/operations/management/search_get_stats.cxx +10 -0
  208. data/ext/couchbase/core/operations/management/search_index_analyze_document.cxx +3 -2
  209. data/ext/couchbase/core/operations/management/search_index_control_ingest.cxx +4 -3
  210. data/ext/couchbase/core/operations/management/search_index_control_plan_freeze.cxx +4 -3
  211. data/ext/couchbase/core/operations/management/search_index_control_query.cxx +4 -3
  212. data/ext/couchbase/core/operations/management/search_index_drop.cxx +2 -2
  213. data/ext/couchbase/core/operations/management/search_index_get.cxx +2 -2
  214. data/ext/couchbase/core/operations/management/search_index_get_documents_count.cxx +3 -2
  215. data/ext/couchbase/core/operations/management/search_index_get_stats.cxx +3 -1
  216. data/ext/couchbase/core/operations/management/search_index_upsert.cxx +2 -2
  217. data/ext/couchbase/core/operations/management/user_drop.cxx +3 -1
  218. data/ext/couchbase/core/operations/management/user_get.cxx +3 -1
  219. data/ext/couchbase/core/operations/management/user_upsert.cxx +12 -9
  220. data/ext/couchbase/core/operations/management/view_index_drop.cxx +1 -1
  221. data/ext/couchbase/core/operations/management/view_index_get.cxx +1 -1
  222. data/ext/couchbase/core/operations/management/view_index_upsert.cxx +1 -1
  223. data/ext/couchbase/core/operations/operation_traits.hxx +18 -0
  224. data/ext/couchbase/core/operations/query_response_parsing.cxx +211 -0
  225. data/ext/couchbase/core/operations/query_response_parsing.hxx +60 -0
  226. data/ext/couchbase/core/operations_fwd.hxx +3 -3
  227. data/ext/couchbase/core/origin.cxx +54 -26
  228. data/ext/couchbase/core/origin.hxx +12 -0
  229. data/ext/couchbase/core/orphan_reporter.cxx +2 -1
  230. data/ext/couchbase/core/platform/random.cc +7 -7
  231. data/ext/couchbase/core/protocol/client_request.cxx +2 -2
  232. data/ext/couchbase/core/protocol/client_request.hxx +38 -21
  233. data/ext/couchbase/core/protocol/client_response.cxx +11 -3
  234. data/ext/couchbase/core/protocol/client_response.hxx +27 -6
  235. data/ext/couchbase/core/protocol/cmd_append.cxx +2 -2
  236. data/ext/couchbase/core/protocol/cmd_cluster_map_change_notification.cxx +2 -2
  237. data/ext/couchbase/core/protocol/cmd_decrement.cxx +6 -6
  238. data/ext/couchbase/core/protocol/cmd_get.cxx +1 -1
  239. data/ext/couchbase/core/protocol/cmd_get_and_lock.cxx +2 -2
  240. data/ext/couchbase/core/protocol/cmd_get_and_touch.cxx +2 -2
  241. data/ext/couchbase/core/protocol/cmd_get_cluster_config.cxx +6 -4
  242. data/ext/couchbase/core/protocol/cmd_get_collection_id.cxx +2 -2
  243. data/ext/couchbase/core/protocol/cmd_get_error_map.cxx +1 -1
  244. data/ext/couchbase/core/protocol/cmd_get_meta.cxx +4 -4
  245. data/ext/couchbase/core/protocol/cmd_get_replica.cxx +1 -1
  246. data/ext/couchbase/core/protocol/cmd_hello.cxx +1 -1
  247. data/ext/couchbase/core/protocol/cmd_increment.cxx +6 -6
  248. data/ext/couchbase/core/protocol/cmd_insert.cxx +4 -4
  249. data/ext/couchbase/core/protocol/cmd_lookup_in.cxx +4 -3
  250. data/ext/couchbase/core/protocol/cmd_lookup_in_replica.cxx +4 -3
  251. data/ext/couchbase/core/protocol/cmd_mutate_in.cxx +10 -9
  252. data/ext/couchbase/core/protocol/cmd_mutate_in.hxx +10 -10
  253. data/ext/couchbase/core/protocol/cmd_observe_seqno.cxx +7 -7
  254. data/ext/couchbase/core/protocol/cmd_prepend.cxx +2 -2
  255. data/ext/couchbase/core/protocol/cmd_remove.cxx +2 -2
  256. data/ext/couchbase/core/protocol/cmd_replace.cxx +4 -4
  257. data/ext/couchbase/core/protocol/cmd_touch.cxx +1 -1
  258. data/ext/couchbase/core/protocol/cmd_upsert.cxx +4 -4
  259. data/ext/couchbase/core/protocol/datatype.hxx +118 -1
  260. data/ext/couchbase/core/protocol/frame_info_utils.cxx +1 -1
  261. data/ext/couchbase/core/protocol/magic.hxx +4 -0
  262. data/ext/couchbase/core/protocol/magic_fmt.hxx +3 -0
  263. data/ext/couchbase/core/protocol/server_request.hxx +3 -1
  264. data/ext/couchbase/core/protocol/status.cxx +1 -1
  265. data/ext/couchbase/core/protostellar/analytics_converter.hxx +171 -0
  266. data/ext/couchbase/core/protostellar/bucket_admin_converter.hxx +301 -0
  267. data/ext/couchbase/core/protostellar/collection_admin_converter.hxx +92 -0
  268. data/ext/couchbase/core/protostellar/component.cxx +2445 -0
  269. data/ext/couchbase/core/protostellar/component.hxx +391 -0
  270. data/ext/couchbase/core/{columnar/bootstrap_notification_subscriber.hxx → protostellar/compression_settings.hxx} +11 -10
  271. data/ext/couchbase/core/protostellar/credentials.cxx +233 -0
  272. data/ext/couchbase/core/protostellar/credentials.hxx +88 -0
  273. data/ext/couchbase/core/protostellar/dispatcher.cxx +57 -0
  274. data/ext/couchbase/core/protostellar/dispatcher.hxx +482 -0
  275. data/ext/couchbase/core/protostellar/error_utils.cxx +293 -0
  276. data/ext/couchbase/core/protostellar/error_utils.hxx +97 -0
  277. data/ext/couchbase/core/protostellar/json_payload.hxx +49 -0
  278. data/ext/couchbase/core/protostellar/kv_converter.cxx +70 -0
  279. data/ext/couchbase/core/protostellar/kv_converter.hxx +600 -0
  280. data/ext/couchbase/core/protostellar/query_converter.hxx +265 -0
  281. data/ext/couchbase/core/protostellar/query_index_admin_converter.hxx +291 -0
  282. data/ext/couchbase/core/protostellar/query_proto.hxx +73 -0
  283. data/ext/couchbase/core/protostellar/search_converter.hxx +244 -0
  284. data/ext/couchbase/core/protostellar/search_index_admin_converter.hxx +156 -0
  285. data/ext/couchbase/core/protostellar/view_converter.hxx +158 -0
  286. data/ext/couchbase/core/query_stream.cxx +447 -0
  287. data/ext/couchbase/core/query_stream.hxx +141 -0
  288. data/ext/couchbase/core/query_stream_component.cxx +243 -0
  289. data/ext/couchbase/core/query_stream_component.hxx +68 -0
  290. data/ext/couchbase/core/range_scan_load_balancer.cxx +15 -8
  291. data/ext/couchbase/core/range_scan_orchestrator.cxx +15 -3
  292. data/ext/couchbase/core/response_handler.hxx +41 -4
  293. data/ext/couchbase/core/row_streamer.cxx +332 -46
  294. data/ext/couchbase/core/row_streamer.hxx +31 -1
  295. data/ext/couchbase/core/row_streamer_options.hxx +55 -0
  296. data/ext/couchbase/core/sasl/client.h +3 -0
  297. data/ext/couchbase/core/search_scoring.hxx +66 -0
  298. data/ext/couchbase/core/stream_error_details.hxx +69 -0
  299. data/ext/couchbase/core/timeout_defaults.hxx +0 -1
  300. data/ext/couchbase/core/topology/capabilities.hxx +6 -0
  301. data/ext/couchbase/core/topology/capabilities_fmt.hxx +3 -0
  302. data/ext/couchbase/core/topology/configuration.cxx +21 -6
  303. data/ext/couchbase/core/topology/configuration.hxx +29 -8
  304. data/ext/couchbase/core/topology/configuration_json.hxx +3 -0
  305. data/ext/couchbase/core/topology/error_map_json.hxx +3 -1
  306. data/ext/couchbase/core/tracing/threshold_logging_tracer.cxx +70 -4
  307. data/ext/couchbase/core/tracing/threshold_logging_tracer.hxx +10 -0
  308. data/ext/couchbase/core/transactions/active_transaction_record.cxx +0 -34
  309. data/ext/couchbase/core/transactions/attempt_context_impl.cxx +362 -241
  310. data/ext/couchbase/core/transactions/attempt_context_impl.hxx +24 -3
  311. data/ext/couchbase/core/transactions/error_list.hxx +2 -2
  312. data/ext/couchbase/core/transactions/get_multi_fetch.hxx +160 -0
  313. data/ext/couchbase/core/transactions/get_multi_orchestrator.cxx +326 -125
  314. data/ext/couchbase/core/transactions/get_multi_transaction_id.hxx +62 -0
  315. data/ext/couchbase/core/transactions/internal/atr_entry.hxx +22 -2
  316. data/ext/couchbase/core/transactions/internal/transaction_context.hxx +2 -2
  317. data/ext/couchbase/core/transactions/internal/transactions_cleanup.hxx +23 -1
  318. data/ext/couchbase/core/transactions/internal/utils.hxx +50 -14
  319. data/ext/couchbase/core/transactions/staged_mutation.cxx +23 -18
  320. data/ext/couchbase/core/transactions/staged_mutation.hxx +15 -4
  321. data/ext/couchbase/core/transactions/transaction_context.cxx +55 -40
  322. data/ext/couchbase/core/transactions/transaction_get_result.hxx +16 -0
  323. data/ext/couchbase/core/transactions/transactions.cxx +3 -55
  324. data/ext/couchbase/core/transactions/transactions_cleanup.cxx +194 -66
  325. data/ext/couchbase/core/transactions/transactions_config.cxx +0 -11
  326. data/ext/couchbase/core/transactions/utils.cxx +10 -0
  327. data/ext/couchbase/core/transactions/waitable_op_list.hxx +15 -4
  328. data/ext/couchbase/core/transactions.hxx +9 -9
  329. data/ext/couchbase/core/utils/byteswap.hxx +166 -9
  330. data/ext/couchbase/core/utils/connection_string.cxx +50 -85
  331. data/ext/couchbase/core/utils/connection_string.hxx +15 -0
  332. data/ext/couchbase/core/{columnar/backoff_calculator.hxx → utils/deadline.hxx} +13 -13
  333. data/ext/couchbase/core/utils/duration_parser.cxx +1 -1
  334. data/ext/couchbase/core/utils/json_streaming_lexer.cxx +48 -5
  335. data/ext/couchbase/core/utils/json_streaming_lexer.hxx +4 -1
  336. data/ext/couchbase/core/utils/movable_function.hxx +301 -52
  337. data/ext/couchbase/core/utils/name_codec.hxx +154 -11
  338. data/ext/couchbase/core/{columnar/retry_info.hxx → utils/process_id.hxx} +18 -13
  339. data/ext/couchbase/core/utils/url_codec.cxx +12 -51
  340. data/ext/couchbase/core/websocket_codec.cxx +3 -29
  341. data/ext/couchbase/couchbase/analytics_options.hxx +21 -10
  342. data/ext/couchbase/couchbase/analytics_row.hxx +105 -0
  343. data/ext/couchbase/couchbase/analytics_stream_result.hxx +266 -0
  344. data/ext/couchbase/couchbase/boolean_query.hxx +3 -3
  345. data/ext/couchbase/couchbase/bucket.hxx +57 -0
  346. data/ext/couchbase/couchbase/cluster.hxx +216 -5
  347. data/ext/couchbase/{core/columnar/security_options.hxx → couchbase/cluster_state.hxx} +18 -14
  348. data/ext/couchbase/couchbase/codec/lenient_json_transcoder.hxx +69 -0
  349. data/ext/couchbase/couchbase/collection.hxx +234 -14
  350. data/ext/couchbase/couchbase/common_durability_options.hxx +18 -3
  351. data/ext/couchbase/couchbase/conjunction_query.hxx +1 -1
  352. data/ext/couchbase/couchbase/create_dataset_analytics_options.hxx +6 -1
  353. data/ext/couchbase/couchbase/date_range_query.hxx +2 -2
  354. data/ext/couchbase/couchbase/decrement_options.hxx +1 -1
  355. data/ext/couchbase/couchbase/disjunction_query.hxx +1 -1
  356. data/ext/couchbase/couchbase/error.hxx +32 -0
  357. data/ext/couchbase/couchbase/error_codes.hxx +32 -0
  358. data/ext/couchbase/couchbase/geo_bounding_box_query.hxx +1 -1
  359. data/ext/couchbase/couchbase/geo_distance_query.hxx +1 -1
  360. data/ext/couchbase/couchbase/geo_polygon_query.hxx +1 -1
  361. data/ext/couchbase/couchbase/get_replica_options.hxx +68 -0
  362. data/ext/couchbase/couchbase/get_replica_result.hxx +5 -3
  363. data/ext/couchbase/couchbase/get_replica_strategy.hxx +161 -0
  364. data/ext/couchbase/couchbase/get_result.hxx +1 -0
  365. data/ext/couchbase/couchbase/increment_options.hxx +1 -1
  366. data/ext/couchbase/couchbase/insert_options.hxx +1 -1
  367. data/ext/couchbase/couchbase/match_phrase_query.hxx +1 -1
  368. data/ext/couchbase/couchbase/match_query.hxx +1 -1
  369. data/ext/couchbase/couchbase/mutate_in_options.hxx +3 -3
  370. data/ext/couchbase/couchbase/network_options.hxx +1 -1
  371. data/ext/couchbase/couchbase/node_id.hxx +42 -14
  372. data/ext/couchbase/couchbase/node_id_for_options.hxx +7 -1
  373. data/ext/couchbase/couchbase/node_ids_options.hxx +8 -2
  374. data/ext/couchbase/couchbase/numeric_range_query.hxx +1 -1
  375. data/ext/couchbase/couchbase/phrase_query.hxx +1 -1
  376. data/ext/couchbase/couchbase/prefix_query.hxx +1 -1
  377. data/ext/couchbase/couchbase/query_options.hxx +23 -12
  378. data/ext/couchbase/couchbase/query_row.hxx +111 -0
  379. data/ext/couchbase/couchbase/query_stream_result.hxx +302 -0
  380. data/ext/couchbase/couchbase/query_string_query.hxx +3 -3
  381. data/ext/couchbase/couchbase/regexp_query.hxx +1 -1
  382. data/ext/couchbase/couchbase/replace_options.hxx +3 -3
  383. data/ext/couchbase/couchbase/result.hxx +14 -3
  384. data/ext/couchbase/couchbase/scan_result_item.hxx +1 -0
  385. data/ext/couchbase/couchbase/scope.hxx +85 -2
  386. data/ext/couchbase/couchbase/search_options.hxx +58 -8
  387. data/ext/couchbase/couchbase/search_scoring.hxx +94 -0
  388. data/ext/couchbase/couchbase/search_scoring_none.hxx +51 -0
  389. data/ext/couchbase/couchbase/search_scoring_reciprocal_rank_fusion.hxx +88 -0
  390. data/ext/couchbase/couchbase/search_scoring_relative_score_fusion.hxx +70 -0
  391. data/ext/couchbase/couchbase/term_range_query.hxx +1 -1
  392. data/ext/couchbase/couchbase/tracing/request_span.hxx +46 -0
  393. data/ext/couchbase/couchbase/transactions/transaction_get_multi_replicas_from_preferred_server_group_result.hxx +23 -21
  394. data/ext/couchbase/couchbase/transactions/transaction_get_multi_result.hxx +24 -19
  395. data/ext/couchbase/couchbase/transactions/transaction_get_result.hxx +17 -3
  396. data/ext/couchbase/couchbase/transactions/transactions_config.hxx +4 -2
  397. data/ext/couchbase/couchbase/transactions.hxx +27 -18
  398. data/ext/couchbase/couchbase/upsert_options.hxx +3 -3
  399. data/ext/couchbase/couchbase/vector_query.hxx +1 -1
  400. data/ext/couchbase/couchbase/wait_until_ready_options.hxx +111 -0
  401. data/ext/couchbase/couchbase/wildcard_query.hxx +1 -1
  402. data/ext/extconf.rb +15 -10
  403. data/ext/rcb_analytics.cxx +82 -102
  404. data/ext/rcb_backend.cxx +42 -36
  405. data/ext/rcb_backend.hxx +2 -0
  406. data/ext/rcb_buckets.cxx +47 -59
  407. data/ext/rcb_collections.cxx +42 -52
  408. data/ext/rcb_crud.cxx +345 -224
  409. data/ext/rcb_diagnostics.cxx +117 -27
  410. data/ext/rcb_exceptions.cxx +152 -99
  411. data/ext/rcb_exceptions.hxx +25 -0
  412. data/ext/rcb_extras.cxx +18 -19
  413. data/ext/rcb_hdr_histogram.cxx +19 -4
  414. data/ext/rcb_logger.cxx +202 -27
  415. data/ext/rcb_logger.hxx +12 -0
  416. data/ext/rcb_multi.cxx +40 -40
  417. data/ext/rcb_observability.cxx +7 -5
  418. data/ext/rcb_query.cxx +99 -142
  419. data/ext/rcb_range_scan.cxx +41 -35
  420. data/ext/rcb_search.cxx +98 -99
  421. data/ext/rcb_users.cxx +36 -56
  422. data/ext/rcb_utils.cxx +100 -37
  423. data/ext/rcb_utils.hxx +287 -33
  424. data/ext/rcb_version.cxx +1 -1
  425. data/ext/rcb_views.cxx +55 -51
  426. data/lib/active_support/cache/couchbase_store.rb +77 -12
  427. data/lib/couchbase/bucket.rb +20 -0
  428. data/lib/couchbase/cluster.rb +33 -14
  429. data/lib/couchbase/collection.rb +36 -1
  430. data/lib/couchbase/errors.rb +18 -0
  431. data/lib/couchbase/fork_hooks.rb +16 -7
  432. data/lib/couchbase/get_replica_strategy.rb +89 -0
  433. data/lib/couchbase/logger.rb +1 -1
  434. data/lib/couchbase/management/analytics_index_manager.rb +15 -15
  435. data/lib/couchbase/management/bucket_manager.rb +6 -6
  436. data/lib/couchbase/management/collection_manager.rb +6 -6
  437. data/lib/couchbase/management/query_index_manager.rb +7 -7
  438. data/lib/couchbase/management/search_index_manager.rb +13 -13
  439. data/lib/couchbase/management/user_manager.rb +10 -10
  440. data/lib/couchbase/management/view_index_manager.rb +5 -5
  441. data/lib/couchbase/options.rb +181 -44
  442. data/lib/couchbase/protostellar/bucket.rb +4 -0
  443. data/lib/couchbase/protostellar/cluster.rb +4 -0
  444. data/lib/couchbase/protostellar/collection.rb +4 -0
  445. data/lib/couchbase/protostellar/error_handling.rb +2 -1
  446. data/lib/couchbase/protostellar/request.rb +1 -0
  447. data/lib/couchbase/protostellar/request_generator/kv.rb +16 -2
  448. data/lib/couchbase/protostellar/request_generator/search.rb +17 -1
  449. data/lib/couchbase/protostellar/retry/orchestrator.rb +3 -2
  450. data/lib/couchbase/protostellar/retry/strategies/fail_fast.rb +33 -0
  451. data/lib/couchbase/protostellar/retry/strategies.rb +1 -0
  452. data/lib/couchbase/search_options.rb +95 -6
  453. data/lib/couchbase/version.rb +1 -1
  454. metadata +92 -33
  455. data/ext/0001-fix-build-for-mingw-w64-ucrt-x86_64-toolchain.patch +0 -40
  456. data/ext/couchbase/core/columnar/agent.hxx +0 -71
  457. data/ext/couchbase/core/columnar/agent_config.hxx +0 -59
  458. data/ext/couchbase/core/columnar/background_bootstrap_listener.hxx +0 -42
  459. data/ext/couchbase/core/columnar/backoff_calculator.cxx +0 -62
  460. data/ext/couchbase/core/columnar/columnar_agent.cxx +0 -147
  461. data/ext/couchbase/core/columnar/columnar_agent_config.cxx +0 -48
  462. data/ext/couchbase/core/columnar/columnar_error.cxx +0 -51
  463. data/ext/couchbase/core/columnar/database_management_options.hxx +0 -56
  464. data/ext/couchbase/core/columnar/error.hxx +0 -51
  465. data/ext/couchbase/core/columnar/error_codes.cxx +0 -107
  466. data/ext/couchbase/core/columnar/error_codes.hxx +0 -75
  467. data/ext/couchbase/core/columnar/management_component.cxx +0 -300
  468. data/ext/couchbase/core/columnar/management_component.hxx +0 -56
  469. data/ext/couchbase/core/columnar/query_component.cxx +0 -523
  470. data/ext/couchbase/core/columnar/query_component.hxx +0 -57
  471. data/ext/couchbase/core/columnar/query_options.hxx +0 -59
  472. data/ext/couchbase/core/columnar/query_result.cxx +0 -130
  473. data/ext/couchbase/core/columnar/query_result.hxx +0 -78
  474. data/ext/couchbase/core/io/config_tracker.cxx +0 -687
  475. data/ext/couchbase/core/io/config_tracker.hxx +0 -123
data/ext/rcb_users.cxx CHANGED
@@ -89,10 +89,8 @@ cb_Backend_role_get_all(VALUE self, VALUE timeout, VALUE observability_handler)
89
89
  }
90
90
  return res;
91
91
  } catch (const std::system_error& se) {
92
- rb_exc_raise(cb_map_error_code(
92
+ throw ruby_exception(cb_map_error_code(
93
93
  se.code(), fmt::format("failed to perform {}: {}", __func__, se.what()), false));
94
- } catch (const ruby_exception& e) {
95
- rb_exc_raise(e.exception_object());
96
94
  }
97
95
  return Qnil;
98
96
  }
@@ -179,7 +177,7 @@ cb_Backend_user_get_all(VALUE self, VALUE domain, VALUE timeout, VALUE observabi
179
177
  {
180
178
  auto cluster = cb_backend_to_core_api_cluster(self);
181
179
 
182
- Check_Type(domain, T_SYMBOL);
180
+ cb_check_type(domain, T_SYMBOL);
183
181
 
184
182
  try {
185
183
  core::operations::management::user_get_all_request req{};
@@ -190,7 +188,7 @@ cb_Backend_user_get_all(VALUE self, VALUE domain, VALUE timeout, VALUE observabi
190
188
  req.domain = core::management::rbac::auth_domain::external;
191
189
  } else {
192
190
  throw ruby_exception(exc_invalid_argument(),
193
- rb_sprintf("unsupported authentication domain: %+" PRIsVALUE, domain));
191
+ cb_sprintf("unsupported authentication domain: %+" PRIsVALUE, domain));
194
192
  }
195
193
  auto parent_span = cb_create_parent_span(req, self);
196
194
  std::promise<core::operations::management::user_get_all_response> promise;
@@ -212,10 +210,8 @@ cb_Backend_user_get_all(VALUE self, VALUE domain, VALUE timeout, VALUE observabi
212
210
  }
213
211
  return res;
214
212
  } catch (const std::system_error& se) {
215
- rb_exc_raise(cb_map_error_code(
213
+ throw ruby_exception(cb_map_error_code(
216
214
  se.code(), fmt::format("failed to perform {}: {}", __func__, se.what()), false));
217
- } catch (const ruby_exception& e) {
218
- rb_exc_raise(e.exception_object());
219
215
  }
220
216
  return Qnil;
221
217
  }
@@ -229,8 +225,8 @@ cb_Backend_user_get(VALUE self,
229
225
  {
230
226
  auto cluster = cb_backend_to_core_api_cluster(self);
231
227
 
232
- Check_Type(domain, T_SYMBOL);
233
- Check_Type(username, T_STRING);
228
+ cb_check_type(domain, T_SYMBOL);
229
+ cb_check_type(username, T_STRING);
234
230
 
235
231
  try {
236
232
  core::operations::management::user_get_request req{};
@@ -241,7 +237,7 @@ cb_Backend_user_get(VALUE self,
241
237
  req.domain = core::management::rbac::auth_domain::external;
242
238
  } else {
243
239
  throw ruby_exception(exc_invalid_argument(),
244
- rb_sprintf("unsupported authentication domain: %+" PRIsVALUE, domain));
240
+ cb_sprintf("unsupported authentication domain: %+" PRIsVALUE, domain));
245
241
  }
246
242
  req.username = cb_string_new(username);
247
243
  auto parent_span = cb_create_parent_span(req, self);
@@ -260,10 +256,8 @@ cb_Backend_user_get(VALUE self,
260
256
  cb_extract_user(resp.user, res);
261
257
  return res;
262
258
  } catch (const std::system_error& se) {
263
- rb_exc_raise(cb_map_error_code(
259
+ throw ruby_exception(cb_map_error_code(
264
260
  se.code(), fmt::format("failed to perform {}: {}", __func__, se.what()), false));
265
- } catch (const ruby_exception& e) {
266
- rb_exc_raise(e.exception_object());
267
261
  }
268
262
  return Qnil;
269
263
  }
@@ -277,8 +271,8 @@ cb_Backend_user_drop(VALUE self,
277
271
  {
278
272
  auto cluster = cb_backend_to_core_api_cluster(self);
279
273
 
280
- Check_Type(domain, T_SYMBOL);
281
- Check_Type(username, T_STRING);
274
+ cb_check_type(domain, T_SYMBOL);
275
+ cb_check_type(username, T_STRING);
282
276
 
283
277
  try {
284
278
  core::operations::management::user_drop_request req{};
@@ -289,7 +283,7 @@ cb_Backend_user_drop(VALUE self,
289
283
  req.domain = core::management::rbac::auth_domain::external;
290
284
  } else {
291
285
  throw ruby_exception(exc_invalid_argument(),
292
- rb_sprintf("unsupported authentication domain: %+" PRIsVALUE, domain));
286
+ cb_sprintf("unsupported authentication domain: %+" PRIsVALUE, domain));
293
287
  }
294
288
  req.username = cb_string_new(username);
295
289
  auto parent_span = cb_create_parent_span(req, self);
@@ -306,10 +300,8 @@ cb_Backend_user_drop(VALUE self,
306
300
 
307
301
  return Qtrue;
308
302
  } catch (const std::system_error& se) {
309
- rb_exc_raise(cb_map_error_code(
303
+ throw ruby_exception(cb_map_error_code(
310
304
  se.code(), fmt::format("failed to perform {}: {}", __func__, se.what()), false));
311
- } catch (const ruby_exception& e) {
312
- rb_exc_raise(e.exception_object());
313
305
  }
314
306
  return Qnil;
315
307
  }
@@ -323,8 +315,8 @@ cb_Backend_user_upsert(VALUE self,
323
315
  {
324
316
  auto cluster = cb_backend_to_core_api_cluster(self);
325
317
 
326
- Check_Type(domain, T_SYMBOL);
327
- Check_Type(user, T_HASH);
318
+ cb_check_type(domain, T_SYMBOL);
319
+ cb_check_type(user, T_HASH);
328
320
 
329
321
  try {
330
322
  core::operations::management::user_upsert_request req{};
@@ -335,7 +327,7 @@ cb_Backend_user_upsert(VALUE self,
335
327
  req.domain = core::management::rbac::auth_domain::external;
336
328
  } else {
337
329
  throw ruby_exception(exc_invalid_argument(),
338
- rb_sprintf("unsupported authentication domain: %+" PRIsVALUE, domain));
330
+ cb_sprintf("unsupported authentication domain: %+" PRIsVALUE, domain));
339
331
  }
340
332
  VALUE name = rb_hash_aref(user, rb_id2sym(rb_intern("username")));
341
333
  if (NIL_P(name) || TYPE(name) != T_STRING) {
@@ -406,10 +398,8 @@ cb_Backend_user_upsert(VALUE self,
406
398
 
407
399
  return Qtrue;
408
400
  } catch (const std::system_error& se) {
409
- rb_exc_raise(cb_map_error_code(
401
+ throw ruby_exception(cb_map_error_code(
410
402
  se.code(), fmt::format("failed to perform {}: {}", __func__, se.what()), false));
411
- } catch (const ruby_exception& e) {
412
- rb_exc_raise(e.exception_object());
413
403
  }
414
404
  return Qnil;
415
405
  }
@@ -422,7 +412,7 @@ cb_Backend_change_password(VALUE self,
422
412
  {
423
413
  auto cluster = cb_backend_to_core_api_cluster(self);
424
414
 
425
- Check_Type(new_password, T_STRING);
415
+ cb_check_type(new_password, T_STRING);
426
416
 
427
417
  try {
428
418
  core::operations::management::change_password_request req{};
@@ -442,10 +432,8 @@ cb_Backend_change_password(VALUE self,
442
432
 
443
433
  return Qtrue;
444
434
  } catch (const std::system_error& se) {
445
- rb_exc_raise(cb_map_error_code(
435
+ throw ruby_exception(cb_map_error_code(
446
436
  se.code(), fmt::format("failed to perform {}: {}", __func__, se.what()), false));
447
- } catch (const ruby_exception& e) {
448
- rb_exc_raise(e.exception_object());
449
437
  }
450
438
  return Qnil;
451
439
  }
@@ -508,10 +496,8 @@ cb_Backend_group_get_all(VALUE self, VALUE timeout, VALUE observability_handler)
508
496
  }
509
497
  return res;
510
498
  } catch (const std::system_error& se) {
511
- rb_exc_raise(cb_map_error_code(
499
+ throw ruby_exception(cb_map_error_code(
512
500
  se.code(), fmt::format("failed to perform {}: {}", __func__, se.what()), false));
513
- } catch (const ruby_exception& e) {
514
- rb_exc_raise(e.exception_object());
515
501
  }
516
502
  return Qnil;
517
503
  }
@@ -521,7 +507,7 @@ cb_Backend_group_get(VALUE self, VALUE name, VALUE timeout, VALUE observability_
521
507
  {
522
508
  auto cluster = cb_backend_to_core_api_cluster(self);
523
509
 
524
- Check_Type(name, T_STRING);
510
+ cb_check_type(name, T_STRING);
525
511
 
526
512
  try {
527
513
  core::operations::management::group_get_request req{};
@@ -543,10 +529,8 @@ cb_Backend_group_get(VALUE self, VALUE name, VALUE timeout, VALUE observability_
543
529
  cb_extract_group(resp.group, res);
544
530
  return res;
545
531
  } catch (const std::system_error& se) {
546
- rb_exc_raise(cb_map_error_code(
532
+ throw ruby_exception(cb_map_error_code(
547
533
  se.code(), fmt::format("failed to perform {}: {}", __func__, se.what()), false));
548
- } catch (const ruby_exception& e) {
549
- rb_exc_raise(e.exception_object());
550
534
  }
551
535
  return Qnil;
552
536
  }
@@ -556,7 +540,7 @@ cb_Backend_group_drop(VALUE self, VALUE name, VALUE timeout, VALUE observability
556
540
  {
557
541
  auto cluster = cb_backend_to_core_api_cluster(self);
558
542
 
559
- Check_Type(name, T_STRING);
543
+ cb_check_type(name, T_STRING);
560
544
 
561
545
  try {
562
546
  core::operations::management::group_drop_request req{};
@@ -576,10 +560,8 @@ cb_Backend_group_drop(VALUE self, VALUE name, VALUE timeout, VALUE observability
576
560
  }
577
561
  return Qtrue;
578
562
  } catch (const std::system_error& se) {
579
- rb_exc_raise(cb_map_error_code(
563
+ throw ruby_exception(cb_map_error_code(
580
564
  se.code(), fmt::format("failed to perform {}: {}", __func__, se.what()), false));
581
- } catch (const ruby_exception& e) {
582
- rb_exc_raise(e.exception_object());
583
565
  }
584
566
  return Qnil;
585
567
  }
@@ -589,7 +571,7 @@ cb_Backend_group_upsert(VALUE self, VALUE group, VALUE timeout, VALUE observabil
589
571
  {
590
572
  auto cluster = cb_backend_to_core_api_cluster(self);
591
573
 
592
- Check_Type(group, T_HASH);
574
+ cb_check_type(group, T_HASH);
593
575
 
594
576
  try {
595
577
  core::operations::management::group_upsert_request req{};
@@ -652,10 +634,8 @@ cb_Backend_group_upsert(VALUE self, VALUE group, VALUE timeout, VALUE observabil
652
634
  }
653
635
  return Qtrue;
654
636
  } catch (const std::system_error& se) {
655
- rb_exc_raise(cb_map_error_code(
637
+ throw ruby_exception(cb_map_error_code(
656
638
  se.code(), fmt::format("failed to perform {}: {}", __func__, se.what()), false));
657
- } catch (const ruby_exception& e) {
658
- rb_exc_raise(e.exception_object());
659
639
  }
660
640
  return Qnil;
661
641
  }
@@ -664,16 +644,16 @@ cb_Backend_group_upsert(VALUE self, VALUE group, VALUE timeout, VALUE observabil
664
644
  void
665
645
  init_users(VALUE cBackend)
666
646
  {
667
- rb_define_method(cBackend, "role_get_all", cb_Backend_role_get_all, 2);
668
- rb_define_method(cBackend, "user_get_all", cb_Backend_user_get_all, 3);
669
- rb_define_method(cBackend, "user_get", cb_Backend_user_get, 4);
670
- rb_define_method(cBackend, "user_drop", cb_Backend_user_drop, 4);
671
- rb_define_method(cBackend, "user_upsert", cb_Backend_user_upsert, 4);
672
- rb_define_method(cBackend, "group_get_all", cb_Backend_group_get_all, 2);
673
- rb_define_method(cBackend, "group_get", cb_Backend_group_get, 3);
674
- rb_define_method(cBackend, "group_drop", cb_Backend_group_drop, 3);
675
- rb_define_method(cBackend, "group_upsert", cb_Backend_group_upsert, 3);
676
-
677
- rb_define_method(cBackend, "change_password", cb_Backend_change_password, 3);
647
+ rb_define_method(cBackend, "role_get_all", cb_method<cb_Backend_role_get_all>::invoke, 2);
648
+ rb_define_method(cBackend, "user_get_all", cb_method<cb_Backend_user_get_all>::invoke, 3);
649
+ rb_define_method(cBackend, "user_get", cb_method<cb_Backend_user_get>::invoke, 4);
650
+ rb_define_method(cBackend, "user_drop", cb_method<cb_Backend_user_drop>::invoke, 4);
651
+ rb_define_method(cBackend, "user_upsert", cb_method<cb_Backend_user_upsert>::invoke, 4);
652
+ rb_define_method(cBackend, "group_get_all", cb_method<cb_Backend_group_get_all>::invoke, 2);
653
+ rb_define_method(cBackend, "group_get", cb_method<cb_Backend_group_get>::invoke, 3);
654
+ rb_define_method(cBackend, "group_drop", cb_method<cb_Backend_group_drop>::invoke, 3);
655
+ rb_define_method(cBackend, "group_upsert", cb_method<cb_Backend_group_upsert>::invoke, 3);
656
+
657
+ rb_define_method(cBackend, "change_password", cb_method<cb_Backend_change_password>::invoke, 3);
678
658
  }
679
659
  } // namespace couchbase::ruby
data/ext/rcb_utils.cxx CHANGED
@@ -15,13 +15,17 @@
15
15
  * limitations under the License.
16
16
  */
17
17
 
18
+ #include <couchbase/best_effort_retry_strategy.hxx>
18
19
  #include <couchbase/expiry.hxx>
20
+ #include <couchbase/fail_fast_retry_strategy.hxx>
19
21
 
20
22
  #include <core/utils/binary.hxx>
21
23
 
22
24
  #include "rcb_exceptions.hxx"
23
25
  #include "rcb_utils.hxx"
24
26
 
27
+ #include <chrono>
28
+ #include <cinttypes>
25
29
  #include <cstdint>
26
30
  #include <ruby.h>
27
31
 
@@ -99,7 +103,7 @@ extract_legacy_durability_replicate_to(VALUE options)
99
103
  {
100
104
  static VALUE property_name{ rb_id2sym(rb_intern("replicate_to")) };
101
105
  if (VALUE val = rb_hash_aref(options, property_name); !NIL_P(val)) {
102
- ID mode = rb_sym2id(val);
106
+ ID mode = cb_sym2id(val);
103
107
  if (mode == rb_intern("none")) {
104
108
  return {};
105
109
  }
@@ -113,7 +117,7 @@ extract_legacy_durability_replicate_to(VALUE options)
113
117
  return couchbase::replicate_to::three;
114
118
  }
115
119
  throw ruby_exception(exc_invalid_argument(),
116
- rb_sprintf("unknown replicate_to: %+" PRIsVALUE, val));
120
+ cb_sprintf("unknown replicate_to: %+" PRIsVALUE, val));
117
121
  }
118
122
  return couchbase::replicate_to::none;
119
123
  }
@@ -123,7 +127,7 @@ extract_legacy_durability_persist_to(VALUE options)
123
127
  {
124
128
  static VALUE property_name{ rb_id2sym(rb_intern("persist_to")) };
125
129
  if (VALUE val = rb_hash_aref(options, property_name); !NIL_P(val)) {
126
- ID mode = rb_sym2id(val);
130
+ ID mode = cb_sym2id(val);
127
131
  if (mode == rb_intern("none")) {
128
132
  return {};
129
133
  }
@@ -143,7 +147,7 @@ extract_legacy_durability_persist_to(VALUE options)
143
147
  return couchbase::persist_to::four;
144
148
  }
145
149
  throw ruby_exception(exc_invalid_argument(),
146
- rb_sprintf("unknown persist_to value: %+" PRIsVALUE, val));
150
+ cb_sprintf("unknown persist_to value: %+" PRIsVALUE, val));
147
151
  }
148
152
  return couchbase::persist_to::none;
149
153
  }
@@ -165,7 +169,7 @@ cb_check_type(VALUE object, int type)
165
169
  if (auto object_type = TYPE(object);
166
170
  object_type != type || (object_type == T_DATA && RTYPEDDATA_P(object))) {
167
171
  throw ruby_exception(rb_eTypeError,
168
- rb_sprintf("wrong argument type %" PRIsVALUE " (expected %s)",
172
+ cb_sprintf("wrong argument type %" PRIsVALUE " (expected %s)",
169
173
  cb_displaying_class_of(object),
170
174
  cb_builtin_type_name(type)));
171
175
  }
@@ -225,7 +229,7 @@ void
225
229
  cb_extract_flags(std::uint32_t& field, VALUE flags)
226
230
  {
227
231
  cb_check_type(flags, T_FIXNUM);
228
- field = FIX2UINT(flags);
232
+ field = cb_num2uint(flags);
229
233
  }
230
234
 
231
235
  void
@@ -240,6 +244,31 @@ cb_extract_timeout(std::optional<std::chrono::milliseconds>& field, VALUE option
240
244
  cb_extract_duration(field, options, "timeout");
241
245
  }
242
246
 
247
+ auto
248
+ cb_extract_retry_strategy(VALUE options) -> std::shared_ptr<couchbase::retry_strategy>
249
+ {
250
+ if (NIL_P(options) || TYPE(options) != T_HASH) {
251
+ return nullptr;
252
+ }
253
+ static VALUE property_name{ rb_id2sym(rb_intern("retry_strategy")) };
254
+ VALUE val = rb_hash_aref(options, property_name);
255
+ if (NIL_P(val)) {
256
+ return nullptr;
257
+ }
258
+ if (TYPE(val) == T_SYMBOL) {
259
+ ID name = rb_sym2id(val);
260
+ if (name == rb_intern("best_effort")) {
261
+ return couchbase::make_best_effort_retry_strategy();
262
+ }
263
+ if (name == rb_intern("fail_fast")) {
264
+ return couchbase::make_fail_fast_retry_strategy();
265
+ }
266
+ }
267
+ throw ruby_exception(
268
+ exc_invalid_argument(),
269
+ cb_sprintf("retry_strategy must be :best_effort or :fail_fast, but given %+" PRIsVALUE, val));
270
+ }
271
+
243
272
  void
244
273
  cb_extract_option_symbol(VALUE& val, VALUE options, const char* name)
245
274
  {
@@ -252,7 +281,7 @@ cb_extract_option_symbol(VALUE& val, VALUE options, const char* name)
252
281
  return;
253
282
  }
254
283
  throw couchbase::ruby::ruby_exception(
255
- rb_eArgError, rb_sprintf("%s must be an Symbol, but given %+" PRIsVALUE, name, val));
284
+ rb_eArgError, cb_sprintf("%s must be an Symbol, but given %+" PRIsVALUE, name, val));
256
285
  }
257
286
  }
258
287
 
@@ -268,7 +297,7 @@ cb_extract_option_string(VALUE& val, VALUE options, const char* name)
268
297
  return;
269
298
  }
270
299
  throw couchbase::ruby::ruby_exception(
271
- rb_eArgError, rb_sprintf("%s must be an String, but given %+" PRIsVALUE, name, val));
300
+ rb_eArgError, cb_sprintf("%s must be an String, but given %+" PRIsVALUE, name, val));
272
301
  }
273
302
  }
274
303
 
@@ -285,7 +314,7 @@ cb_extract_option_string(std::string& target, VALUE options, const char* name)
285
314
  return;
286
315
  }
287
316
  throw couchbase::ruby::ruby_exception(
288
- rb_eArgError, rb_sprintf("%s must be an String, but given %+" PRIsVALUE, name, val));
317
+ rb_eArgError, cb_sprintf("%s must be an String, but given %+" PRIsVALUE, name, val));
289
318
  }
290
319
  }
291
320
 
@@ -302,7 +331,7 @@ cb_extract_option_string(std::optional<std::string>& target, VALUE options, cons
302
331
  return;
303
332
  }
304
333
  throw couchbase::ruby::ruby_exception(
305
- rb_eArgError, rb_sprintf("%s must be an String, but given %+" PRIsVALUE, name, val));
334
+ rb_eArgError, cb_sprintf("%s must be an String, but given %+" PRIsVALUE, name, val));
306
335
  }
307
336
  }
308
337
 
@@ -322,7 +351,7 @@ cb_extract_option_bignum(VALUE& val, VALUE options, const char* name)
322
351
  break;
323
352
  }
324
353
  throw couchbase::ruby::ruby_exception(
325
- rb_eArgError, rb_sprintf("%s must be an Integer, but given %+" PRIsVALUE, name, val));
354
+ rb_eArgError, cb_sprintf("%s must be an Integer, but given %+" PRIsVALUE, name, val));
326
355
  }
327
356
  }
328
357
 
@@ -338,7 +367,7 @@ cb_extract_option_array(VALUE& val, VALUE options, const char* name)
338
367
  return;
339
368
  }
340
369
  throw couchbase::ruby::ruby_exception(
341
- rb_eArgError, rb_sprintf("%s must be an Array, but given %+" PRIsVALUE, name, val));
370
+ rb_eArgError, cb_sprintf("%s must be an Array, but given %+" PRIsVALUE, name, val));
342
371
  }
343
372
  }
344
373
 
@@ -351,7 +380,7 @@ cb_cas_to_num(const couchbase::cas& cas)
351
380
  couchbase::cas
352
381
  cb_num_to_cas(VALUE num)
353
382
  {
354
- return couchbase::cas{ static_cast<std::uint64_t>(NUM2ULL(num)) };
383
+ return couchbase::cas{ static_cast<std::uint64_t>(cb_num2ull(num)) };
355
384
  }
356
385
 
357
386
  VALUE
@@ -370,7 +399,7 @@ cb_extract_cas(couchbase::cas& field, VALUE cas)
370
399
  break;
371
400
  default:
372
401
  throw couchbase::ruby::ruby_exception(
373
- rb_eArgError, rb_sprintf("CAS must be an Integer, but given %+" PRIsVALUE, cas));
402
+ rb_eArgError, cb_sprintf("CAS must be an Integer, but given %+" PRIsVALUE, cas));
374
403
  }
375
404
  }
376
405
 
@@ -380,7 +409,7 @@ cb_extract_expiry(std::uint32_t& field, VALUE options)
380
409
  if (NIL_P(options)) {
381
410
  return;
382
411
  }
383
- Check_Type(options, T_HASH);
412
+ cb_check_type(options, T_HASH);
384
413
 
385
414
  static VALUE property_name = rb_id2sym(rb_intern("expiry"));
386
415
  VALUE val = rb_hash_aref(options, property_name);
@@ -408,7 +437,7 @@ cb_extract_expiry(std::optional<std::uint32_t>& field, VALUE options)
408
437
  if (NIL_P(options)) {
409
438
  return;
410
439
  }
411
- Check_Type(options, T_HASH);
440
+ cb_check_type(options, T_HASH);
412
441
 
413
442
  static VALUE property_name = rb_id2sym(rb_intern("expiry"));
414
443
  VALUE val = rb_hash_aref(options, property_name);
@@ -434,12 +463,12 @@ std::pair<expiry_type, std::chrono::seconds>
434
463
  unpack_expiry(VALUE val, bool allow_nil)
435
464
  {
436
465
  if (TYPE(val) == T_FIXNUM || TYPE(val) == T_BIGNUM) {
437
- return { expiry_type::relative, std::chrono::seconds(NUM2ULL(val)) };
466
+ return { expiry_type::relative, std::chrono::seconds(cb_num2ull(val)) };
438
467
  }
439
468
  if (TYPE(val) != T_ARRAY || RARRAY_LEN(val) != 2) {
440
469
  throw ruby_exception(
441
470
  rb_eArgError,
442
- rb_sprintf("expected expiry to be Array[Symbol, Integer|nil], given %+" PRIsVALUE, val));
471
+ cb_sprintf("expected expiry to be Array[Symbol, Integer|nil], given %+" PRIsVALUE, val));
443
472
  }
444
473
  VALUE expiry = rb_ary_entry(val, 1);
445
474
  if (NIL_P(expiry)) {
@@ -450,14 +479,14 @@ unpack_expiry(VALUE val, bool allow_nil)
450
479
  }
451
480
  if (TYPE(expiry) != T_FIXNUM && TYPE(expiry) != T_BIGNUM) {
452
481
  throw ruby_exception(
453
- rb_eArgError, rb_sprintf("expiry value must be an Integer, but given %+" PRIsVALUE, expiry));
482
+ rb_eArgError, cb_sprintf("expiry value must be an Integer, but given %+" PRIsVALUE, expiry));
454
483
  }
455
- auto duration = std::chrono::seconds(NUM2ULL(expiry));
484
+ auto duration = std::chrono::seconds(cb_num2ull(expiry));
456
485
 
457
486
  VALUE type = rb_ary_entry(val, 0);
458
487
  if (TYPE(type) != T_SYMBOL) {
459
488
  throw ruby_exception(rb_eArgError,
460
- rb_sprintf("expiry type must be a Symbol, but given %+" PRIsVALUE, type));
489
+ cb_sprintf("expiry type must be a Symbol, but given %+" PRIsVALUE, type));
461
490
  }
462
491
  static VALUE duration_type = rb_id2sym(rb_intern("duration"));
463
492
  static VALUE time_point_type = rb_id2sym(rb_intern("time_point"));
@@ -467,7 +496,7 @@ unpack_expiry(VALUE val, bool allow_nil)
467
496
  if (type == time_point_type) {
468
497
  return { expiry_type::absolute, duration };
469
498
  }
470
- throw ruby_exception(rb_eArgError, rb_sprintf("unknown expiry type: %+" PRIsVALUE, type));
499
+ throw ruby_exception(rb_eArgError, cb_sprintf("unknown expiry type: %+" PRIsVALUE, type));
471
500
  }
472
501
 
473
502
  std::optional<couchbase::durability_level>
@@ -475,7 +504,7 @@ extract_durability_level(VALUE options)
475
504
  {
476
505
  static VALUE property_name{ rb_id2sym(rb_intern("durability_level")) };
477
506
  if (VALUE val = rb_hash_aref(options, property_name); !NIL_P(val)) {
478
- ID level = rb_sym2id(val);
507
+ ID level = cb_sym2id(val);
479
508
  if (level == rb_intern("none")) {
480
509
  return {};
481
510
  }
@@ -489,7 +518,7 @@ extract_durability_level(VALUE options)
489
518
  return couchbase::durability_level::persist_to_majority;
490
519
  }
491
520
  throw ruby_exception(exc_invalid_argument(),
492
- rb_sprintf("unknown durability level: %+" PRIsVALUE, val));
521
+ cb_sprintf("unknown durability level: %+" PRIsVALUE, val));
493
522
  }
494
523
  return couchbase::durability_level::none;
495
524
  }
@@ -527,7 +556,7 @@ get_bool(VALUE options, VALUE name)
527
556
  default:
528
557
  throw ruby_exception(
529
558
  rb_eArgError,
530
- rb_sprintf("%+" PRIsVALUE " must be a Boolean, but given %+" PRIsVALUE, name, val));
559
+ cb_sprintf("%+" PRIsVALUE " must be a Boolean, but given %+" PRIsVALUE, name, val));
531
560
  }
532
561
  }
533
562
  return {};
@@ -546,11 +575,11 @@ get_milliseconds(VALUE options, VALUE name)
546
575
  case T_FIXNUM:
547
576
  return std::chrono::milliseconds(FIX2ULONG(val));
548
577
  case T_BIGNUM:
549
- return std::chrono::milliseconds(NUM2ULL(val));
578
+ return std::chrono::milliseconds(cb_num2ull(val));
550
579
  default:
551
580
  throw ruby_exception(
552
581
  rb_eArgError,
553
- rb_sprintf("%+" PRIsVALUE
582
+ cb_sprintf("%+" PRIsVALUE
554
583
  " must be a Integer representing milliseconds, but given %+" PRIsVALUE,
555
584
  name,
556
585
  val));
@@ -572,11 +601,11 @@ get_size_t(VALUE options, VALUE name)
572
601
  case T_FIXNUM:
573
602
  return static_cast<std::size_t>(FIX2ULONG(val));
574
603
  case T_BIGNUM:
575
- return static_cast<std::size_t>(NUM2ULL(val));
604
+ return static_cast<std::size_t>(cb_num2ull(val));
576
605
  default:
577
606
  throw ruby_exception(
578
607
  rb_eArgError,
579
- rb_sprintf("%+" PRIsVALUE " must be a Integer, but given %+" PRIsVALUE, name, val));
608
+ cb_sprintf("%+" PRIsVALUE " must be a Integer, but given %+" PRIsVALUE, name, val));
580
609
  }
581
610
  }
582
611
  return {};
@@ -596,26 +625,26 @@ get_uint16_t(VALUE options, VALUE name)
596
625
  if (FIX2ULONG(val) > std::numeric_limits<std::uint16_t>::max()) {
597
626
  throw ruby_exception(
598
627
  rb_eArgError,
599
- rb_sprintf("%+" PRIsVALUE " must not be larger than %d , but given %+" PRIsVALUE,
628
+ cb_sprintf("%+" PRIsVALUE " must not be larger than %d , but given %+" PRIsVALUE,
600
629
  name,
601
630
  static_cast<int>(std::numeric_limits<std::uint16_t>::max()),
602
631
  val));
603
632
  }
604
633
  return static_cast<std::uint16_t>(FIX2ULONG(val));
605
634
  case T_BIGNUM:
606
- if (NUM2ULL(val) > std::numeric_limits<std::uint16_t>::max()) {
635
+ if (cb_num2ull(val) > std::numeric_limits<std::uint16_t>::max()) {
607
636
  throw ruby_exception(
608
637
  rb_eArgError,
609
- rb_sprintf("%+" PRIsVALUE " must not be larger than %d , but given %+" PRIsVALUE,
638
+ cb_sprintf("%+" PRIsVALUE " must not be larger than %d , but given %+" PRIsVALUE,
610
639
  name,
611
640
  static_cast<int>(std::numeric_limits<std::uint16_t>::max()),
612
641
  val));
613
642
  }
614
- return static_cast<std::uint16_t>(NUM2ULL(val));
643
+ return static_cast<std::uint16_t>(cb_num2ull(val));
615
644
  default:
616
645
  throw ruby_exception(
617
646
  rb_eArgError,
618
- rb_sprintf("%+" PRIsVALUE " must be a Integer, but given %+" PRIsVALUE, name, val));
647
+ cb_sprintf("%+" PRIsVALUE " must be a Integer, but given %+" PRIsVALUE, name, val));
619
648
  }
620
649
  }
621
650
  return {};
@@ -635,7 +664,7 @@ get_symbol(VALUE options, VALUE name)
635
664
  }
636
665
  throw couchbase::ruby::ruby_exception(
637
666
  rb_eArgError,
638
- rb_sprintf("%+" PRIsVALUE " must be an Symbol, but given %+" PRIsVALUE, name, val));
667
+ cb_sprintf("%+" PRIsVALUE " must be an Symbol, but given %+" PRIsVALUE, name, val));
639
668
  }
640
669
  return {};
641
670
  }
@@ -654,7 +683,7 @@ get_hash(VALUE options, VALUE name)
654
683
  }
655
684
  throw couchbase::ruby::ruby_exception(
656
685
  rb_eArgError,
657
- rb_sprintf("%+" PRIsVALUE " must be a Hash, but given %+" PRIsVALUE, name, val));
686
+ cb_sprintf("%+" PRIsVALUE " must be a Hash, but given %+" PRIsVALUE, name, val));
658
687
  }
659
688
  return {};
660
689
  }
@@ -673,9 +702,43 @@ get_string(VALUE options, VALUE name)
673
702
  }
674
703
  throw couchbase::ruby::ruby_exception(
675
704
  rb_eArgError,
676
- rb_sprintf("%+" PRIsVALUE " must be an String, but given %+" PRIsVALUE, name, val));
705
+ cb_sprintf("%+" PRIsVALUE " must be an String, but given %+" PRIsVALUE, name, val));
677
706
  }
678
707
  return {};
679
708
  }
680
709
  } // namespace options
710
+
711
+ auto
712
+ cb_to_timeout(VALUE timeout, const char* name, std::chrono::milliseconds max_timeout)
713
+ -> std::chrono::milliseconds
714
+ {
715
+ if (!RB_INTEGER_TYPE_P(timeout)) {
716
+ VALUE message = Qnil;
717
+ cb_protect([&message, timeout, name] {
718
+ message = rb_sprintf("%s must be an Integer, but given %+" PRIsVALUE, name, timeout);
719
+ });
720
+ throw ruby_exception(rb_eArgError, message);
721
+ }
722
+ std::uint64_t timeout_ms = 0;
723
+ // The sign is -2 or -1 for a negative value, and 2 for one that does not fit timeout_ms.
724
+ if (int sign = rb_integer_pack(timeout,
725
+ &timeout_ms,
726
+ 1,
727
+ sizeof(timeout_ms),
728
+ 0,
729
+ INTEGER_PACK_LSWORD_FIRST | INTEGER_PACK_NATIVE_BYTE_ORDER);
730
+ sign < 0 || sign > 1 || timeout_ms > static_cast<std::uint64_t>(max_timeout.count())) {
731
+ VALUE message = Qnil;
732
+ cb_protect([&message, timeout, name, max = static_cast<std::int64_t>(max_timeout.count())] {
733
+ message =
734
+ rb_sprintf("%s must be between 0 and %" PRId64 " milliseconds, but given %+" PRIsVALUE,
735
+ name,
736
+ max,
737
+ timeout);
738
+ });
739
+ throw ruby_exception(exc_invalid_argument(), message);
740
+ }
741
+ return std::chrono::milliseconds{ static_cast<std::int64_t>(timeout_ms) };
742
+ }
743
+
681
744
  } // namespace couchbase::ruby