couchbase 3.8.2 → 3.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (473) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/ext/CMakeLists.txt +16 -1
  4. data/ext/cache/cpm/{CPM_0.42.0.cmake → CPM_0.43.1.cmake} +18 -2
  5. data/ext/cache/extconf_include.rb +6 -6
  6. data/ext/cache/mozilla-ca-bundle.crt +121 -55
  7. data/ext/cache/mozilla-ca-bundle.sha256 +1 -1
  8. data/ext/couchbase/CMakeLists.txt +136 -23
  9. data/ext/couchbase/cmake/APKBUILD.in +25 -4
  10. data/ext/couchbase/cmake/Bundler.cmake +143 -34
  11. data/ext/couchbase/cmake/CPM.cmake +126 -12
  12. data/ext/couchbase/cmake/Cache.cmake +7 -1
  13. data/ext/couchbase/cmake/CompilerOptions.cmake +1 -1
  14. data/ext/couchbase/cmake/CompilerWarnings.cmake +17 -6
  15. data/ext/couchbase/cmake/GrpcProtobuf.cmake +481 -0
  16. data/ext/couchbase/cmake/OpenSSL.cmake +82 -7
  17. data/ext/couchbase/cmake/Packaging.cmake +519 -65
  18. data/ext/couchbase/cmake/Protostellar.cmake +250 -0
  19. data/ext/couchbase/cmake/Sanitizers.cmake +61 -50
  20. data/ext/couchbase/cmake/StaticAnalyzers.cmake +16 -5
  21. data/ext/couchbase/cmake/TestFramework.cmake +283 -0
  22. data/ext/couchbase/cmake/TestFrameworkAddTests.cmake +51 -0
  23. data/ext/couchbase/cmake/Testing.cmake +27 -9
  24. data/ext/couchbase/cmake/ThirdPartyDependencies.cmake +141 -8
  25. data/ext/couchbase/cmake/VersionInfo.cmake +50 -0
  26. data/ext/couchbase/cmake/build_config.hxx.in +2 -1
  27. data/ext/couchbase/cmake/couchbase-cxx-client.spec.in +101 -23
  28. data/ext/couchbase/cmake/couchbase_cxx_client_static-config.cmake.in +7 -0
  29. data/ext/couchbase/cmake/couchbase_cxx_client_static.pc.in +2 -0
  30. data/ext/couchbase/cmake/gRPC_Generate.cmake +58 -0
  31. data/ext/couchbase/cmake/protobuf_Generate.cmake +69 -0
  32. data/ext/couchbase/cmake/require-git-checkout.cmake +25 -0
  33. data/ext/couchbase/cmake/tarball_glob.txt +49 -0
  34. data/ext/couchbase/core/agent_group.cxx +0 -8
  35. data/ext/couchbase/core/agent_group.hxx +0 -4
  36. data/ext/couchbase/core/analytics_stream.cxx +314 -0
  37. data/ext/couchbase/core/analytics_stream.hxx +129 -0
  38. data/ext/couchbase/core/analytics_stream_component.cxx +245 -0
  39. data/ext/couchbase/core/analytics_stream_component.hxx +67 -0
  40. data/ext/couchbase/core/app_telemetry_meter.cxx +25 -3
  41. data/ext/couchbase/core/app_telemetry_meter.hxx +77 -0
  42. data/ext/couchbase/core/app_telemetry_reporter.cxx +7 -6
  43. data/ext/couchbase/core/bucket.cxx +381 -87
  44. data/ext/couchbase/core/bucket.hxx +105 -25
  45. data/ext/couchbase/core/bucket_unit_test_api.hxx +57 -0
  46. data/ext/couchbase/core/capella.hxx +91 -0
  47. data/ext/couchbase/core/cluster.cxx +1551 -397
  48. data/ext/couchbase/core/cluster.hxx +39 -8
  49. data/ext/couchbase/core/cluster_agent.cxx +0 -8
  50. data/ext/couchbase/core/cluster_agent.hxx +0 -4
  51. data/ext/couchbase/core/cluster_options.hxx +26 -3
  52. data/ext/couchbase/core/collections_component.cxx +39 -15
  53. data/ext/couchbase/core/config_profiles.cxx +1 -1
  54. data/ext/couchbase/core/crud_component.cxx +2 -2
  55. data/ext/couchbase/core/crud_options.hxx +34 -0
  56. data/ext/couchbase/core/crypto/cbcrypto.cc +18 -13
  57. data/ext/couchbase/core/document_id_redaction.hxx +81 -0
  58. data/ext/couchbase/core/error_context/base_error_context.hxx +7 -6
  59. data/ext/couchbase/core/error_context/key_value.cxx +25 -2
  60. data/ext/couchbase/core/error_context/key_value.hxx +60 -33
  61. data/ext/couchbase/core/error_context/key_value_error_context.hxx +16 -15
  62. data/ext/couchbase/core/error_context/search.hxx +5 -0
  63. data/ext/couchbase/core/error_context/search_json.hxx +3 -0
  64. data/ext/couchbase/core/error_context/subdocument_error_context.hxx +19 -18
  65. data/ext/couchbase/core/error_context/view.hxx +5 -0
  66. data/ext/couchbase/core/free_form_http_request.cxx +237 -4
  67. data/ext/couchbase/core/free_form_http_request.hxx +41 -8
  68. data/ext/couchbase/core/http_component.cxx +300 -284
  69. data/ext/couchbase/core/http_component.hxx +0 -4
  70. data/ext/couchbase/core/impl/analytics.cxx +38 -5
  71. data/ext/couchbase/core/impl/analytics.hxx +34 -0
  72. data/ext/couchbase/core/impl/bootstrap_error.hxx +0 -3
  73. data/ext/couchbase/core/impl/collection.cxx +215 -202
  74. data/ext/couchbase/core/impl/collection_manager.cxx +1 -1
  75. data/ext/couchbase/core/impl/dns_srv_tracker.cxx +45 -18
  76. data/ext/couchbase/core/impl/error.cxx +22 -2
  77. data/ext/couchbase/core/impl/internal_analytics_stream_result.hxx +111 -0
  78. data/ext/couchbase/core/impl/internal_query_stream_result.hxx +110 -0
  79. data/ext/couchbase/core/impl/invoke_with_node_id.hxx +15 -7
  80. data/ext/couchbase/core/impl/key_value_error_category.cxx +6 -0
  81. data/ext/couchbase/core/impl/lookup_in_replica.cxx +10 -10
  82. data/ext/couchbase/core/impl/lookup_in_replica.hxx +4 -4
  83. data/ext/couchbase/core/impl/node_id.cxx +49 -13
  84. data/ext/couchbase/core/impl/observability_recorder.cxx +12 -2
  85. data/ext/couchbase/core/impl/observe_poll.cxx +63 -23
  86. data/ext/couchbase/core/impl/public_analytics_stream_result.cxx +372 -0
  87. data/ext/couchbase/core/impl/public_bucket.cxx +48 -2
  88. data/ext/couchbase/core/impl/public_cluster.cxx +229 -42
  89. data/ext/couchbase/core/impl/public_query_stream_result.cxx +380 -0
  90. data/ext/couchbase/core/impl/public_transaction_get_multi_replicas_from_preferred_server_group_result.cxx +42 -0
  91. data/ext/couchbase/core/impl/public_transaction_get_multi_result.cxx +42 -0
  92. data/ext/couchbase/core/impl/query.cxx +76 -7
  93. data/ext/couchbase/core/impl/query.hxx +36 -0
  94. data/ext/couchbase/core/impl/query_index_manager.cxx +54 -1
  95. data/ext/couchbase/core/impl/replica_utils.cxx +101 -0
  96. data/ext/couchbase/core/impl/replica_utils.hxx +64 -0
  97. data/ext/couchbase/core/impl/resolve_node_id.hxx +125 -0
  98. data/ext/couchbase/core/impl/scope.cxx +70 -0
  99. data/ext/couchbase/core/impl/search.cxx +31 -1
  100. data/ext/couchbase/core/impl/transactions.cxx +130 -0
  101. data/ext/couchbase/core/impl/wait_until_ready.cxx +439 -0
  102. data/ext/couchbase/core/impl/wait_until_ready.hxx +110 -0
  103. data/ext/couchbase/core/impl/with_bucket_config_or_timeout.hxx +180 -0
  104. data/ext/couchbase/core/impl/with_cancellation.hxx +11 -3
  105. data/ext/couchbase/core/io/configuration_belongs_to_session.hxx +1 -2
  106. data/ext/couchbase/core/io/dns_client.cxx +122 -45
  107. data/ext/couchbase/core/io/dns_codec.hxx +21 -21
  108. data/ext/couchbase/core/io/dns_config.cxx +21 -6
  109. data/ext/couchbase/core/io/http_command.hxx +149 -121
  110. data/ext/couchbase/core/io/http_error.hxx +107 -0
  111. data/ext/couchbase/core/io/http_parser.cxx +4 -0
  112. data/ext/couchbase/core/io/http_session.cxx +606 -154
  113. data/ext/couchbase/core/io/http_session.hxx +147 -30
  114. data/ext/couchbase/core/io/http_session_manager.hxx +329 -382
  115. data/ext/couchbase/core/io/http_streaming_parser.cxx +4 -0
  116. data/ext/couchbase/core/io/http_streaming_response.cxx +328 -43
  117. data/ext/couchbase/core/io/http_streaming_response.hxx +37 -3
  118. data/ext/couchbase/core/io/mcbp_buffer_pool.hxx +122 -0
  119. data/ext/couchbase/core/io/mcbp_command.hxx +150 -51
  120. data/ext/couchbase/core/io/mcbp_command_id.hxx +45 -0
  121. data/ext/couchbase/core/io/mcbp_message.cxx +9 -1
  122. data/ext/couchbase/core/io/mcbp_message.hxx +19 -0
  123. data/ext/couchbase/core/io/mcbp_output_queue.hxx +150 -0
  124. data/ext/couchbase/core/io/mcbp_parser.cxx +24 -7
  125. data/ext/couchbase/core/io/mcbp_session.cxx +309 -301
  126. data/ext/couchbase/core/io/mcbp_session.hxx +27 -18
  127. data/ext/couchbase/core/io/opaque_ring_table.hxx +145 -0
  128. data/ext/couchbase/core/io/retry_orchestrator.hxx +6 -5
  129. data/ext/couchbase/core/io/stream_deadline.hxx +50 -0
  130. data/ext/couchbase/core/io/streams.cxx +151 -21
  131. data/ext/couchbase/core/io/streams.hxx +48 -1
  132. data/ext/couchbase/core/logger/logger.cxx +36 -0
  133. data/ext/couchbase/core/logger/logger.hxx +46 -6
  134. data/ext/couchbase/core/logger/redaction.hxx +503 -0
  135. data/ext/couchbase/core/management/eventing_status.hxx +10 -0
  136. data/ext/couchbase/core/management/eventing_status_json.hxx +4 -0
  137. data/ext/couchbase/core/mcbp/big_endian.cxx +1 -1
  138. data/ext/couchbase/core/mcbp/codec.cxx +27 -18
  139. data/ext/couchbase/core/mcbp/operation_queue.cxx +2 -2
  140. data/ext/couchbase/core/mcbp/packet.hxx +2 -2
  141. data/ext/couchbase/core/mcbp/queue_request.cxx +23 -6
  142. data/ext/couchbase/core/mcbp/queue_request.hxx +21 -0
  143. data/ext/couchbase/core/meta/features.hxx +13 -0
  144. data/ext/couchbase/core/meta/version.cxx +6 -3
  145. data/ext/couchbase/core/metrics/logging_meter.cxx +5 -10
  146. data/ext/couchbase/core/metrics/meter_wrapper.cxx +63 -33
  147. data/ext/couchbase/core/metrics/meter_wrapper.hxx +55 -3
  148. data/ext/couchbase/core/operations/analytics_response_parsing.cxx +177 -0
  149. data/ext/couchbase/core/operations/analytics_response_parsing.hxx +55 -0
  150. data/ext/couchbase/core/operations/document_analytics.cxx +48 -130
  151. data/ext/couchbase/core/operations/document_analytics.hxx +14 -2
  152. data/ext/couchbase/core/operations/document_get_all_replicas.hxx +15 -7
  153. data/ext/couchbase/core/operations/document_get_any_replica.hxx +19 -8
  154. data/ext/couchbase/core/operations/document_get_projected.cxx +1 -1
  155. data/ext/couchbase/core/{impl/get_replica.cxx → operations/document_get_replica.cxx} +21 -3
  156. data/ext/couchbase/core/{impl/get_replica.hxx → operations/document_get_replica.hxx} +31 -4
  157. data/ext/couchbase/core/operations/document_lookup_in.cxx +10 -10
  158. data/ext/couchbase/core/operations/document_lookup_in_all_replicas.hxx +228 -198
  159. data/ext/couchbase/core/operations/document_lookup_in_any_replica.hxx +215 -217
  160. data/ext/couchbase/core/operations/document_query.cxx +108 -221
  161. data/ext/couchbase/core/operations/document_query.hxx +18 -4
  162. data/ext/couchbase/core/operations/document_search.cxx +52 -8
  163. data/ext/couchbase/core/operations/document_search.hxx +3 -0
  164. data/ext/couchbase/core/operations/document_view.cxx +3 -3
  165. data/ext/couchbase/core/operations/management/analytics_dataset_create.cxx +15 -8
  166. data/ext/couchbase/core/operations/management/analytics_dataset_create.hxx +4 -0
  167. data/ext/couchbase/core/operations/management/analytics_dataset_drop.cxx +11 -6
  168. data/ext/couchbase/core/operations/management/analytics_dataset_get_all.cxx +3 -2
  169. data/ext/couchbase/core/operations/management/analytics_dataverse_create.cxx +10 -5
  170. data/ext/couchbase/core/operations/management/analytics_dataverse_drop.cxx +10 -5
  171. data/ext/couchbase/core/operations/management/analytics_get_pending_mutations.cxx +2 -1
  172. data/ext/couchbase/core/operations/management/analytics_index_create.cxx +33 -8
  173. data/ext/couchbase/core/operations/management/analytics_index_drop.cxx +12 -7
  174. data/ext/couchbase/core/operations/management/analytics_index_get_all.cxx +3 -2
  175. data/ext/couchbase/core/operations/management/analytics_link_connect.cxx +11 -6
  176. data/ext/couchbase/core/operations/management/analytics_link_create.cxx +3 -3
  177. data/ext/couchbase/core/operations/management/analytics_link_disconnect.cxx +10 -4
  178. data/ext/couchbase/core/operations/management/analytics_link_drop.cxx +6 -4
  179. data/ext/couchbase/core/operations/management/analytics_link_get_all.cxx +4 -3
  180. data/ext/couchbase/core/operations/management/analytics_link_replace.cxx +3 -3
  181. data/ext/couchbase/core/operations/management/analytics_link_utils.hxx +1 -1
  182. data/ext/couchbase/core/operations/management/change_password.cxx +2 -0
  183. data/ext/couchbase/core/operations/management/collection_drop.cxx +5 -1
  184. data/ext/couchbase/core/operations/management/error_utils.cxx +60 -6
  185. data/ext/couchbase/core/operations/management/error_utils.hxx +29 -1
  186. data/ext/couchbase/core/operations/management/eventing_deploy_function.cxx +9 -3
  187. data/ext/couchbase/core/operations/management/eventing_drop_function.cxx +8 -3
  188. data/ext/couchbase/core/operations/management/eventing_get_all_functions.cxx +4 -2
  189. data/ext/couchbase/core/operations/management/eventing_get_function.cxx +5 -3
  190. data/ext/couchbase/core/operations/management/eventing_get_status.cxx +4 -2
  191. data/ext/couchbase/core/operations/management/eventing_pause_function.cxx +9 -3
  192. data/ext/couchbase/core/operations/management/eventing_resume_function.cxx +9 -3
  193. data/ext/couchbase/core/operations/management/eventing_undeploy_function.cxx +9 -3
  194. data/ext/couchbase/core/operations/management/eventing_upsert_function.cxx +9 -3
  195. data/ext/couchbase/core/operations/management/group_drop.cxx +3 -1
  196. data/ext/couchbase/core/operations/management/group_get.cxx +3 -1
  197. data/ext/couchbase/core/operations/management/group_upsert.cxx +11 -8
  198. data/ext/couchbase/core/operations/management/query_index_build.cxx +5 -2
  199. data/ext/couchbase/core/operations/management/query_index_create.cxx +9 -3
  200. data/ext/couchbase/core/operations/management/query_index_drop.cxx +11 -4
  201. data/ext/couchbase/core/operations/management/query_index_get_all.cxx +1 -1
  202. data/ext/couchbase/core/operations/management/query_index_get_all_deferred.cxx +1 -1
  203. data/ext/couchbase/core/operations/management/scope_drop.cxx +5 -1
  204. data/ext/couchbase/core/operations/management/scope_get_all.cxx +6 -1
  205. data/ext/couchbase/core/operations/management/search_get_stats.cxx +10 -0
  206. data/ext/couchbase/core/operations/management/search_index_analyze_document.cxx +3 -2
  207. data/ext/couchbase/core/operations/management/search_index_control_ingest.cxx +4 -3
  208. data/ext/couchbase/core/operations/management/search_index_control_plan_freeze.cxx +4 -3
  209. data/ext/couchbase/core/operations/management/search_index_control_query.cxx +4 -3
  210. data/ext/couchbase/core/operations/management/search_index_drop.cxx +2 -2
  211. data/ext/couchbase/core/operations/management/search_index_get.cxx +2 -2
  212. data/ext/couchbase/core/operations/management/search_index_get_documents_count.cxx +3 -2
  213. data/ext/couchbase/core/operations/management/search_index_get_stats.cxx +3 -1
  214. data/ext/couchbase/core/operations/management/search_index_upsert.cxx +2 -2
  215. data/ext/couchbase/core/operations/management/user_drop.cxx +3 -1
  216. data/ext/couchbase/core/operations/management/user_get.cxx +3 -1
  217. data/ext/couchbase/core/operations/management/user_upsert.cxx +12 -9
  218. data/ext/couchbase/core/operations/management/view_index_drop.cxx +1 -1
  219. data/ext/couchbase/core/operations/management/view_index_get.cxx +1 -1
  220. data/ext/couchbase/core/operations/management/view_index_upsert.cxx +1 -1
  221. data/ext/couchbase/core/operations/operation_traits.hxx +18 -0
  222. data/ext/couchbase/core/operations/query_response_parsing.cxx +211 -0
  223. data/ext/couchbase/core/operations/query_response_parsing.hxx +60 -0
  224. data/ext/couchbase/core/operations_fwd.hxx +3 -3
  225. data/ext/couchbase/core/origin.cxx +54 -26
  226. data/ext/couchbase/core/origin.hxx +12 -0
  227. data/ext/couchbase/core/orphan_reporter.cxx +2 -1
  228. data/ext/couchbase/core/platform/random.cc +7 -7
  229. data/ext/couchbase/core/protocol/client_request.cxx +2 -2
  230. data/ext/couchbase/core/protocol/client_request.hxx +38 -21
  231. data/ext/couchbase/core/protocol/client_response.cxx +11 -3
  232. data/ext/couchbase/core/protocol/client_response.hxx +27 -6
  233. data/ext/couchbase/core/protocol/cmd_append.cxx +2 -2
  234. data/ext/couchbase/core/protocol/cmd_cluster_map_change_notification.cxx +2 -2
  235. data/ext/couchbase/core/protocol/cmd_decrement.cxx +6 -6
  236. data/ext/couchbase/core/protocol/cmd_get.cxx +1 -1
  237. data/ext/couchbase/core/protocol/cmd_get_and_lock.cxx +2 -2
  238. data/ext/couchbase/core/protocol/cmd_get_and_touch.cxx +2 -2
  239. data/ext/couchbase/core/protocol/cmd_get_cluster_config.cxx +6 -4
  240. data/ext/couchbase/core/protocol/cmd_get_collection_id.cxx +2 -2
  241. data/ext/couchbase/core/protocol/cmd_get_error_map.cxx +1 -1
  242. data/ext/couchbase/core/protocol/cmd_get_meta.cxx +4 -4
  243. data/ext/couchbase/core/protocol/cmd_get_replica.cxx +1 -1
  244. data/ext/couchbase/core/protocol/cmd_hello.cxx +1 -1
  245. data/ext/couchbase/core/protocol/cmd_increment.cxx +6 -6
  246. data/ext/couchbase/core/protocol/cmd_insert.cxx +4 -4
  247. data/ext/couchbase/core/protocol/cmd_lookup_in.cxx +4 -3
  248. data/ext/couchbase/core/protocol/cmd_lookup_in_replica.cxx +4 -3
  249. data/ext/couchbase/core/protocol/cmd_mutate_in.cxx +10 -9
  250. data/ext/couchbase/core/protocol/cmd_mutate_in.hxx +10 -10
  251. data/ext/couchbase/core/protocol/cmd_observe_seqno.cxx +7 -7
  252. data/ext/couchbase/core/protocol/cmd_prepend.cxx +2 -2
  253. data/ext/couchbase/core/protocol/cmd_remove.cxx +2 -2
  254. data/ext/couchbase/core/protocol/cmd_replace.cxx +4 -4
  255. data/ext/couchbase/core/protocol/cmd_touch.cxx +1 -1
  256. data/ext/couchbase/core/protocol/cmd_upsert.cxx +4 -4
  257. data/ext/couchbase/core/protocol/datatype.hxx +118 -1
  258. data/ext/couchbase/core/protocol/frame_info_utils.cxx +1 -1
  259. data/ext/couchbase/core/protocol/magic.hxx +4 -0
  260. data/ext/couchbase/core/protocol/magic_fmt.hxx +3 -0
  261. data/ext/couchbase/core/protocol/server_request.hxx +3 -1
  262. data/ext/couchbase/core/protocol/status.cxx +1 -1
  263. data/ext/couchbase/core/protostellar/analytics_converter.hxx +171 -0
  264. data/ext/couchbase/core/protostellar/bucket_admin_converter.hxx +301 -0
  265. data/ext/couchbase/core/protostellar/collection_admin_converter.hxx +92 -0
  266. data/ext/couchbase/core/protostellar/component.cxx +2445 -0
  267. data/ext/couchbase/core/protostellar/component.hxx +391 -0
  268. data/ext/couchbase/core/{columnar/bootstrap_notification_subscriber.hxx → protostellar/compression_settings.hxx} +11 -10
  269. data/ext/couchbase/core/protostellar/credentials.cxx +233 -0
  270. data/ext/couchbase/core/protostellar/credentials.hxx +88 -0
  271. data/ext/couchbase/core/protostellar/dispatcher.cxx +57 -0
  272. data/ext/couchbase/core/protostellar/dispatcher.hxx +482 -0
  273. data/ext/couchbase/core/protostellar/error_utils.cxx +293 -0
  274. data/ext/couchbase/core/protostellar/error_utils.hxx +97 -0
  275. data/ext/couchbase/core/protostellar/json_payload.hxx +49 -0
  276. data/ext/couchbase/core/protostellar/kv_converter.cxx +70 -0
  277. data/ext/couchbase/core/protostellar/kv_converter.hxx +600 -0
  278. data/ext/couchbase/core/protostellar/query_converter.hxx +265 -0
  279. data/ext/couchbase/core/protostellar/query_index_admin_converter.hxx +291 -0
  280. data/ext/couchbase/core/protostellar/query_proto.hxx +73 -0
  281. data/ext/couchbase/core/protostellar/search_converter.hxx +244 -0
  282. data/ext/couchbase/core/protostellar/search_index_admin_converter.hxx +156 -0
  283. data/ext/couchbase/core/protostellar/view_converter.hxx +158 -0
  284. data/ext/couchbase/core/query_stream.cxx +447 -0
  285. data/ext/couchbase/core/query_stream.hxx +141 -0
  286. data/ext/couchbase/core/query_stream_component.cxx +243 -0
  287. data/ext/couchbase/core/query_stream_component.hxx +68 -0
  288. data/ext/couchbase/core/range_scan_load_balancer.cxx +15 -8
  289. data/ext/couchbase/core/range_scan_orchestrator.cxx +15 -3
  290. data/ext/couchbase/core/response_handler.hxx +41 -4
  291. data/ext/couchbase/core/row_streamer.cxx +332 -46
  292. data/ext/couchbase/core/row_streamer.hxx +31 -1
  293. data/ext/couchbase/core/row_streamer_options.hxx +55 -0
  294. data/ext/couchbase/core/sasl/client.h +3 -0
  295. data/ext/couchbase/core/search_scoring.hxx +66 -0
  296. data/ext/couchbase/core/stream_error_details.hxx +69 -0
  297. data/ext/couchbase/core/timeout_defaults.hxx +0 -1
  298. data/ext/couchbase/core/topology/capabilities.hxx +6 -0
  299. data/ext/couchbase/core/topology/capabilities_fmt.hxx +3 -0
  300. data/ext/couchbase/core/topology/configuration.cxx +21 -6
  301. data/ext/couchbase/core/topology/configuration.hxx +29 -8
  302. data/ext/couchbase/core/topology/configuration_json.hxx +3 -0
  303. data/ext/couchbase/core/topology/error_map_json.hxx +3 -1
  304. data/ext/couchbase/core/tracing/threshold_logging_tracer.cxx +70 -4
  305. data/ext/couchbase/core/tracing/threshold_logging_tracer.hxx +10 -0
  306. data/ext/couchbase/core/transactions/active_transaction_record.cxx +0 -34
  307. data/ext/couchbase/core/transactions/attempt_context_impl.cxx +108 -63
  308. data/ext/couchbase/core/transactions/attempt_context_impl.hxx +19 -2
  309. data/ext/couchbase/core/transactions/error_list.hxx +2 -2
  310. data/ext/couchbase/core/transactions/get_multi_fetch.hxx +160 -0
  311. data/ext/couchbase/core/transactions/get_multi_orchestrator.cxx +326 -125
  312. data/ext/couchbase/core/transactions/get_multi_transaction_id.hxx +62 -0
  313. data/ext/couchbase/core/transactions/internal/atr_entry.hxx +22 -2
  314. data/ext/couchbase/core/transactions/internal/transaction_context.hxx +2 -2
  315. data/ext/couchbase/core/transactions/internal/transactions_cleanup.hxx +23 -1
  316. data/ext/couchbase/core/transactions/internal/utils.hxx +50 -14
  317. data/ext/couchbase/core/transactions/staged_mutation.cxx +23 -18
  318. data/ext/couchbase/core/transactions/staged_mutation.hxx +15 -4
  319. data/ext/couchbase/core/transactions/transaction_context.cxx +55 -40
  320. data/ext/couchbase/core/transactions/transaction_get_result.hxx +16 -0
  321. data/ext/couchbase/core/transactions/transactions.cxx +3 -55
  322. data/ext/couchbase/core/transactions/transactions_cleanup.cxx +165 -72
  323. data/ext/couchbase/core/transactions/transactions_config.cxx +0 -11
  324. data/ext/couchbase/core/transactions/utils.cxx +10 -0
  325. data/ext/couchbase/core/transactions/waitable_op_list.hxx +2 -2
  326. data/ext/couchbase/core/transactions.hxx +9 -9
  327. data/ext/couchbase/core/utils/byteswap.hxx +166 -9
  328. data/ext/couchbase/core/utils/connection_string.cxx +50 -85
  329. data/ext/couchbase/core/utils/connection_string.hxx +15 -0
  330. data/ext/couchbase/core/{columnar/backoff_calculator.hxx → utils/deadline.hxx} +13 -13
  331. data/ext/couchbase/core/utils/duration_parser.cxx +1 -1
  332. data/ext/couchbase/core/utils/json_streaming_lexer.cxx +48 -5
  333. data/ext/couchbase/core/utils/json_streaming_lexer.hxx +4 -1
  334. data/ext/couchbase/core/utils/movable_function.hxx +301 -52
  335. data/ext/couchbase/core/utils/name_codec.hxx +154 -11
  336. data/ext/couchbase/core/{columnar/retry_info.hxx → utils/process_id.hxx} +18 -13
  337. data/ext/couchbase/core/utils/url_codec.cxx +12 -51
  338. data/ext/couchbase/core/websocket_codec.cxx +13 -37
  339. data/ext/couchbase/couchbase/analytics_options.hxx +21 -10
  340. data/ext/couchbase/couchbase/analytics_row.hxx +105 -0
  341. data/ext/couchbase/couchbase/analytics_stream_result.hxx +266 -0
  342. data/ext/couchbase/couchbase/boolean_query.hxx +3 -3
  343. data/ext/couchbase/couchbase/bucket.hxx +57 -0
  344. data/ext/couchbase/couchbase/cluster.hxx +183 -5
  345. data/ext/couchbase/{core/columnar/security_options.hxx → couchbase/cluster_state.hxx} +18 -14
  346. data/ext/couchbase/couchbase/codec/lenient_json_transcoder.hxx +69 -0
  347. data/ext/couchbase/couchbase/collection.hxx +234 -14
  348. data/ext/couchbase/couchbase/common_durability_options.hxx +18 -3
  349. data/ext/couchbase/couchbase/conjunction_query.hxx +1 -1
  350. data/ext/couchbase/couchbase/create_dataset_analytics_options.hxx +6 -1
  351. data/ext/couchbase/couchbase/date_range_query.hxx +2 -2
  352. data/ext/couchbase/couchbase/decrement_options.hxx +1 -1
  353. data/ext/couchbase/couchbase/disjunction_query.hxx +1 -1
  354. data/ext/couchbase/couchbase/error.hxx +32 -0
  355. data/ext/couchbase/couchbase/error_codes.hxx +33 -1
  356. data/ext/couchbase/couchbase/geo_bounding_box_query.hxx +1 -1
  357. data/ext/couchbase/couchbase/geo_distance_query.hxx +1 -1
  358. data/ext/couchbase/couchbase/geo_polygon_query.hxx +1 -1
  359. data/ext/couchbase/couchbase/get_replica_options.hxx +68 -0
  360. data/ext/couchbase/couchbase/get_replica_result.hxx +5 -3
  361. data/ext/couchbase/couchbase/get_replica_strategy.hxx +161 -0
  362. data/ext/couchbase/couchbase/get_result.hxx +1 -0
  363. data/ext/couchbase/couchbase/increment_options.hxx +1 -1
  364. data/ext/couchbase/couchbase/insert_options.hxx +1 -1
  365. data/ext/couchbase/couchbase/match_phrase_query.hxx +1 -1
  366. data/ext/couchbase/couchbase/match_query.hxx +1 -1
  367. data/ext/couchbase/couchbase/mutate_in_options.hxx +3 -3
  368. data/ext/couchbase/couchbase/network_options.hxx +1 -1
  369. data/ext/couchbase/couchbase/node_id.hxx +42 -14
  370. data/ext/couchbase/couchbase/node_id_for_options.hxx +7 -1
  371. data/ext/couchbase/couchbase/node_ids_options.hxx +8 -2
  372. data/ext/couchbase/couchbase/numeric_range_query.hxx +1 -1
  373. data/ext/couchbase/couchbase/phrase_query.hxx +1 -1
  374. data/ext/couchbase/couchbase/prefix_query.hxx +1 -1
  375. data/ext/couchbase/couchbase/query_options.hxx +23 -12
  376. data/ext/couchbase/couchbase/query_row.hxx +111 -0
  377. data/ext/couchbase/couchbase/query_stream_result.hxx +302 -0
  378. data/ext/couchbase/couchbase/query_string_query.hxx +3 -3
  379. data/ext/couchbase/couchbase/regexp_query.hxx +1 -1
  380. data/ext/couchbase/couchbase/replace_options.hxx +3 -3
  381. data/ext/couchbase/couchbase/result.hxx +14 -3
  382. data/ext/couchbase/couchbase/scan_result_item.hxx +1 -0
  383. data/ext/couchbase/couchbase/scope.hxx +85 -2
  384. data/ext/couchbase/couchbase/search_options.hxx +58 -8
  385. data/ext/couchbase/couchbase/search_scoring.hxx +94 -0
  386. data/ext/couchbase/couchbase/search_scoring_none.hxx +51 -0
  387. data/ext/couchbase/couchbase/search_scoring_reciprocal_rank_fusion.hxx +88 -0
  388. data/ext/couchbase/couchbase/search_scoring_relative_score_fusion.hxx +70 -0
  389. data/ext/couchbase/couchbase/term_range_query.hxx +1 -1
  390. data/ext/couchbase/couchbase/tracing/request_span.hxx +46 -0
  391. data/ext/couchbase/couchbase/transactions/transaction_get_multi_replicas_from_preferred_server_group_result.hxx +23 -21
  392. data/ext/couchbase/couchbase/transactions/transaction_get_multi_result.hxx +24 -19
  393. data/ext/couchbase/couchbase/transactions/transaction_get_result.hxx +17 -3
  394. data/ext/couchbase/couchbase/transactions/transactions_config.hxx +4 -2
  395. data/ext/couchbase/couchbase/transactions.hxx +27 -18
  396. data/ext/couchbase/couchbase/upsert_options.hxx +3 -3
  397. data/ext/couchbase/couchbase/vector_query.hxx +1 -1
  398. data/ext/couchbase/couchbase/wait_until_ready_options.hxx +111 -0
  399. data/ext/couchbase/couchbase/wildcard_query.hxx +1 -1
  400. data/ext/extconf.rb +15 -10
  401. data/ext/rcb_analytics.cxx +82 -102
  402. data/ext/rcb_backend.cxx +42 -36
  403. data/ext/rcb_backend.hxx +2 -0
  404. data/ext/rcb_buckets.cxx +47 -59
  405. data/ext/rcb_collections.cxx +42 -52
  406. data/ext/rcb_crud.cxx +345 -224
  407. data/ext/rcb_diagnostics.cxx +117 -27
  408. data/ext/rcb_exceptions.cxx +152 -99
  409. data/ext/rcb_exceptions.hxx +25 -0
  410. data/ext/rcb_extras.cxx +18 -19
  411. data/ext/rcb_hdr_histogram.cxx +19 -4
  412. data/ext/rcb_logger.cxx +202 -27
  413. data/ext/rcb_logger.hxx +12 -0
  414. data/ext/rcb_multi.cxx +40 -40
  415. data/ext/rcb_observability.cxx +7 -5
  416. data/ext/rcb_query.cxx +99 -142
  417. data/ext/rcb_range_scan.cxx +41 -35
  418. data/ext/rcb_search.cxx +98 -99
  419. data/ext/rcb_users.cxx +36 -56
  420. data/ext/rcb_utils.cxx +100 -37
  421. data/ext/rcb_utils.hxx +287 -33
  422. data/ext/rcb_version.cxx +1 -1
  423. data/ext/rcb_views.cxx +55 -51
  424. data/lib/active_support/cache/couchbase_store.rb +77 -12
  425. data/lib/couchbase/bucket.rb +20 -0
  426. data/lib/couchbase/cluster.rb +17 -0
  427. data/lib/couchbase/collection.rb +36 -1
  428. data/lib/couchbase/errors.rb +18 -0
  429. data/lib/couchbase/fork_hooks.rb +16 -7
  430. data/lib/couchbase/get_replica_strategy.rb +89 -0
  431. data/lib/couchbase/logger.rb +1 -1
  432. data/lib/couchbase/management/analytics_index_manager.rb +15 -15
  433. data/lib/couchbase/management/bucket_manager.rb +6 -6
  434. data/lib/couchbase/management/collection_manager.rb +6 -6
  435. data/lib/couchbase/management/query_index_manager.rb +7 -7
  436. data/lib/couchbase/management/search_index_manager.rb +13 -13
  437. data/lib/couchbase/management/user_manager.rb +10 -10
  438. data/lib/couchbase/management/view_index_manager.rb +5 -5
  439. data/lib/couchbase/options.rb +174 -42
  440. data/lib/couchbase/protostellar/bucket.rb +4 -0
  441. data/lib/couchbase/protostellar/cluster.rb +4 -0
  442. data/lib/couchbase/protostellar/collection.rb +4 -0
  443. data/lib/couchbase/protostellar/error_handling.rb +2 -1
  444. data/lib/couchbase/protostellar/request.rb +1 -0
  445. data/lib/couchbase/protostellar/request_generator/kv.rb +16 -2
  446. data/lib/couchbase/protostellar/request_generator/search.rb +17 -1
  447. data/lib/couchbase/protostellar/retry/orchestrator.rb +3 -2
  448. data/lib/couchbase/protostellar/retry/strategies/fail_fast.rb +33 -0
  449. data/lib/couchbase/protostellar/retry/strategies.rb +1 -0
  450. data/lib/couchbase/search_options.rb +95 -6
  451. data/lib/couchbase/version.rb +1 -1
  452. metadata +91 -33
  453. data/ext/0001-fix-build-for-mingw-w64-ucrt-x86_64-toolchain.patch +0 -40
  454. data/ext/couchbase/core/columnar/agent.hxx +0 -71
  455. data/ext/couchbase/core/columnar/agent_config.hxx +0 -59
  456. data/ext/couchbase/core/columnar/background_bootstrap_listener.hxx +0 -42
  457. data/ext/couchbase/core/columnar/backoff_calculator.cxx +0 -62
  458. data/ext/couchbase/core/columnar/columnar_agent.cxx +0 -147
  459. data/ext/couchbase/core/columnar/columnar_agent_config.cxx +0 -48
  460. data/ext/couchbase/core/columnar/columnar_error.cxx +0 -51
  461. data/ext/couchbase/core/columnar/database_management_options.hxx +0 -56
  462. data/ext/couchbase/core/columnar/error.hxx +0 -51
  463. data/ext/couchbase/core/columnar/error_codes.cxx +0 -107
  464. data/ext/couchbase/core/columnar/error_codes.hxx +0 -75
  465. data/ext/couchbase/core/columnar/management_component.cxx +0 -300
  466. data/ext/couchbase/core/columnar/management_component.hxx +0 -56
  467. data/ext/couchbase/core/columnar/query_component.cxx +0 -523
  468. data/ext/couchbase/core/columnar/query_component.hxx +0 -57
  469. data/ext/couchbase/core/columnar/query_options.hxx +0 -59
  470. data/ext/couchbase/core/columnar/query_result.cxx +0 -130
  471. data/ext/couchbase/core/columnar/query_result.hxx +0 -78
  472. data/ext/couchbase/core/io/config_tracker.cxx +0 -687
  473. data/ext/couchbase/core/io/config_tracker.hxx +0 -123
@@ -1 +1 @@
1
- f66dff1bdf8f96060b8177976f8b7d9254bc89bc4db933d769f7384d28480bc9 cacert.pem
1
+ 796f1389bfea13c0ed78f663b765baaff54a508e5483786bd6ece73c5e3e3cbe cacert.pem
@@ -14,14 +14,9 @@ if(NOT DEFINED COUCHBASE_CXX_CLIENT_MASTER_PROJECT)
14
14
  endif()
15
15
  endif()
16
16
 
17
- option(COUCHBASE_CXX_CLIENT_COLUMNAR "Build with Columnar additions" FALSE)
18
- if(COUCHBASE_CXX_CLIENT_COLUMNAR)
19
- message(STATUS "COUCHBASE_CXX_CLIENT_COLUMNAR=${COUCHBASE_CXX_CLIENT_COLUMNAR} building with Columnar additions.")
20
- endif()
21
-
22
17
  project(
23
18
  couchbase_cxx_client
24
- VERSION "1.3.3"
19
+ VERSION "1.5.1"
25
20
  LANGUAGES CXX C)
26
21
  message(
27
22
  STATUS
@@ -32,6 +27,33 @@ if(WIN32)
32
27
  message(STATUS "Windows SDK: ${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION}")
33
28
  endif()
34
29
 
30
+ # On Windows ARM64, MSVC's <winbase.h> defines C++ overloads for the
31
+ # _Interlocked* intrinsics that clash with the intrinsic declarations pulled
32
+ # in transitively (e.g. via asio/BoringSSL), breaking the build. Disabling
33
+ # the C++ overloads restores the plain intrinsic declarations. Match both the
34
+ # native case (CMAKE_SYSTEM_PROCESSOR) and the cross-compile case
35
+ # (-A ARM64 sets CMAKE_GENERATOR_PLATFORM).
36
+ if(MSVC AND (CMAKE_SYSTEM_PROCESSOR MATCHES "ARM64" OR CMAKE_GENERATOR_PLATFORM STREQUAL "ARM64"))
37
+ message(STATUS "Applying WinBase Interlocked macro for Windows ARM64")
38
+ add_compile_definitions(MICROSOFT_WINDOWS_WINBASE_H_DEFINE_INTERLOCKED_CPLUSPLUS_OVERLOADS=0)
39
+ endif()
40
+
41
+ # Multi-process compile for MSVC. With the Visual Studio generator each
42
+ # .vcxproj invokes a single cl.exe that processes its source files
43
+ # serially; /MP turns each invocation into a parallel batch driven by
44
+ # NUMBER_OF_PROCESSORS. Combined with MSBuild's /m:N (project-level
45
+ # parallelism) this lets a Windows agent saturate its cores. Must be
46
+ # applied at directory scope before ThirdPartyDependencies.cmake so
47
+ # the FetchContent-built dependencies (gRPC, protobuf, abseil, curl,
48
+ # boringssl, ...) inherit it — they are the bulk of the Windows build.
49
+ #
50
+ # Scoped to C and CXX via COMPILE_LANGUAGE: NASM (used by BoringSSL's
51
+ # x86 assembly) and other ASM dialects do not understand /MP and would
52
+ # abort with `nasm.exe ... /MP ... exited with code 1`.
53
+ if(MSVC)
54
+ add_compile_options($<$<COMPILE_LANGUAGE:C,CXX>:/MP>)
55
+ endif()
56
+
35
57
  include(cmake/TarballRelease.cmake OPTIONAL)
36
58
 
37
59
  include(cmake/PreventInSourceBuilds.cmake)
@@ -62,9 +84,66 @@ endif()
62
84
  find_package(Threads REQUIRED)
63
85
 
64
86
  option(COUCHBASE_CXX_CLIENT_BUILD_OPENTELEMETRY "Build with OpenTelemetry" ${COUCHBASE_CXX_CLIENT_MASTER_PROJECT})
87
+ option(COUCHBASE_CXX_CLIENT_BUILD_TOOLS "Build tools" ${COUCHBASE_CXX_CLIENT_MASTER_PROJECT})
88
+ # fit_performer links gRPC/Protobuf, which cmake/GrpcProtobuf.cmake resolves from the platform or
89
+ # builds from source, so this no longer depends on what the platform packages. Turning it OFF only
90
+ # skips the tool.
91
+ option(COUCHBASE_CXX_CLIENT_BUILD_FIT_PERFORMER
92
+ "Build the FIT performer integration-test tool"
93
+ ${COUCHBASE_CXX_CLIENT_BUILD_TOOLS})
94
+
95
+ # couchbase2:// (Protostellar) support. Like the FIT performer it pulls in gRPC and protobuf. Default
96
+ # OFF: the transport is experimental and opt-in. When enabled it vendors the Protostellar schema,
97
+ # builds the generated stubs, and compiles the couchbase2 transport into the client library on top of
98
+ # them.
99
+ option(COUCHBASE_CXX_CLIENT_BUILD_COUCHBASE2
100
+ "Build with couchbase2:// (Protostellar/gRPC) support"
101
+ OFF)
102
+
103
+ # Build the way the redistributable packages are built.
104
+ #
105
+ # The packages must carry every vendored dependency inside their own artefacts, so this switch makes
106
+ # the build resolve gRPC, Protobuf and their transitive dependencies from source, hide the generated
107
+ # Protostellar stubs from the shared library's exported ABI, and link the in-tree executables against
108
+ # the static client so each holds exactly one copy of them.
109
+ #
110
+ # All of that is expensive: a source build of gRPC on every configure, and a full copy of the client
111
+ # and the vendored stack in every executable that is linked. A development or CI build needs none of
112
+ # it -- it wants the platform's gRPC where one exists and the shared client everywhere -- so the
113
+ # switch is off by default and the packaging manifests turn it on.
114
+ option(COUCHBASE_CXX_CLIENT_PACKAGE_BUILD
115
+ "Resolve and link the vendored dependencies the way the redistributable packages do" FALSE)
65
116
 
66
117
  include(cmake/ThirdPartyDependencies.cmake)
67
118
 
119
+ if(COUCHBASE_CXX_CLIENT_BUILD_COUCHBASE2)
120
+ # Vendors the Protostellar schema (CPM) and builds the generated gRPC/protobuf stubs library.
121
+ include(cmake/Protostellar.cmake)
122
+ endif()
123
+
124
+ # Remove the staging prefix at the end of ANY install, not only the three packaging manifests.
125
+ #
126
+ # The vendored dependencies declare install rules no option switches off, and they are redirected
127
+ # under one throwaway prefix. The RPM, DEB and Alpine steps each delete it -- but nothing else does,
128
+ # so a plain "cmake --install" left gRPC's headers, archives and roots.pem sitting under
129
+ # <prefix>/vendored-not-installed. That affects every source build with a vendored dependency, which
130
+ # since AUTO includes any host without a system gRPC.
131
+ #
132
+ # Declared here, unconditionally, rather than in cmake/Packaging.cmake: that file is included only
133
+ # when COUCHBASE_CXX_CLIENT_INSTALL is ON, while the vendored dependencies register their install
134
+ # rules regardless, so with INSTALL off "cmake --install" still staged them and nothing removed them.
135
+ # install(CODE) runs in declaration order, and this point is after the dependencies were added.
136
+ # CMAKE_INSTALL_PREFIX is escaped so the generated script reads it at install time: "cmake --install
137
+ # --prefix <other>" stages the redirected files under the override, and expanding the configured
138
+ # prefix here would try to delete them from somewhere else entirely, leaving them behind.
139
+ install(CODE "
140
+ set(_junk \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${COUCHBASE_CXX_CLIENT_VENDORED_INSTALL_JUNK_DIR}\")
141
+ if(EXISTS \"\${_junk}\")
142
+ message(STATUS \"Removing vendored staging prefix: \${_junk}\")
143
+ file(REMOVE_RECURSE \"\${_junk}\")
144
+ endif()
145
+ ")
146
+
68
147
  include(cmake/VersionInfo.cmake)
69
148
 
70
149
  include(cmake/RPath.cmake)
@@ -77,6 +156,8 @@ set(couchbase_cxx_client_FILES
77
156
  core/agent_group.cxx
78
157
  core/agent_group_config.cxx
79
158
  core/analytics_query_options.cxx
159
+ core/analytics_stream.cxx
160
+ core/analytics_stream_component.cxx
80
161
  core/app_telemetry_address.cxx
81
162
  core/app_telemetry_meter.cxx
82
163
  core/app_telemetry_reporter.cxx
@@ -87,14 +168,6 @@ set(couchbase_cxx_client_FILES
87
168
  core/cluster_credentials.cxx
88
169
  core/cluster_options.cxx
89
170
  core/collections_component.cxx
90
- core/columnar/backoff_calculator.cxx
91
- core/columnar/columnar_agent.cxx
92
- core/columnar/columnar_agent_config.cxx
93
- core/columnar/columnar_error.cxx
94
- core/columnar/error_codes.cxx
95
- core/columnar/management_component.cxx
96
- core/columnar/query_component.cxx
97
- core/columnar/query_result.cxx
98
171
  core/config_profiles.cxx
99
172
  core/core_sdk_shim.cxx
100
173
  core/crud_component.cxx
@@ -113,6 +186,7 @@ set(couchbase_cxx_client_FILES
113
186
  core/impl/boolean_query.cxx
114
187
  core/impl/bucket_manager.cxx
115
188
  core/impl/collection.cxx
189
+ core/operations/document_get_replica.cxx
116
190
  core/impl/collection_manager.cxx
117
191
  core/impl/common_error_category.cxx
118
192
  core/impl/configuration_profiles_registry.cxx
@@ -135,7 +209,6 @@ set(couchbase_cxx_client_FILES
135
209
  core/impl/geo_bounding_box_query.cxx
136
210
  core/impl/geo_distance_query.cxx
137
211
  core/impl/geo_polygon_query.cxx
138
- core/impl/get_replica.cxx
139
212
  core/impl/internal_date_range_facet_result.cxx
140
213
  core/impl/internal_error_context.cxx
141
214
  core/impl/internal_numeric_range_facet_result.cxx
@@ -162,10 +235,14 @@ set(couchbase_cxx_client_FILES
162
235
  core/impl/observe_seqno.cxx
163
236
  core/impl/phrase_query.cxx
164
237
  core/impl/prefix_query.cxx
238
+ core/impl/public_analytics_stream_result.cxx
165
239
  core/impl/public_bucket.cxx
166
240
  core/impl/public_cluster.cxx
167
241
  core/impl/public_logger.cxx
242
+ core/impl/public_query_stream_result.cxx
168
243
  core/impl/public_scan_result.cxx
244
+ core/impl/public_transaction_get_multi_replicas_from_preferred_server_group_result.cxx
245
+ core/impl/public_transaction_get_multi_result.cxx
169
246
  core/impl/public_transaction_get_result.cxx
170
247
  core/impl/query.cxx
171
248
  core/impl/query_error_category.cxx
@@ -191,6 +268,7 @@ set(couchbase_cxx_client_FILES
191
268
  core/impl/search_sort_id.cxx
192
269
  core/impl/search_sort_score.cxx
193
270
  core/impl/streaming_json_lexer_error_category.cxx
271
+ core/impl/wait_until_ready.cxx
194
272
  core/impl/subdoc/array_add_unique.cxx
195
273
  core/impl/subdoc/array_append.cxx
196
274
  core/impl/subdoc/array_insert.cxx
@@ -222,7 +300,7 @@ set(couchbase_cxx_client_FILES
222
300
  core/impl/wildcard_query.cxx
223
301
  core/impl/crypto.cxx
224
302
  core/impl/observability_recorder.cxx
225
- core/io/config_tracker.cxx
303
+ core/impl/transactions.cxx
226
304
  core/io/dns_client.cxx
227
305
  core/io/dns_config.cxx
228
306
  core/io/http_parser.cxx
@@ -253,6 +331,7 @@ set(couchbase_cxx_client_FILES
253
331
  core/metrics/logging_meter.cxx
254
332
  core/metrics/meter_wrapper.cxx
255
333
  core/n1ql_query_options.cxx
334
+ core/operations/analytics_response_parsing.cxx
256
335
  core/operations/document_analytics.cxx
257
336
  core/operations/document_append.cxx
258
337
  core/operations/document_decrement.cxx
@@ -267,6 +346,7 @@ set(couchbase_cxx_client_FILES
267
346
  core/operations/document_mutate_in.cxx
268
347
  core/operations/document_prepend.cxx
269
348
  core/operations/document_query.cxx
349
+ core/operations/query_response_parsing.cxx
270
350
  core/operations/document_remove.cxx
271
351
  core/operations/document_replace.cxx
272
352
  core/operations/document_search.cxx
@@ -389,6 +469,8 @@ set(couchbase_cxx_client_FILES
389
469
  core/protocol/cmd_upsert.cxx
390
470
  core/protocol/frame_info_utils.cxx
391
471
  core/protocol/status.cxx
472
+ core/query_stream.cxx
473
+ core/query_stream_component.cxx
392
474
  core/range_scan_load_balancer.cxx
393
475
  core/range_scan_options.cxx
394
476
  core/range_scan_orchestrator.cxx
@@ -449,6 +531,11 @@ set(couchbase_cxx_client_FILES
449
531
  core/cluster_label_listener.cxx
450
532
  )
451
533
 
534
+ if(COUCHBASE_CXX_CLIENT_BUILD_COUCHBASE2)
535
+ # The Protostellar transport is compiled into the client library (see cmake/Protostellar.cmake).
536
+ list(APPEND couchbase_cxx_client_FILES ${couchbase_cxx_protostellar_TRANSPORT_FILES})
537
+ endif()
538
+
452
539
  set(couchbase_cxx_client_LIBRARIES)
453
540
  set(couchbase_cxx_client_DEFAULT_LIBRARY)
454
541
 
@@ -475,8 +562,12 @@ if(COUCHBASE_CXX_CLIENT_BUILD_SHARED OR BUILD_SHARED_LIBS)
475
562
  add_library(couchbase_cxx_client SHARED ${couchbase_cxx_client_FILES})
476
563
  add_library(couchbase_cxx_client::couchbase_cxx_client ALIAS couchbase_cxx_client)
477
564
 
478
- set_target_properties(couchbase_cxx_client PROPERTIES VERSION ${couchbase_cxx_client_VERSION_MAJOR}
479
- SOVERSION ${couchbase_cxx_client_VERSION})
565
+ # The soname carries MAJOR.MINOR. A patch release keeps the ABI, so a binary linked against one
566
+ # MAJOR.MINOR release loads every later patch of it; a minor release may change the ABI and the soname.
567
+ set_target_properties(
568
+ couchbase_cxx_client
569
+ PROPERTIES VERSION ${couchbase_cxx_client_VERSION}
570
+ SOVERSION ${couchbase_cxx_client_VERSION_MAJOR}.${couchbase_cxx_client_VERSION_MINOR})
480
571
  list(APPEND couchbase_cxx_client_LIBRARIES couchbase_cxx_client)
481
572
  if(NOT WIN32)
482
573
  set(couchbase_cxx_client_DEFAULT_LIBRARY couchbase_cxx_client::couchbase_cxx_client)
@@ -509,10 +600,9 @@ foreach(TARGET ${couchbase_cxx_client_LIBRARIES})
509
600
 
510
601
  target_include_directories(
511
602
  ${TARGET} SYSTEM
512
- PRIVATE $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/third_party/cxx_function>
513
- $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/third_party/expected/include>
514
- $<BUILD_INTERFACE:$<TARGET_PROPERTY:jsonsl,INTERFACE_INCLUDE_DIRECTORIES>>
515
- $<BUILD_INTERFACE:$<TARGET_PROPERTY:asio,INTERFACE_INCLUDE_DIRECTORIES>>)
603
+ PRIVATE $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/third_party/expected/include>
604
+ $<BUILD_INTERFACE:$<TARGET_PROPERTY:jsonsl,INTERFACE_SYSTEM_INCLUDE_DIRECTORIES>>
605
+ $<BUILD_INTERFACE:$<TARGET_PROPERTY:asio,INTERFACE_SYSTEM_INCLUDE_DIRECTORIES>>)
516
606
 
517
607
  target_include_directories(${TARGET} PUBLIC $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}>)
518
608
  target_include_directories(${TARGET} PUBLIC $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
@@ -535,6 +625,10 @@ foreach(TARGET ${couchbase_cxx_client_LIBRARIES})
535
625
  if(COUCHBASE_CXX_CLIENT_BUILD_OPENTELEMETRY)
536
626
  target_link_libraries(${TARGET} PRIVATE $<BUILD_INTERFACE:opentelemetry_api>)
537
627
  endif()
628
+ if(COUCHBASE_CXX_CLIENT_BUILD_COUCHBASE2)
629
+ # Generated Protostellar stubs + gRPC/protobuf, consumed by core/protostellar/*.
630
+ target_link_libraries(${TARGET} PRIVATE $<BUILD_INTERFACE:couchbase_cxx_protostellar>)
631
+ endif()
538
632
 
539
633
  if(HAVE_BACKTRACE)
540
634
  target_link_libraries(${TARGET} PRIVATE ${PLATFORM_LIBRARIES})
@@ -586,10 +680,30 @@ if(COUCHBASE_CXX_CLIENT_BUILD_STATIC)
586
680
  endif()
587
681
 
588
682
  option(COUCHBASE_CXX_CLIENT_BUILD_TESTS "Build test programs" ${COUCHBASE_CXX_CLIENT_MASTER_PROJECT})
683
+
684
+ # CNG (Protostellar) tests use a hand-rolled framework (NOT Catch2), so they can be built
685
+ # independently of the main (Catch2) test suite. The framework itself links no client code; each
686
+ # test links only what it exercises (see test/cng/CMakeLists.txt).
687
+ option(COUCHBASE_CXX_CLIENT_BUILD_CNG_TESTS "Build CNG (Protostellar) tests"
688
+ ${COUCHBASE_CXX_CLIENT_BUILD_TESTS})
689
+
690
+ # The hand-rolled framework both test trees build on, and its self-test. It precedes
691
+ # cmake/Testing.cmake so couchbase_add_test() is defined before test/CMakeLists.txt is read.
692
+ # Testing is enabled at the top level here so `ctest` from the build root discovers these even when
693
+ # the main (Catch2) suite is disabled and cmake/Testing.cmake was not included.
694
+ if(COUCHBASE_CXX_CLIENT_BUILD_TESTS OR COUCHBASE_CXX_CLIENT_BUILD_CNG_TESTS)
695
+ enable_testing()
696
+ include(cmake/TestFramework.cmake)
697
+ endif()
698
+
589
699
  if(COUCHBASE_CXX_CLIENT_BUILD_TESTS)
590
700
  include(cmake/Testing.cmake)
591
701
  endif()
592
702
 
703
+ if(COUCHBASE_CXX_CLIENT_BUILD_CNG_TESTS)
704
+ add_subdirectory(test/cng)
705
+ endif()
706
+
593
707
  option(COUCHBASE_CXX_CLIENT_BUILD_DOCS "Build API documentation" ${COUCHBASE_CXX_CLIENT_MASTER_PROJECT})
594
708
  if(COUCHBASE_CXX_CLIENT_BUILD_DOCS)
595
709
  include(cmake/Documentation.cmake)
@@ -600,7 +714,6 @@ if(COUCHBASE_CXX_CLIENT_BUILD_EXAMPLES)
600
714
  add_subdirectory(examples)
601
715
  endif()
602
716
 
603
- option(COUCHBASE_CXX_CLIENT_BUILD_TOOLS "Build tools" ${COUCHBASE_CXX_CLIENT_MASTER_PROJECT})
604
717
  if(COUCHBASE_CXX_CLIENT_BUILD_TOOLS)
605
718
  add_subdirectory(tools)
606
719
  endif()
@@ -25,13 +25,15 @@ url="https://docs.couchbase.com/cxx-sdk/current/hello-world/overview.html"
25
25
  arch="all"
26
26
  license="Apache-2.0"
27
27
  depends=""
28
+ # The -dev subpackage installs the static library's CMake config, which runs find_dependency(ZLIB);
29
+ # a build dependency does not reach whoever installs that package, so zlib-dev is declared for it
30
+ # here as it is in the RPM and Debian manifests.
31
+ depends_dev="zlib-dev"
28
32
  makedepends="
29
33
  linux-headers
30
34
  cmake
31
35
  ninja
32
- curl-dev
33
- protobuf-dev
34
- grpc-dev
36
+ zlib-dev
35
37
  nlohmann-json
36
38
  "
37
39
  subpackages="${pkgname}-dev ${pkgname}-tools"
@@ -49,6 +51,7 @@ build() {
49
51
  -DCOUCHBASE_CXX_CLIENT_PKGCONFIG_VERSION="${pkgver}" \
50
52
  -DCOUCHBASE_CXX_CLIENT_INSTALL=ON \
51
53
  -DCOUCHBASE_CXX_CLIENT_STATIC_BORINGSSL=ON \
54
+ -DCOUCHBASE_CXX_CLIENT_PACKAGE_BUILD=ON \
52
55
  -DCOUCHBASE_CXX_CLIENT_BUILD_EXAMPLES=OFF \
53
56
  -DCOUCHBASE_CXX_CLIENT_BUILD_TESTS=OFF \
54
57
  -DCOUCHBASE_CXX_CLIENT_BUILD_OPENTELEMETRY=ON \
@@ -60,11 +63,29 @@ build() {
60
63
 
61
64
  tools() {
62
65
  pkgdesc="${pkgdesc} (tools)"
63
- depends="${pkgname}=${pkgver}-r${pkgrel}"
64
66
 
65
67
  amove usr/bin
68
+
69
+ # cbc no longer depends on the library package and carries the SDK and taocpp code inside the
70
+ # binary, so the notices for that code have to ship with it. Copied under this subpackage's own
71
+ # documentation directory rather than shared with the base package, which is what the Debian
72
+ # packaging has to do -- dpkg rejects two packages owning one path even when the contents match.
73
+ # Whether apk would tolerate sharing was not established; a private directory needs no answer.
74
+ local _doc="${subpkgdir}/usr/share/doc/${subpkgname}"
75
+ mkdir -p "${_doc}/tao/json" "${_doc}/tao/pegtl"
76
+ cp "${pkgdir}/usr/share/doc/couchbase_cxx_client/LICENSE.txt" "${_doc}/"
77
+ cp "${pkgdir}/usr/share/doc/tao/json/LICENSE" "${_doc}/tao/json/"
78
+ cp "${pkgdir}/usr/share/doc/tao/pegtl/LICENSE" "${_doc}/tao/pegtl/"
79
+ # And the notices for the vendored dependencies compiled into cbc, which the base package
80
+ # receives from the install step but this subpackage does not.
81
+ cp -r "${pkgdir}/usr/share/doc/couchbase_cxx_client/third_party" "${_doc}/"
66
82
  }
67
83
 
68
84
  package() {
69
85
  DESTDIR="${pkgdir}" cmake --install apk-build
86
+ # The vendored gRPC and curl install their headers, archives and pkg-config files regardless of
87
+ # the options that are supposed to gate them; cmake/GrpcProtobuf.cmake and
88
+ # cmake/ThirdPartyDependencies.cmake redirect all of it under this one prefix so it can be
89
+ # dropped in a single step. Nothing packaged here comes from it.
90
+ rm -rf "${pkgdir}/usr/vendored-not-installed"
70
91
  }
@@ -31,12 +31,24 @@ function(bundle_static_library tgt_name bundled_tgt_name)
31
31
  endfunction()
32
32
 
33
33
  function(_recursively_collect_dependencies input_target)
34
- set(_input_link_libraries LINK_LIBRARIES)
34
+ # Both properties, not one. A concrete target's LINK_LIBRARIES holds what it links for itself,
35
+ # while INTERFACE_LINK_LIBRARIES holds what it imposes on whoever links IT -- and the second is
36
+ # exactly what a consumer of the installed archive inherits. cmake/DetectStandardFilesystem.cmake
37
+ # adds stdc++fs that way, so reading only the first would drop a library that is mandatory on
38
+ # older toolchains. An INTERFACE_LIBRARY has no LINK_LIBRARIES at all; get_target_property simply
39
+ # reports it absent and the loop below skips the sentinel.
40
+ set(public_dependencies)
35
41
  get_target_property(_input_type ${input_target} TYPE)
36
- if(${_input_type} STREQUAL "INTERFACE_LIBRARY")
37
- set(_input_link_libraries INTERFACE_LINK_LIBRARIES)
42
+ if(NOT ${_input_type} STREQUAL "INTERFACE_LIBRARY")
43
+ get_target_property(_own_dependencies ${input_target} LINK_LIBRARIES)
44
+ if(_own_dependencies)
45
+ list(APPEND public_dependencies ${_own_dependencies})
46
+ endif()
47
+ endif()
48
+ get_target_property(_interface_dependencies ${input_target} INTERFACE_LINK_LIBRARIES)
49
+ if(_interface_dependencies)
50
+ list(APPEND public_dependencies ${_interface_dependencies})
38
51
  endif()
39
- get_target_property(public_dependencies ${input_target} ${_input_link_libraries})
40
52
  foreach(candidate IN LISTS public_dependencies)
41
53
  strip_build_interface("${candidate}" dependency)
42
54
  if(TARGET ${dependency})
@@ -47,32 +59,152 @@ function(bundle_static_library tgt_name bundled_tgt_name)
47
59
  get_target_property(_type ${dependency} TYPE)
48
60
  if(${_type} STREQUAL "STATIC_LIBRARY")
49
61
  list(APPEND static_libs ${dependency})
62
+ else()
63
+ get_target_property(_imported ${dependency} IMPORTED)
64
+ if(_type MATCHES "^(SHARED|MODULE|UNKNOWN)_LIBRARY$"
65
+ OR (_type STREQUAL "INTERFACE_LIBRARY" AND _imported))
66
+ # Its content stays outside the archive, so a consumer of the installed archive has to
67
+ # be told about it. Recorded, not archived.
68
+ #
69
+ # An IMPORTED interface library counts even though it contributes no objects: that is
70
+ # the shape pkg_check_modules(... IMPORTED_TARGET) produces, and dropping it would lose
71
+ # the link directories and options that come with it -- which is the whole reason
72
+ # cmake/OpenSSL.cmake falls back to pkg-config in the first place. An interface target
73
+ # defined in this build is a different thing: it carries headers, and whatever it links
74
+ # is reached by recursing through it.
75
+ #
76
+ # OBJECT libraries are never recorded: their objects are compiled straight into the
77
+ # target being archived.
78
+ list(APPEND external_libs ${dependency})
79
+ endif()
50
80
  endif()
51
81
 
82
+ # Recurse into targets this build defines, and stop at imported ones.
83
+ #
84
+ # An imported target describes something already built elsewhere: whatever it needs comes
85
+ # back with it when the consumer calls find_dependency on the package that defines it, so
86
+ # naming its interface piecemeal adds nothing. Descending into one is actively harmful --
87
+ # the platform's gRPC drags in around a hundred and seventy absl:: interface targets, none
88
+ # of which a consumer has to name because linking gRPC::grpc++ supplies them all.
89
+ # An imported STATIC library is the exception: it gets archived like any other, so whatever
90
+ # it needs is now inside the bundle and its interface still has to be walked. Only imported
91
+ # targets that stay OUTSIDE the archive are left unexplored.
92
+ get_target_property(_dependency_imported ${dependency} IMPORTED)
93
+ if(_type STREQUAL "STATIC_LIBRARY")
94
+ set(_dependency_imported FALSE)
95
+ endif()
52
96
  get_property(library_already_added GLOBAL PROPERTY _${tgt_name}_static_bundle_${dependency})
53
- if(NOT library_already_added)
97
+ if(NOT library_already_added AND NOT _dependency_imported)
54
98
  set_property(GLOBAL PROPERTY _${tgt_name}_static_bundle_${dependency} ON)
55
99
  _recursively_collect_dependencies(${dependency})
56
100
  endif()
101
+ elseif(dependency
102
+ AND NOT dependency MATCHES "NOTFOUND$"
103
+ AND NOT dependency MATCHES "^\\$<"
104
+ AND NOT dependency MATCHES "^-[^l]")
105
+ # A plain link item rather than a target -- bcrypt.lib, iphlpapi, m, rt, or an absolute path
106
+ # from find_library. These are exactly the dependencies that were repeatedly missed when the
107
+ # installed interface was maintained by hand, because they are contributed from wherever the
108
+ # subdirectory that needs them happens to be.
109
+ #
110
+ # Two things are not link items and are skipped: a generator expression, which cannot be
111
+ # evaluated here, and the "<var>-NOTFOUND" sentinel get_target_property returns for a target
112
+ # that has no link property at all, which would otherwise be published verbatim as
113
+ # -lpublic_dependencies-NOTFOUND.
114
+ list(APPEND external_libs ${dependency})
115
+ elseif(dependency MATCHES "^-[^l]")
116
+ # A link OPTION rather than a library -- enable_sanitizers() adds -fsanitize=... PUBLIC, and
117
+ # an archive built with it carries references into the sanitizer runtime that a consumer's
118
+ # link line must repeat. Kept apart from the libraries because the two are published
119
+ # differently: options as INTERFACE_LINK_OPTIONS and raw entries in Libs.private, libraries
120
+ # as -l names.
121
+ list(APPEND external_opts ${dependency})
57
122
  endif()
58
123
  endforeach()
59
124
  set(static_libs
60
125
  ${static_libs}
61
126
  PARENT_SCOPE)
127
+ set(external_libs
128
+ ${external_libs}
129
+ PARENT_SCOPE)
130
+ set(external_opts
131
+ ${external_opts}
132
+ PARENT_SCOPE)
62
133
  endfunction()
63
134
 
64
135
  _recursively_collect_dependencies(${tgt_name})
65
136
 
66
137
  list(REMOVE_DUPLICATES static_libs)
138
+ if(external_libs)
139
+ list(REMOVE_DUPLICATES external_libs)
140
+ endif()
141
+ if(external_opts)
142
+ list(REMOVE_DUPLICATES external_opts)
143
+ endif()
144
+ # Published for cmake/Packaging.cmake, which turns it into the installed target's link interface
145
+ # and its pkg-config Libs.private, and warns about anything it does not already name.
146
+ set_property(GLOBAL PROPERTY ${bundled_tgt_name}_EXTERNAL_LIBS "${external_libs}")
147
+ set_property(GLOBAL PROPERTY ${bundled_tgt_name}_EXTERNAL_OPTS "${external_opts}")
67
148
 
68
149
  set(bundled_tgt_full_name
69
150
  ${CMAKE_BINARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}${bundled_tgt_name}${CMAKE_STATIC_LIBRARY_SUFFIX})
70
151
 
71
- if(CMAKE_CXX_COMPILER_ID MATCHES "^(Clang|GNU)$")
152
+ # Selected on the platform before the compiler, because what matters here is which ar is on PATH,
153
+ # not who compiled the objects. Apple's ar comes from cctools and has no MRI mode -- no -M, no
154
+ # ADDLIB -- so on macOS the archives are unpacked and re-archived instead. Keying that branch on
155
+ # AppleClang alone left the MRI path selected for a macOS build driven by any other Clang, a
156
+ # Homebrew or MacPorts LLVM among them, where it cannot work.
157
+ if(APPLE)
158
+ find_program(find NAMES find REQUIRED)
159
+
160
+ set(AR_EXTRACT_DIR "${CMAKE_CURRENT_BINARY_DIR}/tmp_ar_extract")
161
+ set(EXTRACT_COMMANDS "")
162
+ foreach(tgt IN LISTS static_libs)
163
+ list(
164
+ APPEND EXTRACT_COMMANDS
165
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${AR_EXTRACT_DIR}/${tgt}
166
+ COMMAND ${CMAKE_COMMAND} -E chdir ${AR_EXTRACT_DIR}/${tgt} ${CMAKE_AR} -x $<TARGET_FILE:${tgt}>)
167
+ endforeach()
168
+
169
+ add_custom_command(
170
+ OUTPUT ${bundled_tgt_full_name}
171
+ COMMAND ${CMAKE_COMMAND} -E rm -rf ${AR_EXTRACT_DIR}
172
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${AR_EXTRACT_DIR} ${EXTRACT_COMMANDS}
173
+ COMMAND ${find} ${AR_EXTRACT_DIR} -name *.o -exec ${CMAKE_AR} -rcs ${bundled_tgt_full_name} {} +
174
+ COMMAND ${CMAKE_AR} -s ${bundled_tgt_full_name}
175
+ COMMAND ${CMAKE_COMMAND} -E rm -rf ${AR_EXTRACT_DIR}
176
+ DEPENDS ${tgt_name} ${static_libs}
177
+ COMMENT "Bundling ${bundled_tgt_name}"
178
+ VERBATIM)
179
+ elseif(CMAKE_CXX_COMPILER_ID MATCHES "^(Clang|GNU)$")
72
180
  file(WRITE ${CMAKE_BINARY_DIR}/${bundled_tgt_name}.ar.in "CREATE ${bundled_tgt_full_name}\n")
73
181
 
182
+ # GNU ar's MRI lexer does not accept '+' in a filename. binutils 2.35 (EL9) reads
183
+ # "ADDLIB .../libgrpc++.a" as the file ".../libgrpc" followed by the stray token "++" and fails
184
+ # with "libgrpc: No such file or directory"; 2.47 accepts it, so this only shows up on older
185
+ # toolchains. gRPC contributes libgrpc++.a and several siblings, so any archive whose name
186
+ # carries a '+' is staged under a '+'-free name just before ar runs. MRI needs nothing of that
187
+ # path but the name, so how it gets there does not matter -- except on Windows, which this
188
+ # branch also covers through MinGW, and where creating a symlink needs a privilege an ordinary
189
+ # account does not hold. Copy there and link everywhere else.
190
+ set(_bundle_staging ${CMAKE_BINARY_DIR}/bundle_staging)
191
+ set(_bundle_stage_commands COMMAND ${CMAKE_COMMAND} -E make_directory ${_bundle_staging})
192
+ if(WIN32)
193
+ set(_bundle_stage_verb copy)
194
+ else()
195
+ set(_bundle_stage_verb create_symlink)
196
+ endif()
197
+
74
198
  foreach(tgt IN LISTS static_libs)
75
- file(APPEND ${CMAKE_BINARY_DIR}/${bundled_tgt_name}.ar.in "ADDLIB $<TARGET_FILE:${tgt}>\n")
199
+ if(tgt MATCHES "\\+")
200
+ string(REPLACE "+" "_plus" _bundle_safe_name "${tgt}")
201
+ set(_bundle_staged_lib "${_bundle_staging}/lib${_bundle_safe_name}.a")
202
+ list(APPEND _bundle_stage_commands COMMAND ${CMAKE_COMMAND} -E ${_bundle_stage_verb}
203
+ $<TARGET_FILE:${tgt}> ${_bundle_staged_lib})
204
+ file(APPEND ${CMAKE_BINARY_DIR}/${bundled_tgt_name}.ar.in "ADDLIB ${_bundle_staged_lib}\n")
205
+ else()
206
+ file(APPEND ${CMAKE_BINARY_DIR}/${bundled_tgt_name}.ar.in "ADDLIB $<TARGET_FILE:${tgt}>\n")
207
+ endif()
76
208
  endforeach()
77
209
 
78
210
  file(APPEND ${CMAKE_BINARY_DIR}/${bundled_tgt_name}.ar.in "SAVE\n")
@@ -88,13 +220,12 @@ function(bundle_static_library tgt_name bundled_tgt_name)
88
220
  set(ar_tool ${CMAKE_CXX_COMPILER_AR})
89
221
  endif()
90
222
 
91
- if(APPLE)
92
- find_program(SED gsed)
93
- else()
94
- find_program(SED sed)
95
- endif()
223
+ # GNU sed: -i takes no argument here. macOS never reaches this branch, so the BSD sed that
224
+ # needed gsed is out of scope.
225
+ find_program(SED sed REQUIRED)
96
226
 
97
227
  add_custom_command(
228
+ ${_bundle_stage_commands}
98
229
  COMMAND ${SED} -i "s|${CMAKE_BINARY_DIR}/||g" ${bundled_tgt_name}.ar
99
230
  COMMAND ${ar_tool} -M < ${bundled_tgt_name}.ar
100
231
  OUTPUT ${bundled_tgt_full_name}
@@ -102,28 +233,6 @@ function(bundle_static_library tgt_name bundled_tgt_name)
102
233
  WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
103
234
  COMMENT "Bundling ${bundled_tgt_name}"
104
235
  VERBATIM)
105
- elseif(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")
106
- find_program(find NAMES find REQUIRED)
107
-
108
- set(AR_EXTRACT_DIR "${CMAKE_CURRENT_BINARY_DIR}/tmp_ar_extract")
109
- set(EXTRACT_COMMANDS "")
110
- foreach(tgt IN LISTS static_libs)
111
- list(
112
- APPEND EXTRACT_COMMANDS
113
- COMMAND ${CMAKE_COMMAND} -E make_directory ${AR_EXTRACT_DIR}/${tgt}
114
- COMMAND ${CMAKE_COMMAND} -E chdir ${AR_EXTRACT_DIR}/${tgt} ${CMAKE_AR} -x $<TARGET_FILE:${tgt}>)
115
- endforeach()
116
-
117
- add_custom_command(
118
- OUTPUT ${bundled_tgt_full_name}
119
- COMMAND ${CMAKE_COMMAND} -E rm -rf ${AR_EXTRACT_DIR}
120
- COMMAND ${CMAKE_COMMAND} -E make_directory ${AR_EXTRACT_DIR} ${EXTRACT_COMMANDS}
121
- COMMAND ${find} ${AR_EXTRACT_DIR} -name *.o -exec ${CMAKE_AR} -rcs ${bundled_tgt_full_name} {} +
122
- COMMAND ${CMAKE_AR} -s ${bundled_tgt_full_name}
123
- COMMAND ${CMAKE_COMMAND} -E rm -rf ${AR_EXTRACT_DIR}
124
- DEPENDS ${tgt_name} ${static_libs}
125
- COMMENT "Bundling ${bundled_tgt_name}"
126
- VERBATIM)
127
236
  elseif(MSVC)
128
237
  get_filename_component(LINKER_DIR "${CMAKE_LINKER}" DIRECTORY)
129
238
  find_program(