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
@@ -0,0 +1,250 @@
1
+ # Vendors the Couchbase Protostellar (couchbase2://) protobuf/gRPC schema and builds the generated
2
+ # C++ stubs into the couchbase_cxx_protostellar static library.
3
+ #
4
+ # For VCS builds the schema is fetched via CPM (DOWNLOAD_ONLY, no CMakeLists), mirroring how
5
+ # tools/fit_performer vendors couchbaselabs/fit-protocol.
6
+ #
7
+ # Offline/tarball builds are wired: cmake/Packaging.cmake enables COUCHBASE_CXX_CLIENT_BUILD_COUCHBASE2
8
+ # in the inner packaging configure so these CPM packages land in the cache, and cmake/tarball_glob.txt
9
+ # carries protostellar/api_common_protos entries so they are embedded in the tarball. Both are load
10
+ # bearing for RPM/DEB builds, which run without network access.
11
+ #
12
+ # gRPC::grpc++, gRPC::grpc_cpp_plugin, protobuf::libprotobuf and protobuf::protoc are provided by
13
+ # cmake/GrpcProtobuf.cmake, which CMakeLists.txt includes before this module.
14
+
15
+ if(NOT TARGET gRPC::grpc++)
16
+ message(FATAL_ERROR "gRPC::grpc++ not found; cmake/GrpcProtobuf.cmake must be included first")
17
+ endif()
18
+ if(NOT TARGET protobuf::libprotobuf)
19
+ message(FATAL_ERROR "protobuf::libprotobuf not found; cmake/GrpcProtobuf.cmake must be included first")
20
+ endif()
21
+
22
+ # The Protostellar schema. The .proto files live at the repository root under couchbase/**.
23
+ # WARNING: do NOT add GIT_SHALLOW — a shallow clone cannot reach an arbitrary pinned commit.
24
+ #
25
+ # CAVEAT when bumping GIT_TAG: protobuf emits a class-scoped alias per enum value ("static
26
+ # constexpr Status STATUS_TIMEOUT = ..."), so an enum value whose name is also an object-like macro
27
+ # in the Windows SDK mangles the generated header. This breaks MSVC only — <winnt.h> is reached
28
+ # transitively through asio and gRPC, so the Linux and macOS legs stay green and the failure shows
29
+ # up an hour later in CI. One name collides today: QueryResponse.MetaData.Status.STATUS_TIMEOUT vs
30
+ # winnt.h's ((DWORD)0x00000102L). couchbase/query/v1/query{,.grpc}.pb.h is therefore included only
31
+ # through core/protostellar/query_proto.hxx, which suppresses the whole STATUS_* family around the
32
+ # include with push_macro/pop_macro. A renamed or added enum value, or the same pattern in another
33
+ # proto, introduces a new collision — after bumping, run
34
+ #
35
+ # ./bin/check-proto-macro-collisions <build-dir>
36
+ #
37
+ # which lists the hazardous aliases and any source that includes a hazardous header directly
38
+ # instead of through its wrapper.
39
+ cpmaddpackage(
40
+ NAME
41
+ protostellar
42
+ GITHUB_REPOSITORY
43
+ "couchbase/protostellar"
44
+ GIT_TAG
45
+ 36d4d9aba03a388f7edb05290f1093d9497b1005
46
+ DOWNLOAD_ONLY
47
+ YES)
48
+
49
+ # The schema imports google/rpc/status.proto (a googleapis common proto that protobuf itself does
50
+ # not ship). api-common-protos is the small canonical source for it. The google/protobuf/* imports
51
+ # (any, duration, timestamp) are well-known types resolved by protoc from the protobuf install.
52
+ cpmaddpackage(
53
+ NAME
54
+ api_common_protos
55
+ GITHUB_REPOSITORY
56
+ "googleapis/api-common-protos"
57
+ GIT_TAG
58
+ 3332dec527759859840a3a2ff108c67a54708130
59
+ DOWNLOAD_ONLY
60
+ YES)
61
+
62
+ set(_ps_out "${CMAKE_CURRENT_BINARY_DIR}/protostellar_generated")
63
+
64
+ if(TARGET gRPC::grpc_cpp_plugin)
65
+ set(_ps_grpc_plugin "$<TARGET_FILE:gRPC::grpc_cpp_plugin>")
66
+ # Depend on the target so it is built before codegen runs.
67
+ set(_ps_grpc_plugin_dep gRPC::grpc_cpp_plugin)
68
+ else()
69
+ find_program(_ps_grpc_plugin grpc_cpp_plugin REQUIRED)
70
+ # No target to depend on; the discovered executable path is the dependency.
71
+ set(_ps_grpc_plugin_dep "${_ps_grpc_plugin}")
72
+ endif()
73
+
74
+ set(_ps_import_flags -I "${protostellar_SOURCE_DIR}" -I "${api_common_protos_SOURCE_DIR}")
75
+ # When protobuf is built from source (not a system package) protoc has no built-in path to the
76
+ # well-known .proto files; GrpcProtobuf.cmake sets PROTOBUF_IMPORT_DIRS in that case.
77
+ if(DEFINED PROTOBUF_IMPORT_DIRS)
78
+ foreach(_dir ${PROTOBUF_IMPORT_DIRS})
79
+ list(APPEND _ps_import_flags -I "${_dir}")
80
+ endforeach()
81
+ endif()
82
+
83
+ # Service protos (generate both message and gRPC stubs), relative to the Protostellar root.
84
+ set(_ps_service_protos
85
+ couchbase/admin/analytics/v1/analytics.proto
86
+ couchbase/admin/bucket/v1/bucket.proto
87
+ couchbase/admin/collection/v1/collection.proto
88
+ couchbase/admin/query/v1/query.proto
89
+ couchbase/admin/search/v1/search.proto
90
+ couchbase/analytics/v1/analytics.proto
91
+ couchbase/internal/hooks/v1/hooks.proto
92
+ couchbase/internal/xdcr/v1/xdcr.proto
93
+ couchbase/kv/v1/kv.proto
94
+ couchbase/query/v1/query.proto
95
+ couchbase/routing/v2/routing.proto
96
+ couchbase/search/v1/search.proto
97
+ couchbase/transactions/v1/transactions.proto
98
+ couchbase/view/v1/view.proto)
99
+
100
+ set(_ps_srcs "")
101
+ set(_ps_hdrs "")
102
+
103
+ # Emit the protobuf (message) sources for one proto given its import-root base and relative path.
104
+ # Appends the outputs to _ps_srcs / _ps_hdrs in the caller scope.
105
+ function(_ps_generate_cpp base rel out_srcs out_hdrs)
106
+ get_filename_component(_rel_dir "${rel}" DIRECTORY)
107
+ get_filename_component(_rel_we "${rel}" NAME_WE)
108
+ file(MAKE_DIRECTORY "${_ps_out}/${_rel_dir}")
109
+ set(_cc "${_ps_out}/${_rel_dir}/${_rel_we}.pb.cc")
110
+ set(_h "${_ps_out}/${_rel_dir}/${_rel_we}.pb.h")
111
+ add_custom_command(
112
+ OUTPUT "${_cc}" "${_h}"
113
+ COMMAND protobuf::protoc
114
+ --cpp_out "${_ps_out}" ${_ps_import_flags} "${base}/${rel}"
115
+ --experimental_allow_proto3_optional
116
+ DEPENDS "${base}/${rel}" protobuf::protoc
117
+ COMMENT "protoc cpp: ${rel}"
118
+ VERBATIM)
119
+ set(${out_srcs} ${${out_srcs}} "${_cc}" PARENT_SCOPE)
120
+ set(${out_hdrs} ${${out_hdrs}} "${_h}" PARENT_SCOPE)
121
+ endfunction()
122
+
123
+ # Emit the gRPC service sources for one proto.
124
+ function(_ps_generate_grpc base rel out_srcs out_hdrs)
125
+ get_filename_component(_rel_dir "${rel}" DIRECTORY)
126
+ get_filename_component(_rel_we "${rel}" NAME_WE)
127
+ file(MAKE_DIRECTORY "${_ps_out}/${_rel_dir}")
128
+ set(_cc "${_ps_out}/${_rel_dir}/${_rel_we}.grpc.pb.cc")
129
+ set(_h "${_ps_out}/${_rel_dir}/${_rel_we}.grpc.pb.h")
130
+ add_custom_command(
131
+ OUTPUT "${_cc}" "${_h}"
132
+ COMMAND protobuf::protoc
133
+ --grpc_out "${_ps_out}" ${_ps_import_flags}
134
+ "--plugin=protoc-gen-grpc=${_ps_grpc_plugin}" "${base}/${rel}"
135
+ --experimental_allow_proto3_optional
136
+ DEPENDS "${base}/${rel}" protobuf::protoc ${_ps_grpc_plugin_dep}
137
+ COMMENT "protoc grpc: ${rel}"
138
+ VERBATIM)
139
+ set(${out_srcs} ${${out_srcs}} "${_cc}" PARENT_SCOPE)
140
+ set(${out_hdrs} ${${out_hdrs}} "${_h}" PARENT_SCOPE)
141
+ endfunction()
142
+
143
+ # google/rpc/status.proto — message stubs only (no service).
144
+ _ps_generate_cpp("${api_common_protos_SOURCE_DIR}" "google/rpc/status.proto" _ps_srcs _ps_hdrs)
145
+
146
+ # google/rpc/error_details.proto — the typed detail blocks (ErrorInfo, PreconditionFailure,
147
+ # ResourceInfo, …) that CNG packs into Status.details; RFC 77 error handling needs them decoded.
148
+ _ps_generate_cpp(
149
+ "${api_common_protos_SOURCE_DIR}" "google/rpc/error_details.proto" _ps_srcs _ps_hdrs)
150
+
151
+ foreach(_proto ${_ps_service_protos})
152
+ _ps_generate_cpp("${protostellar_SOURCE_DIR}" "${_proto}" _ps_srcs _ps_hdrs)
153
+ _ps_generate_grpc("${protostellar_SOURCE_DIR}" "${_proto}" _ps_srcs _ps_hdrs)
154
+ endforeach()
155
+
156
+ set_source_files_properties(${_ps_srcs} ${_ps_hdrs} PROPERTIES GENERATED TRUE)
157
+
158
+ add_library(couchbase_cxx_protostellar STATIC ${_ps_srcs} ${_ps_hdrs})
159
+ add_library(couchbase::cxx_protostellar ALIAS couchbase_cxx_protostellar)
160
+ # Consumers include the generated headers by their proto path, e.g.
161
+ # <couchbase/kv/v1/kv.pb.h>. Exposed SYSTEM so the (warning-heavy) generated code does not trip
162
+ # the project's warnings-as-errors in downstream targets.
163
+ target_include_directories(couchbase_cxx_protostellar SYSTEM PUBLIC "${_ps_out}")
164
+ target_link_libraries(couchbase_cxx_protostellar PUBLIC gRPC::grpc++ protobuf::libprotobuf)
165
+ set_target_properties(
166
+ couchbase_cxx_protostellar
167
+ PROPERTIES POSITION_INDEPENDENT_CODE ON
168
+ COMPILE_WARNING_AS_ERROR OFF
169
+ CXX_CLANG_TIDY ""
170
+ CXX_INCLUDE_WHAT_YOU_USE "")
171
+ if(COUCHBASE_CXX_CLIENT_PACKAGE_BUILD)
172
+ set_target_properties(
173
+ couchbase_cxx_protostellar PROPERTIES C_VISIBILITY_PRESET hidden CXX_VISIBILITY_PRESET hidden
174
+ VISIBILITY_INLINES_HIDDEN ON)
175
+ endif()
176
+ # The generated stubs MUST be compiled with the same sanitizer flags as everything that includes the
177
+ # generated headers, because protobuf changes the LAYOUT of every message under ThreadSanitizer:
178
+ # port_def.inc defines PROTOBUF_TSAN from the compiler's thread_sanitizer feature test, and
179
+ # PROTOBUF_TSAN_DECLARE_MEMBER -- which appears in every generated message's Impl_ -- then adds a
180
+ # `::uint32_t _tsan_detect_race` member. So sizeof(UpsertResponse) is 40 without -fsanitize=thread
181
+ # and 48 with it, and every setter additionally stores a race-detection byte past the smaller size.
182
+ #
183
+ # enable_sanitizers() attaches the flags PUBLIC to the client target, which propagates UP to the
184
+ # tests but never DOWN into this library (the client links it PRIVATE). That left RpcMethodHandler
185
+ # -- instantiated in the uninstrumented kv.grpc.pb.cc -- reserving a 40-byte `ResponseType rsp` on
186
+ # its stack directly below the saved `param` reference, while the instrumented handler's set_cas()
187
+ # wrote the race byte at offset 40, zeroing that pointer's low byte. RunHandler then read
188
+ # param.request from an address 32 bytes off, got a null, and destroyed a null request: the
189
+ # `unit (tsan)` SEGV in cng_component_test at method_handler.h:119 (CXXCBC-917).
190
+ #
191
+ # PROTOBUF_TSAN cannot be forced to a fixed value instead -- port_def.inc #errors if it is already
192
+ # defined -- so matching the flags is the only supported remedy.
193
+ enable_sanitizers(couchbase_cxx_protostellar)
194
+ # ABI visibility, above: couchbase_cxx_client links this library whenever
195
+ # COUCHBASE_CXX_CLIENT_BUILD_COUCHBASE2 is on, so without hidden visibility the generated
196
+ # protobuf/gRPC symbols land in the exported ABI of libcouchbase_cxx_client.so, where an application
197
+ # linking its own protobuf/gRPC interposes on them. That is what the shipped library must not do, so
198
+ # COUCHBASE_CXX_CLIENT_PACKAGE_BUILD hides them; gRPC and protobuf themselves are covered in
199
+ # cmake/GrpcProtobuf.cmake.
200
+ #
201
+ # Hiding them splits the process into two protobuf worlds: symbols in this archive resolve at static
202
+ # link time regardless of visibility, so an executable that links BOTH this library and the shared
203
+ # client gets its own copy of every generated message alongside the one inside the .so, with two
204
+ # descriptor pools and two type identities for the same message. Nothing in a package links that
205
+ # combination, but the CNG tests do, which is why they follow the same switch and link the static
206
+ # client only when it is on (test/cng/CMakeLists.txt).
207
+ if(MSVC)
208
+ # /bigobj: the generated translation units are large -- search.pb.cc is 18k lines and yields a
209
+ # 7.4 MB object -- and protobuf-generated code this size can exceed the COFF section limit
210
+ # (fatal error C1128). CI builds Release, but a Debug MSVC build (the default for
211
+ # bin/build-tests) produces markedly larger objects. tools/fit_performer gets this flag from
212
+ # set_project_options() for the same class of file; this target does not call that function.
213
+ #
214
+ # Do NOT add the /FI<proto_utils.h> force-include that tools/fit_performer uses. It was tried
215
+ # here and breaks the build: proto_utils.h reaches grpc/support/port_platform.h, which includes
216
+ # <windows.h> unconditionally ("Get windows.h included everywhere (we need it)"), so forcing it
217
+ # ahead of the translation unit's own includes puts winnt.h's STATUS_TIMEOUT macro in scope before
218
+ # couchbase/query/v1/query.pb.h is parsed. That header declares an enum constant of the same name,
219
+ # so
220
+ # static constexpr Status STATUS_TIMEOUT = ...
221
+ # expands to ((DWORD)0x00000102L): C2143, plus a member named DWORD (C2789). query.pb.h is the
222
+ # only generated header carrying such a collision. In normal include order it is parsed before
223
+ # anything drags in windows.h, so there is no clash.
224
+ #
225
+ # That force-include exists to work around MSVC's non-conformant two-phase lookup leaving
226
+ # grpc::SerializationTraits undefined when call_op_set.h is processed before proto_utils.h. The
227
+ # ordering does occur here: grpc_cpp_plugin emits the generated .grpc.pb.h includes
228
+ # alphabetically, so async_stream.h (which pulls call_op_set.h) precedes proto_utils.h. It does
229
+ # not, however, produce a diagnostic: the windows-2022 and windows-11-arm legs each compile all 30
230
+ # of this library's translation units and link it without one, so the workaround is not needed
231
+ # here. Should SerializationTraits ever turn up undefined in a *.grpc.pb.cc, the remedy is
232
+ # /permissive-, which makes the lookup conformant without inverting include order -- not the
233
+ # force-include.
234
+ target_compile_options(couchbase_cxx_protostellar PRIVATE /W0 /FS /bigobj)
235
+ else()
236
+ target_compile_options(couchbase_cxx_protostellar PRIVATE -w)
237
+ endif()
238
+
239
+ # The hand-written transport (core/protostellar/*.cxx: the gRPC<->asio bridge, credentials, and
240
+ # later the cluster component) is compiled into couchbase_cxx_client itself, guarded by
241
+ # COUCHBASE_CXX_CLIENT_BUILD_COUCHBASE2 -- the client library links this stubs library. Keeping
242
+ # the transport in the client library (rather than a standalone lib) avoids a dependency cycle
243
+ # once cluster_impl calls into it, and lets it reuse core utilities (base64, the Mozilla CA
244
+ # bundle). The source list is exported for CMakeLists.txt to append to couchbase_cxx_client_FILES.
245
+ set(couchbase_cxx_protostellar_TRANSPORT_FILES
246
+ ${PROJECT_SOURCE_DIR}/core/protostellar/dispatcher.cxx
247
+ ${PROJECT_SOURCE_DIR}/core/protostellar/credentials.cxx
248
+ ${PROJECT_SOURCE_DIR}/core/protostellar/error_utils.cxx
249
+ ${PROJECT_SOURCE_DIR}/core/protostellar/kv_converter.cxx
250
+ ${PROJECT_SOURCE_DIR}/core/protostellar/component.cxx)
@@ -1,68 +1,79 @@
1
- function(enable_sanitizers project_name)
1
+ # Evaluated at file scope when Sanitizers.cmake is included by top-level CMakeLists.txt.
2
+ # Setting options and computing LIST_OF_SANITIZERS globally (rather than scoped inside
3
+ # enable_sanitizers()) ensures LIST_OF_SANITIZERS and SANITIZERS are available to
4
+ # ThirdPartyDependencies.cmake and FetchContent hooks when configuring bundled dependencies.
5
+ if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES ".*Clang")
6
+ option(ENABLE_COVERAGE "Enable coverage reporting for gcc/clang" FALSE)
2
7
 
3
- if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES ".*Clang")
4
- option(ENABLE_COVERAGE "Enable coverage reporting for gcc/clang" FALSE)
8
+ set(SANITIZERS "")
5
9
 
6
- if(ENABLE_COVERAGE)
7
- target_compile_options(${project_name} INTERFACE --coverage -O0 -g)
8
- target_link_libraries(${project_name} INTERFACE --coverage)
9
- endif()
10
+ option(ENABLE_SANITIZER_ADDRESS "Enable address sanitizer" FALSE)
11
+ if(ENABLE_SANITIZER_ADDRESS)
12
+ list(APPEND SANITIZERS "address")
13
+ endif()
10
14
 
11
- set(SANITIZERS "")
15
+ option(ENABLE_SANITIZER_LEAK "Enable leak sanitizer" FALSE)
16
+ if(ENABLE_SANITIZER_LEAK)
17
+ list(APPEND SANITIZERS "leak")
18
+ endif()
12
19
 
13
- option(ENABLE_SANITIZER_ADDRESS "Enable address sanitizer" FALSE)
14
- if(ENABLE_SANITIZER_ADDRESS)
15
- list(APPEND SANITIZERS "address")
16
- endif()
20
+ option(ENABLE_SANITIZER_UNDEFINED_BEHAVIOUR "Enable undefined behaviour sanitizer" FALSE)
21
+ if(ENABLE_SANITIZER_UNDEFINED_BEHAVIOUR)
22
+ list(APPEND SANITIZERS "undefined")
23
+ endif()
17
24
 
18
- option(ENABLE_SANITIZER_LEAK "Enable leak sanitizer" FALSE)
19
- if(ENABLE_SANITIZER_LEAK)
20
- list(APPEND SANITIZERS "leak")
25
+ option(ENABLE_SANITIZER_THREAD "Enable thread sanitizer" FALSE)
26
+ if(ENABLE_SANITIZER_THREAD)
27
+ if("address" IN_LIST SANITIZERS OR "leak" IN_LIST SANITIZERS)
28
+ message(WARNING "Thread sanitizer does not work with Address and Leak sanitizer enabled")
29
+ else()
30
+ list(APPEND SANITIZERS "thread")
31
+ # Propagate the suppression file path so that test targets can set TSAN_OPTIONS.
32
+ set(COUCHBASE_CXX_CLIENT_TSAN_SUPPRESSIONS
33
+ "${PROJECT_SOURCE_DIR}/.tsan_suppressions"
34
+ CACHE FILEPATH "Path to TSan suppressions file")
21
35
  endif()
36
+ endif()
22
37
 
23
- option(ENABLE_SANITIZER_UNDEFINED_BEHAVIOUR "Enable undefined behaviour sanitizer" FALSE)
24
- if(ENABLE_SANITIZER_UNDEFINED_BEHAVIOUR)
25
- list(APPEND SANITIZERS "undefined")
38
+ option(ENABLE_SANITIZER_MEMORY "Enable memory sanitizer" FALSE)
39
+ if(ENABLE_SANITIZER_MEMORY AND CMAKE_CXX_COMPILER_ID MATCHES ".*Clang")
40
+ if("address" IN_LIST SANITIZERS
41
+ OR "thread" IN_LIST SANITIZERS
42
+ OR "leak" IN_LIST SANITIZERS)
43
+ message(WARNING "Memory sanitizer does not work with Address, Thread and Leak sanitizer enabled")
44
+ else()
45
+ list(APPEND SANITIZERS "memory")
26
46
  endif()
47
+ endif()
27
48
 
28
- option(ENABLE_SANITIZER_THREAD "Enable thread sanitizer" FALSE)
29
- if(ENABLE_SANITIZER_THREAD)
30
- if("address" IN_LIST SANITIZERS OR "leak" IN_LIST SANITIZERS)
31
- message(WARNING "Thread sanitizer does not work with Address and Leak sanitizer enabled")
32
- else()
33
- list(APPEND SANITIZERS "thread")
34
- endif()
35
- endif()
49
+ list(
50
+ JOIN
51
+ SANITIZERS
52
+ ","
53
+ LIST_OF_SANITIZERS)
36
54
 
37
- option(ENABLE_SANITIZER_MEMORY "Enable memory sanitizer" FALSE)
38
- if(ENABLE_SANITIZER_MEMORY AND CMAKE_CXX_COMPILER_ID MATCHES ".*Clang")
39
- if("address" IN_LIST SANITIZERS
40
- OR "thread" IN_LIST SANITIZERS
41
- OR "leak" IN_LIST SANITIZERS)
42
- message(WARNING "Memory sanitizer does not work with Address, Thread and Leak sanitizer enabled")
43
- else()
44
- list(APPEND SANITIZERS "memory")
45
- endif()
46
- endif()
55
+ endif()
47
56
 
48
- list(
49
- JOIN
50
- SANITIZERS
51
- ","
52
- LIST_OF_SANITIZERS)
57
+ function(enable_sanitizers project_name)
53
58
 
59
+ if(ENABLE_COVERAGE)
60
+ target_compile_options(${project_name} INTERFACE --coverage -O0 -g)
61
+ target_link_libraries(${project_name} INTERFACE --coverage)
54
62
  endif()
55
63
 
56
- if(LIST_OF_SANITIZERS)
57
- if(NOT
58
- "${LIST_OF_SANITIZERS}"
59
- STREQUAL
60
- "")
61
- target_compile_options(${project_name} INTERFACE -fsanitize=${LIST_OF_SANITIZERS})
62
- target_link_libraries(${project_name} INTERFACE -fsanitize=${LIST_OF_SANITIZERS})
63
- target_compile_definitions(${project_name} INTERFACE COUCHBASE_CXX_CLIENT_BUILD_SANITIZED=1)
64
- message(STATUS "Enabled stanitizers: ${LIST_OF_SANITIZERS}")
64
+ if(LIST_OF_SANITIZERS AND NOT "${LIST_OF_SANITIZERS}" STREQUAL "")
65
+ target_compile_options(${project_name} PUBLIC -fsanitize=${LIST_OF_SANITIZERS})
66
+ if("thread" IN_LIST SANITIZERS
67
+ AND CMAKE_CXX_COMPILER_ID STREQUAL "GNU"
68
+ AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "14.0.0")
69
+ # GCC 14+ emits -Wtsan compile-time warnings for std::atomic_thread_fence (e.g. in Asio headers).
70
+ # Under -Werror, this breaks compilation. -Wno-error=tsan prevents compile errors while keeping
71
+ # runtime TSan instrumentation (-fsanitize=thread) fully active to catch actual data races.
72
+ target_compile_options(${project_name} PUBLIC -Wno-error=tsan)
65
73
  endif()
74
+ target_link_libraries(${project_name} PUBLIC -fsanitize=${LIST_OF_SANITIZERS})
75
+ target_compile_definitions(${project_name} PUBLIC COUCHBASE_CXX_CLIENT_BUILD_SANITIZED=1)
76
+ message(STATUS "Enabled sanitizers: ${LIST_OF_SANITIZERS}")
66
77
  endif()
67
78
 
68
79
  endfunction()
@@ -34,20 +34,31 @@ if(ENABLE_CLANG_TIDY)
34
34
  endif()
35
35
 
36
36
  set(CLANGTIDY_CANDIDATES
37
+ clang-tidy-23
38
+ clang-tidy-22
39
+ clang-tidy-21
37
40
  clang-tidy-20
38
41
  clang-tidy-19
39
42
  clang-tidy-18
40
43
  clang-tidy)
41
44
  if(LLVM_ROOT_DIR)
42
- find_program(CLANGTIDY ${CLANGTIDY_CANDIDATES} HINTS "${LLVM_ROOT_DIR}/bin")
45
+ find_program(CLANGTIDY NAMES ${CLANGTIDY_CANDIDATES} HINTS "${LLVM_ROOT_DIR}/bin")
43
46
  else()
44
- find_program(CLANGTIDY ${CLANGTIDY_CANDIDATES})
47
+ find_program(CLANGTIDY NAMES ${CLANGTIDY_CANDIDATES})
45
48
  endif()
46
49
  if(CLANGTIDY)
47
- set(COUCHBASE_CXX_CLIENT_CLANG_TIDY "${CLANGTIDY};-extra-arg=-Wno-unknown-warning-option")
50
+ # -Wno-unknown-warning-option: suppresses errors when clang-tidy passes flags not known to older
51
+ # compiler versions (e.g. when mixing clang-tidy-23 with clang-22 headers).
52
+ # -Wno-c2y-extensions: __COUNTER__ is used by Catch2's TEST_CASE macro; clang-23 warns it is a
53
+ # C2y extension. We cannot modify Catch2, and the warning is irrelevant in a C++17 codebase.
54
+ # No -export-fixes here: build-integrated clang-tidy runs once per translation unit in
55
+ # parallel, so a shared fixes file would be clobbered. CI exports fixes via run-clang-tidy
56
+ # in bin/check-clang-tidy instead. -fix (which rewrites sources in place) is opt-in and
57
+ # intended for local use only; CI must report, not rewrite.
58
+ set(COUCHBASE_CXX_CLIENT_CLANG_TIDY
59
+ "${CLANGTIDY};-extra-arg=-Wno-unknown-warning-option;-extra-arg=-Wno-c2y-extensions")
48
60
  if(ENABLE_CLANG_TIDY_FIX)
49
- set(COUCHBASE_CXX_CLIENT_CLANG_TIDY
50
- "${COUCHBASE_CXX_CLIENT_CLANG_TIDY};-fix;-export-fixes=${PROJECT_BINARY_DIR}/clang-tidy-fixes.yaml")
61
+ set(COUCHBASE_CXX_CLIENT_CLANG_TIDY "${COUCHBASE_CXX_CLIENT_CLANG_TIDY};-fix")
51
62
  endif()
52
63
  else()
53
64
  message(SEND_ERROR "clang-tidy requested but executable not found")