couchbase 4.2.5 → 4.2.6-dev
Sign up to get free protection for your applications and to get access to all the features.
- package/deps/couchbase-cxx-client/CMakeLists.txt +9 -1
- package/deps/couchbase-cxx-client/bin/api.rb +234 -0
- package/deps/couchbase-cxx-client/bin/create-search-index +18 -135
- package/deps/couchbase-cxx-client/bin/init-cluster +17 -139
- package/deps/couchbase-cxx-client/bin/load-sample-buckets +54 -0
- package/deps/couchbase-cxx-client/core/cluster.hxx +33 -12
- package/deps/couchbase-cxx-client/core/cluster_options.hxx +3 -0
- package/deps/couchbase-cxx-client/core/crud_component.cxx +51 -22
- package/deps/couchbase-cxx-client/core/impl/build_deferred_query_indexes.cxx +115 -50
- package/deps/couchbase-cxx-client/core/impl/cluster.cxx +6 -0
- package/deps/couchbase-cxx-client/core/impl/create_bucket.cxx +155 -0
- package/deps/couchbase-cxx-client/core/impl/create_query_index.cxx +172 -59
- package/deps/couchbase-cxx-client/core/impl/dns_srv_tracker.cxx +2 -1
- package/deps/couchbase-cxx-client/core/impl/drop_bucket.cxx +66 -0
- package/deps/couchbase-cxx-client/core/impl/drop_query_index.cxx +138 -59
- package/deps/couchbase-cxx-client/core/impl/flush_bucket.cxx +66 -0
- package/deps/couchbase-cxx-client/core/impl/get_all_buckets.cxx +163 -0
- package/deps/couchbase-cxx-client/core/impl/get_all_query_indexes.cxx +67 -37
- package/deps/couchbase-cxx-client/core/impl/get_bucket.cxx +153 -0
- package/deps/couchbase-cxx-client/core/impl/internal_manager_error_context.cxx +113 -0
- package/deps/couchbase-cxx-client/core/impl/internal_manager_error_context.hxx +60 -0
- package/deps/couchbase-cxx-client/core/impl/key_value_error_category.cxx +2 -4
- package/deps/couchbase-cxx-client/core/impl/manager_error_context.cxx +100 -0
- package/deps/couchbase-cxx-client/core/impl/query.cxx +1 -0
- package/deps/couchbase-cxx-client/core/impl/update_bucket.cxx +130 -0
- package/deps/couchbase-cxx-client/core/impl/watch_query_indexes.cxx +53 -29
- package/deps/couchbase-cxx-client/core/io/dns_client.cxx +71 -38
- package/deps/couchbase-cxx-client/core/io/dns_config.cxx +5 -4
- package/deps/couchbase-cxx-client/core/io/mcbp_session.cxx +5 -6
- package/deps/couchbase-cxx-client/core/meta/features.hxx +6 -0
- package/deps/couchbase-cxx-client/core/operations/document_query.cxx +11 -0
- package/deps/couchbase-cxx-client/core/operations/document_query.hxx +1 -0
- package/deps/couchbase-cxx-client/core/origin.cxx +270 -0
- package/deps/couchbase-cxx-client/core/origin.hxx +2 -0
- package/deps/couchbase-cxx-client/core/protocol/status.cxx +2 -2
- package/deps/couchbase-cxx-client/core/range_scan_options.cxx +3 -27
- package/deps/couchbase-cxx-client/core/range_scan_options.hxx +13 -17
- package/deps/couchbase-cxx-client/core/range_scan_orchestrator.cxx +367 -170
- package/deps/couchbase-cxx-client/core/range_scan_orchestrator.hxx +13 -2
- package/deps/couchbase-cxx-client/core/range_scan_orchestrator_options.hxx +5 -3
- package/deps/couchbase-cxx-client/core/scan_options.hxx +0 -19
- package/deps/couchbase-cxx-client/core/scan_result.cxx +19 -5
- package/deps/couchbase-cxx-client/core/scan_result.hxx +5 -2
- package/deps/couchbase-cxx-client/core/timeout_defaults.hxx +2 -3
- package/deps/couchbase-cxx-client/core/topology/capabilities.hxx +1 -0
- package/deps/couchbase-cxx-client/core/topology/capabilities_fmt.hxx +2 -0
- package/deps/couchbase-cxx-client/core/topology/collections_manifest_fmt.hxx +1 -1
- package/deps/couchbase-cxx-client/core/topology/configuration.hxx +5 -0
- package/deps/couchbase-cxx-client/core/topology/configuration_json.hxx +2 -0
- package/deps/couchbase-cxx-client/core/utils/connection_string.cxx +4 -0
- package/deps/couchbase-cxx-client/couchbase/behavior_options.hxx +19 -2
- package/deps/couchbase-cxx-client/couchbase/bucket_manager.hxx +135 -0
- package/deps/couchbase-cxx-client/couchbase/build_query_index_options.hxx +0 -30
- package/deps/couchbase-cxx-client/couchbase/cluster.hxx +14 -0
- package/deps/couchbase-cxx-client/couchbase/collection_query_index_manager.hxx +7 -48
- package/deps/couchbase-cxx-client/couchbase/create_bucket_options.hxx +41 -0
- package/deps/couchbase-cxx-client/couchbase/create_primary_query_index_options.hxx +0 -29
- package/deps/couchbase-cxx-client/couchbase/create_query_index_options.hxx +0 -33
- package/deps/couchbase-cxx-client/couchbase/drop_bucket_options.hxx +41 -0
- package/deps/couchbase-cxx-client/couchbase/drop_primary_query_index_options.hxx +0 -30
- package/deps/couchbase-cxx-client/couchbase/drop_query_index_options.hxx +0 -31
- package/deps/couchbase-cxx-client/couchbase/error_codes.hxx +1 -2
- package/deps/couchbase-cxx-client/couchbase/flush_bucket_options.hxx +41 -0
- package/deps/couchbase-cxx-client/couchbase/get_all_buckets_options.hxx +44 -0
- package/deps/couchbase-cxx-client/couchbase/get_all_query_indexes_options.hxx +0 -30
- package/deps/couchbase-cxx-client/couchbase/get_bucket_options.hxx +43 -0
- package/deps/couchbase-cxx-client/couchbase/management/bucket_settings.hxx +116 -0
- package/deps/couchbase-cxx-client/couchbase/manager_error_context.hxx +29 -53
- package/deps/couchbase-cxx-client/couchbase/query_index_manager.hxx +16 -83
- package/deps/couchbase-cxx-client/couchbase/query_options.hxx +18 -0
- package/deps/couchbase-cxx-client/couchbase/security_options.hxx +15 -0
- package/deps/couchbase-cxx-client/couchbase/update_bucket_options.hxx +41 -0
- package/deps/couchbase-cxx-client/couchbase/watch_query_indexes_options.hxx +0 -31
- package/deps/couchbase-cxx-client/docs/cbc-analytics.md +1 -0
- package/deps/couchbase-cxx-client/docs/cbc-get.md +1 -0
- package/deps/couchbase-cxx-client/docs/cbc-pillowfight.md +1 -0
- package/deps/couchbase-cxx-client/docs/cbc-query.md +1 -0
- package/deps/couchbase-cxx-client/docs/cbc.md +10 -0
- package/deps/couchbase-cxx-client/test/CMakeLists.txt +1 -0
- package/deps/couchbase-cxx-client/test/test_integration_collections.cxx +6 -0
- package/deps/couchbase-cxx-client/test/test_integration_crud.cxx +5 -0
- package/deps/couchbase-cxx-client/test/test_integration_examples.cxx +137 -1
- package/deps/couchbase-cxx-client/test/test_integration_management.cxx +709 -266
- package/deps/couchbase-cxx-client/test/test_integration_query.cxx +19 -7
- package/deps/couchbase-cxx-client/test/test_integration_range_scan.cxx +351 -112
- package/deps/couchbase-cxx-client/test/test_integration_search.cxx +10 -1
- package/deps/couchbase-cxx-client/test/test_transaction_public_async_api.cxx +13 -12
- package/deps/couchbase-cxx-client/test/test_transaction_public_blocking_api.cxx +27 -21
- package/deps/couchbase-cxx-client/test/test_unit_query.cxx +75 -0
- package/deps/couchbase-cxx-client/test/utils/server_version.hxx +5 -0
- package/deps/couchbase-cxx-client/test/utils/wait_until.cxx +29 -10
- package/deps/couchbase-cxx-client/test/utils/wait_until.hxx +3 -1
- package/deps/couchbase-cxx-client/tools/utils.cxx +4 -1
- package/dist/binding.d.ts +21 -16
- package/dist/binding.js +1 -4
- package/dist/bindingutilities.d.ts +6 -1
- package/dist/bindingutilities.js +36 -1
- package/dist/collection.d.ts +65 -3
- package/dist/collection.js +107 -0
- package/dist/crudoptypes.d.ts +34 -0
- package/dist/crudoptypes.js +18 -1
- package/dist/queryexecutor.js +1 -0
- package/dist/querytypes.d.ts +7 -0
- package/dist/rangeScan.d.ts +107 -0
- package/dist/rangeScan.js +91 -0
- package/dist/streamablepromises.d.ts +6 -0
- package/dist/streamablepromises.js +25 -1
- package/package.json +12 -13
- package/src/addondata.hpp +1 -0
- package/src/binding.cpp +5 -2
- package/src/connection.cpp +108 -2
- package/src/connection.hpp +1 -0
- package/src/constants.cpp +2 -12
- package/src/jstocbpp_autogen.hpp +49 -22
- package/src/jstocbpp_basic.hpp +2 -8
- package/src/mutationtoken.cpp +13 -0
- package/src/scan_iterator.cpp +90 -0
- package/src/scan_iterator.hpp +30 -0
- package/tools/gen-bindings-json.py +9 -8
- package/deps/couchbase-cxx-client/core/impl/collection_query_index_manager.cxx +0 -93
@@ -0,0 +1,54 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
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
|
+
require "timeout"
|
18
|
+
require "set"
|
19
|
+
|
20
|
+
require_relative "api"
|
21
|
+
|
22
|
+
options = {
|
23
|
+
host: ENV.fetch("CB_HOST", ARGV[0] || "127.0.0.1"),
|
24
|
+
strict_encryption: ENV.fetch("CB_STRICT_ENCRYPTION", ARGV[1]).to_b,
|
25
|
+
username: ENV.fetch("CB_USERNAME", ARGV[2] || "Administrator"),
|
26
|
+
password: ENV.fetch("CB_PASSWORD", ARGV[3] || "password"),
|
27
|
+
verbose: ENV.fetch("CB_VERBOSE", true).to_b,
|
28
|
+
bucket: "travel-sample",
|
29
|
+
sample_buckets: Set.new,
|
30
|
+
}
|
31
|
+
options[:sample_buckets] << "beer-sample" if ENV.fetch("CB_BEER_SAMPLE", false).to_b
|
32
|
+
options[:sample_buckets] << "travel-sample" if ENV.fetch("CB_TRAVEL_SAMPLE", false).to_b
|
33
|
+
options[:sample_buckets] |= ARGV[4..-1]
|
34
|
+
return if options[:sample_buckets].empty?
|
35
|
+
|
36
|
+
p options: options
|
37
|
+
|
38
|
+
management_api =
|
39
|
+
begin
|
40
|
+
API.new(options.merge(port: options[:strict_encryption] ? 18091 : 8091))
|
41
|
+
rescue => ex
|
42
|
+
puts "#{ex}, sleep for 1 second and retry"
|
43
|
+
sleep(1)
|
44
|
+
retry
|
45
|
+
end
|
46
|
+
|
47
|
+
expected_counts = {
|
48
|
+
"travel-sample" => 30_000,
|
49
|
+
"beer-sample" => 7_000,
|
50
|
+
}
|
51
|
+
|
52
|
+
options[:sample_buckets].each do |bucket|
|
53
|
+
ensure_sample_bucket_loaded(management_api, expected_counts[bucket], options.merge(bucket: bucket))
|
54
|
+
end
|
@@ -79,6 +79,7 @@ class cluster : public std::enable_shared_from_this<cluster>
|
|
79
79
|
}
|
80
80
|
|
81
81
|
origin_ = std::move(origin);
|
82
|
+
CB_LOG_DEBUG(R"(open cluster, id: "{}", core version: "{}", {})", id_, couchbase::core::meta::sdk_semver(), origin_.to_json());
|
82
83
|
// ignore the enable_tracing flag if a tracer was passed in
|
83
84
|
if (nullptr != origin_.options().tracer) {
|
84
85
|
tracer_ = origin_.options().tracer;
|
@@ -111,10 +112,7 @@ class cluster : public std::enable_shared_from_this<cluster>
|
|
111
112
|
return self->dns_srv_tracker_->get_srv_nodes(
|
112
113
|
[self, hostname = std::move(hostname), handler = std::forward<Handler>(handler)](origin::node_list nodes,
|
113
114
|
std::error_code ec) mutable {
|
114
|
-
if (ec) {
|
115
|
-
return self->close([ec, handler = std::forward<Handler>(handler)]() mutable { handler(ec); });
|
116
|
-
}
|
117
|
-
if (!nodes.empty()) {
|
115
|
+
if (!ec && !nodes.empty()) {
|
118
116
|
self->origin_.set_nodes(std::move(nodes));
|
119
117
|
CB_LOG_INFO("replace list of bootstrap nodes with addresses from DNS SRV of \"{}\": [{}]",
|
120
118
|
hostname,
|
@@ -339,8 +337,8 @@ class cluster : public std::enable_shared_from_this<cluster>
|
|
339
337
|
void do_open(Handler&& handler)
|
340
338
|
{
|
341
339
|
// Warn users if they attempt to use Capella without TLS being enabled.
|
340
|
+
bool has_capella_host = false;
|
342
341
|
{
|
343
|
-
bool has_capella_host = false;
|
344
342
|
bool has_non_capella_host = false;
|
345
343
|
static std::string suffix = "cloud.couchbase.com";
|
346
344
|
for (const auto& node : origin_.get_hostnames()) {
|
@@ -359,6 +357,7 @@ class cluster : public std::enable_shared_from_this<cluster>
|
|
359
357
|
|
360
358
|
if (origin_.options().enable_tls /* TLS is enabled */
|
361
359
|
&& origin_.options().trust_certificate.empty() /* No CA certificate (or other SDK-specific trust source) is specified */
|
360
|
+
&& origin_.options().trust_certificate_value.empty() /* and certificate value has not been specified */
|
362
361
|
&& origin_.options().tls_verify != tls_verify_mode::none /* The user did not disable all TLS verification */
|
363
362
|
&& has_non_capella_host /* The connection string has a hostname that does NOT end in ".cloud.couchbase.com" */) {
|
364
363
|
CB_LOG_WARNING("[{}] When TLS is enabled, the cluster options must specify certificate(s) to trust or ensure that they are "
|
@@ -368,7 +367,17 @@ class cluster : public std::enable_shared_from_this<cluster>
|
|
368
367
|
}
|
369
368
|
|
370
369
|
if (origin_.options().enable_tls) {
|
371
|
-
|
370
|
+
long tls_options = asio::ssl::context::default_workarounds | // various bug workarounds that should be rather harmless
|
371
|
+
asio::ssl::context::no_sslv2 | // published: 1995, deprecated: 2011
|
372
|
+
asio::ssl::context::no_sslv3; // published: 1996, deprecated: 2015
|
373
|
+
if (origin_.options().tls_disable_deprecated_protocols) {
|
374
|
+
tls_options |= asio::ssl::context::no_tlsv1 | // published: 1999, deprecated: 2021
|
375
|
+
asio::ssl::context::no_tlsv1_1; // published: 2006, deprecated: 2021
|
376
|
+
}
|
377
|
+
if (origin_.options().tls_disable_v1_2 || has_capella_host) {
|
378
|
+
tls_options |= asio::ssl::context::no_tlsv1_2; // published: 2008, still in use
|
379
|
+
}
|
380
|
+
tls_.set_options(tls_options);
|
372
381
|
switch (origin_.options().tls_verify) {
|
373
382
|
case tls_verify_mode::none:
|
374
383
|
tls_.set_verify_mode(asio::ssl::verify_none);
|
@@ -378,7 +387,8 @@ class cluster : public std::enable_shared_from_this<cluster>
|
|
378
387
|
tls_.set_verify_mode(asio::ssl::verify_peer);
|
379
388
|
break;
|
380
389
|
}
|
381
|
-
if (origin_.options().trust_certificate.empty()
|
390
|
+
if (origin_.options().trust_certificate.empty() &&
|
391
|
+
origin_.options().trust_certificate_value.empty()) { // trust certificate is not explicitly specified
|
382
392
|
CB_LOG_DEBUG(R"([{}]: use default CA for TLS verify)", id_);
|
383
393
|
std::error_code ec{};
|
384
394
|
|
@@ -414,11 +424,22 @@ class cluster : public std::enable_shared_from_this<cluster>
|
|
414
424
|
std::error_code ec{};
|
415
425
|
// load only the explicit certificate
|
416
426
|
// system and default capella certificates are not loaded
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
427
|
+
if (!origin_.options().trust_certificate_value.empty()) {
|
428
|
+
CB_LOG_DEBUG(R"([{}]: use TLS certificate passed through via options object)", id_);
|
429
|
+
tls_.add_certificate_authority(asio::const_buffer(origin_.options().trust_certificate_value.data(),
|
430
|
+
origin_.options().trust_certificate_value.size()),
|
431
|
+
ec);
|
432
|
+
if (ec) {
|
433
|
+
CB_LOG_WARNING("[{}]: unable to load CA passed via options object: {}", id_, ec.message());
|
434
|
+
}
|
435
|
+
}
|
436
|
+
if (!origin_.options().trust_certificate.empty()) {
|
437
|
+
CB_LOG_DEBUG(R"([{}]: use TLS verify file: "{}")", id_, origin_.options().trust_certificate);
|
438
|
+
tls_.load_verify_file(origin_.options().trust_certificate, ec);
|
439
|
+
if (ec) {
|
440
|
+
CB_LOG_ERROR("[{}]: unable to load verify file \"{}\": {}", id_, origin_.options().trust_certificate, ec.message());
|
441
|
+
return close([ec, handler = std::forward<Handler>(handler)]() mutable { return handler(ec); });
|
442
|
+
}
|
422
443
|
}
|
423
444
|
}
|
424
445
|
#ifdef COUCHBASE_CXX_CLIENT_TLS_KEY_LOG_FILE
|
@@ -50,7 +50,10 @@ struct cluster_options {
|
|
50
50
|
std::chrono::milliseconds management_timeout = timeout_defaults::management_timeout;
|
51
51
|
|
52
52
|
bool enable_tls{ false };
|
53
|
+
bool tls_disable_deprecated_protocols{ true };
|
54
|
+
bool tls_disable_v1_2{ false };
|
53
55
|
std::string trust_certificate{};
|
56
|
+
std::string trust_certificate_value{};
|
54
57
|
bool enable_mutation_tokens{ true };
|
55
58
|
bool enable_tcp_keep_alive{ true };
|
56
59
|
io::ip_protocol use_ip_protocol{ io::ip_protocol::any };
|
@@ -1,6 +1,6 @@
|
|
1
1
|
/* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
|
2
2
|
/*
|
3
|
-
* Copyright 2020-
|
3
|
+
* Copyright 2020-2023 Couchbase, Inc.
|
4
4
|
*
|
5
5
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
6
6
|
* you may not use this file except in compliance with the License.
|
@@ -39,6 +39,8 @@
|
|
39
39
|
|
40
40
|
#include <tl/expected.hpp>
|
41
41
|
|
42
|
+
#include <random>
|
43
|
+
|
42
44
|
namespace couchbase::core
|
43
45
|
{
|
44
46
|
static std::pair<std::vector<std::byte>, std::error_code>
|
@@ -53,17 +55,40 @@ serialize_range_scan_create_options(const range_scan_create_options& options)
|
|
53
55
|
body["collection"] = fmt::format("{:x}", options.collection_id);
|
54
56
|
}
|
55
57
|
|
56
|
-
if (std::holds_alternative<range_scan>(options.scan_type)) {
|
57
|
-
const auto& range = std::
|
58
|
+
if (std::holds_alternative<range_scan>(options.scan_type) || std::holds_alternative<prefix_scan>(options.scan_type)) {
|
59
|
+
const auto& range = (std::holds_alternative<range_scan>(options.scan_type))
|
60
|
+
? std::get<range_scan>(options.scan_type)
|
61
|
+
: std::get<prefix_scan>(options.scan_type).to_range_scan();
|
62
|
+
|
63
|
+
const auto& from = range.from.value_or(scan_term{ "" });
|
64
|
+
const auto& to = range.to.value_or(scan_term{ "\xf4\x8f\xfb\xfb" });
|
65
|
+
|
58
66
|
body["range"] = {
|
59
|
-
{
|
60
|
-
{
|
67
|
+
{ from.exclusive ? "excl_start" : "start", base64::encode(from.term) },
|
68
|
+
{ to.exclusive ? "excl_end" : "end", base64::encode(to.term) },
|
61
69
|
};
|
62
70
|
} else if (std::holds_alternative<sampling_scan>(options.scan_type)) {
|
63
71
|
const auto& sampling = std::get<sampling_scan>(options.scan_type);
|
72
|
+
|
73
|
+
// The limit in sampling scan is required to be greater than 0
|
74
|
+
if (sampling.limit <= 0) {
|
75
|
+
return { {}, errc::common::invalid_argument };
|
76
|
+
}
|
77
|
+
|
78
|
+
std::uint64_t seed{};
|
79
|
+
if (sampling.seed.has_value()) {
|
80
|
+
seed = sampling.seed.value();
|
81
|
+
} else {
|
82
|
+
// Generate random uint64 as seed
|
83
|
+
std::random_device rd;
|
84
|
+
std::mt19937_64 gen(rd());
|
85
|
+
std::uniform_int_distribution<std::uint64_t> dis;
|
86
|
+
seed = dis(gen);
|
87
|
+
}
|
88
|
+
|
64
89
|
body["sampling"] = {
|
65
90
|
{ "samples", sampling.limit },
|
66
|
-
{ "seed",
|
91
|
+
{ "seed", seed },
|
67
92
|
};
|
68
93
|
} else {
|
69
94
|
return { {}, errc::common::invalid_argument };
|
@@ -75,7 +100,7 @@ serialize_range_scan_create_options(const range_scan_create_options& options)
|
|
75
100
|
{ "vb_uuid", std::to_string(snapshot.vbucket_uuid) },
|
76
101
|
{ "seqno", snapshot.sequence_number },
|
77
102
|
{ "timeout_ms",
|
78
|
-
(options.timeout == std::chrono::milliseconds::zero()) ? timeout_defaults::
|
103
|
+
(options.timeout == std::chrono::milliseconds::zero()) ? timeout_defaults::key_value_scan_timeout.count()
|
79
104
|
: options.timeout.count() },
|
80
105
|
};
|
81
106
|
if (snapshot.sequence_number_exists) {
|
@@ -98,7 +123,7 @@ parse_range_scan_keys(gsl::span<std::byte> data, range_scan_item_callback&& item
|
|
98
123
|
if (remaining.size() < key_length) {
|
99
124
|
return errc::network::protocol_error;
|
100
125
|
}
|
101
|
-
item_callback(range_scan_item{ { remaining.
|
126
|
+
item_callback(range_scan_item{ { reinterpret_cast<const char*>(remaining.data()), key_length } });
|
102
127
|
if (remaining.size() == key_length) {
|
103
128
|
return {};
|
104
129
|
}
|
@@ -130,13 +155,13 @@ parse_range_scan_documents(gsl::span<std::byte> data, range_scan_item_callback&&
|
|
130
155
|
body.datatype = data[24];
|
131
156
|
data = gsl::make_span(data.data() + header_offset, data.size() - header_offset);
|
132
157
|
|
133
|
-
std::
|
158
|
+
std::string key{};
|
134
159
|
{
|
135
160
|
auto [key_length, remaining] = utils::decode_unsigned_leb128<std::size_t>(data, core::utils::leb_128_no_throw{});
|
136
161
|
if (remaining.size() < key_length) {
|
137
162
|
return errc::network::protocol_error;
|
138
163
|
}
|
139
|
-
key = { remaining.
|
164
|
+
key = { reinterpret_cast<const char*>(remaining.data()), key_length };
|
140
165
|
data = gsl::make_span(remaining.data() + key_length, remaining.size() - key_length);
|
141
166
|
}
|
142
167
|
|
@@ -242,19 +267,10 @@ class crud_component_impl
|
|
242
267
|
if (error) {
|
243
268
|
return cb({}, error);
|
244
269
|
}
|
245
|
-
|
246
|
-
|
247
|
-
case 4:
|
248
|
-
ids_only = mcbp::big_endian::read_uint32(response->extras_, 0) == 0;
|
249
|
-
break;
|
250
|
-
|
251
|
-
case 0:
|
252
|
-
ids_only = options.ids_only; // support servers before MB-54267. TODO: remove after server GA
|
253
|
-
break;
|
254
|
-
|
255
|
-
default:
|
256
|
-
return cb({}, errc::network::protocol_error);
|
270
|
+
if (response->extras_.size() != 4) {
|
271
|
+
return cb({}, errc::network::protocol_error);
|
257
272
|
}
|
273
|
+
bool ids_only = mcbp::big_endian::read_uint32(response->extras_, 0) == 0;
|
258
274
|
|
259
275
|
if (auto ec = parse_range_scan_data(response->value_, std::move(item_cb), ids_only); ec) {
|
260
276
|
return cb({}, ec);
|
@@ -276,6 +292,19 @@ class crud_component_impl
|
|
276
292
|
|
277
293
|
req->persistent_ = true;
|
278
294
|
req->vbucket_ = vbucket_id;
|
295
|
+
|
296
|
+
if (options.timeout != std::chrono::milliseconds::zero()) {
|
297
|
+
auto timer = std::make_shared<asio::steady_timer>(io_);
|
298
|
+
timer->expires_after(options.timeout);
|
299
|
+
timer->async_wait([req](auto error) {
|
300
|
+
if (error == asio::error::operation_aborted) {
|
301
|
+
return;
|
302
|
+
}
|
303
|
+
req->cancel(couchbase::errc::common::unambiguous_timeout);
|
304
|
+
});
|
305
|
+
req->set_deadline(timer);
|
306
|
+
}
|
307
|
+
|
279
308
|
mcbp::buffer_writer buf{ scan_uuid.size() + sizeof(std::uint32_t) * 3 };
|
280
309
|
buf.write(scan_uuid);
|
281
310
|
buf.write_uint32(options.batch_item_limit);
|
@@ -20,44 +20,116 @@
|
|
20
20
|
|
21
21
|
#include "core/cluster.hxx"
|
22
22
|
#include "core/operations/management/query_index_build.hxx"
|
23
|
-
#include "core/operations/management/
|
24
|
-
#include "core/utils/json.hxx"
|
23
|
+
#include "core/operations/management/query_index_build_deferred.hxx"
|
25
24
|
|
26
|
-
namespace couchbase
|
25
|
+
namespace couchbase
|
27
26
|
{
|
28
27
|
template<typename Response>
|
29
28
|
static manager_error_context
|
30
29
|
build_context(Response& resp)
|
31
30
|
{
|
32
|
-
return { resp.ctx.ec,
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
31
|
+
return manager_error_context(internal_manager_error_context{ resp.ctx.ec,
|
32
|
+
resp.ctx.last_dispatched_to,
|
33
|
+
resp.ctx.last_dispatched_from,
|
34
|
+
resp.ctx.retry_attempts,
|
35
|
+
std::move(resp.ctx.retry_reasons),
|
36
|
+
std::move(resp.ctx.client_context_id),
|
37
|
+
resp.ctx.http_status,
|
38
|
+
std::move(resp.ctx.http_body),
|
39
|
+
std::move(resp.ctx.path) });
|
41
40
|
}
|
41
|
+
|
42
|
+
static core::operations::management::query_index_build_request
|
43
|
+
build_build_index_request(std::string bucket_name,
|
44
|
+
core::operations::management::query_index_get_all_deferred_response list_resp,
|
45
|
+
const build_query_index_options::built& options)
|
46
|
+
{
|
47
|
+
core::operations::management::query_index_build_request request{
|
48
|
+
std::move(bucket_name), {}, {}, {}, std::move(list_resp.index_names), {}, options.timeout
|
49
|
+
};
|
50
|
+
return request;
|
51
|
+
}
|
52
|
+
|
53
|
+
static core::operations::management::query_index_get_all_deferred_request
|
54
|
+
build_get_all_request(std::string bucket_name, const build_query_index_options::built& options)
|
55
|
+
{
|
56
|
+
core::operations::management::query_index_get_all_deferred_request request{ std::move(bucket_name), {}, {}, {}, {}, options.timeout };
|
57
|
+
return request;
|
58
|
+
}
|
59
|
+
|
60
|
+
static core::operations::management::query_index_build_request
|
61
|
+
build_build_index_request(std::string bucket_name,
|
62
|
+
std::string scope_name,
|
63
|
+
std::string collection_name,
|
64
|
+
core::operations::management::query_index_get_all_deferred_response list_resp,
|
65
|
+
const build_query_index_options::built& options)
|
66
|
+
{
|
67
|
+
core::operations::management::query_index_build_request request{ "",
|
68
|
+
"",
|
69
|
+
std::move(collection_name),
|
70
|
+
core::query_context{ std::move(bucket_name), std::move(scope_name) },
|
71
|
+
std::move(list_resp.index_names),
|
72
|
+
{},
|
73
|
+
options.timeout };
|
74
|
+
return request;
|
75
|
+
}
|
76
|
+
|
77
|
+
static core::operations::management::query_index_get_all_deferred_request
|
78
|
+
build_get_all_request(std::string bucket_name,
|
79
|
+
std::string scope_name,
|
80
|
+
std::string collection_name,
|
81
|
+
const build_query_index_options::built& options)
|
82
|
+
{
|
83
|
+
core::operations::management::query_index_get_all_deferred_request request{
|
84
|
+
"", "", std::move(collection_name), core::query_context{ std::move(bucket_name), std::move(scope_name) }, {}, options.timeout
|
85
|
+
};
|
86
|
+
return request;
|
87
|
+
}
|
88
|
+
|
42
89
|
void
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
90
|
+
query_index_manager::build_deferred_indexes(std::string bucket_name,
|
91
|
+
const couchbase::build_query_index_options& options,
|
92
|
+
couchbase::build_deferred_query_indexes_handler&& handler) const
|
93
|
+
{
|
94
|
+
|
95
|
+
auto get_all_request = build_get_all_request(bucket_name, options.build());
|
96
|
+
core_->execute(std::move(get_all_request),
|
97
|
+
[handler = std::move(handler), this, bucket_name, options](
|
98
|
+
core::operations::management::query_index_get_all_deferred_response resp1) mutable {
|
99
|
+
auto list_resp = std::move(resp1);
|
100
|
+
if (list_resp.ctx.ec) {
|
101
|
+
return handler(build_context(list_resp));
|
102
|
+
}
|
103
|
+
if (list_resp.index_names.empty()) {
|
104
|
+
return handler(build_context(list_resp));
|
105
|
+
}
|
106
|
+
auto build_request = build_build_index_request(std::move(bucket_name), list_resp, options.build());
|
107
|
+
core_->execute(
|
108
|
+
std::move(build_request),
|
109
|
+
[handler = std::move(handler)](core::operations::management::query_index_build_response resp2) mutable {
|
110
|
+
auto build_resp = std::move(resp2);
|
111
|
+
return handler(build_context(build_resp));
|
112
|
+
});
|
113
|
+
});
|
114
|
+
}
|
115
|
+
|
116
|
+
auto
|
117
|
+
query_index_manager::build_deferred_indexes(std::string bucket_name, const couchbase::build_query_index_options& options) const
|
118
|
+
-> std::future<manager_error_context>
|
49
119
|
{
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
120
|
+
auto barrier = std::make_shared<std::promise<manager_error_context>>();
|
121
|
+
build_deferred_indexes(std::move(bucket_name), options, [barrier](auto ctx) mutable { barrier->set_value(std::move(ctx)); });
|
122
|
+
return barrier->get_future();
|
123
|
+
}
|
124
|
+
|
125
|
+
void
|
126
|
+
collection_query_index_manager::build_deferred_indexes(const build_query_index_options& options,
|
127
|
+
build_deferred_query_indexes_handler&& handler) const
|
128
|
+
{
|
129
|
+
auto get_all_request = build_get_all_request(bucket_name_, scope_name_, collection_name_, options.build());
|
130
|
+
core_->execute(
|
131
|
+
std::move(get_all_request),
|
132
|
+
[handler = std::move(handler), this, options](core::operations::management::query_index_get_all_deferred_response resp1) mutable {
|
61
133
|
auto list_resp = std::move(resp1);
|
62
134
|
if (list_resp.ctx.ec) {
|
63
135
|
return handler(build_context(list_resp));
|
@@ -65,28 +137,21 @@ initiate_build_deferred_indexes(std::shared_ptr<couchbase::core::cluster> core,
|
|
65
137
|
if (list_resp.index_names.empty()) {
|
66
138
|
return handler(build_context(list_resp));
|
67
139
|
}
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
std::move(list_resp.index_names),
|
75
|
-
{},
|
76
|
-
options.timeout,
|
77
|
-
},
|
78
|
-
[handler = std::move(handler)](operations::management::query_index_build_response resp2) {
|
79
|
-
auto build_resp = std::move(resp2);
|
80
|
-
return handler(build_context(build_resp));
|
81
|
-
});
|
140
|
+
auto build_request = build_build_index_request(bucket_name_, scope_name_, collection_name_, list_resp, options.build());
|
141
|
+
core_->execute(std::move(build_request),
|
142
|
+
[handler = std::move(handler)](core::operations::management::query_index_build_response resp2) mutable {
|
143
|
+
auto build_resp = std::move(resp2);
|
144
|
+
return handler(build_context(build_resp));
|
145
|
+
});
|
82
146
|
});
|
83
147
|
}
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
build_deferred_query_indexes_handler&& handler)
|
148
|
+
|
149
|
+
auto
|
150
|
+
collection_query_index_manager::build_deferred_indexes(const couchbase::build_query_index_options& options) const
|
151
|
+
-> std::future<manager_error_context>
|
89
152
|
{
|
90
|
-
|
153
|
+
auto barrier = std::make_shared<std::promise<manager_error_context>>();
|
154
|
+
build_deferred_indexes(options, [barrier](auto ctx) mutable { barrier->set_value(std::move(ctx)); });
|
155
|
+
return barrier->get_future();
|
91
156
|
}
|
92
|
-
} // namespace couchbase
|
157
|
+
} // namespace couchbase
|
@@ -82,6 +82,9 @@ options_to_origin(const std::string& connection_string, const couchbase::cluster
|
|
82
82
|
if (opts.security.trust_certificate.has_value()) {
|
83
83
|
user_options.trust_certificate = opts.security.trust_certificate.value();
|
84
84
|
}
|
85
|
+
if (opts.security.trust_certificate_value.has_value()) {
|
86
|
+
user_options.trust_certificate_value = opts.security.trust_certificate_value.value();
|
87
|
+
}
|
85
88
|
switch (opts.security.tls_verify) {
|
86
89
|
case couchbase::tls_verify_mode::none:
|
87
90
|
user_options.tls_verify = core::tls_verify_mode::none;
|
@@ -91,6 +94,8 @@ options_to_origin(const std::string& connection_string, const couchbase::cluster
|
|
91
94
|
break;
|
92
95
|
}
|
93
96
|
user_options.disable_mozilla_ca_certificates = opts.security.disable_mozilla_ca_certificates;
|
97
|
+
user_options.tls_disable_deprecated_protocols = opts.security.disable_deprecated_protocols;
|
98
|
+
user_options.tls_disable_v1_2 = opts.security.disable_tls_v1_2;
|
94
99
|
}
|
95
100
|
|
96
101
|
if (opts.dns.nameserver) {
|
@@ -103,6 +108,7 @@ options_to_origin(const std::string& connection_string, const couchbase::cluster
|
|
103
108
|
user_options.enable_mutation_tokens = opts.behavior.enable_mutation_tokens;
|
104
109
|
user_options.enable_unordered_execution = opts.behavior.enable_unordered_execution;
|
105
110
|
user_options.user_agent_extra = opts.behavior.user_agent_extra;
|
111
|
+
user_options.network = opts.behavior.network;
|
106
112
|
|
107
113
|
user_options.enable_tcp_keep_alive = opts.network.enable_tcp_keep_alive;
|
108
114
|
user_options.tcp_keep_alive_interval = opts.network.tcp_keep_alive_interval;
|