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.
- checksums.yaml +4 -4
- data/README.md +2 -2
- data/ext/couchbase/CMakeLists.txt +15 -1
- data/ext/couchbase/core/bucket.cxx +183 -152
- data/ext/couchbase/core/bucket.hxx +17 -4
- data/ext/couchbase/core/cluster.hxx +34 -13
- data/ext/couchbase/core/cluster_options.hxx +3 -0
- data/ext/couchbase/core/crud_component.cxx +51 -22
- data/ext/couchbase/core/error_context/key_value.cxx +2 -1
- data/ext/couchbase/core/error_context/key_value.hxx +10 -12
- data/ext/couchbase/core/impl/build_deferred_query_indexes.cxx +115 -50
- data/ext/couchbase/core/impl/cluster.cxx +6 -0
- data/ext/couchbase/core/impl/create_bucket.cxx +155 -0
- data/ext/couchbase/core/impl/create_query_index.cxx +172 -59
- data/ext/couchbase/core/impl/dns_srv_tracker.cxx +2 -1
- data/ext/couchbase/core/impl/drop_bucket.cxx +66 -0
- data/ext/couchbase/core/impl/drop_query_index.cxx +138 -59
- data/ext/couchbase/core/impl/flush_bucket.cxx +66 -0
- data/ext/couchbase/core/impl/get_all_buckets.cxx +163 -0
- data/ext/couchbase/core/impl/get_all_query_indexes.cxx +67 -37
- data/ext/couchbase/core/impl/get_bucket.cxx +153 -0
- data/ext/couchbase/core/impl/internal_manager_error_context.cxx +113 -0
- data/ext/couchbase/core/impl/internal_manager_error_context.hxx +60 -0
- data/ext/couchbase/core/impl/key_value_error_category.cxx +2 -4
- data/ext/couchbase/core/impl/key_value_error_context.cxx +98 -0
- data/ext/couchbase/core/impl/lookup_in.cxx +1 -0
- data/ext/couchbase/core/impl/lookup_in_all_replicas.cxx +176 -0
- data/ext/couchbase/core/impl/lookup_in_all_replicas.hxx +80 -0
- data/ext/couchbase/core/impl/lookup_in_any_replica.cxx +167 -0
- data/ext/couchbase/core/impl/lookup_in_any_replica.hxx +75 -0
- data/ext/couchbase/core/impl/lookup_in_replica.cxx +97 -0
- data/ext/couchbase/core/impl/lookup_in_replica.hxx +67 -0
- data/ext/couchbase/core/impl/manager_error_context.cxx +100 -0
- data/ext/couchbase/core/impl/query.cxx +1 -0
- data/ext/couchbase/core/impl/query_error_context.cxx +75 -0
- data/ext/couchbase/core/impl/update_bucket.cxx +130 -0
- data/ext/couchbase/core/impl/watch_query_indexes.cxx +53 -29
- data/ext/couchbase/core/io/dns_client.cxx +111 -40
- data/ext/couchbase/core/io/dns_config.cxx +5 -4
- data/ext/couchbase/core/io/http_session.hxx +24 -1
- data/ext/couchbase/core/io/mcbp_command.hxx +9 -2
- data/ext/couchbase/core/io/mcbp_session.cxx +80 -43
- data/ext/couchbase/core/io/mcbp_session.hxx +4 -3
- data/ext/couchbase/core/logger/custom_rotating_file_sink.cxx +1 -1
- data/ext/couchbase/core/logger/logger.cxx +80 -20
- data/ext/couchbase/core/logger/logger.hxx +31 -0
- data/ext/couchbase/core/meta/features.hxx +25 -0
- data/ext/couchbase/core/operations/document_lookup_in_all_replicas.hxx +192 -0
- data/ext/couchbase/core/operations/document_lookup_in_any_replica.hxx +188 -0
- data/ext/couchbase/core/operations/document_query.cxx +11 -0
- data/ext/couchbase/core/operations/document_query.hxx +1 -0
- data/ext/couchbase/core/operations.hxx +2 -0
- data/ext/couchbase/core/origin.cxx +270 -0
- data/ext/couchbase/core/origin.hxx +2 -0
- data/ext/couchbase/core/protocol/client_response.hxx +1 -0
- data/ext/couchbase/core/protocol/cmd_hello.hxx +1 -0
- data/ext/couchbase/core/protocol/cmd_lookup_in_replica.cxx +107 -0
- data/ext/couchbase/core/protocol/cmd_lookup_in_replica.hxx +137 -0
- data/ext/couchbase/core/protocol/hello_feature.hxx +6 -0
- data/ext/couchbase/core/protocol/hello_feature_fmt.hxx +3 -0
- data/ext/couchbase/core/protocol/status.cxx +2 -2
- data/ext/couchbase/core/range_scan_options.cxx +3 -27
- data/ext/couchbase/core/range_scan_options.hxx +13 -17
- data/ext/couchbase/core/range_scan_orchestrator.cxx +388 -170
- data/ext/couchbase/core/range_scan_orchestrator.hxx +13 -2
- data/ext/couchbase/core/range_scan_orchestrator_options.hxx +5 -3
- data/ext/couchbase/core/scan_options.hxx +0 -19
- data/ext/couchbase/core/scan_result.cxx +19 -5
- data/ext/couchbase/core/scan_result.hxx +5 -2
- data/ext/couchbase/core/timeout_defaults.hxx +2 -3
- data/ext/couchbase/core/topology/capabilities.hxx +3 -0
- data/ext/couchbase/core/topology/capabilities_fmt.hxx +8 -0
- data/ext/couchbase/core/topology/collections_manifest_fmt.hxx +1 -1
- data/ext/couchbase/core/topology/configuration.hxx +15 -0
- data/ext/couchbase/core/topology/configuration_json.hxx +6 -1
- data/ext/couchbase/core/utils/connection_string.cxx +62 -47
- data/ext/couchbase/core/utils/connection_string.hxx +1 -0
- data/ext/couchbase/couchbase/analytics_error_context.hxx +1 -1
- data/ext/couchbase/couchbase/behavior_options.hxx +19 -2
- data/ext/couchbase/couchbase/bucket_manager.hxx +135 -0
- data/ext/couchbase/couchbase/build_query_index_options.hxx +0 -30
- data/ext/couchbase/couchbase/cluster.hxx +14 -0
- data/ext/couchbase/couchbase/collection.hxx +111 -0
- data/ext/couchbase/couchbase/collection_query_index_manager.hxx +7 -48
- data/ext/couchbase/couchbase/create_bucket_options.hxx +41 -0
- data/ext/couchbase/couchbase/create_primary_query_index_options.hxx +0 -29
- data/ext/couchbase/couchbase/create_query_index_options.hxx +0 -33
- data/ext/couchbase/couchbase/drop_bucket_options.hxx +41 -0
- data/ext/couchbase/couchbase/drop_primary_query_index_options.hxx +0 -30
- data/ext/couchbase/couchbase/drop_query_index_options.hxx +0 -31
- data/ext/couchbase/couchbase/error_codes.hxx +1 -2
- data/ext/couchbase/couchbase/error_context.hxx +10 -2
- data/ext/couchbase/couchbase/flush_bucket_options.hxx +41 -0
- data/ext/couchbase/{core/topology/error_map_fmt.hxx → couchbase/fmt/key_value_error_map_attribute.hxx} +21 -21
- data/ext/couchbase/couchbase/get_all_buckets_options.hxx +44 -0
- data/ext/couchbase/couchbase/get_all_query_indexes_options.hxx +0 -30
- data/ext/couchbase/couchbase/get_and_lock_options.hxx +2 -2
- data/ext/couchbase/couchbase/get_and_touch_options.hxx +2 -2
- data/ext/couchbase/couchbase/get_bucket_options.hxx +43 -0
- data/ext/couchbase/couchbase/get_options.hxx +2 -2
- data/ext/couchbase/couchbase/insert_options.hxx +3 -3
- data/ext/couchbase/couchbase/key_value_error_context.hxx +7 -2
- data/ext/couchbase/couchbase/lookup_in_all_replicas_options.hxx +109 -0
- data/ext/couchbase/couchbase/lookup_in_any_replica_options.hxx +101 -0
- data/ext/couchbase/couchbase/lookup_in_options.hxx +2 -2
- data/ext/couchbase/couchbase/lookup_in_replica_result.hxx +74 -0
- data/ext/couchbase/couchbase/lookup_in_result.hxx +26 -0
- data/ext/couchbase/couchbase/management/bucket_settings.hxx +116 -0
- data/ext/couchbase/couchbase/manager_error_context.hxx +29 -53
- data/ext/couchbase/couchbase/mutate_in_options.hxx +2 -2
- data/ext/couchbase/couchbase/query_error_context.hxx +3 -1
- data/ext/couchbase/couchbase/query_index_manager.hxx +16 -83
- data/ext/couchbase/couchbase/query_options.hxx +18 -0
- data/ext/couchbase/couchbase/remove_options.hxx +2 -2
- data/ext/couchbase/couchbase/replace_options.hxx +3 -3
- data/ext/couchbase/couchbase/security_options.hxx +15 -0
- data/ext/couchbase/couchbase/subdocument_error_context.hxx +4 -2
- data/ext/couchbase/couchbase/touch_options.hxx +2 -2
- data/ext/couchbase/couchbase/unlock_options.hxx +2 -2
- data/ext/couchbase/couchbase/update_bucket_options.hxx +41 -0
- data/ext/couchbase/couchbase/upsert_options.hxx +3 -3
- data/ext/couchbase/couchbase/watch_query_indexes_options.hxx +0 -31
- data/ext/couchbase/test/CMakeLists.txt +1 -0
- data/ext/couchbase/test/test_integration_collections.cxx +6 -0
- data/ext/couchbase/test/test_integration_crud.cxx +5 -0
- data/ext/couchbase/test/test_integration_examples.cxx +137 -1
- data/ext/couchbase/test/test_integration_management.cxx +709 -266
- data/ext/couchbase/test/test_integration_query.cxx +19 -7
- data/ext/couchbase/test/test_integration_range_scan.cxx +351 -112
- data/ext/couchbase/test/test_integration_search.cxx +10 -1
- data/ext/couchbase/test/test_integration_subdoc.cxx +655 -0
- data/ext/couchbase/test/test_transaction_public_async_api.cxx +13 -12
- data/ext/couchbase/test/test_transaction_public_blocking_api.cxx +27 -21
- data/ext/couchbase/test/test_unit_connection_string.cxx +29 -0
- data/ext/couchbase/test/test_unit_query.cxx +75 -0
- data/ext/couchbase.cxx +583 -29
- data/ext/revisions.rb +3 -3
- data/lib/couchbase/cluster.rb +1 -1
- data/lib/couchbase/collection.rb +108 -0
- data/lib/couchbase/collection_options.rb +100 -0
- data/lib/couchbase/errors.rb +5 -0
- data/lib/couchbase/key_value_scan.rb +125 -0
- data/lib/couchbase/options.rb +151 -0
- data/lib/couchbase/scope.rb +1 -1
- data/lib/couchbase/utils/time.rb +14 -1
- data/lib/couchbase/version.rb +1 -1
- metadata +41 -7
- 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::
|
|
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{
|
|
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
|
|
@@ -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
|
-
|
|
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
|
+
}
|