couchbase 3.4.3 → 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 (148) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/ext/couchbase/CMakeLists.txt +15 -1
  4. data/ext/couchbase/core/bucket.cxx +183 -152
  5. data/ext/couchbase/core/bucket.hxx +17 -4
  6. data/ext/couchbase/core/cluster.hxx +34 -13
  7. data/ext/couchbase/core/cluster_options.hxx +3 -0
  8. data/ext/couchbase/core/crud_component.cxx +51 -22
  9. data/ext/couchbase/core/error_context/key_value.cxx +2 -1
  10. data/ext/couchbase/core/error_context/key_value.hxx +10 -12
  11. data/ext/couchbase/core/impl/build_deferred_query_indexes.cxx +115 -50
  12. data/ext/couchbase/core/impl/cluster.cxx +6 -0
  13. data/ext/couchbase/core/impl/create_bucket.cxx +155 -0
  14. data/ext/couchbase/core/impl/create_query_index.cxx +172 -59
  15. data/ext/couchbase/core/impl/dns_srv_tracker.cxx +2 -1
  16. data/ext/couchbase/core/impl/drop_bucket.cxx +66 -0
  17. data/ext/couchbase/core/impl/drop_query_index.cxx +138 -59
  18. data/ext/couchbase/core/impl/flush_bucket.cxx +66 -0
  19. data/ext/couchbase/core/impl/get_all_buckets.cxx +163 -0
  20. data/ext/couchbase/core/impl/get_all_query_indexes.cxx +67 -37
  21. data/ext/couchbase/core/impl/get_bucket.cxx +153 -0
  22. data/ext/couchbase/core/impl/internal_manager_error_context.cxx +113 -0
  23. data/ext/couchbase/core/impl/internal_manager_error_context.hxx +60 -0
  24. data/ext/couchbase/core/impl/key_value_error_category.cxx +2 -4
  25. data/ext/couchbase/core/impl/key_value_error_context.cxx +98 -0
  26. data/ext/couchbase/core/impl/lookup_in.cxx +1 -0
  27. data/ext/couchbase/core/impl/lookup_in_all_replicas.cxx +176 -0
  28. data/ext/couchbase/core/impl/lookup_in_all_replicas.hxx +80 -0
  29. data/ext/couchbase/core/impl/lookup_in_any_replica.cxx +167 -0
  30. data/ext/couchbase/core/impl/lookup_in_any_replica.hxx +75 -0
  31. data/ext/couchbase/core/impl/lookup_in_replica.cxx +97 -0
  32. data/ext/couchbase/core/impl/lookup_in_replica.hxx +67 -0
  33. data/ext/couchbase/core/impl/manager_error_context.cxx +100 -0
  34. data/ext/couchbase/core/impl/query.cxx +1 -0
  35. data/ext/couchbase/core/impl/query_error_context.cxx +75 -0
  36. data/ext/couchbase/core/impl/update_bucket.cxx +130 -0
  37. data/ext/couchbase/core/impl/watch_query_indexes.cxx +53 -29
  38. data/ext/couchbase/core/io/dns_client.cxx +111 -40
  39. data/ext/couchbase/core/io/dns_config.cxx +5 -4
  40. data/ext/couchbase/core/io/http_session.hxx +24 -1
  41. data/ext/couchbase/core/io/mcbp_command.hxx +9 -2
  42. data/ext/couchbase/core/io/mcbp_session.cxx +80 -43
  43. data/ext/couchbase/core/io/mcbp_session.hxx +4 -3
  44. data/ext/couchbase/core/logger/custom_rotating_file_sink.cxx +1 -1
  45. data/ext/couchbase/core/logger/logger.cxx +80 -20
  46. data/ext/couchbase/core/logger/logger.hxx +31 -0
  47. data/ext/couchbase/core/meta/features.hxx +25 -0
  48. data/ext/couchbase/core/operations/document_lookup_in_all_replicas.hxx +192 -0
  49. data/ext/couchbase/core/operations/document_lookup_in_any_replica.hxx +188 -0
  50. data/ext/couchbase/core/operations/document_query.cxx +11 -0
  51. data/ext/couchbase/core/operations/document_query.hxx +1 -0
  52. data/ext/couchbase/core/operations.hxx +2 -0
  53. data/ext/couchbase/core/origin.cxx +270 -0
  54. data/ext/couchbase/core/origin.hxx +2 -0
  55. data/ext/couchbase/core/protocol/client_response.hxx +1 -0
  56. data/ext/couchbase/core/protocol/cmd_hello.hxx +1 -0
  57. data/ext/couchbase/core/protocol/cmd_lookup_in_replica.cxx +107 -0
  58. data/ext/couchbase/core/protocol/cmd_lookup_in_replica.hxx +137 -0
  59. data/ext/couchbase/core/protocol/hello_feature.hxx +6 -0
  60. data/ext/couchbase/core/protocol/hello_feature_fmt.hxx +3 -0
  61. data/ext/couchbase/core/protocol/status.cxx +2 -2
  62. data/ext/couchbase/core/range_scan_options.cxx +3 -27
  63. data/ext/couchbase/core/range_scan_options.hxx +13 -17
  64. data/ext/couchbase/core/range_scan_orchestrator.cxx +388 -170
  65. data/ext/couchbase/core/range_scan_orchestrator.hxx +13 -2
  66. data/ext/couchbase/core/range_scan_orchestrator_options.hxx +5 -3
  67. data/ext/couchbase/core/scan_options.hxx +0 -19
  68. data/ext/couchbase/core/scan_result.cxx +19 -5
  69. data/ext/couchbase/core/scan_result.hxx +5 -2
  70. data/ext/couchbase/core/timeout_defaults.hxx +2 -3
  71. data/ext/couchbase/core/topology/capabilities.hxx +3 -0
  72. data/ext/couchbase/core/topology/capabilities_fmt.hxx +8 -0
  73. data/ext/couchbase/core/topology/collections_manifest_fmt.hxx +1 -1
  74. data/ext/couchbase/core/topology/configuration.hxx +15 -0
  75. data/ext/couchbase/core/topology/configuration_json.hxx +6 -1
  76. data/ext/couchbase/core/utils/connection_string.cxx +62 -47
  77. data/ext/couchbase/core/utils/connection_string.hxx +1 -0
  78. data/ext/couchbase/couchbase/analytics_error_context.hxx +1 -1
  79. data/ext/couchbase/couchbase/behavior_options.hxx +19 -2
  80. data/ext/couchbase/couchbase/bucket_manager.hxx +135 -0
  81. data/ext/couchbase/couchbase/build_query_index_options.hxx +0 -30
  82. data/ext/couchbase/couchbase/cluster.hxx +14 -0
  83. data/ext/couchbase/couchbase/collection.hxx +111 -0
  84. data/ext/couchbase/couchbase/collection_query_index_manager.hxx +7 -48
  85. data/ext/couchbase/couchbase/create_bucket_options.hxx +41 -0
  86. data/ext/couchbase/couchbase/create_primary_query_index_options.hxx +0 -29
  87. data/ext/couchbase/couchbase/create_query_index_options.hxx +0 -33
  88. data/ext/couchbase/couchbase/drop_bucket_options.hxx +41 -0
  89. data/ext/couchbase/couchbase/drop_primary_query_index_options.hxx +0 -30
  90. data/ext/couchbase/couchbase/drop_query_index_options.hxx +0 -31
  91. data/ext/couchbase/couchbase/error_codes.hxx +1 -2
  92. data/ext/couchbase/couchbase/error_context.hxx +10 -2
  93. data/ext/couchbase/couchbase/flush_bucket_options.hxx +41 -0
  94. data/ext/couchbase/{core/topology/error_map_fmt.hxx → couchbase/fmt/key_value_error_map_attribute.hxx} +21 -21
  95. data/ext/couchbase/couchbase/get_all_buckets_options.hxx +44 -0
  96. data/ext/couchbase/couchbase/get_all_query_indexes_options.hxx +0 -30
  97. data/ext/couchbase/couchbase/get_and_lock_options.hxx +2 -2
  98. data/ext/couchbase/couchbase/get_and_touch_options.hxx +2 -2
  99. data/ext/couchbase/couchbase/get_bucket_options.hxx +43 -0
  100. data/ext/couchbase/couchbase/get_options.hxx +2 -2
  101. data/ext/couchbase/couchbase/insert_options.hxx +3 -3
  102. data/ext/couchbase/couchbase/key_value_error_context.hxx +7 -2
  103. data/ext/couchbase/couchbase/lookup_in_all_replicas_options.hxx +109 -0
  104. data/ext/couchbase/couchbase/lookup_in_any_replica_options.hxx +101 -0
  105. data/ext/couchbase/couchbase/lookup_in_options.hxx +2 -2
  106. data/ext/couchbase/couchbase/lookup_in_replica_result.hxx +74 -0
  107. data/ext/couchbase/couchbase/lookup_in_result.hxx +26 -0
  108. data/ext/couchbase/couchbase/management/bucket_settings.hxx +116 -0
  109. data/ext/couchbase/couchbase/manager_error_context.hxx +29 -53
  110. data/ext/couchbase/couchbase/mutate_in_options.hxx +2 -2
  111. data/ext/couchbase/couchbase/query_error_context.hxx +3 -1
  112. data/ext/couchbase/couchbase/query_index_manager.hxx +16 -83
  113. data/ext/couchbase/couchbase/query_options.hxx +18 -0
  114. data/ext/couchbase/couchbase/remove_options.hxx +2 -2
  115. data/ext/couchbase/couchbase/replace_options.hxx +3 -3
  116. data/ext/couchbase/couchbase/security_options.hxx +15 -0
  117. data/ext/couchbase/couchbase/subdocument_error_context.hxx +4 -2
  118. data/ext/couchbase/couchbase/touch_options.hxx +2 -2
  119. data/ext/couchbase/couchbase/unlock_options.hxx +2 -2
  120. data/ext/couchbase/couchbase/update_bucket_options.hxx +41 -0
  121. data/ext/couchbase/couchbase/upsert_options.hxx +3 -3
  122. data/ext/couchbase/couchbase/watch_query_indexes_options.hxx +0 -31
  123. data/ext/couchbase/test/CMakeLists.txt +1 -0
  124. data/ext/couchbase/test/test_integration_collections.cxx +6 -0
  125. data/ext/couchbase/test/test_integration_crud.cxx +5 -0
  126. data/ext/couchbase/test/test_integration_examples.cxx +137 -1
  127. data/ext/couchbase/test/test_integration_management.cxx +709 -266
  128. data/ext/couchbase/test/test_integration_query.cxx +19 -7
  129. data/ext/couchbase/test/test_integration_range_scan.cxx +351 -112
  130. data/ext/couchbase/test/test_integration_search.cxx +10 -1
  131. data/ext/couchbase/test/test_integration_subdoc.cxx +655 -0
  132. data/ext/couchbase/test/test_transaction_public_async_api.cxx +13 -12
  133. data/ext/couchbase/test/test_transaction_public_blocking_api.cxx +27 -21
  134. data/ext/couchbase/test/test_unit_connection_string.cxx +29 -0
  135. data/ext/couchbase/test/test_unit_query.cxx +75 -0
  136. data/ext/couchbase.cxx +583 -29
  137. data/ext/revisions.rb +3 -3
  138. data/lib/couchbase/cluster.rb +1 -1
  139. data/lib/couchbase/collection.rb +108 -0
  140. data/lib/couchbase/collection_options.rb +100 -0
  141. data/lib/couchbase/errors.rb +5 -0
  142. data/lib/couchbase/key_value_scan.rb +125 -0
  143. data/lib/couchbase/options.rb +151 -0
  144. data/lib/couchbase/scope.rb +1 -1
  145. data/lib/couchbase/utils/time.rb +14 -1
  146. data/lib/couchbase/version.rb +1 -1
  147. metadata +41 -7
  148. data/ext/couchbase/core/impl/collection_query_index_manager.cxx +0 -93
@@ -45,11 +45,20 @@ class security_options
45
45
  return *this;
46
46
  }
47
47
 
48
+ auto trust_certificate_value(std::string certificate_value) -> security_options&
49
+ {
50
+ trust_certificate_value_ = certificate_value;
51
+ return *this;
52
+ }
53
+
48
54
  struct built {
49
55
  bool enabled;
50
56
  tls_verify_mode tls_verify;
51
57
  std::optional<std::string> trust_certificate;
58
+ std::optional<std::string> trust_certificate_value;
52
59
  bool disable_mozilla_ca_certificates;
60
+ bool disable_deprecated_protocols;
61
+ bool disable_tls_v1_2;
53
62
  };
54
63
 
55
64
  [[nodiscard]] auto build() const -> built
@@ -58,7 +67,10 @@ class security_options
58
67
  enabled_,
59
68
  tls_verify_,
60
69
  trust_certificate_,
70
+ trust_certificate_value_,
61
71
  disable_mozilla_ca_certificates_,
72
+ disable_deprecated_protocols,
73
+ disable_tls_v1_2,
62
74
  };
63
75
  }
64
76
 
@@ -66,6 +78,9 @@ class security_options
66
78
  bool enabled_{ true };
67
79
  tls_verify_mode tls_verify_{ tls_verify_mode::peer };
68
80
  std::optional<std::string> trust_certificate_{};
81
+ std::optional<std::string> trust_certificate_value_{};
69
82
  bool disable_mozilla_ca_certificates_{ false };
83
+ bool disable_deprecated_protocols{ true };
84
+ bool disable_tls_v1_2{ false };
70
85
  };
71
86
  } // namespace couchbase
@@ -62,7 +62,8 @@ class subdocument_error_context : public key_value_error_context
62
62
  * @since 1.0.0
63
63
  * @internal
64
64
  */
65
- subdocument_error_context(std::error_code ec,
65
+ subdocument_error_context(std::string operation_id,
66
+ std::error_code ec,
66
67
  std::optional<std::string> last_dispatched_to,
67
68
  std::optional<std::string> last_dispatched_from,
68
69
  std::size_t retry_attempts,
@@ -79,7 +80,8 @@ class subdocument_error_context : public key_value_error_context
79
80
  std::optional<std::string> first_error_path,
80
81
  std::optional<std::uint64_t> first_error_index,
81
82
  bool deleted)
82
- : key_value_error_context{ ec,
83
+ : key_value_error_context{ std::move(operation_id),
84
+ ec,
83
85
  std::move(last_dispatched_to),
84
86
  std::move(last_dispatched_from),
85
87
  retry_attempts,
@@ -86,8 +86,8 @@ initiate_touch_operation(std::shared_ptr<couchbase::core::cluster> core,
86
86
  std::string collection_name,
87
87
  std::string document_key,
88
88
  std::uint32_t expiry,
89
- touch_options::built options,
90
- touch_handler&& handler);
89
+ couchbase::touch_options::built options,
90
+ couchbase::touch_handler&& handler);
91
91
  #endif
92
92
  } // namespace impl
93
93
  } // namespace core
@@ -89,8 +89,8 @@ initiate_unlock_operation(std::shared_ptr<couchbase::core::cluster> core,
89
89
  std::string collection_name,
90
90
  std::string document_key,
91
91
  couchbase::cas cas,
92
- unlock_options::built options,
93
- unlock_handler&& handler);
92
+ couchbase::unlock_options::built options,
93
+ couchbase::unlock_handler&& handler);
94
94
  #endif
95
95
  } // namespace impl
96
96
  } // namespace core
@@ -0,0 +1,41 @@
1
+ /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2020-Present Couchbase, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ #pragma once
19
+
20
+ #include <functional>
21
+ #include <memory>
22
+ #include <optional>
23
+ #include <string>
24
+
25
+ namespace couchbase
26
+ {
27
+ struct update_bucket_options : public common_options<update_bucket_options> {
28
+ public:
29
+ struct built : public common_options<update_bucket_options>::built {
30
+ };
31
+
32
+ [[nodiscard]] auto build() const -> built
33
+ {
34
+ return { build_common_options() };
35
+ }
36
+
37
+ private:
38
+ };
39
+
40
+ using update_bucket_handler = std::function<void(couchbase::manager_error_context)>;
41
+ } // namespace couchbase
@@ -149,9 +149,9 @@ initiate_upsert_operation(std::shared_ptr<couchbase::core::cluster> core,
149
149
  std::string scope_name,
150
150
  std::string collection_name,
151
151
  std::string document_key,
152
- codec::encoded_value encoded,
153
- upsert_options::built options,
154
- upsert_handler&& handler);
152
+ couchbase::codec::encoded_value encoded,
153
+ couchbase::upsert_options::built options,
154
+ couchbase::upsert_handler&& handler);
155
155
  #endif
156
156
  } // namespace impl
157
157
  } // namespace core
@@ -81,35 +81,4 @@ class watch_query_indexes_options : public common_options<watch_query_indexes_op
81
81
  */
82
82
 
83
83
  using watch_query_indexes_handler = std::function<void(couchbase::manager_error_context)>;
84
-
85
- #ifndef COUCHBASE_CXX_CLIENT_DOXYGEN
86
- namespace core
87
- {
88
- class cluster;
89
- class query_context;
90
- namespace impl
91
- {
92
-
93
- /**
94
- * @since 1.0.0
95
- * @internal
96
- */
97
- void
98
- initiate_watch_query_indexes(std::shared_ptr<couchbase::core::cluster> core,
99
- std::string bucket_name,
100
- std::vector<std::string> index_names,
101
- couchbase::watch_query_indexes_options::built options,
102
- query_context query_ctx,
103
- std::string collection_name,
104
- watch_query_indexes_handler&& handler);
105
- void
106
- initiate_watch_query_indexes(std::shared_ptr<couchbase::core::cluster> core,
107
- std::string bucket_name,
108
- std::vector<std::string> index_names,
109
- couchbase::watch_query_indexes_options::built options,
110
- watch_query_indexes_handler&& handler);
111
-
112
- #endif
113
- } // namespace impl
114
- } // namespace core
115
84
  } // namespace couchbase
@@ -26,6 +26,7 @@ unit_test(jsonsl)
26
26
  unit_test(config_profiles)
27
27
  unit_test(options)
28
28
  unit_test(search)
29
+ unit_test(query)
29
30
  target_link_libraries(test_unit_jsonsl jsonsl)
30
31
 
31
32
  integration_benchmark(get)
@@ -113,6 +113,12 @@ TEST_CASE("integration: get and insert non default scope and collection", "[inte
113
113
  REQUIRE_SUCCESS(resp.ctx.ec());
114
114
  REQUIRE(resp.value == couchbase::core::utils::to_binary(key));
115
115
  }
116
+
117
+ {
118
+ couchbase::core::operations::management::scope_drop_request req{ integration.ctx.bucket, scope_name };
119
+ auto resp = test::utils::execute(integration.cluster, req);
120
+ REQUIRE_SUCCESS(resp.ctx.ec);
121
+ }
116
122
  }
117
123
 
118
124
  TEST_CASE("integration: insert into dropped scope", "[integration]")
@@ -315,6 +315,11 @@ TEST_CASE("integration: lock/unlock without lock time", "[integration]")
315
315
  TEST_CASE("integration: touch with zero expiry resets expiry", "[integration]")
316
316
  {
317
317
  test::utils::integration_test_guard integration;
318
+
319
+ if (integration.ctx.deployment == test::utils::deployment_type::elixir) {
320
+ SKIP("Timeout is too strict for sanity test env");
321
+ }
322
+
318
323
  test::utils::open_bucket(integration.cluster, integration.ctx.bucket);
319
324
 
320
325
  couchbase::core::document_id id{ integration.ctx.bucket, "_default", "_default", test::utils::uniq_id("get_reset_expiry_key") };
@@ -132,6 +132,9 @@ row: {"airline":{"callsign":"MILE-AIR","country":"United States","iata":"Q5","ic
132
132
  TEST_CASE("example: start using", "[integration]")
133
133
  {
134
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
+ }
135
138
  if (!integration.cluster_version().supports_collections()) {
136
139
  SKIP("cluster does not support collections");
137
140
  }
@@ -438,8 +441,12 @@ row: {"airline":{"callsign":"MILE-AIR","country":"United States","iata":"Q5","ic
438
441
  TEST_CASE("example: search", "[integration]")
439
442
  {
440
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
+ }
441
448
  if (!integration.cluster_version().supports_collections()) {
442
- return;
449
+ SKIP("cluster does not support collections");
443
450
  }
444
451
 
445
452
  const auto env = test::utils::test_context::load_from_environment();
@@ -452,3 +459,132 @@ TEST_CASE("example: search", "[integration]")
452
459
 
453
460
  REQUIRE(example_search::main(4, argv) == 0);
454
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
+ }