couchbase 3.4.2 → 3.4.4

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 (355) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/ext/couchbase/CMakeLists.txt +71 -7
  4. data/ext/couchbase/cmake/Documentation.cmake +0 -1
  5. data/ext/couchbase/cmake/OpenSSL.cmake +98 -3
  6. data/ext/couchbase/cmake/Testing.cmake +12 -4
  7. data/ext/couchbase/cmake/build_config.hxx.in +3 -0
  8. data/ext/couchbase/core/bucket.cxx +183 -151
  9. data/ext/couchbase/core/bucket.hxx +23 -1
  10. data/ext/couchbase/core/cluster.hxx +51 -13
  11. data/ext/couchbase/core/cluster_options.cxx +2 -2
  12. data/ext/couchbase/core/cluster_options.hxx +7 -6
  13. data/ext/couchbase/core/cluster_options_fwd.hxx +26 -0
  14. data/ext/couchbase/core/config_profile.hxx +1 -54
  15. data/ext/couchbase/core/config_profiles.cxx +79 -0
  16. data/ext/couchbase/core/config_profiles.hxx +56 -0
  17. data/ext/couchbase/core/crud_component.cxx +51 -22
  18. data/ext/couchbase/core/error_context/key_value.cxx +2 -1
  19. data/ext/couchbase/core/error_context/key_value.hxx +10 -12
  20. data/ext/couchbase/core/error_context/search.hxx +1 -1
  21. data/ext/couchbase/core/impl/analytics.cxx +1 -0
  22. data/ext/couchbase/core/impl/boolean_field_query.cxx +40 -0
  23. data/ext/couchbase/core/impl/boolean_query.cxx +62 -0
  24. data/ext/couchbase/core/impl/build_deferred_query_indexes.cxx +115 -50
  25. data/ext/couchbase/core/impl/cluster.cxx +8 -0
  26. data/ext/couchbase/core/impl/conjunction_query.cxx +51 -0
  27. data/ext/couchbase/core/impl/create_bucket.cxx +155 -0
  28. data/ext/couchbase/core/impl/create_query_index.cxx +172 -59
  29. data/ext/couchbase/core/impl/date_range.cxx +89 -0
  30. data/ext/couchbase/core/impl/date_range_facet.cxx +54 -0
  31. data/ext/couchbase/core/impl/date_range_facet_result.cxx +64 -0
  32. data/ext/couchbase/core/impl/date_range_query.cxx +125 -0
  33. data/ext/couchbase/core/impl/disjunction_query.cxx +51 -0
  34. data/ext/couchbase/core/impl/dns_srv_tracker.cxx +2 -1
  35. data/ext/couchbase/core/impl/drop_bucket.cxx +66 -0
  36. data/ext/couchbase/core/impl/drop_query_index.cxx +138 -59
  37. data/ext/couchbase/core/impl/encoded_search_facet.hxx +29 -0
  38. data/ext/couchbase/core/impl/encoded_search_query.hxx +29 -0
  39. data/ext/couchbase/core/impl/encoded_search_sort.hxx +29 -0
  40. data/ext/couchbase/core/impl/flush_bucket.cxx +66 -0
  41. data/ext/couchbase/core/impl/geo_bounding_box_query.cxx +46 -0
  42. data/ext/couchbase/core/impl/geo_distance_query.cxx +43 -0
  43. data/ext/couchbase/core/impl/geo_polygon_query.cxx +46 -0
  44. data/ext/couchbase/core/impl/get_all_buckets.cxx +163 -0
  45. data/ext/couchbase/core/impl/get_all_query_indexes.cxx +67 -37
  46. data/ext/couchbase/core/impl/get_bucket.cxx +153 -0
  47. data/ext/couchbase/core/impl/internal_date_range_facet_result.cxx +80 -0
  48. data/ext/couchbase/core/impl/internal_date_range_facet_result.hxx +48 -0
  49. data/ext/couchbase/core/impl/internal_manager_error_context.cxx +113 -0
  50. data/ext/couchbase/core/impl/internal_manager_error_context.hxx +60 -0
  51. data/ext/couchbase/core/impl/internal_numeric_range_facet_result.cxx +80 -0
  52. data/ext/couchbase/core/impl/internal_numeric_range_facet_result.hxx +48 -0
  53. data/ext/couchbase/core/impl/internal_search_error_context.cxx +141 -0
  54. data/ext/couchbase/core/impl/internal_search_error_context.hxx +61 -0
  55. data/ext/couchbase/core/impl/internal_search_meta_data.cxx +60 -0
  56. data/ext/couchbase/core/impl/internal_search_meta_data.hxx +41 -0
  57. data/ext/couchbase/core/impl/internal_search_result.cxx +84 -0
  58. data/ext/couchbase/core/impl/internal_search_result.hxx +43 -0
  59. data/ext/couchbase/core/impl/internal_search_row.cxx +82 -0
  60. data/ext/couchbase/core/impl/internal_search_row.hxx +56 -0
  61. data/ext/couchbase/core/impl/internal_search_row_location.hxx +32 -0
  62. data/ext/couchbase/core/impl/internal_search_row_locations.cxx +137 -0
  63. data/ext/couchbase/core/impl/internal_search_row_locations.hxx +45 -0
  64. data/ext/couchbase/core/impl/internal_term_facet_result.cxx +80 -0
  65. data/ext/couchbase/core/impl/internal_term_facet_result.hxx +48 -0
  66. data/ext/couchbase/core/impl/key_value_error_category.cxx +2 -4
  67. data/ext/couchbase/core/impl/key_value_error_context.cxx +98 -0
  68. data/ext/couchbase/core/impl/lookup_in.cxx +1 -0
  69. data/ext/couchbase/core/impl/lookup_in_all_replicas.cxx +176 -0
  70. data/ext/couchbase/core/impl/lookup_in_all_replicas.hxx +80 -0
  71. data/ext/couchbase/core/impl/lookup_in_any_replica.cxx +167 -0
  72. data/ext/couchbase/core/impl/lookup_in_any_replica.hxx +75 -0
  73. data/ext/couchbase/core/impl/lookup_in_replica.cxx +97 -0
  74. data/ext/couchbase/core/impl/lookup_in_replica.hxx +67 -0
  75. data/ext/couchbase/core/impl/manager_error_context.cxx +100 -0
  76. data/ext/couchbase/core/impl/match_all_query.cxx +35 -0
  77. data/ext/couchbase/core/impl/match_none_query.cxx +35 -0
  78. data/ext/couchbase/core/impl/match_phrase_query.cxx +43 -0
  79. data/ext/couchbase/core/impl/match_query.cxx +59 -0
  80. data/ext/couchbase/core/impl/numeric_range.cxx +49 -0
  81. data/ext/couchbase/core/impl/numeric_range_facet.cxx +54 -0
  82. data/ext/couchbase/core/impl/numeric_range_facet_result.cxx +64 -0
  83. data/ext/couchbase/core/impl/numeric_range_query.cxx +56 -0
  84. data/ext/couchbase/core/impl/phrase_query.cxx +42 -0
  85. data/ext/couchbase/core/impl/prefix_query.cxx +40 -0
  86. data/ext/couchbase/core/impl/query.cxx +1 -0
  87. data/ext/couchbase/core/impl/query_error_context.cxx +75 -0
  88. data/ext/couchbase/core/impl/query_string_query.cxx +37 -0
  89. data/ext/couchbase/core/impl/regexp_query.cxx +40 -0
  90. data/ext/couchbase/core/impl/search.cxx +191 -0
  91. data/ext/couchbase/core/impl/search_error_context.cxx +147 -0
  92. data/ext/couchbase/core/impl/search_meta_data.cxx +46 -0
  93. data/ext/couchbase/core/impl/search_result.cxx +66 -0
  94. data/ext/couchbase/core/impl/search_row.cxx +74 -0
  95. data/ext/couchbase/core/impl/search_row_location.cxx +64 -0
  96. data/ext/couchbase/core/impl/search_row_locations.cxx +66 -0
  97. data/ext/couchbase/core/impl/search_sort_field.cxx +104 -0
  98. data/ext/couchbase/core/impl/search_sort_id.cxx +43 -0
  99. data/ext/couchbase/core/impl/search_sort_score.cxx +43 -0
  100. data/ext/couchbase/core/impl/term_facet.cxx +36 -0
  101. data/ext/couchbase/core/impl/term_facet_result.cxx +64 -0
  102. data/ext/couchbase/core/impl/term_query.cxx +56 -0
  103. data/ext/couchbase/core/impl/term_range_query.cxx +57 -0
  104. data/ext/couchbase/core/impl/update_bucket.cxx +130 -0
  105. data/ext/couchbase/core/impl/watch_query_indexes.cxx +53 -29
  106. data/ext/couchbase/core/impl/wildcard_query.cxx +40 -0
  107. data/ext/couchbase/core/io/dns_client.cxx +111 -40
  108. data/ext/couchbase/core/io/dns_config.cxx +5 -4
  109. data/ext/couchbase/core/io/http_context.hxx +1 -1
  110. data/ext/couchbase/core/io/http_session.hxx +34 -1
  111. data/ext/couchbase/core/io/http_session_manager.hxx +5 -3
  112. data/ext/couchbase/core/io/mcbp_command.hxx +9 -2
  113. data/ext/couchbase/core/io/mcbp_session.cxx +106 -42
  114. data/ext/couchbase/core/io/mcbp_session.hxx +4 -3
  115. data/ext/couchbase/core/io/retry_orchestrator.hxx +3 -2
  116. data/ext/couchbase/core/json_string.hxx +5 -0
  117. data/ext/couchbase/core/logger/custom_rotating_file_sink.cxx +1 -1
  118. data/ext/couchbase/core/logger/logger.cxx +80 -20
  119. data/ext/couchbase/core/logger/logger.hxx +31 -0
  120. data/ext/couchbase/core/meta/features.hxx +25 -0
  121. data/ext/couchbase/core/meta/version.cxx +18 -4
  122. data/ext/couchbase/core/mozilla_ca_bundle.hxx +39 -0
  123. data/ext/couchbase/core/operations/document_analytics.cxx +1 -0
  124. data/ext/couchbase/core/operations/document_analytics.hxx +1 -0
  125. data/ext/couchbase/core/operations/document_append.hxx +1 -1
  126. data/ext/couchbase/core/operations/document_decrement.hxx +1 -1
  127. data/ext/couchbase/core/operations/document_exists.hxx +1 -1
  128. data/ext/couchbase/core/operations/document_get.hxx +1 -1
  129. data/ext/couchbase/core/operations/document_get_and_lock.hxx +1 -1
  130. data/ext/couchbase/core/operations/document_get_and_touch.hxx +1 -1
  131. data/ext/couchbase/core/operations/document_get_projected.hxx +1 -1
  132. data/ext/couchbase/core/operations/document_increment.hxx +1 -1
  133. data/ext/couchbase/core/operations/document_insert.hxx +1 -1
  134. data/ext/couchbase/core/operations/document_lookup_in.hxx +1 -1
  135. data/ext/couchbase/core/operations/document_lookup_in_all_replicas.hxx +192 -0
  136. data/ext/couchbase/core/operations/document_lookup_in_any_replica.hxx +188 -0
  137. data/ext/couchbase/core/operations/document_mutate_in.hxx +1 -1
  138. data/ext/couchbase/core/operations/document_prepend.hxx +1 -1
  139. data/ext/couchbase/core/operations/document_query.cxx +13 -0
  140. data/ext/couchbase/core/operations/document_query.hxx +7 -0
  141. data/ext/couchbase/core/operations/document_remove.hxx +1 -1
  142. data/ext/couchbase/core/operations/document_replace.hxx +1 -1
  143. data/ext/couchbase/core/operations/document_search.cxx +4 -1
  144. data/ext/couchbase/core/operations/document_search.hxx +2 -1
  145. data/ext/couchbase/core/operations/document_touch.hxx +1 -1
  146. data/ext/couchbase/core/operations/document_unlock.hxx +1 -1
  147. data/ext/couchbase/core/operations/document_upsert.hxx +1 -1
  148. data/ext/couchbase/core/operations/document_view.hxx +1 -0
  149. data/ext/couchbase/core/operations.hxx +2 -0
  150. data/ext/couchbase/core/origin.cxx +270 -0
  151. data/ext/couchbase/core/origin.hxx +2 -0
  152. data/ext/couchbase/core/protocol/client_request.hxx +11 -2
  153. data/ext/couchbase/core/protocol/client_response.hxx +1 -0
  154. data/ext/couchbase/core/protocol/cmd_hello.hxx +1 -0
  155. data/ext/couchbase/core/protocol/cmd_lookup_in_replica.cxx +107 -0
  156. data/ext/couchbase/core/protocol/cmd_lookup_in_replica.hxx +137 -0
  157. data/ext/couchbase/core/protocol/hello_feature.hxx +6 -0
  158. data/ext/couchbase/core/protocol/hello_feature_fmt.hxx +3 -0
  159. data/ext/couchbase/core/protocol/status.cxx +2 -2
  160. data/ext/couchbase/core/public_fwd.hxx +21 -0
  161. data/ext/couchbase/core/range_scan_options.cxx +3 -27
  162. data/ext/couchbase/core/range_scan_options.hxx +13 -17
  163. data/ext/couchbase/core/range_scan_orchestrator.cxx +388 -170
  164. data/ext/couchbase/core/range_scan_orchestrator.hxx +13 -2
  165. data/ext/couchbase/core/range_scan_orchestrator_options.hxx +5 -3
  166. data/ext/couchbase/core/scan_options.hxx +0 -19
  167. data/ext/couchbase/core/scan_result.cxx +19 -5
  168. data/ext/couchbase/core/scan_result.hxx +5 -2
  169. data/ext/couchbase/core/timeout_defaults.hxx +2 -3
  170. data/ext/couchbase/core/tls_verify_mode.hxx +26 -0
  171. data/ext/couchbase/core/topology/capabilities.hxx +3 -0
  172. data/ext/couchbase/core/topology/capabilities_fmt.hxx +8 -0
  173. data/ext/couchbase/core/topology/collections_manifest_fmt.hxx +1 -1
  174. data/ext/couchbase/core/topology/configuration.cxx +15 -2
  175. data/ext/couchbase/core/topology/configuration.hxx +20 -1
  176. data/ext/couchbase/core/topology/configuration_json.hxx +6 -1
  177. data/ext/couchbase/core/transactions/attempt_context_testing_hooks.cxx +93 -0
  178. data/ext/couchbase/core/transactions/attempt_context_testing_hooks.hxx +48 -75
  179. data/ext/couchbase/core/transactions/cleanup_testing_hooks.cxx +52 -0
  180. data/ext/couchbase/core/transactions/cleanup_testing_hooks.hxx +17 -31
  181. data/ext/couchbase/core/transactions/exceptions.hxx +12 -9
  182. data/ext/couchbase/core/utils/connection_string.cxx +75 -43
  183. data/ext/couchbase/core/utils/connection_string.hxx +1 -0
  184. data/ext/couchbase/core/utils/json.cxx +4 -1
  185. data/ext/couchbase/couchbase/analytics_error_context.hxx +1 -1
  186. data/ext/couchbase/couchbase/behavior_options.hxx +27 -1
  187. data/ext/couchbase/couchbase/boolean_field_query.hxx +77 -0
  188. data/ext/couchbase/couchbase/boolean_query.hxx +223 -0
  189. data/ext/couchbase/couchbase/bucket_manager.hxx +135 -0
  190. data/ext/couchbase/couchbase/build_query_index_options.hxx +0 -30
  191. data/ext/couchbase/couchbase/cluster.hxx +56 -1
  192. data/ext/couchbase/couchbase/collection.hxx +111 -0
  193. data/ext/couchbase/couchbase/collection_query_index_manager.hxx +7 -48
  194. data/ext/couchbase/couchbase/conjunction_query.hxx +88 -0
  195. data/ext/couchbase/couchbase/create_bucket_options.hxx +41 -0
  196. data/ext/couchbase/couchbase/create_primary_query_index_options.hxx +0 -29
  197. data/ext/couchbase/couchbase/create_query_index_options.hxx +0 -33
  198. data/ext/couchbase/couchbase/date_range.hxx +69 -0
  199. data/ext/couchbase/couchbase/date_range_facet.hxx +56 -0
  200. data/ext/couchbase/couchbase/date_range_facet_result.hxx +55 -0
  201. data/ext/couchbase/couchbase/date_range_query.hxx +265 -0
  202. data/ext/couchbase/couchbase/disjunction_query.hxx +109 -0
  203. data/ext/couchbase/couchbase/doc_id_query.hxx +111 -0
  204. data/ext/couchbase/couchbase/drop_bucket_options.hxx +41 -0
  205. data/ext/couchbase/couchbase/drop_primary_query_index_options.hxx +0 -30
  206. data/ext/couchbase/couchbase/drop_query_index_options.hxx +0 -31
  207. data/ext/couchbase/couchbase/error_codes.hxx +1 -2
  208. data/ext/couchbase/couchbase/error_context.hxx +17 -8
  209. data/ext/couchbase/couchbase/flush_bucket_options.hxx +41 -0
  210. data/ext/couchbase/couchbase/fmt/analytics_scan_consistency.hxx +52 -0
  211. data/ext/couchbase/{core/topology/error_map_fmt.hxx → couchbase/fmt/key_value_error_map_attribute.hxx} +21 -21
  212. data/ext/couchbase/couchbase/fmt/search_scan_consistency.hxx +49 -0
  213. data/ext/couchbase/couchbase/geo_bounding_box_query.hxx +107 -0
  214. data/ext/couchbase/couchbase/geo_distance_query.hxx +109 -0
  215. data/ext/couchbase/couchbase/geo_point.hxx +32 -0
  216. data/ext/couchbase/couchbase/geo_polygon_query.hxx +85 -0
  217. data/ext/couchbase/couchbase/get_all_buckets_options.hxx +44 -0
  218. data/ext/couchbase/couchbase/get_all_query_indexes_options.hxx +0 -30
  219. data/ext/couchbase/couchbase/get_and_lock_options.hxx +2 -2
  220. data/ext/couchbase/couchbase/get_and_touch_options.hxx +2 -2
  221. data/ext/couchbase/couchbase/get_bucket_options.hxx +43 -0
  222. data/ext/couchbase/couchbase/get_options.hxx +2 -2
  223. data/ext/couchbase/couchbase/highlight_style.hxx +45 -0
  224. data/ext/couchbase/couchbase/insert_options.hxx +3 -3
  225. data/ext/couchbase/couchbase/key_value_error_context.hxx +7 -2
  226. data/ext/couchbase/couchbase/lookup_in_all_replicas_options.hxx +109 -0
  227. data/ext/couchbase/couchbase/lookup_in_any_replica_options.hxx +101 -0
  228. data/ext/couchbase/couchbase/lookup_in_options.hxx +2 -2
  229. data/ext/couchbase/couchbase/lookup_in_replica_result.hxx +74 -0
  230. data/ext/couchbase/couchbase/lookup_in_result.hxx +26 -0
  231. data/ext/couchbase/couchbase/management/bucket_settings.hxx +116 -0
  232. data/ext/couchbase/couchbase/manager_error_context.hxx +29 -53
  233. data/ext/couchbase/couchbase/match_all_query.hxx +43 -0
  234. data/ext/couchbase/couchbase/match_none_query.hxx +43 -0
  235. data/ext/couchbase/couchbase/match_operator.hxx +45 -0
  236. data/ext/couchbase/couchbase/match_phrase_query.hxx +108 -0
  237. data/ext/couchbase/couchbase/match_query.hxx +163 -0
  238. data/ext/couchbase/couchbase/mutate_in_options.hxx +2 -2
  239. data/ext/couchbase/couchbase/numeric_range.hxx +58 -0
  240. data/ext/couchbase/couchbase/numeric_range_facet.hxx +56 -0
  241. data/ext/couchbase/couchbase/numeric_range_facet_result.hxx +55 -0
  242. data/ext/couchbase/couchbase/numeric_range_query.hxx +143 -0
  243. data/ext/couchbase/couchbase/phrase_query.hxx +93 -0
  244. data/ext/couchbase/couchbase/prefix_query.hxx +82 -0
  245. data/ext/couchbase/couchbase/query_error_context.hxx +3 -1
  246. data/ext/couchbase/couchbase/query_index_manager.hxx +16 -83
  247. data/ext/couchbase/couchbase/query_options.hxx +18 -0
  248. data/ext/couchbase/couchbase/query_string_query.hxx +72 -0
  249. data/ext/couchbase/couchbase/regexp_query.hxx +82 -0
  250. data/ext/couchbase/couchbase/remove_options.hxx +2 -2
  251. data/ext/couchbase/couchbase/replace_options.hxx +3 -3
  252. data/ext/couchbase/couchbase/scope.hxx +40 -0
  253. data/ext/couchbase/couchbase/search_date_range.hxx +68 -0
  254. data/ext/couchbase/couchbase/search_error_context.hxx +138 -0
  255. data/ext/couchbase/couchbase/search_facet.hxx +60 -0
  256. data/ext/couchbase/couchbase/search_facet_result.hxx +50 -0
  257. data/ext/couchbase/couchbase/search_meta_data.hxx +85 -0
  258. data/ext/couchbase/couchbase/search_metrics.hxx +127 -0
  259. data/ext/couchbase/couchbase/search_numeric_range.hxx +69 -0
  260. data/ext/couchbase/couchbase/search_options.hxx +509 -0
  261. data/ext/couchbase/couchbase/search_query.hxx +69 -0
  262. data/ext/couchbase/couchbase/search_result.hxx +77 -0
  263. data/ext/couchbase/couchbase/search_row.hxx +104 -0
  264. data/ext/couchbase/couchbase/search_row_location.hxx +55 -0
  265. data/ext/couchbase/couchbase/search_row_locations.hxx +86 -0
  266. data/ext/couchbase/couchbase/search_scan_consistency.hxx +34 -0
  267. data/ext/couchbase/couchbase/search_sort.hxx +58 -0
  268. data/ext/couchbase/couchbase/search_sort_field.hxx +117 -0
  269. data/ext/couchbase/couchbase/search_sort_field_missing.hxx +26 -0
  270. data/ext/couchbase/couchbase/search_sort_field_mode.hxx +27 -0
  271. data/ext/couchbase/couchbase/search_sort_field_type.hxx +28 -0
  272. data/ext/couchbase/couchbase/search_sort_id.hxx +60 -0
  273. data/ext/couchbase/couchbase/search_sort_score.hxx +60 -0
  274. data/ext/couchbase/couchbase/search_term_range.hxx +51 -0
  275. data/ext/couchbase/couchbase/security_options.hxx +18 -0
  276. data/ext/couchbase/couchbase/subdocument_error_context.hxx +4 -2
  277. data/ext/couchbase/couchbase/term_facet.hxx +48 -0
  278. data/ext/couchbase/couchbase/term_facet_result.hxx +55 -0
  279. data/ext/couchbase/couchbase/term_query.hxx +151 -0
  280. data/ext/couchbase/couchbase/term_range_query.hxx +142 -0
  281. data/ext/couchbase/couchbase/touch_options.hxx +2 -2
  282. data/ext/couchbase/couchbase/tracing/request_span.hxx +63 -0
  283. data/ext/couchbase/couchbase/tracing/request_tracer.hxx +2 -40
  284. data/ext/couchbase/couchbase/transactions/async_attempt_context.hxx +83 -4
  285. data/ext/couchbase/couchbase/transactions/attempt_context.hxx +67 -0
  286. data/ext/couchbase/couchbase/transactions/transaction_get_result.hxx +2 -0
  287. data/ext/couchbase/couchbase/transactions/transaction_keyspace.hxx +11 -1
  288. data/ext/couchbase/couchbase/transactions/transaction_options.hxx +79 -8
  289. data/ext/couchbase/couchbase/transactions/transaction_query_options.hxx +128 -15
  290. data/ext/couchbase/couchbase/transactions/transaction_query_result.hxx +4 -0
  291. data/ext/couchbase/couchbase/transactions/transaction_result.hxx +1 -1
  292. data/ext/couchbase/couchbase/transactions/transactions_cleanup_config.hxx +5 -3
  293. data/ext/couchbase/couchbase/transactions/transactions_config.hxx +9 -5
  294. data/ext/couchbase/couchbase/transactions/transactions_query_config.hxx +6 -3
  295. data/ext/couchbase/couchbase/transactions.hxx +34 -1
  296. data/ext/couchbase/couchbase/unlock_options.hxx +2 -2
  297. data/ext/couchbase/couchbase/update_bucket_options.hxx +41 -0
  298. data/ext/couchbase/couchbase/upsert_options.hxx +3 -3
  299. data/ext/couchbase/couchbase/watch_query_indexes_options.hxx +0 -31
  300. data/ext/couchbase/couchbase/wildcard_query.hxx +83 -0
  301. data/ext/couchbase/test/CMakeLists.txt +8 -5
  302. data/ext/couchbase/test/benchmark_helper_integration.hxx +2 -2
  303. data/ext/couchbase/test/test_helper.hxx +5 -5
  304. data/ext/couchbase/test/test_integration_analytics.cxx +28 -6
  305. data/ext/couchbase/test/test_integration_collections.cxx +13 -3
  306. data/ext/couchbase/test/test_integration_connect.cxx +7 -3
  307. data/ext/couchbase/test/test_integration_crud.cxx +18 -3
  308. data/ext/couchbase/test/test_integration_diagnostics.cxx +11 -5
  309. data/ext/couchbase/test/test_integration_durability.cxx +12 -7
  310. data/ext/couchbase/test/test_integration_examples.cxx +419 -11
  311. data/ext/couchbase/test/test_integration_management.cxx +867 -368
  312. data/ext/couchbase/test/test_integration_query.cxx +87 -17
  313. data/ext/couchbase/test/test_integration_range_scan.cxx +363 -124
  314. data/ext/couchbase/test/test_integration_read_replica.cxx +48 -11
  315. data/ext/couchbase/test/test_integration_search.cxx +32 -3
  316. data/ext/couchbase/test/test_integration_subdoc.cxx +717 -11
  317. data/ext/couchbase/test/test_integration_tracer.cxx +5 -0
  318. data/ext/couchbase/test/test_integration_transcoders.cxx +13 -5
  319. data/ext/couchbase/test/{test_transaction_transaction_context.cxx → test_transaction_context.cxx} +1 -1
  320. data/ext/couchbase/test/test_transaction_examples.cxx +195 -0
  321. data/ext/couchbase/test/{test_transaction_transaction_public_async_api.cxx → test_transaction_public_async_api.cxx} +13 -12
  322. data/ext/couchbase/test/{test_transaction_transaction_public_blocking_api.cxx → test_transaction_public_blocking_api.cxx} +27 -21
  323. data/ext/couchbase/test/{test_transaction_transaction_simple.cxx → test_transaction_simple.cxx} +17 -5
  324. data/ext/couchbase/test/{test_transaction_transaction_simple_async.cxx → test_transaction_simple_async.cxx} +19 -21
  325. data/ext/couchbase/test/test_unit_config_profiles.cxx +1 -1
  326. data/ext/couchbase/test/test_unit_connection_string.cxx +29 -0
  327. data/ext/couchbase/test/test_unit_json_transcoder.cxx +4 -0
  328. data/ext/couchbase/test/test_unit_query.cxx +75 -0
  329. data/ext/couchbase/test/test_unit_search.cxx +427 -0
  330. data/ext/couchbase/test/test_unit_transaction_utils.cxx +10 -1
  331. data/ext/couchbase/test/test_unit_utils.cxx +8 -4
  332. data/ext/couchbase.cxx +641 -45
  333. data/ext/revisions.rb +3 -3
  334. data/lib/couchbase/authenticator.rb +0 -1
  335. data/lib/couchbase/cluster.rb +1 -5
  336. data/lib/couchbase/collection.rb +108 -0
  337. data/lib/couchbase/collection_options.rb +100 -0
  338. data/lib/couchbase/config_profiles.rb +1 -1
  339. data/lib/couchbase/errors.rb +5 -0
  340. data/lib/couchbase/json_transcoder.rb +12 -5
  341. data/lib/couchbase/key_value_scan.rb +125 -0
  342. data/lib/couchbase/management/collection_query_index_manager.rb +54 -15
  343. data/lib/couchbase/management/query_index_manager.rb +70 -5
  344. data/lib/couchbase/options.rb +151 -0
  345. data/lib/couchbase/raw_binary_transcoder.rb +37 -0
  346. data/lib/couchbase/raw_json_transcoder.rb +38 -0
  347. data/lib/couchbase/raw_string_transcoder.rb +40 -0
  348. data/lib/couchbase/scope.rb +1 -1
  349. data/lib/couchbase/search_options.rb +5 -0
  350. data/lib/couchbase/transcoder_flags.rb +62 -0
  351. data/lib/couchbase/utils/time.rb +14 -1
  352. data/lib/couchbase/version.rb +1 -1
  353. metadata +175 -13
  354. data/ext/couchbase/core/config_profile.cxx +0 -47
  355. data/ext/couchbase/core/impl/collection_query_index_manager.cxx +0 -93
@@ -21,9 +21,14 @@
21
21
  #include "core/operations/management/query_index_create.hxx"
22
22
  #include "core/operations/management/query_index_get_all.hxx"
23
23
 
24
+ #include <couchbase/boolean_query.hxx>
24
25
  #include <couchbase/cluster.hxx>
25
26
  #include <couchbase/fmt/cas.hxx>
26
27
  #include <couchbase/fmt/mutation_token.hxx>
28
+ #include <couchbase/match_query.hxx>
29
+ #include <couchbase/numeric_range_query.hxx>
30
+ #include <couchbase/query_string_query.hxx>
31
+ #include <couchbase/term_facet.hxx>
27
32
 
28
33
  #include <tao/json.hpp>
29
34
 
@@ -44,9 +49,9 @@ main(int argc, const char* argv[])
44
49
  return 1;
45
50
  }
46
51
 
47
- std::string connection_string{ argv[1] };
48
- std::string username{ argv[2] };
49
- std::string password{ argv[3] };
52
+ std::string connection_string{ argv[1] }; // "couchbase://127.0.0.1"
53
+ std::string username{ argv[2] }; // "Administrator"
54
+ std::string password{ argv[3] }; // "password"
50
55
  std::string bucket_name{ "travel-sample" };
51
56
 
52
57
  // run IO context on separate thread
@@ -59,6 +64,7 @@ main(int argc, const char* argv[])
59
64
  // For example, optimize timeouts for WAN
60
65
  options.apply_profile("wan_development");
61
66
 
67
+ // [1] connect to cluster using the given connection string and the options
62
68
  auto [cluster, ec] = couchbase::cluster::connect(io, connection_string, options).get();
63
69
  if (ec) {
64
70
  fmt::print("unable to connect to the cluster: {}\n", ec.message());
@@ -72,8 +78,7 @@ main(int argc, const char* argv[])
72
78
  auto scope = bucket.scope("tenant_agent_00");
73
79
  auto collection = scope.collection("users");
74
80
 
75
- {
76
- // upsert document
81
+ { // [2] upsert document
77
82
  auto [ctx, upsert_result] = collection.upsert("my-document", tao::json::value{ { "name", "mike" } }).get();
78
83
  if (ctx.ec()) {
79
84
  fmt::print("unable to upsert the document \"{}\": {}\n", ctx.id(), ctx.ec().message());
@@ -82,8 +87,7 @@ main(int argc, const char* argv[])
82
87
  fmt::print("saved document \"{}\", cas={}, token={}\n", ctx.id(), upsert_result.cas(), upsert_result.mutation_token().value());
83
88
  }
84
89
 
85
- {
86
- // get document
90
+ { // [3] get document
87
91
  auto [ctx, get_result] = collection.get("my-document").get();
88
92
  if (ctx.ec()) {
89
93
  fmt::print("unable to get the document \"{}\": {}\n", ctx.id(), ctx.ec().message());
@@ -93,8 +97,7 @@ main(int argc, const char* argv[])
93
97
  fmt::print("retrieved document \"{}\", name=\"{}\"\n", ctx.id(), name);
94
98
  }
95
99
 
96
- {
97
- // N1QL query
100
+ { // [4] N1QL query
98
101
  auto inventory_scope = bucket.scope("inventory");
99
102
  auto [ctx, query_result] = inventory_scope.query("SELECT * FROM airline WHERE id = 10").get();
100
103
  if (ctx.ec()) {
@@ -106,7 +109,7 @@ main(int argc, const char* argv[])
106
109
  }
107
110
  }
108
111
 
109
- // close cluster connection
112
+ // [5] close cluster connection
110
113
  cluster.close();
111
114
  guard.reset();
112
115
 
@@ -129,8 +132,14 @@ row: {"airline":{"callsign":"MILE-AIR","country":"United States","iata":"Q5","ic
129
132
  TEST_CASE("example: start using", "[integration]")
130
133
  {
131
134
  test::utils::integration_test_guard integration;
135
+ if (integration.cluster_version().is_capella()) {
136
+ SKIP("Capella does not allow to use REST API to load sample buckets");
137
+ }
132
138
  if (!integration.cluster_version().supports_collections()) {
133
- return;
139
+ SKIP("cluster does not support collections");
140
+ }
141
+ if (integration.cluster_version().is_mock()) {
142
+ SKIP("GOCAVES cannot load travel-sample bucket. See https://github.com/couchbaselabs/gocaves/issues/101");
134
143
  }
135
144
 
136
145
  {
@@ -180,3 +189,402 @@ TEST_CASE("example: start using", "[integration]")
180
189
 
181
190
  REQUIRE(start_using::main(4, argv) == 0);
182
191
  }
192
+
193
+ namespace example_search
194
+ {
195
+ //! [example-search]
196
+ #include <couchbase/cluster.hxx>
197
+
198
+ #include <couchbase/boolean_query.hxx>
199
+ #include <couchbase/match_query.hxx>
200
+ #include <couchbase/numeric_range_query.hxx>
201
+ #include <couchbase/query_string_query.hxx>
202
+
203
+ #include <couchbase/fmt/cas.hxx>
204
+ #include <couchbase/fmt/mutation_token.hxx>
205
+
206
+ #include <tao/json.hpp>
207
+
208
+ int
209
+ main(int argc, const char* argv[])
210
+ {
211
+ if (argc != 4) {
212
+ fmt::print("USAGE: ./example_search couchbase://127.0.0.1 Administrator password\n");
213
+ return 1;
214
+ }
215
+
216
+ std::string connection_string{ argv[1] }; // "couchbase://127.0.0.1"
217
+ std::string username{ argv[2] }; // "Administrator"
218
+ std::string password{ argv[3] }; // "password"
219
+ std::string bucket_name{ "travel-sample" };
220
+
221
+ // run IO context on separate thread
222
+ asio::io_context io;
223
+ auto guard = asio::make_work_guard(io);
224
+ std::thread io_thread([&io]() { io.run(); });
225
+
226
+ auto options = couchbase::cluster_options(username, password);
227
+ // customize through the 'options'.
228
+ // For example, optimize timeouts for WAN
229
+ options.apply_profile("wan_development");
230
+
231
+ auto [cluster, ec] = couchbase::cluster::connect(io, connection_string, options).get();
232
+ if (ec) {
233
+ fmt::print("unable to connect to the cluster: {}\n", ec.message());
234
+ return 1;
235
+ }
236
+
237
+ {
238
+ fmt::print("--- simple query\n");
239
+ auto [ctx, result] = cluster.search_query("travel-sample-index", couchbase::query_string_query("nice bar")).get();
240
+
241
+ if (ctx.ec()) {
242
+ fmt::print("unable to perform search query: {}, ({}, {})\n", ctx.ec().message(), ctx.status(), ctx.error());
243
+ return 1;
244
+ }
245
+ fmt::print("{} hits, total: {}\n", result.rows().size(), result.meta_data().metrics().total_rows());
246
+ for (const auto& row : result.rows()) {
247
+ fmt::print("id: {}, score: {}\n", row.id(), row.score());
248
+ }
249
+ }
250
+
251
+ {
252
+ fmt::print("--- simple query with fields\n");
253
+ auto [ctx, result] = cluster
254
+ .search_query("travel-sample-index",
255
+ couchbase::query_string_query("nice bar"),
256
+ couchbase::search_options{}.fields({ "description" }))
257
+ .get();
258
+
259
+ if (ctx.ec()) {
260
+ fmt::print("unable to perform search query: {}, ({}, {})\n", ctx.ec().message(), ctx.status(), ctx.error());
261
+ return 1;
262
+ }
263
+ fmt::print("{} hits, total: {}\n", result.rows().size(), result.meta_data().metrics().total_rows());
264
+ for (const auto& row : result.rows()) {
265
+ auto fields = row.fields_as<couchbase::codec::tao_json_serializer>();
266
+ fmt::print("id: {}, score: {}, description: {}\n", row.id(), row.score(), fields["description"].as<std::string>());
267
+ }
268
+ }
269
+
270
+ {
271
+ fmt::print("--- simple query with limit\n");
272
+ auto [ctx, result] =
273
+ cluster
274
+ .search_query("travel-sample-index", couchbase::query_string_query("nice bar"), couchbase::search_options{}.skip(3).limit(4))
275
+ .get();
276
+
277
+ if (ctx.ec()) {
278
+ fmt::print("unable to perform search query: {}, ({}, {})\n", ctx.ec().message(), ctx.status(), ctx.error());
279
+ return 1;
280
+ }
281
+ fmt::print("{} hits, total: {}\n", result.rows().size(), result.meta_data().metrics().total_rows());
282
+ for (const auto& row : result.rows()) {
283
+ fmt::print("id: {}, score: {}\n", row.id(), row.score());
284
+ }
285
+ }
286
+
287
+ {
288
+ fmt::print("--- simple query with highlight\n");
289
+ auto [ctx, result] =
290
+ cluster
291
+ .search_query("travel-sample-index",
292
+ couchbase::query_string_query("nice bar"),
293
+ couchbase::search_options{}.highlight(couchbase::highlight_style::html, { "description", "title" }))
294
+ .get();
295
+
296
+ if (ctx.ec()) {
297
+ fmt::print("unable to perform search query: {}, ({}, {})\n", ctx.ec().message(), ctx.status(), ctx.error());
298
+ return 1;
299
+ }
300
+ fmt::print("{} hits, total: {}\n", result.rows().size(), result.meta_data().metrics().total_rows());
301
+ for (const auto& row : result.rows()) {
302
+ fmt::print("id: {}, score: {}\n", row.id(), row.score());
303
+ for (const auto& [field, fragments] : row.fragments()) {
304
+ fmt::print("- {}:\n", field);
305
+ for (const auto& fragment : fragments) {
306
+ fmt::print("-- {}\n", fragment);
307
+ }
308
+ }
309
+ }
310
+ }
311
+
312
+ {
313
+ fmt::print("--- simple query with collections\n");
314
+ auto [ctx, result] = cluster
315
+ .search_query("travel-sample-index",
316
+ couchbase::query_string_query("west"),
317
+ couchbase::search_options{}.collections({ "airline" }))
318
+ .get();
319
+
320
+ if (ctx.ec()) {
321
+ fmt::print("unable to perform search query: {}, ({}, {})\n", ctx.ec().message(), ctx.status(), ctx.error());
322
+ return 1;
323
+ }
324
+ fmt::print("{} hits, total: {}\n", result.rows().size(), result.meta_data().metrics().total_rows());
325
+ for (const auto& row : result.rows()) {
326
+ fmt::print("id: {}, score: {}\n", row.id(), row.score());
327
+ }
328
+ }
329
+
330
+ {
331
+ fmt::print("--- query with consistency requirements\n");
332
+
333
+ auto bucket = cluster.bucket(bucket_name);
334
+ auto collection = bucket.scope("inventory").collection("hotel");
335
+
336
+ couchbase::mutation_state state;
337
+
338
+ {
339
+ auto [ctx, upsert_result] =
340
+ collection
341
+ .upsert(
342
+ "prancing-pony",
343
+ tao::json::value{
344
+ { "title", "The Prancing Pony" },
345
+ { "type", "hotel" },
346
+ { "description",
347
+ "The inn was located just where the East Road bent round the foot of Bree-hill, within the dike that stretched "
348
+ "around the town. The building was three stories tall with many windows. Its front faced the Road and it had two "
349
+ "wings that ran back towards the elevated ground of the hill, such that in the rear the second floor was at ground "
350
+ "level. " } })
351
+ .get();
352
+ if (ctx.ec()) {
353
+ fmt::print("unable to upsert the document \"{}\": {}\n", ctx.id(), ctx.ec().message());
354
+ return 1;
355
+ }
356
+ fmt::print("saved document \"{}\", cas={}, token={}\n",
357
+ ctx.id(),
358
+ upsert_result.cas(),
359
+ upsert_result.mutation_token().value_or(couchbase::mutation_token{}));
360
+ state.add(upsert_result);
361
+ }
362
+
363
+ auto [ctx, result] =
364
+ cluster
365
+ .search_query("travel-sample-index", couchbase::query_string_query("bree"), couchbase::search_options{}.consistent_with(state))
366
+ .get();
367
+
368
+ if (ctx.ec()) {
369
+ fmt::print("unable to perform search query: {}, ({}, {})\n", ctx.ec().message(), ctx.status(), ctx.error());
370
+ return 1;
371
+ }
372
+ fmt::print("{} hits, total: {}\n", result.rows().size(), result.meta_data().metrics().total_rows());
373
+ for (const auto& row : result.rows()) {
374
+ fmt::print("id: {}, score: {}\n", row.id(), row.score());
375
+ }
376
+ }
377
+
378
+ {
379
+ fmt::print("--- complex query\n");
380
+ auto [ctx, result] = cluster
381
+ .search_query("travel-sample-index",
382
+ couchbase::boolean_query()
383
+ .must(couchbase::match_query("honeymoon").field("reviews.content"),
384
+ couchbase::numeric_range_query().field("reviews.ratings.Overall").min(4))
385
+ .must_not(couchbase::match_query("San Francisco").field("city")),
386
+ couchbase::search_options{}.collections({ "hotel" }).highlight())
387
+ .get();
388
+ if (ctx.ec()) {
389
+ fmt::print("unable to perform search query: {}, ({}, {})\n", ctx.ec().message(), ctx.status(), ctx.error());
390
+ return 1;
391
+ }
392
+ fmt::print("{} hits, total: {}\n", result.rows().size(), result.meta_data().metrics().total_rows());
393
+ for (const auto& row : result.rows()) {
394
+ fmt::print("id: {}, score: {}\n", row.id(), row.score());
395
+ }
396
+ }
397
+
398
+ {
399
+ fmt::print("--- simple query with facets\n");
400
+ auto [ctx, result] =
401
+ cluster
402
+ .search_query("travel-sample-index",
403
+ couchbase::query_string_query("honeymoon"),
404
+ couchbase::search_options{}.collections({ "hotel" }).facet("by_country", couchbase::term_facet("country", 3)))
405
+ .get();
406
+ if (ctx.ec()) {
407
+ fmt::print("unable to perform search query: {}, ({}, {})\n", ctx.ec().message(), ctx.status(), ctx.error());
408
+ return 1;
409
+ }
410
+ fmt::print("{} hits, total: {}\n", result.rows().size(), result.meta_data().metrics().total_rows());
411
+ for (const auto& [name, facet] : result.facets()) {
412
+ fmt::print("{} facet: total={}, missing={}\n", name, facet->total(), facet->missing());
413
+ if (name == "by_country") {
414
+ auto term_facet = std::static_pointer_cast<couchbase::term_facet_result>(facet);
415
+ for (const auto& group : term_facet->terms()) {
416
+ fmt::print("* {}: {}\n", group.name(), group.count());
417
+ }
418
+ }
419
+ }
420
+ }
421
+
422
+ // close cluster connection
423
+ cluster.close();
424
+ guard.reset();
425
+
426
+ io_thread.join();
427
+ return 0;
428
+ }
429
+
430
+ /*
431
+
432
+ $ ./example_search couchbase://127.0.0.1 Administrator password
433
+ saved document "my-document", cas=17486a1722b20000
434
+ retrieved document "my-document", name="mike"
435
+ row: {"airline":{"callsign":"MILE-AIR","country":"United States","iata":"Q5","icao":"MLA","id":10,"name":"40-Mile Air","type":"airline"}}
436
+
437
+ */
438
+ //! [example-search]
439
+ } // namespace example_search
440
+
441
+ TEST_CASE("example: search", "[integration]")
442
+ {
443
+ test::utils::integration_test_guard integration;
444
+
445
+ if (integration.cluster_version().is_capella()) {
446
+ SKIP("Capella does not allow to use REST API to load sample buckets");
447
+ }
448
+ if (!integration.cluster_version().supports_collections()) {
449
+ SKIP("cluster does not support collections");
450
+ }
451
+
452
+ const auto env = test::utils::test_context::load_from_environment();
453
+ const char* argv[] = {
454
+ "example_search", // name of the "executable"
455
+ env.connection_string.c_str(),
456
+ env.username.c_str(),
457
+ env.password.c_str(),
458
+ };
459
+
460
+ REQUIRE(example_search::main(4, argv) == 0);
461
+ }
462
+
463
+ namespace example_buckets
464
+ {
465
+ //! [example-buckets]
466
+ #include <couchbase/cluster.hxx>
467
+
468
+ int
469
+ main(int argc, const char* argv[])
470
+ {
471
+ if (argc != 4) {
472
+ fmt::print("USAGE: ./example_buckets couchbase://127.0.0.1 Administrator password\n");
473
+ return 1;
474
+ }
475
+
476
+ std::string connection_string{ argv[1] }; // "couchbase://127.0.0.1"
477
+ std::string username{ argv[2] }; // "Administrator"
478
+ std::string password{ argv[3] }; // "password"
479
+ std::string bucket_name{ "travel-sample" };
480
+
481
+ // run IO context on separate thread
482
+ asio::io_context io;
483
+ auto guard = asio::make_work_guard(io);
484
+ std::thread io_thread([&io]() { io.run(); });
485
+
486
+ auto options = couchbase::cluster_options(username, password);
487
+ // customize through the 'options'.
488
+ // For example, optimize timeouts for WAN
489
+ options.apply_profile("wan_development");
490
+
491
+ auto [cluster, ec] = couchbase::cluster::connect(io, connection_string, options).get();
492
+ if (ec) {
493
+ fmt::print("unable to connect to the cluster: {}\n", ec.message());
494
+ return 1;
495
+ }
496
+ auto manager = cluster.buckets();
497
+
498
+ couchbase::management::cluster::bucket_settings bucket_settings{};
499
+ std::string test_bucket_name = "cxx_test_integration_examples_bucket";
500
+ bucket_settings.name = test_bucket_name;
501
+ bucket_settings.ram_quota_mb = 150;
502
+ bucket_settings.bucket_type = couchbase::management::cluster::bucket_type::couchbase;
503
+ bucket_settings.eviction_policy = couchbase::management::cluster::bucket_eviction_policy::value_only;
504
+ bucket_settings.flush_enabled = true;
505
+ bucket_settings.replica_indexes = true;
506
+ bucket_settings.conflict_resolution_type = couchbase::management::cluster::bucket_conflict_resolution::sequence_number;
507
+ {
508
+ fmt::print("--- create bucket\n");
509
+ auto ctx = manager.create_bucket(bucket_settings).get();
510
+ if (ctx.ec()) {
511
+ if (ctx.ec() == couchbase::errc::common::invalid_argument) {
512
+ fmt::print("bucket already exists\n");
513
+ } else {
514
+ fmt::print("unable to create the bucket: {}\n", ctx.ec().message());
515
+ return 1;
516
+ }
517
+ } else {
518
+ fmt::print("--- bucket has been successfully created\n");
519
+ }
520
+ }
521
+ {
522
+ fmt::print("--- get bucket\n");
523
+ auto [ctx, bucket] = manager.get_bucket(bucket_name).get();
524
+ if (ctx.ec()) {
525
+ fmt::print("unable to get the bucket: {}\n", ctx.ec().message());
526
+ return 1;
527
+ }
528
+ fmt::print("name of fetched bucket: {}\n", bucket.name);
529
+ }
530
+ {
531
+ fmt::print("--- get all buckets\n");
532
+ auto [ctx, buckets] = manager.get_all_buckets().get();
533
+ if (ctx.ec()) {
534
+ fmt::print("unable to get all buckets: {}\n", ctx.ec().message());
535
+ return 1;
536
+ }
537
+ for (const auto& fetched_bucket : buckets) {
538
+ fmt::print("Bucket name: {}\n", fetched_bucket.name);
539
+ }
540
+ }
541
+ {
542
+ fmt::print("--- update bucket\n");
543
+ bucket_settings.ram_quota_mb = 150;
544
+ auto ctx = manager.update_bucket(bucket_settings).get();
545
+ if (ctx.ec()) {
546
+ fmt::print("unable to update the bucket: {}\n", ctx.ec().message());
547
+ return 1;
548
+ }
549
+ fmt::print("bucket has been updated\n");
550
+ }
551
+ {
552
+ fmt::print("--- drop bucket\n");
553
+ auto ctx = manager.drop_bucket(test_bucket_name).get();
554
+ if (ctx.ec()) {
555
+ fmt::print("unable to drop the bucket: {}\n", ctx.ec().message());
556
+ return 1;
557
+ }
558
+ fmt::print("bucket has been dropped\n");
559
+ }
560
+
561
+ // close cluster connection
562
+ cluster.close();
563
+ guard.reset();
564
+
565
+ io_thread.join();
566
+ return 0;
567
+ }
568
+
569
+ //! [example-buckets]
570
+ } // namespace example_buckets
571
+
572
+ TEST_CASE("example: bucket management", "[integration]")
573
+ {
574
+ test::utils::integration_test_guard integration;
575
+
576
+ if (integration.cluster_version().is_capella()) {
577
+ SKIP("Capella does not allow to use REST API to load sample buckets");
578
+ }
579
+
580
+ const auto env = test::utils::test_context::load_from_environment();
581
+
582
+ const char* argv[] = {
583
+ "example_buckets", // name of the "executable"
584
+ env.connection_string.c_str(),
585
+ env.username.c_str(),
586
+ env.password.c_str(),
587
+ };
588
+
589
+ REQUIRE(example_buckets::main(4, argv) == 0);
590
+ }