couchbase 3.0.0.beta.1-universal-darwin-19 → 3.0.0-universal-darwin-19
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/.rubocop.yml +227 -0
- data/.rubocop_todo.yml +47 -0
- data/CONTRIBUTING.md +110 -0
- data/Gemfile +4 -0
- data/README.md +3 -3
- data/Rakefile +1 -1
- data/couchbase.gemspec +40 -39
- data/examples/analytics.rb +123 -108
- data/examples/auth.rb +33 -0
- data/examples/crud.rb +16 -2
- data/examples/managing_analytics_indexes.rb +18 -4
- data/examples/managing_buckets.rb +17 -3
- data/examples/managing_collections.rb +22 -9
- data/examples/managing_query_indexes.rb +38 -18
- data/examples/managing_search_indexes.rb +21 -6
- data/examples/managing_view_indexes.rb +18 -4
- data/examples/query.rb +17 -3
- data/examples/query_with_consistency.rb +30 -20
- data/examples/search.rb +116 -101
- data/examples/search_with_consistency.rb +43 -30
- data/examples/subdocument.rb +42 -30
- data/examples/view.rb +19 -10
- data/ext/CMakeLists.txt +40 -2
- data/ext/build_version.hxx.in +1 -1
- data/ext/couchbase/bucket.hxx +190 -38
- data/ext/couchbase/cluster.hxx +22 -4
- data/ext/couchbase/configuration.hxx +14 -14
- data/ext/couchbase/couchbase.cxx +108 -12
- data/ext/couchbase/error_map.hxx +202 -2
- data/ext/couchbase/errors.hxx +8 -2
- data/ext/couchbase/io/dns_client.hxx +6 -6
- data/ext/couchbase/io/http_command.hxx +2 -2
- data/ext/couchbase/io/http_session.hxx +7 -11
- data/ext/couchbase/io/http_session_manager.hxx +3 -3
- data/ext/couchbase/io/mcbp_command.hxx +101 -44
- data/ext/couchbase/io/mcbp_session.hxx +144 -49
- data/ext/couchbase/io/retry_action.hxx +30 -0
- data/ext/couchbase/io/retry_context.hxx +39 -0
- data/ext/couchbase/io/retry_orchestrator.hxx +96 -0
- data/ext/couchbase/io/retry_reason.hxx +235 -0
- data/ext/couchbase/io/retry_strategy.hxx +156 -0
- data/ext/couchbase/operations/document_decrement.hxx +2 -0
- data/ext/couchbase/operations/document_exists.hxx +2 -0
- data/ext/couchbase/operations/document_get.hxx +2 -0
- data/ext/couchbase/operations/document_get_and_lock.hxx +2 -0
- data/ext/couchbase/operations/document_get_and_touch.hxx +2 -0
- data/ext/couchbase/operations/document_get_projected.hxx +2 -0
- data/ext/couchbase/operations/document_increment.hxx +2 -0
- data/ext/couchbase/operations/document_insert.hxx +2 -0
- data/ext/couchbase/operations/document_lookup_in.hxx +2 -0
- data/ext/couchbase/operations/document_mutate_in.hxx +3 -0
- data/ext/couchbase/operations/document_query.hxx +10 -0
- data/ext/couchbase/operations/document_remove.hxx +2 -0
- data/ext/couchbase/operations/document_replace.hxx +2 -0
- data/ext/couchbase/operations/document_search.hxx +8 -3
- data/ext/couchbase/operations/document_touch.hxx +2 -0
- data/ext/couchbase/operations/document_unlock.hxx +2 -0
- data/ext/couchbase/operations/document_upsert.hxx +2 -0
- data/ext/couchbase/operations/query_index_create.hxx +14 -4
- data/ext/couchbase/operations/query_index_drop.hxx +12 -2
- data/ext/couchbase/operations/query_index_get_all.hxx +11 -2
- data/ext/couchbase/origin.hxx +47 -17
- data/ext/couchbase/platform/backtrace.c +189 -0
- data/ext/couchbase/platform/backtrace.h +54 -0
- data/ext/couchbase/platform/terminate_handler.cc +122 -0
- data/ext/couchbase/platform/terminate_handler.h +36 -0
- data/ext/couchbase/protocol/cmd_get_cluster_config.hxx +6 -1
- data/ext/couchbase/protocol/status.hxx +14 -4
- data/ext/couchbase/version.hxx +2 -2
- data/ext/extconf.rb +39 -36
- data/ext/test/main.cxx +64 -16
- data/lib/couchbase.rb +0 -1
- data/lib/couchbase/analytics_options.rb +2 -4
- data/lib/couchbase/authenticator.rb +14 -0
- data/lib/couchbase/binary_collection.rb +9 -9
- data/lib/couchbase/binary_collection_options.rb +8 -6
- data/lib/couchbase/bucket.rb +18 -18
- data/lib/couchbase/cluster.rb +121 -90
- data/lib/couchbase/collection.rb +36 -38
- data/lib/couchbase/collection_options.rb +31 -17
- data/lib/couchbase/common_options.rb +1 -1
- data/lib/couchbase/datastructures/couchbase_list.rb +16 -16
- data/lib/couchbase/datastructures/couchbase_map.rb +18 -18
- data/lib/couchbase/datastructures/couchbase_queue.rb +13 -13
- data/lib/couchbase/datastructures/couchbase_set.rb +8 -7
- data/lib/couchbase/errors.rb +10 -3
- data/lib/couchbase/json_transcoder.rb +2 -2
- data/lib/couchbase/libcouchbase.bundle +0 -0
- data/lib/couchbase/management/analytics_index_manager.rb +37 -37
- data/lib/couchbase/management/bucket_manager.rb +25 -25
- data/lib/couchbase/management/collection_manager.rb +3 -3
- data/lib/couchbase/management/query_index_manager.rb +59 -14
- data/lib/couchbase/management/search_index_manager.rb +15 -12
- data/lib/couchbase/management/user_manager.rb +1 -1
- data/lib/couchbase/management/view_index_manager.rb +11 -5
- data/lib/couchbase/mutation_state.rb +12 -0
- data/lib/couchbase/query_options.rb +23 -9
- data/lib/couchbase/scope.rb +61 -1
- data/lib/couchbase/search_options.rb +40 -27
- data/lib/couchbase/subdoc.rb +31 -28
- data/lib/couchbase/version.rb +2 -2
- data/lib/couchbase/view_options.rb +0 -1
- metadata +20 -7
@@ -19,6 +19,7 @@
|
|
19
19
|
|
20
20
|
#include <document_id.hxx>
|
21
21
|
#include <protocol/cmd_decrement.hxx>
|
22
|
+
#include <io/retry_context.hxx>
|
22
23
|
|
23
24
|
namespace couchbase::operations
|
24
25
|
{
|
@@ -45,6 +46,7 @@ struct decrement_request {
|
|
45
46
|
protocol::durability_level durability_level{ protocol::durability_level::none };
|
46
47
|
std::optional<std::uint16_t> durability_timeout{};
|
47
48
|
std::chrono::milliseconds timeout{ timeout_defaults::key_value_timeout };
|
49
|
+
io::retry_context<io::retry_strategy::best_effort> retries{ false };
|
48
50
|
|
49
51
|
void encode_to(encoded_request_type& encoded)
|
50
52
|
{
|
@@ -19,6 +19,7 @@
|
|
19
19
|
|
20
20
|
#include <document_id.hxx>
|
21
21
|
#include <protocol/cmd_exists.hxx>
|
22
|
+
#include <io/retry_context.hxx>
|
22
23
|
|
23
24
|
namespace couchbase::operations
|
24
25
|
{
|
@@ -42,6 +43,7 @@ struct exists_request {
|
|
42
43
|
std::uint16_t partition{};
|
43
44
|
std::uint32_t opaque{};
|
44
45
|
std::chrono::milliseconds timeout{ timeout_defaults::key_value_timeout };
|
46
|
+
io::retry_context<io::retry_strategy::best_effort> retries{ false };
|
45
47
|
|
46
48
|
void encode_to(encoded_request_type& encoded)
|
47
49
|
{
|
@@ -19,6 +19,7 @@
|
|
19
19
|
|
20
20
|
#include <document_id.hxx>
|
21
21
|
#include <protocol/cmd_get.hxx>
|
22
|
+
#include <io/retry_context.hxx>
|
22
23
|
|
23
24
|
namespace couchbase::operations
|
24
25
|
{
|
@@ -40,6 +41,7 @@ struct get_request {
|
|
40
41
|
uint16_t partition{};
|
41
42
|
uint32_t opaque{};
|
42
43
|
std::chrono::milliseconds timeout{ timeout_defaults::key_value_timeout };
|
44
|
+
io::retry_context<io::retry_strategy::best_effort> retries{ true };
|
43
45
|
|
44
46
|
void encode_to(encoded_request_type& encoded)
|
45
47
|
{
|
@@ -19,6 +19,7 @@
|
|
19
19
|
|
20
20
|
#include <document_id.hxx>
|
21
21
|
#include <protocol/cmd_get_and_lock.hxx>
|
22
|
+
#include <io/retry_context.hxx>
|
22
23
|
|
23
24
|
namespace couchbase::operations
|
24
25
|
{
|
@@ -41,6 +42,7 @@ struct get_and_lock_request {
|
|
41
42
|
uint32_t opaque{};
|
42
43
|
uint32_t lock_time{};
|
43
44
|
std::chrono::milliseconds timeout{ timeout_defaults::key_value_timeout };
|
45
|
+
io::retry_context<io::retry_strategy::best_effort> retries{ false };
|
44
46
|
|
45
47
|
void encode_to(encoded_request_type& encoded)
|
46
48
|
{
|
@@ -19,6 +19,7 @@
|
|
19
19
|
|
20
20
|
#include <document_id.hxx>
|
21
21
|
#include <protocol/cmd_get_and_touch.hxx>
|
22
|
+
#include <io/retry_context.hxx>
|
22
23
|
|
23
24
|
namespace couchbase::operations
|
24
25
|
{
|
@@ -41,6 +42,7 @@ struct get_and_touch_request {
|
|
41
42
|
uint32_t opaque{};
|
42
43
|
uint32_t expiry{};
|
43
44
|
std::chrono::milliseconds timeout{ timeout_defaults::key_value_timeout };
|
45
|
+
io::retry_context<io::retry_strategy::best_effort> retries{ false };
|
44
46
|
|
45
47
|
void encode_to(encoded_request_type& encoded)
|
46
48
|
{
|
@@ -19,6 +19,7 @@
|
|
19
19
|
|
20
20
|
#include <document_id.hxx>
|
21
21
|
#include <protocol/cmd_lookup_in.hxx>
|
22
|
+
#include <io/retry_context.hxx>
|
22
23
|
|
23
24
|
namespace couchbase::operations
|
24
25
|
{
|
@@ -45,6 +46,7 @@ struct get_projected_request {
|
|
45
46
|
std::vector<std::string> effective_projections{};
|
46
47
|
bool preserve_array_indexes{ false };
|
47
48
|
std::chrono::milliseconds timeout{ timeout_defaults::key_value_timeout };
|
49
|
+
io::retry_context<io::retry_strategy::best_effort> retries{ true };
|
48
50
|
|
49
51
|
void encode_to(encoded_request_type& encoded)
|
50
52
|
{
|
@@ -21,6 +21,7 @@
|
|
21
21
|
#include <protocol/durability_level.hxx>
|
22
22
|
#include <operations.hxx>
|
23
23
|
#include <protocol/client_response.hxx>
|
24
|
+
#include <io/retry_context.hxx>
|
24
25
|
|
25
26
|
namespace couchbase::operations
|
26
27
|
{
|
@@ -47,6 +48,7 @@ struct increment_request {
|
|
47
48
|
protocol::durability_level durability_level{ protocol::durability_level::none };
|
48
49
|
std::optional<std::uint16_t> durability_timeout{};
|
49
50
|
std::chrono::milliseconds timeout{ timeout_defaults::key_value_timeout };
|
51
|
+
io::retry_context<io::retry_strategy::best_effort> retries{ false };
|
50
52
|
|
51
53
|
void encode_to(encoded_request_type& encoded)
|
52
54
|
{
|
@@ -20,6 +20,7 @@
|
|
20
20
|
#include <document_id.hxx>
|
21
21
|
#include <protocol/cmd_insert.hxx>
|
22
22
|
#include <protocol/durability_level.hxx>
|
23
|
+
#include <io/retry_context.hxx>
|
23
24
|
|
24
25
|
namespace couchbase::operations
|
25
26
|
{
|
@@ -45,6 +46,7 @@ struct insert_request {
|
|
45
46
|
protocol::durability_level durability_level{ protocol::durability_level::none };
|
46
47
|
std::optional<std::uint16_t> durability_timeout{};
|
47
48
|
std::chrono::milliseconds timeout{ timeout_defaults::key_value_timeout };
|
49
|
+
io::retry_context<io::retry_strategy::best_effort> retries{ false };
|
48
50
|
|
49
51
|
void encode_to(encoded_request_type& encoded)
|
50
52
|
{
|
@@ -20,6 +20,7 @@
|
|
20
20
|
#include <gsl/gsl_assert>
|
21
21
|
#include <document_id.hxx>
|
22
22
|
#include <protocol/cmd_lookup_in.hxx>
|
23
|
+
#include <io/retry_context.hxx>
|
23
24
|
|
24
25
|
namespace couchbase::operations
|
25
26
|
{
|
@@ -50,6 +51,7 @@ struct lookup_in_request {
|
|
50
51
|
bool access_deleted{ false };
|
51
52
|
protocol::lookup_in_request_body::lookup_in_specs specs{};
|
52
53
|
std::chrono::milliseconds timeout{ timeout_defaults::key_value_timeout };
|
54
|
+
io::retry_context<io::retry_strategy::best_effort> retries{ false };
|
53
55
|
|
54
56
|
void encode_to(encoded_request_type& encoded)
|
55
57
|
{
|
@@ -25,6 +25,8 @@
|
|
25
25
|
#include <protocol/durability_level.hxx>
|
26
26
|
#include <protocol/client_request.hxx>
|
27
27
|
|
28
|
+
#include <io/retry_context.hxx>
|
29
|
+
|
28
30
|
#include <mutation_token.hxx>
|
29
31
|
#include <document_id.hxx>
|
30
32
|
#include <timeout_defaults.hxx>
|
@@ -67,6 +69,7 @@ struct mutate_in_request {
|
|
67
69
|
protocol::durability_level durability_level{ protocol::durability_level::none };
|
68
70
|
std::optional<std::uint16_t> durability_timeout{};
|
69
71
|
std::chrono::milliseconds timeout{ timeout_defaults::key_value_timeout };
|
72
|
+
io::retry_context<io::retry_strategy::best_effort> retries{ false };
|
70
73
|
|
71
74
|
void encode_to(encoded_request_type& encoded)
|
72
75
|
{
|
@@ -168,6 +168,9 @@ struct query_request {
|
|
168
168
|
std::optional<scan_consistency_type> scan_consistency{};
|
169
169
|
std::vector<mutation_token> mutation_state{};
|
170
170
|
std::chrono::milliseconds timeout{ timeout_defaults::query_timeout };
|
171
|
+
std::optional<std::string> bucket_name{};
|
172
|
+
std::optional<std::string> scope_name{};
|
173
|
+
std::optional<std::string> scope_qualifier{};
|
171
174
|
|
172
175
|
enum class profile_mode {
|
173
176
|
off,
|
@@ -255,6 +258,13 @@ struct query_request {
|
|
255
258
|
if (check_scan_wait && scan_wait) {
|
256
259
|
body["scan_wait"] = fmt::format("{}ms", scan_wait.value());
|
257
260
|
}
|
261
|
+
if (scope_qualifier) {
|
262
|
+
body["query_context"] = scope_qualifier;
|
263
|
+
} else if (scope_name) {
|
264
|
+
if (bucket_name) {
|
265
|
+
body["query_context"] = fmt::format("`{}`.{}", *bucket_name, *scope_name);
|
266
|
+
}
|
267
|
+
}
|
258
268
|
for (auto& param : raw) {
|
259
269
|
body[param.first] = param.second;
|
260
270
|
}
|
@@ -19,6 +19,7 @@
|
|
19
19
|
|
20
20
|
#include <document_id.hxx>
|
21
21
|
#include <protocol/cmd_remove.hxx>
|
22
|
+
#include <io/retry_context.hxx>
|
22
23
|
|
23
24
|
namespace couchbase::operations
|
24
25
|
{
|
@@ -41,6 +42,7 @@ struct remove_request {
|
|
41
42
|
protocol::durability_level durability_level{ protocol::durability_level::none };
|
42
43
|
std::optional<std::uint16_t> durability_timeout{};
|
43
44
|
std::chrono::milliseconds timeout{ timeout_defaults::key_value_timeout };
|
45
|
+
io::retry_context<io::retry_strategy::best_effort> retries{ false };
|
44
46
|
|
45
47
|
void encode_to(encoded_request_type& encoded)
|
46
48
|
{
|
@@ -20,6 +20,7 @@
|
|
20
20
|
#include <document_id.hxx>
|
21
21
|
#include <protocol/cmd_replace.hxx>
|
22
22
|
#include <protocol/durability_level.hxx>
|
23
|
+
#include <io/retry_context.hxx>
|
23
24
|
|
24
25
|
namespace couchbase::operations
|
25
26
|
{
|
@@ -46,6 +47,7 @@ struct replace_request {
|
|
46
47
|
protocol::durability_level durability_level{ protocol::durability_level::none };
|
47
48
|
std::optional<std::uint16_t> durability_timeout{};
|
48
49
|
std::chrono::milliseconds timeout{ timeout_defaults::key_value_timeout };
|
50
|
+
io::retry_context<io::retry_strategy::best_effort> retries{ false };
|
49
51
|
|
50
52
|
void encode_to(encoded_request_type& encoded)
|
51
53
|
{
|
@@ -231,7 +231,7 @@ make_response(std::error_code ec, search_request& request, search_request::encod
|
|
231
231
|
search_response::search_row row{};
|
232
232
|
row.index = entry.at("index").get_string();
|
233
233
|
row.id = entry.at("id").get_string();
|
234
|
-
row.score = entry.at("score").
|
234
|
+
row.score = entry.at("score").as<double>();
|
235
235
|
const auto* locations = entry.find("locations");
|
236
236
|
if (locations != nullptr && locations->is_object()) {
|
237
237
|
for (const auto& field : locations->get_object()) {
|
@@ -306,7 +306,7 @@ make_response(std::error_code ec, search_request& request, search_request::encod
|
|
306
306
|
const auto* min = numeric_range.find("min");
|
307
307
|
if (min != nullptr) {
|
308
308
|
if (min->is_double()) {
|
309
|
-
nrf.min = min->
|
309
|
+
nrf.min = min->as<double>();
|
310
310
|
} else if (min->is_integer()) {
|
311
311
|
nrf.min = min->get_unsigned();
|
312
312
|
}
|
@@ -314,7 +314,7 @@ make_response(std::error_code ec, search_request& request, search_request::encod
|
|
314
314
|
const auto* max = numeric_range.find("max");
|
315
315
|
if (max != nullptr) {
|
316
316
|
if (max->is_double()) {
|
317
|
-
nrf.max = max->
|
317
|
+
nrf.max = max->as<double>();
|
318
318
|
} else if (max->is_integer()) {
|
319
319
|
nrf.max = max->get_unsigned();
|
320
320
|
}
|
@@ -346,6 +346,11 @@ make_response(std::error_code ec, search_request& request, search_request::encod
|
|
346
346
|
response.ec = std::make_error_code(error::common_errc::index_not_found);
|
347
347
|
return response;
|
348
348
|
}
|
349
|
+
if (response.error.find("no planPIndexes for indexName") != std::string::npos ||
|
350
|
+
response.error.find("pindex_consistency mismatched partition") != std::string::npos) {
|
351
|
+
response.ec = std::make_error_code(error::search_errc::index_not_ready);
|
352
|
+
return response;
|
353
|
+
}
|
349
354
|
}
|
350
355
|
response.ec = std::make_error_code(error::common_errc::internal_server_failure);
|
351
356
|
}
|
@@ -19,6 +19,7 @@
|
|
19
19
|
|
20
20
|
#include <document_id.hxx>
|
21
21
|
#include <protocol/cmd_touch.hxx>
|
22
|
+
#include <io/retry_context.hxx>
|
22
23
|
|
23
24
|
namespace couchbase::operations
|
24
25
|
{
|
@@ -39,6 +40,7 @@ struct touch_request {
|
|
39
40
|
std::uint32_t opaque{};
|
40
41
|
std::uint32_t expiry{};
|
41
42
|
std::chrono::milliseconds timeout{ timeout_defaults::key_value_timeout };
|
43
|
+
io::retry_context<io::retry_strategy::best_effort> retries{ false };
|
42
44
|
|
43
45
|
void encode_to(encoded_request_type& encoded)
|
44
46
|
{
|
@@ -19,6 +19,7 @@
|
|
19
19
|
|
20
20
|
#include <document_id.hxx>
|
21
21
|
#include <protocol/cmd_unlock.hxx>
|
22
|
+
#include <io/retry_context.hxx>
|
22
23
|
|
23
24
|
namespace couchbase::operations
|
24
25
|
{
|
@@ -39,6 +40,7 @@ struct unlock_request {
|
|
39
40
|
uint32_t opaque{};
|
40
41
|
uint64_t cas{};
|
41
42
|
std::chrono::milliseconds timeout{ timeout_defaults::key_value_timeout };
|
43
|
+
io::retry_context<io::retry_strategy::best_effort> retries{ false };
|
42
44
|
|
43
45
|
void encode_to(encoded_request_type& encoded)
|
44
46
|
{
|
@@ -20,6 +20,7 @@
|
|
20
20
|
#include <document_id.hxx>
|
21
21
|
#include <protocol/cmd_upsert.hxx>
|
22
22
|
#include <protocol/durability_level.hxx>
|
23
|
+
#include <io/retry_context.hxx>
|
23
24
|
|
24
25
|
namespace couchbase::operations
|
25
26
|
{
|
@@ -45,6 +46,7 @@ struct upsert_request {
|
|
45
46
|
protocol::durability_level durability_level{ protocol::durability_level::none };
|
46
47
|
std::optional<std::uint16_t> durability_timeout{};
|
47
48
|
std::chrono::milliseconds timeout{ timeout_defaults::key_value_timeout };
|
49
|
+
io::retry_context<io::retry_strategy::best_effort> retries{ false };
|
48
50
|
|
49
51
|
void encode_to(encoded_request_type& encoded)
|
50
52
|
{
|
@@ -42,7 +42,10 @@ struct query_index_create_request {
|
|
42
42
|
static const inline service_type type = service_type::query;
|
43
43
|
|
44
44
|
std::string client_context_id{ uuid::to_string(uuid::random()) };
|
45
|
+
static constexpr auto namespace_id = "default";
|
45
46
|
std::string bucket_name;
|
47
|
+
std::string scope_name;
|
48
|
+
std::string collection_name;
|
46
49
|
std::string index_name{};
|
47
50
|
std::vector<std::string> fields;
|
48
51
|
bool is_primary{ false };
|
@@ -70,14 +73,21 @@ struct query_index_create_request {
|
|
70
73
|
if (with) {
|
71
74
|
with_clause = fmt::format("WITH {}", tao::json::to_string(with));
|
72
75
|
}
|
76
|
+
std::string keyspace = fmt::format("{}:`{}`", namespace_id, bucket_name);
|
77
|
+
if (!scope_name.empty()) {
|
78
|
+
keyspace += ".`" + scope_name + "`";
|
79
|
+
}
|
80
|
+
if (!collection_name.empty()) {
|
81
|
+
keyspace += ".`" + collection_name + "`";
|
82
|
+
}
|
73
83
|
tao::json::value body{ { "statement",
|
74
|
-
is_primary ? fmt::format(R"(CREATE PRIMARY INDEX {} ON
|
84
|
+
is_primary ? fmt::format(R"(CREATE PRIMARY INDEX {} ON {} USING GSI {})",
|
75
85
|
index_name.empty() ? "" : fmt::format("`{}`", index_name),
|
76
|
-
|
86
|
+
keyspace,
|
77
87
|
with_clause)
|
78
|
-
: fmt::format(R"(CREATE INDEX `{}` ON
|
88
|
+
: fmt::format(R"(CREATE INDEX `{}` ON {}({}) {} USING GSI {})",
|
79
89
|
index_name,
|
80
|
-
|
90
|
+
keyspace,
|
81
91
|
fmt::join(fields, ", "),
|
82
92
|
where_clause,
|
83
93
|
with_clause) },
|
@@ -42,7 +42,10 @@ struct query_index_drop_request {
|
|
42
42
|
static const inline service_type type = service_type::query;
|
43
43
|
|
44
44
|
std::string client_context_id{ uuid::to_string(uuid::random()) };
|
45
|
+
static constexpr auto namespace_id = "default";
|
45
46
|
std::string bucket_name;
|
47
|
+
std::string scope_name;
|
48
|
+
std::string collection_name;
|
46
49
|
std::string index_name;
|
47
50
|
bool is_primary{ false };
|
48
51
|
bool ignore_if_does_not_exist{ false };
|
@@ -51,9 +54,16 @@ struct query_index_drop_request {
|
|
51
54
|
void encode_to(encoded_request_type& encoded)
|
52
55
|
{
|
53
56
|
encoded.headers["content-type"] = "application/json";
|
57
|
+
std::string keyspace = fmt::format("`{}`", bucket_name);
|
58
|
+
if (!scope_name.empty()) {
|
59
|
+
keyspace += ".`" + scope_name + "`";
|
60
|
+
}
|
61
|
+
if (!collection_name.empty()) {
|
62
|
+
keyspace += ".`" + collection_name + "`";
|
63
|
+
}
|
54
64
|
tao::json::value body{ { "statement",
|
55
|
-
is_primary ? fmt::format(R"(DROP PRIMARY INDEX ON
|
56
|
-
: fmt::format(R"(DROP INDEX
|
65
|
+
is_primary ? fmt::format(R"(DROP PRIMARY INDEX ON {} USING GSI)", keyspace)
|
66
|
+
: fmt::format(R"(DROP INDEX {}.`{}` USING GSI)", keyspace, index_name) },
|
57
67
|
{ "client_context_id", client_context_id } };
|
58
68
|
encoded.method = "POST";
|
59
69
|
encoded.path = "/query/service";
|
@@ -32,9 +32,12 @@ struct query_index_get_all_response {
|
|
32
32
|
std::string datastore_id;
|
33
33
|
std::string keyspace_id;
|
34
34
|
std::string namespace_id;
|
35
|
+
std::string collection_name;
|
35
36
|
std::string type;
|
36
37
|
std::vector<std::string> index_key{};
|
37
38
|
std::optional<std::string> condition{};
|
39
|
+
std::optional<std::string> bucket_id{};
|
40
|
+
std::optional<std::string> scope_id{};
|
38
41
|
};
|
39
42
|
std::string client_context_id;
|
40
43
|
std::error_code ec;
|
@@ -59,8 +62,8 @@ struct query_index_get_all_request {
|
|
59
62
|
tao::json::value body{
|
60
63
|
{ "statement",
|
61
64
|
fmt::format(
|
62
|
-
R"(SELECT idx.* FROM system:indexes AS idx WHERE keyspace_id = "{}" AND `using`="gsi" ORDER BY is_primary DESC, name ASC)",
|
63
|
-
bucket_name) },
|
65
|
+
R"(SELECT idx.* FROM system:indexes AS idx WHERE ((keyspace_id = "{}" AND bucket_id IS MISSING) OR (bucket_id = "{}")) AND `using`="gsi" ORDER BY is_primary DESC, name ASC)",
|
66
|
+
bucket_name, bucket_name) },
|
64
67
|
{ "client_context_id", client_context_id }
|
65
68
|
};
|
66
69
|
encoded.method = "POST";
|
@@ -87,6 +90,12 @@ make_response(std::error_code ec, query_index_get_all_request& request, query_in
|
|
87
90
|
index.type = entry.at("using").get_string();
|
88
91
|
index.name = entry.at("name").get_string();
|
89
92
|
index.state = entry.at("state").get_string();
|
93
|
+
if (const auto* prop = entry.find("bucket_id")) {
|
94
|
+
index.bucket_id = prop->get_string();
|
95
|
+
}
|
96
|
+
if (const auto* prop = entry.find("scope_id")) {
|
97
|
+
index.scope_id = prop->get_string();
|
98
|
+
}
|
90
99
|
if (const auto* prop = entry.find("is_primary")) {
|
91
100
|
index.is_primary = prop->get_boolean();
|
92
101
|
}
|
data/ext/couchbase/origin.hxx
CHANGED
@@ -23,6 +23,18 @@
|
|
23
23
|
|
24
24
|
namespace couchbase
|
25
25
|
{
|
26
|
+
struct cluster_credentials {
|
27
|
+
std::string username;
|
28
|
+
std::string password;
|
29
|
+
std::string certificate_path;
|
30
|
+
std::string key_path;
|
31
|
+
|
32
|
+
[[nodiscard]] bool uses_certificate() const
|
33
|
+
{
|
34
|
+
return !certificate_path.empty();
|
35
|
+
}
|
36
|
+
};
|
37
|
+
|
26
38
|
struct origin {
|
27
39
|
using node_entry = std::pair<std::string, std::string>;
|
28
40
|
using node_list = std::vector<node_entry>;
|
@@ -33,26 +45,31 @@ struct origin {
|
|
33
45
|
|
34
46
|
origin(const origin& other)
|
35
47
|
: options_(other.options_)
|
36
|
-
,
|
37
|
-
, password_(other.password_)
|
48
|
+
, credentials_(std::move(other.credentials_))
|
38
49
|
, nodes_(other.nodes_)
|
39
50
|
, next_node_(nodes_.begin())
|
40
51
|
{
|
41
52
|
}
|
42
53
|
|
43
|
-
origin(
|
54
|
+
origin(cluster_credentials auth, const std::string& hostname, std::uint16_t port, const cluster_options& options)
|
44
55
|
: options_(options)
|
45
|
-
,
|
46
|
-
, password_(std::move(password))
|
56
|
+
, credentials_(std::move(auth))
|
47
57
|
, nodes_{ { hostname, std::to_string(port) } }
|
48
58
|
, next_node_(nodes_.begin())
|
49
59
|
{
|
50
60
|
}
|
51
61
|
|
52
|
-
origin(std::string
|
62
|
+
origin(cluster_credentials auth, const std::string& hostname, const std::string& port, const cluster_options& options)
|
63
|
+
: options_(options)
|
64
|
+
, credentials_(std::move(auth))
|
65
|
+
, nodes_{ { hostname, port } }
|
66
|
+
, next_node_(nodes_.begin())
|
67
|
+
{
|
68
|
+
}
|
69
|
+
|
70
|
+
origin(cluster_credentials auth, const utils::connection_string& connstr)
|
53
71
|
: options_(connstr.options)
|
54
|
-
,
|
55
|
-
, password_(std::move(password))
|
72
|
+
, credentials_(std::move(auth))
|
56
73
|
{
|
57
74
|
nodes_.reserve(connstr.bootstrap_nodes.size());
|
58
75
|
for (const auto& node : connstr.bootstrap_nodes) {
|
@@ -66,8 +83,7 @@ struct origin {
|
|
66
83
|
{
|
67
84
|
if (this != &other) {
|
68
85
|
options_ = other.options_;
|
69
|
-
|
70
|
-
password_ = other.password_;
|
86
|
+
credentials_ = other.credentials_;
|
71
87
|
nodes_ = other.nodes_;
|
72
88
|
next_node_ = nodes_.begin();
|
73
89
|
exhausted_ = false;
|
@@ -75,21 +91,31 @@ struct origin {
|
|
75
91
|
return *this;
|
76
92
|
}
|
77
93
|
|
78
|
-
[[nodiscard]] const std::string&
|
94
|
+
[[nodiscard]] const std::string& username() const
|
79
95
|
{
|
80
|
-
return
|
96
|
+
return credentials_.username;
|
81
97
|
}
|
82
98
|
|
83
|
-
[[nodiscard]] const std::string&
|
99
|
+
[[nodiscard]] const std::string& password() const
|
84
100
|
{
|
85
|
-
return
|
101
|
+
return credentials_.password;
|
102
|
+
}
|
103
|
+
|
104
|
+
[[nodiscard]] const std::string& certificate_path() const
|
105
|
+
{
|
106
|
+
return credentials_.certificate_path;
|
107
|
+
}
|
108
|
+
|
109
|
+
[[nodiscard]] const std::string& key_path() const
|
110
|
+
{
|
111
|
+
return credentials_.key_path;
|
86
112
|
}
|
87
113
|
|
88
114
|
[[nodiscard]] std::vector<std::string> get_nodes() const
|
89
115
|
{
|
90
116
|
std::vector<std::string> res;
|
91
117
|
res.reserve(nodes_.size());
|
92
|
-
for (const auto
|
118
|
+
for (const auto& node : nodes_) {
|
93
119
|
res.emplace_back(fmt::format("\"{}:{}\"", node.first, node.second));
|
94
120
|
}
|
95
121
|
return res;
|
@@ -136,10 +162,14 @@ struct origin {
|
|
136
162
|
return options_;
|
137
163
|
}
|
138
164
|
|
165
|
+
[[nodiscard]] const couchbase::cluster_credentials& credentials() const
|
166
|
+
{
|
167
|
+
return credentials_;
|
168
|
+
}
|
169
|
+
|
139
170
|
private:
|
140
171
|
couchbase::cluster_options options_{};
|
141
|
-
|
142
|
-
std::string password_{};
|
172
|
+
cluster_credentials credentials_{};
|
143
173
|
node_list nodes_{};
|
144
174
|
node_list::iterator next_node_{};
|
145
175
|
bool exhausted_{ false };
|