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
|
@@ -0,0 +1,74 @@
|
|
|
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 <couchbase/lookup_in_result.hxx>
|
|
21
|
+
|
|
22
|
+
#include <vector>
|
|
23
|
+
|
|
24
|
+
namespace couchbase
|
|
25
|
+
{
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Represents result of lookup_in_replica operations.
|
|
29
|
+
*
|
|
30
|
+
* @since 1.0.0
|
|
31
|
+
* @committed
|
|
32
|
+
*/
|
|
33
|
+
class lookup_in_replica_result : public lookup_in_result
|
|
34
|
+
{
|
|
35
|
+
public:
|
|
36
|
+
/**
|
|
37
|
+
* @since 1.0.0
|
|
38
|
+
* @internal
|
|
39
|
+
*/
|
|
40
|
+
lookup_in_replica_result() = default;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Constructs result for lookup_in_replica operation
|
|
44
|
+
*
|
|
45
|
+
* @param cas
|
|
46
|
+
* @param entries list of the fields returned by the server
|
|
47
|
+
* @param is_deleted
|
|
48
|
+
* @param is_replica true if document originates from replica node
|
|
49
|
+
*
|
|
50
|
+
* @since 1.0.0
|
|
51
|
+
* @committed
|
|
52
|
+
*/
|
|
53
|
+
lookup_in_replica_result(couchbase::cas cas, std::vector<entry> entries, bool is_deleted, bool is_replica)
|
|
54
|
+
: lookup_in_result{ cas, std::move(entries), is_deleted }
|
|
55
|
+
, is_replica_{ is_replica }
|
|
56
|
+
{
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Returns whether this document originates from a replica node
|
|
61
|
+
*
|
|
62
|
+
* @return whether document originates from a replica node
|
|
63
|
+
*
|
|
64
|
+
* @since 1.0.0
|
|
65
|
+
*/
|
|
66
|
+
[[nodiscard]] auto is_replica() const -> bool
|
|
67
|
+
{
|
|
68
|
+
return is_replica_;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
private:
|
|
72
|
+
bool is_replica_{ false };
|
|
73
|
+
};
|
|
74
|
+
} // namespace couchbase
|
|
@@ -44,6 +44,7 @@ class lookup_in_result : public result
|
|
|
44
44
|
codec::binary value;
|
|
45
45
|
std::size_t original_index;
|
|
46
46
|
bool exists;
|
|
47
|
+
std::error_code ec;
|
|
47
48
|
};
|
|
48
49
|
|
|
49
50
|
/**
|
|
@@ -84,6 +85,11 @@ class lookup_in_result : public result
|
|
|
84
85
|
{
|
|
85
86
|
for (const entry& e : entries_) {
|
|
86
87
|
if (e.original_index == index) {
|
|
88
|
+
if (e.ec) {
|
|
89
|
+
throw std::system_error(
|
|
90
|
+
e.ec, "error getting result for spec at index " + std::to_string(index) + ", path \"" + e.path + "\"");
|
|
91
|
+
}
|
|
92
|
+
|
|
87
93
|
return codec::tao_json_serializer::deserialize<Document>(e.value);
|
|
88
94
|
}
|
|
89
95
|
}
|
|
@@ -105,6 +111,10 @@ class lookup_in_result : public result
|
|
|
105
111
|
{
|
|
106
112
|
for (const entry& e : entries_) {
|
|
107
113
|
if (e.path == path) {
|
|
114
|
+
if (e.ec) {
|
|
115
|
+
throw std::system_error(e.ec, "error getting result for path \"" + e.path + "\"");
|
|
116
|
+
}
|
|
117
|
+
|
|
108
118
|
return codec::tao_json_serializer::deserialize<Document>(e.value);
|
|
109
119
|
}
|
|
110
120
|
}
|
|
@@ -127,6 +137,10 @@ class lookup_in_result : public result
|
|
|
127
137
|
const auto& macro_string = subdoc::to_string(macro);
|
|
128
138
|
for (const entry& e : entries_) {
|
|
129
139
|
if (e.path == macro_string) {
|
|
140
|
+
if (e.ec) {
|
|
141
|
+
throw std::system_error(e.ec, "error getting result for macro \"" + macro_string + "\"");
|
|
142
|
+
}
|
|
143
|
+
|
|
130
144
|
return codec::tao_json_serializer::deserialize<Document>(e.value);
|
|
131
145
|
}
|
|
132
146
|
}
|
|
@@ -147,6 +161,10 @@ class lookup_in_result : public result
|
|
|
147
161
|
{
|
|
148
162
|
for (const entry& e : entries_) {
|
|
149
163
|
if (e.original_index == index) {
|
|
164
|
+
if (e.ec && e.ec != couchbase::errc::key_value::path_not_found) {
|
|
165
|
+
throw std::system_error(e.ec, "error getting result for path \"" + e.path + "\"");
|
|
166
|
+
}
|
|
167
|
+
|
|
150
168
|
return e.exists;
|
|
151
169
|
}
|
|
152
170
|
}
|
|
@@ -167,6 +185,10 @@ class lookup_in_result : public result
|
|
|
167
185
|
const auto& macro_string = subdoc::to_string(macro);
|
|
168
186
|
for (const entry& e : entries_) {
|
|
169
187
|
if (e.path == macro_string) {
|
|
188
|
+
if (e.ec && e.ec != couchbase::errc::key_value::path_not_found) {
|
|
189
|
+
throw std::system_error(e.ec, "error getting result for macro \"" + macro_string + "\"");
|
|
190
|
+
}
|
|
191
|
+
|
|
170
192
|
return e.exists;
|
|
171
193
|
}
|
|
172
194
|
}
|
|
@@ -186,6 +208,10 @@ class lookup_in_result : public result
|
|
|
186
208
|
{
|
|
187
209
|
for (const entry& e : entries_) {
|
|
188
210
|
if (e.path == path) {
|
|
211
|
+
if (e.ec && e.ec != couchbase::errc::key_value::path_not_found) {
|
|
212
|
+
throw std::system_error(e.ec, "error getting result for path \"" + e.path + "\"");
|
|
213
|
+
}
|
|
214
|
+
|
|
189
215
|
return e.exists;
|
|
190
216
|
}
|
|
191
217
|
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
|
|
2
|
+
/*
|
|
3
|
+
* Copyright 2020-2021 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 <couchbase/durability_level.hxx>
|
|
21
|
+
|
|
22
|
+
#include <map>
|
|
23
|
+
#include <optional>
|
|
24
|
+
#include <string>
|
|
25
|
+
#include <vector>
|
|
26
|
+
|
|
27
|
+
namespace couchbase::management::cluster
|
|
28
|
+
{
|
|
29
|
+
enum class bucket_type { unknown, couchbase, memcached, ephemeral };
|
|
30
|
+
enum class bucket_compression { unknown, off, active, passive };
|
|
31
|
+
enum class bucket_eviction_policy {
|
|
32
|
+
unknown,
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* During ejection, everything (including key, metadata, and value) will be ejected.
|
|
36
|
+
*
|
|
37
|
+
* Full Ejection reduces the memory overhead requirement, at the cost of performance.
|
|
38
|
+
*
|
|
39
|
+
* This value is only valid for buckets of type COUCHBASE.
|
|
40
|
+
*/
|
|
41
|
+
full,
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* During ejection, only the value will be ejected (key and metadata will remain in memory).
|
|
45
|
+
*
|
|
46
|
+
* Value Ejection needs more system memory, but provides better performance than Full Ejection.
|
|
47
|
+
*
|
|
48
|
+
* This value is only valid for buckets of type COUCHBASE.
|
|
49
|
+
*/
|
|
50
|
+
value_only,
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Couchbase Server keeps all data until explicitly deleted, but will reject
|
|
54
|
+
* any new data if you reach the quota (dedicated memory) you set for your bucket.
|
|
55
|
+
*
|
|
56
|
+
* This value is only valid for buckets of type EPHEMERAL.
|
|
57
|
+
*/
|
|
58
|
+
no_eviction,
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* When the memory quota is reached, Couchbase Server ejects data that has not been used recently.
|
|
62
|
+
*
|
|
63
|
+
* This value is only valid for buckets of type EPHEMERAL.
|
|
64
|
+
*/
|
|
65
|
+
not_recently_used,
|
|
66
|
+
};
|
|
67
|
+
enum class bucket_conflict_resolution {
|
|
68
|
+
unknown,
|
|
69
|
+
/**
|
|
70
|
+
* Use timestamp conflict resolution.
|
|
71
|
+
*
|
|
72
|
+
* Timestamp-based conflict resolution (often referred to as Last Write Wins, or LWW) uses the document
|
|
73
|
+
* timestamp (stored in the CAS) to resolve conflicts. The timestamps associated with the most recent
|
|
74
|
+
* updates of source and target documents are compared. The document whose update has the more recent
|
|
75
|
+
* timestamp prevails.
|
|
76
|
+
*/
|
|
77
|
+
timestamp,
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Use sequence number conflict resolution
|
|
81
|
+
*
|
|
82
|
+
* Conflicts can be resolved by referring to documents' sequence numbers. Sequence numbers are maintained
|
|
83
|
+
* per document, and are incremented on every document-update. The sequence numbers of source and
|
|
84
|
+
* target documents are compared; and the document with the higher sequence number prevails.
|
|
85
|
+
*/
|
|
86
|
+
sequence_number,
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* VOLATILE: This API is subject to change at any time.
|
|
90
|
+
*
|
|
91
|
+
* In Couchbase Server 7.1, this feature is only available in "developer-preview" mode. See the UI XDCR settings.
|
|
92
|
+
*/
|
|
93
|
+
custom,
|
|
94
|
+
};
|
|
95
|
+
enum class bucket_storage_backend { unknown, couchstore, magma };
|
|
96
|
+
|
|
97
|
+
struct bucket_settings {
|
|
98
|
+
|
|
99
|
+
std::string name;
|
|
100
|
+
cluster::bucket_type bucket_type{ cluster::bucket_type::unknown };
|
|
101
|
+
std::uint64_t ram_quota_mb{ 100 };
|
|
102
|
+
std::uint32_t max_expiry{ 0 };
|
|
103
|
+
bucket_compression compression_mode{ bucket_compression::unknown };
|
|
104
|
+
std::optional<couchbase::durability_level> minimum_durability_level{};
|
|
105
|
+
std::uint32_t num_replicas{ 1 };
|
|
106
|
+
bool replica_indexes{ false };
|
|
107
|
+
bool flush_enabled{ false };
|
|
108
|
+
bucket_eviction_policy eviction_policy{ bucket_eviction_policy::unknown };
|
|
109
|
+
bucket_conflict_resolution conflict_resolution_type{ bucket_conflict_resolution::unknown };
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* UNCOMMITTED: This API may change in the future
|
|
113
|
+
*/
|
|
114
|
+
bucket_storage_backend storage_backend{ bucket_storage_backend::unknown };
|
|
115
|
+
};
|
|
116
|
+
} // namespace couchbase::management::cluster
|
|
@@ -17,14 +17,20 @@
|
|
|
17
17
|
|
|
18
18
|
#pragma once
|
|
19
19
|
|
|
20
|
+
#include "core/impl/internal_manager_error_context.hxx"
|
|
20
21
|
#include <couchbase/error_context.hxx>
|
|
21
22
|
|
|
22
23
|
#include <cstdint>
|
|
24
|
+
#include <memory>
|
|
23
25
|
#include <optional>
|
|
24
26
|
#include <string>
|
|
25
27
|
|
|
26
28
|
namespace couchbase
|
|
27
29
|
{
|
|
30
|
+
#ifndef COUCHBASE_CXX_CLIENT_DOXYGEN
|
|
31
|
+
class internal_manager_error_context;
|
|
32
|
+
#endif
|
|
33
|
+
|
|
28
34
|
/**
|
|
29
35
|
* The error context returned with manager operations.
|
|
30
36
|
*
|
|
@@ -40,40 +46,25 @@ class manager_error_context : public error_context
|
|
|
40
46
|
* @since 1.0.0
|
|
41
47
|
* @committed
|
|
42
48
|
*/
|
|
43
|
-
manager_error_context()
|
|
49
|
+
manager_error_context();
|
|
50
|
+
explicit manager_error_context(internal_manager_error_context ctx);
|
|
51
|
+
manager_error_context(manager_error_context&& other);
|
|
52
|
+
manager_error_context& operator=(manager_error_context&& other);
|
|
53
|
+
manager_error_context(const manager_error_context& other) = delete;
|
|
54
|
+
manager_error_context& operator=(const manager_error_context& other) = delete;
|
|
55
|
+
~manager_error_context() override;
|
|
44
56
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
* @param path
|
|
57
|
-
*
|
|
58
|
-
* @since 1.0.0
|
|
59
|
-
* @internal
|
|
60
|
-
*/
|
|
61
|
-
manager_error_context(std::error_code ec,
|
|
62
|
-
std::optional<std::string> last_dispatched_to,
|
|
63
|
-
std::optional<std::string> last_dispatched_from,
|
|
64
|
-
std::size_t retry_attempts,
|
|
65
|
-
std::set<retry_reason> retry_reasons,
|
|
66
|
-
std::string client_context_id,
|
|
67
|
-
std::uint32_t http_status,
|
|
68
|
-
std::string content,
|
|
69
|
-
std::string path)
|
|
70
|
-
: error_context{ ec, std::move(last_dispatched_to), std::move(last_dispatched_from), retry_attempts, std::move(retry_reasons) }
|
|
71
|
-
, client_context_id_{ std::move(client_context_id) }
|
|
72
|
-
, http_status_{ http_status }
|
|
73
|
-
, content_{ std::move(content) }
|
|
74
|
-
, path_{ std::move(path) }
|
|
75
|
-
{
|
|
76
|
-
}
|
|
57
|
+
[[nodiscard]] auto ec() const -> std::error_code override;
|
|
58
|
+
|
|
59
|
+
[[nodiscard]] auto last_dispatched_to() const -> const std::optional<std::string>& override;
|
|
60
|
+
|
|
61
|
+
[[nodiscard]] auto last_dispatched_from() const -> const std::optional<std::string>& override;
|
|
62
|
+
|
|
63
|
+
[[nodiscard]] auto retry_attempts() const -> std::size_t override;
|
|
64
|
+
|
|
65
|
+
[[nodiscard]] auto retry_reasons() const -> const std::set<retry_reason>& override;
|
|
66
|
+
|
|
67
|
+
[[nodiscard]] auto retried_because_of(retry_reason reason) const -> bool override;
|
|
77
68
|
|
|
78
69
|
/**
|
|
79
70
|
* Returns request path.
|
|
@@ -83,10 +74,7 @@ class manager_error_context : public error_context
|
|
|
83
74
|
* @since 1.0.0
|
|
84
75
|
* @uncommitted
|
|
85
76
|
*/
|
|
86
|
-
[[nodiscard]] auto path() const -> const std::string
|
|
87
|
-
{
|
|
88
|
-
return path_;
|
|
89
|
-
}
|
|
77
|
+
[[nodiscard]] auto path() const -> const std::string&;
|
|
90
78
|
|
|
91
79
|
/**
|
|
92
80
|
* Returns response body.
|
|
@@ -96,10 +84,7 @@ class manager_error_context : public error_context
|
|
|
96
84
|
* @since 1.0.0
|
|
97
85
|
* @committed
|
|
98
86
|
*/
|
|
99
|
-
[[nodiscard]] auto content() const -> const std::string
|
|
100
|
-
{
|
|
101
|
-
return content_;
|
|
102
|
-
}
|
|
87
|
+
[[nodiscard]] auto content() const -> const std::string&;
|
|
103
88
|
|
|
104
89
|
/**
|
|
105
90
|
* Returns the unique
|
|
@@ -109,10 +94,7 @@ class manager_error_context : public error_context
|
|
|
109
94
|
* @since 1.0.0
|
|
110
95
|
* @uncommitted
|
|
111
96
|
*/
|
|
112
|
-
[[nodiscard]] auto client_context_id() const -> const std::string
|
|
113
|
-
{
|
|
114
|
-
return client_context_id_;
|
|
115
|
-
}
|
|
97
|
+
[[nodiscard]] auto client_context_id() const -> const std::string&;
|
|
116
98
|
|
|
117
99
|
/**
|
|
118
100
|
* Returns HTTP status of response
|
|
@@ -122,15 +104,9 @@ class manager_error_context : public error_context
|
|
|
122
104
|
* @since 1.0.0
|
|
123
105
|
* @committed
|
|
124
106
|
*/
|
|
125
|
-
[[nodiscard]] auto http_status() const -> std::uint32_t
|
|
126
|
-
{
|
|
127
|
-
return http_status_;
|
|
128
|
-
}
|
|
107
|
+
[[nodiscard]] auto http_status() const -> std::uint32_t;
|
|
129
108
|
|
|
130
109
|
private:
|
|
131
|
-
std::
|
|
132
|
-
std::uint32_t http_status_{};
|
|
133
|
-
std::string content_{};
|
|
134
|
-
std::string path_{};
|
|
110
|
+
std::unique_ptr<internal_manager_error_context> internal_;
|
|
135
111
|
};
|
|
136
112
|
} // namespace couchbase
|
|
@@ -225,8 +225,8 @@ initiate_mutate_in_operation(std::shared_ptr<couchbase::core::cluster> core,
|
|
|
225
225
|
std::string collection_name,
|
|
226
226
|
std::string document_key,
|
|
227
227
|
const std::vector<couchbase::core::impl::subdoc::command>& specs,
|
|
228
|
-
mutate_in_options::built options,
|
|
229
|
-
mutate_in_handler&& handler);
|
|
228
|
+
couchbase::mutate_in_options::built options,
|
|
229
|
+
couchbase::mutate_in_handler&& handler);
|
|
230
230
|
#endif
|
|
231
231
|
} // namespace impl
|
|
232
232
|
} // namespace core
|
|
@@ -57,7 +57,7 @@ class query_error_context : public error_context
|
|
|
57
57
|
std::string http_body,
|
|
58
58
|
std::string hostname,
|
|
59
59
|
std::uint16_t port)
|
|
60
|
-
: error_context{ ec, std::move(last_dispatched_to), std::move(last_dispatched_from), retry_attempts, std::move(retry_reasons) }
|
|
60
|
+
: error_context{ {}, ec, std::move(last_dispatched_to), std::move(last_dispatched_from), retry_attempts, std::move(retry_reasons) }
|
|
61
61
|
, first_error_code_{ first_error_code }
|
|
62
62
|
, first_error_message_{ std::move(first_error_message) }
|
|
63
63
|
, client_context_id_{ std::move(client_context_id) }
|
|
@@ -127,6 +127,8 @@ class query_error_context : public error_context
|
|
|
127
127
|
return port_;
|
|
128
128
|
}
|
|
129
129
|
|
|
130
|
+
[[nodiscard]] auto to_json() const -> std::string;
|
|
131
|
+
|
|
130
132
|
private:
|
|
131
133
|
std::uint64_t first_error_code_{};
|
|
132
134
|
std::string first_error_message_{};
|
|
@@ -61,19 +61,11 @@ class query_index_manager
|
|
|
61
61
|
*/
|
|
62
62
|
void get_all_indexes(std::string bucket_name,
|
|
63
63
|
const get_all_query_indexes_options& options,
|
|
64
|
-
get_all_query_indexes_handler&& handler) const
|
|
65
|
-
|
|
66
|
-
return core::impl::initiate_get_all_query_indexes(
|
|
67
|
-
core_, std::move(bucket_name), options.build(), std::forward<get_all_query_indexes_handler>(handler));
|
|
68
|
-
}
|
|
64
|
+
get_all_query_indexes_handler&& handler) const;
|
|
65
|
+
|
|
69
66
|
[[nodiscard]] auto get_all_indexes(std::string bucket_name, const get_all_query_indexes_options& options) const
|
|
70
|
-
-> std::future<std::pair<manager_error_context, std::vector<couchbase::management::query::index
|
|
71
|
-
|
|
72
|
-
auto barrier = std::make_shared<std::promise<std::pair<manager_error_context, std::vector<couchbase::management::query::index>>>>();
|
|
73
|
-
auto future = barrier->get_future();
|
|
74
|
-
get_all_indexes(std::move(bucket_name), options, [barrier](auto ctx, auto resp) { barrier->set_value({ ctx, resp }); });
|
|
75
|
-
return future;
|
|
76
|
-
}
|
|
67
|
+
-> std::future<std::pair<manager_error_context, std::vector<couchbase::management::query::index>>>;
|
|
68
|
+
|
|
77
69
|
/**
|
|
78
70
|
* Create an index on a bucket.
|
|
79
71
|
*
|
|
@@ -90,23 +82,12 @@ class query_index_manager
|
|
|
90
82
|
std::string index_name,
|
|
91
83
|
std::vector<std::string> fields,
|
|
92
84
|
const create_query_index_options& options,
|
|
93
|
-
create_query_index_handler&& handler) const
|
|
94
|
-
{
|
|
95
|
-
core::impl::initiate_create_query_index(
|
|
96
|
-
core_, std::move(bucket_name), std::move(index_name), std::move(fields), options.build(), std::move(handler));
|
|
97
|
-
}
|
|
85
|
+
create_query_index_handler&& handler) const;
|
|
98
86
|
|
|
99
87
|
[[nodiscard]] auto create_index(std::string bucket_name,
|
|
100
88
|
std::string index_name,
|
|
101
89
|
std::vector<std::string> fields,
|
|
102
|
-
const create_query_index_options& options) const -> std::future<manager_error_context
|
|
103
|
-
{
|
|
104
|
-
auto barrier = std::make_shared<std::promise<manager_error_context>>();
|
|
105
|
-
auto future = barrier->get_future();
|
|
106
|
-
create_index(
|
|
107
|
-
std::move(bucket_name), std::move(index_name), std::move(fields), options, [barrier](auto ctx) { barrier->set_value(ctx); });
|
|
108
|
-
return future;
|
|
109
|
-
}
|
|
90
|
+
const create_query_index_options& options) const -> std::future<manager_error_context>;
|
|
110
91
|
|
|
111
92
|
/**
|
|
112
93
|
* Create a primary index on a bucket.
|
|
@@ -120,19 +101,10 @@ class query_index_manager
|
|
|
120
101
|
*/
|
|
121
102
|
void create_primary_index(std::string bucket_name,
|
|
122
103
|
const create_primary_query_index_options& options,
|
|
123
|
-
create_query_index_handler&& handler)
|
|
124
|
-
{
|
|
125
|
-
return core::impl::initiate_create_primary_query_index(core_, std::move(bucket_name), options.build(), std::move(handler));
|
|
126
|
-
}
|
|
104
|
+
create_query_index_handler&& handler);
|
|
127
105
|
|
|
128
106
|
[[nodiscard]] auto create_primary_index(std::string bucket_name, const create_primary_query_index_options& options)
|
|
129
|
-
-> std::future<manager_error_context
|
|
130
|
-
{
|
|
131
|
-
auto barrier = std::make_shared<std::promise<manager_error_context>>();
|
|
132
|
-
auto future = barrier->get_future();
|
|
133
|
-
create_primary_index(std::move(bucket_name), options, [barrier](auto ctx) { barrier->set_value(ctx); });
|
|
134
|
-
return future;
|
|
135
|
-
}
|
|
107
|
+
-> std::future<manager_error_context>;
|
|
136
108
|
/**
|
|
137
109
|
* Drop primary index on a bucket.
|
|
138
110
|
*
|
|
@@ -143,19 +115,10 @@ class query_index_manager
|
|
|
143
115
|
* @since 1.0.0
|
|
144
116
|
* @committed
|
|
145
117
|
*/
|
|
146
|
-
void drop_primary_index(std::string bucket_name, const drop_primary_query_index_options& options, drop_query_index_handler&& handler)
|
|
147
|
-
{
|
|
148
|
-
return core::impl::initiate_drop_primary_query_index(core_, std::move(bucket_name), options.build(), std::move(handler));
|
|
149
|
-
}
|
|
118
|
+
void drop_primary_index(std::string bucket_name, const drop_primary_query_index_options& options, drop_query_index_handler&& handler);
|
|
150
119
|
|
|
151
120
|
[[nodiscard]] auto drop_primary_index(std::string bucket_name, const drop_primary_query_index_options& options)
|
|
152
|
-
-> std::future<manager_error_context
|
|
153
|
-
{
|
|
154
|
-
auto barrier = std::make_shared<std::promise<manager_error_context>>();
|
|
155
|
-
auto future = barrier->get_future();
|
|
156
|
-
drop_primary_index(std::move(bucket_name), options, [barrier](auto ctx) { barrier->set_value(ctx); });
|
|
157
|
-
return future;
|
|
158
|
-
}
|
|
121
|
+
-> std::future<manager_error_context>;
|
|
159
122
|
|
|
160
123
|
/**
|
|
161
124
|
*
|
|
@@ -170,20 +133,10 @@ class query_index_manager
|
|
|
170
133
|
void drop_index(std::string bucket_name,
|
|
171
134
|
std::string index_name,
|
|
172
135
|
const drop_query_index_options& options,
|
|
173
|
-
drop_query_index_handler&& handler)
|
|
174
|
-
{
|
|
175
|
-
return core::impl::initiate_drop_query_index(
|
|
176
|
-
core_, std::move(bucket_name), std::move(index_name), options.build(), std::move(handler));
|
|
177
|
-
}
|
|
136
|
+
drop_query_index_handler&& handler);
|
|
178
137
|
|
|
179
138
|
[[nodiscard]] auto drop_index(std::string bucket_name, std::string index_name, const drop_query_index_options& options)
|
|
180
|
-
-> std::future<manager_error_context
|
|
181
|
-
{
|
|
182
|
-
auto barrier = std::make_shared<std::promise<manager_error_context>>();
|
|
183
|
-
auto future = barrier->get_future();
|
|
184
|
-
drop_index(std::move(bucket_name), std::move(index_name), options, [barrier](auto ctx) { barrier->set_value(ctx); });
|
|
185
|
-
return future;
|
|
186
|
-
}
|
|
139
|
+
-> std::future<manager_error_context>;
|
|
187
140
|
/**
|
|
188
141
|
* Builds all currently deferred indexes.
|
|
189
142
|
*
|
|
@@ -198,20 +151,10 @@ class query_index_manager
|
|
|
198
151
|
*/
|
|
199
152
|
void build_deferred_indexes(std::string bucket_name,
|
|
200
153
|
const build_query_index_options& options,
|
|
201
|
-
build_deferred_query_indexes_handler&& handler) const
|
|
202
|
-
{
|
|
203
|
-
return core::impl::initiate_build_deferred_indexes(
|
|
204
|
-
core_, std::move(bucket_name), options.build(), std::forward<build_deferred_query_indexes_handler>(handler));
|
|
205
|
-
}
|
|
154
|
+
build_deferred_query_indexes_handler&& handler) const;
|
|
206
155
|
|
|
207
156
|
[[nodiscard]] auto build_deferred_indexes(std::string bucket_name, const build_query_index_options& options) const
|
|
208
|
-
-> std::future<manager_error_context
|
|
209
|
-
{
|
|
210
|
-
auto barrier = std::make_shared<std::promise<manager_error_context>>();
|
|
211
|
-
auto future = barrier->get_future();
|
|
212
|
-
build_deferred_indexes(std::move(bucket_name), options, [barrier](auto ctx) { barrier->set_value(std::move(ctx)); });
|
|
213
|
-
return future;
|
|
214
|
-
}
|
|
157
|
+
-> std::future<manager_error_context>;
|
|
215
158
|
|
|
216
159
|
/**
|
|
217
160
|
* Polls the state of a set of indexes, until they all are online.
|
|
@@ -227,21 +170,11 @@ class query_index_manager
|
|
|
227
170
|
void watch_indexes(std::string bucket_name,
|
|
228
171
|
std::vector<std::string> index_names,
|
|
229
172
|
const watch_query_indexes_options& options,
|
|
230
|
-
watch_query_indexes_handler&& handler)
|
|
231
|
-
{
|
|
232
|
-
return core::impl::initiate_watch_query_indexes(
|
|
233
|
-
core_, std::move(bucket_name), std::move(index_names), options.build(), std::move(handler));
|
|
234
|
-
}
|
|
173
|
+
watch_query_indexes_handler&& handler);
|
|
235
174
|
|
|
236
175
|
[[nodiscard]] auto watch_indexes(std::string bucket_name,
|
|
237
176
|
std::vector<std::string> index_names,
|
|
238
|
-
const watch_query_indexes_options& options)
|
|
239
|
-
{
|
|
240
|
-
auto barrier = std::make_shared<std::promise<manager_error_context>>();
|
|
241
|
-
auto future = barrier->get_future();
|
|
242
|
-
watch_indexes(std::move(bucket_name), std::move(index_names), options, [barrier](auto ctx) { barrier->set_value(ctx); });
|
|
243
|
-
return future;
|
|
244
|
-
}
|
|
177
|
+
const watch_query_indexes_options& options) -> std::future<manager_error_context>;
|
|
245
178
|
|
|
246
179
|
private:
|
|
247
180
|
friend class cluster;
|
|
@@ -51,6 +51,7 @@ struct query_options : public common_options<query_options> {
|
|
|
51
51
|
const bool readonly;
|
|
52
52
|
const bool flex_index;
|
|
53
53
|
const bool preserve_expiry;
|
|
54
|
+
std::optional<bool> use_replica;
|
|
54
55
|
std::optional<std::uint64_t> max_parallelism;
|
|
55
56
|
std::optional<std::uint64_t> scan_cap;
|
|
56
57
|
std::optional<std::chrono::milliseconds> scan_wait;
|
|
@@ -84,6 +85,7 @@ struct query_options : public common_options<query_options> {
|
|
|
84
85
|
readonly_,
|
|
85
86
|
flex_index_,
|
|
86
87
|
preserve_expiry_,
|
|
88
|
+
use_replica_,
|
|
87
89
|
max_parallelism_,
|
|
88
90
|
scan_cap_,
|
|
89
91
|
scan_wait_,
|
|
@@ -225,6 +227,21 @@ struct query_options : public common_options<query_options> {
|
|
|
225
227
|
return self();
|
|
226
228
|
}
|
|
227
229
|
|
|
230
|
+
/**
|
|
231
|
+
* Specifies that the query engine should use replica nodes for KV fetches if the active node is down.
|
|
232
|
+
*
|
|
233
|
+
* @param use_replica whether replica nodes should be used if the active node is down. If not provided, the server default will be used.
|
|
234
|
+
* @return the options builder for chaining purposes.
|
|
235
|
+
*
|
|
236
|
+
* @since 1.0.0
|
|
237
|
+
* @committed
|
|
238
|
+
*/
|
|
239
|
+
auto use_replica(bool use_replica) -> query_options&
|
|
240
|
+
{
|
|
241
|
+
use_replica_ = use_replica;
|
|
242
|
+
return self();
|
|
243
|
+
}
|
|
244
|
+
|
|
228
245
|
/**
|
|
229
246
|
* Allows overriding the default maximum parallelism for the query execution on the server side.
|
|
230
247
|
*
|
|
@@ -529,6 +546,7 @@ struct query_options : public common_options<query_options> {
|
|
|
529
546
|
bool readonly_{ false };
|
|
530
547
|
bool flex_index_{ false };
|
|
531
548
|
bool preserve_expiry_{ false };
|
|
549
|
+
std::optional<bool> use_replica_{};
|
|
532
550
|
std::optional<std::uint64_t> max_parallelism_{};
|
|
533
551
|
std::optional<std::uint64_t> scan_cap_{};
|
|
534
552
|
std::optional<std::uint64_t> pipeline_batch_{};
|
|
@@ -115,8 +115,8 @@ initiate_remove_operation(std::shared_ptr<couchbase::core::cluster> core,
|
|
|
115
115
|
std::string scope_name,
|
|
116
116
|
std::string collection_name,
|
|
117
117
|
std::string document_key,
|
|
118
|
-
remove_options::built options,
|
|
119
|
-
remove_handler&& handler);
|
|
118
|
+
couchbase::remove_options::built options,
|
|
119
|
+
couchbase::remove_handler&& handler);
|
|
120
120
|
#endif
|
|
121
121
|
} // namespace impl
|
|
122
122
|
} // namespace core
|
|
@@ -175,9 +175,9 @@ initiate_replace_operation(std::shared_ptr<couchbase::core::cluster> core,
|
|
|
175
175
|
std::string scope_name,
|
|
176
176
|
std::string collection_name,
|
|
177
177
|
std::string document_key,
|
|
178
|
-
codec::encoded_value encoded,
|
|
179
|
-
replace_options::built options,
|
|
180
|
-
replace_handler&& handler);
|
|
178
|
+
couchbase::codec::encoded_value encoded,
|
|
179
|
+
couchbase::replace_options::built options,
|
|
180
|
+
couchbase::replace_handler&& handler);
|
|
181
181
|
#endif
|
|
182
182
|
} // namespace impl
|
|
183
183
|
} // namespace core
|