couchbase 3.0.1 → 3.0.2
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 +73 -4
- data/ext/build_config.hxx.in +2 -0
- data/ext/build_version.hxx.in +11 -8
- data/ext/cmake/BuildTracing.cmake +1 -1
- data/ext/cmake/CompilerWarnings.cmake +5 -0
- data/ext/cmake/Testing.cmake +3 -6
- data/ext/couchbase/bucket.hxx +9 -1
- data/ext/couchbase/cbsasl/client.h +1 -1
- data/ext/couchbase/cluster.hxx +89 -6
- data/ext/couchbase/configuration.hxx +2 -0
- data/ext/couchbase/couchbase.cxx +1647 -507
- data/ext/couchbase/diagnostics.hxx +0 -3
- data/ext/couchbase/io/dns_client.hxx +2 -2
- data/ext/couchbase/io/http_command.hxx +6 -3
- data/ext/couchbase/io/http_session.hxx +14 -18
- data/ext/couchbase/io/http_session_manager.hxx +83 -2
- data/ext/couchbase/io/mcbp_command.hxx +4 -1
- data/ext/couchbase/io/mcbp_context.hxx +37 -0
- data/ext/couchbase/io/mcbp_session.hxx +91 -30
- data/ext/couchbase/operations.hxx +5 -0
- data/ext/couchbase/operations/analytics_dataset_create.hxx +3 -2
- data/ext/couchbase/operations/analytics_dataset_drop.hxx +3 -2
- data/ext/couchbase/operations/analytics_dataset_get_all.hxx +3 -2
- data/ext/couchbase/operations/analytics_dataverse_create.hxx +3 -2
- data/ext/couchbase/operations/analytics_dataverse_drop.hxx +3 -2
- data/ext/couchbase/operations/analytics_get_pending_mutations.hxx +3 -2
- data/ext/couchbase/operations/analytics_index_create.hxx +3 -2
- data/ext/couchbase/operations/analytics_index_drop.hxx +3 -2
- data/ext/couchbase/operations/analytics_index_get_all.hxx +5 -2
- data/ext/couchbase/operations/analytics_link_connect.hxx +3 -2
- data/ext/couchbase/operations/analytics_link_disconnect.hxx +3 -2
- data/ext/couchbase/operations/bucket_create.hxx +3 -2
- data/ext/couchbase/operations/bucket_drop.hxx +3 -2
- data/ext/couchbase/operations/bucket_flush.hxx +3 -2
- data/ext/couchbase/operations/bucket_get.hxx +3 -2
- data/ext/couchbase/operations/bucket_get_all.hxx +3 -2
- data/ext/couchbase/operations/bucket_update.hxx +3 -2
- data/ext/couchbase/operations/cluster_developer_preview_enable.hxx +3 -2
- data/ext/couchbase/operations/collection_create.hxx +3 -2
- data/ext/couchbase/operations/collection_drop.hxx +3 -2
- data/ext/couchbase/operations/collections_manifest_get.hxx +3 -2
- data/ext/couchbase/operations/document_analytics.hxx +3 -2
- data/ext/couchbase/operations/document_append.hxx +77 -0
- data/ext/couchbase/operations/document_decrement.hxx +3 -2
- data/ext/couchbase/operations/document_exists.hxx +3 -2
- data/ext/couchbase/operations/document_get.hxx +3 -2
- data/ext/couchbase/operations/document_get_and_lock.hxx +3 -2
- data/ext/couchbase/operations/document_get_and_touch.hxx +3 -2
- data/ext/couchbase/operations/document_get_projected.hxx +3 -2
- data/ext/couchbase/operations/document_increment.hxx +3 -2
- data/ext/couchbase/operations/document_insert.hxx +3 -2
- data/ext/couchbase/operations/document_lookup_in.hxx +8 -2
- data/ext/couchbase/operations/document_mutate_in.hxx +13 -2
- data/ext/couchbase/operations/document_prepend.hxx +77 -0
- data/ext/couchbase/operations/document_query.hxx +3 -2
- data/ext/couchbase/operations/document_remove.hxx +5 -2
- data/ext/couchbase/operations/document_replace.hxx +3 -2
- data/ext/couchbase/operations/document_search.hxx +3 -2
- data/ext/couchbase/operations/document_touch.hxx +3 -2
- data/ext/couchbase/operations/document_unlock.hxx +3 -2
- data/ext/couchbase/operations/document_upsert.hxx +3 -2
- data/ext/couchbase/operations/document_view.hxx +3 -2
- data/ext/couchbase/operations/group_drop.hxx +3 -2
- data/ext/couchbase/operations/group_get.hxx +3 -2
- data/ext/couchbase/operations/group_get_all.hxx +3 -2
- data/ext/couchbase/operations/group_upsert.hxx +3 -2
- data/ext/couchbase/operations/http_noop.hxx +78 -0
- data/ext/couchbase/operations/mcbp_noop.hxx +61 -0
- data/ext/couchbase/operations/query_index_build_deferred.hxx +3 -2
- data/ext/couchbase/operations/query_index_create.hxx +3 -2
- data/ext/couchbase/operations/query_index_drop.hxx +3 -2
- data/ext/couchbase/operations/query_index_get_all.hxx +3 -2
- data/ext/couchbase/operations/role_get_all.hxx +3 -2
- data/ext/couchbase/operations/scope_create.hxx +3 -2
- data/ext/couchbase/operations/scope_drop.hxx +3 -2
- data/ext/couchbase/operations/scope_get_all.hxx +3 -2
- data/ext/couchbase/operations/search_get_stats.hxx +3 -2
- data/ext/couchbase/operations/search_index_analyze_document.hxx +3 -2
- data/ext/couchbase/operations/search_index_control_ingest.hxx +3 -2
- data/ext/couchbase/operations/search_index_control_plan_freeze.hxx +3 -2
- data/ext/couchbase/operations/search_index_control_query.hxx +3 -2
- data/ext/couchbase/operations/search_index_drop.hxx +3 -2
- data/ext/couchbase/operations/search_index_get.hxx +3 -2
- data/ext/couchbase/operations/search_index_get_all.hxx +3 -2
- data/ext/couchbase/operations/search_index_get_documents_count.hxx +3 -2
- data/ext/couchbase/operations/search_index_get_stats.hxx +3 -2
- data/ext/couchbase/operations/search_index_upsert.hxx +3 -2
- data/ext/couchbase/operations/user_drop.hxx +3 -2
- data/ext/couchbase/operations/user_get.hxx +3 -2
- data/ext/couchbase/operations/user_get_all.hxx +3 -2
- data/ext/couchbase/operations/user_upsert.hxx +3 -2
- data/ext/couchbase/operations/view_index_drop.hxx +3 -2
- data/ext/couchbase/operations/view_index_get.hxx +3 -2
- data/ext/couchbase/operations/view_index_get_all.hxx +3 -2
- data/ext/couchbase/operations/view_index_upsert.hxx +3 -2
- data/ext/couchbase/platform/terminate_handler.cc +5 -2
- data/ext/couchbase/protocol/client_opcode.hxx +368 -0
- data/ext/couchbase/protocol/cmd_append.hxx +145 -0
- data/ext/couchbase/protocol/cmd_hello.hxx +1 -0
- data/ext/couchbase/protocol/cmd_lookup_in.hxx +11 -3
- data/ext/couchbase/protocol/cmd_mutate_in.hxx +46 -4
- data/ext/couchbase/protocol/cmd_noop.hxx +82 -0
- data/ext/couchbase/protocol/cmd_prepend.hxx +145 -0
- data/ext/couchbase/protocol/durability_level.hxx +16 -0
- data/ext/couchbase/protocol/hello_feature.hxx +9 -0
- data/ext/couchbase/protocol/unsigned_leb128.h +2 -2
- data/ext/couchbase/service_type.hxx +1 -1
- data/ext/couchbase/version.hxx +18 -4
- data/ext/extconf.rb +9 -6
- data/ext/test/CMakeLists.txt +5 -0
- data/ext/test/test_helper.hxx +3 -3
- data/ext/test/test_helper_native.hxx +2 -5
- data/ext/test/test_native_binary_operations.cxx +186 -0
- data/ext/test/test_native_diagnostics.cxx +54 -3
- data/ext/test/test_ruby_trivial_crud.cxx +1 -1
- data/lib/couchbase.rb +1 -0
- data/lib/couchbase/analytics_options.rb +1 -71
- data/lib/couchbase/binary_collection.rb +60 -22
- data/lib/couchbase/binary_collection_options.rb +0 -76
- data/lib/couchbase/bucket.rb +40 -36
- data/lib/couchbase/cluster.rb +89 -156
- data/lib/couchbase/collection.rb +290 -72
- data/lib/couchbase/collection_options.rb +30 -243
- data/lib/couchbase/datastructures/couchbase_list.rb +5 -16
- data/lib/couchbase/datastructures/couchbase_map.rb +5 -16
- data/lib/couchbase/datastructures/couchbase_queue.rb +5 -16
- data/lib/couchbase/datastructures/couchbase_set.rb +5 -16
- data/lib/couchbase/diagnostics.rb +181 -0
- data/lib/couchbase/json_transcoder.rb +1 -1
- data/lib/couchbase/{common_options.rb → logger.rb} +24 -11
- data/lib/couchbase/management/query_index_manager.rb +1 -1
- data/lib/couchbase/management/user_manager.rb +3 -0
- data/lib/couchbase/options.rb +2094 -0
- data/lib/couchbase/query_options.rb +1 -144
- data/lib/couchbase/scope.rb +8 -25
- data/lib/couchbase/search_options.rb +0 -93
- data/lib/couchbase/version.rb +20 -1
- data/lib/couchbase/view_options.rb +1 -91
- metadata +19 -7
|
@@ -45,15 +45,16 @@ struct collection_drop_request {
|
|
|
45
45
|
std::chrono::milliseconds timeout{ timeout_defaults::management_timeout };
|
|
46
46
|
std::string client_context_id{ uuid::to_string(uuid::random()) };
|
|
47
47
|
|
|
48
|
-
|
|
48
|
+
[[nodiscard]] std::error_code encode_to(encoded_request_type& encoded, http_context&)
|
|
49
49
|
{
|
|
50
50
|
encoded.method = "DELETE";
|
|
51
51
|
encoded.path = fmt::format("/pools/default/buckets/{}/collections/{}/{}", bucket_name, scope_name, collection_name);
|
|
52
|
+
return {};
|
|
52
53
|
}
|
|
53
54
|
};
|
|
54
55
|
|
|
55
56
|
collection_drop_response
|
|
56
|
-
make_response(std::error_code ec, collection_drop_request& request, collection_drop_request::encoded_response_type encoded)
|
|
57
|
+
make_response(std::error_code ec, collection_drop_request& request, collection_drop_request::encoded_response_type&& encoded)
|
|
57
58
|
{
|
|
58
59
|
collection_drop_response response{ request.client_context_id, ec };
|
|
59
60
|
if (!ec) {
|
|
@@ -47,16 +47,17 @@ struct collections_manifest_get_request {
|
|
|
47
47
|
std::chrono::milliseconds timeout{ timeout_defaults::key_value_timeout };
|
|
48
48
|
io::retry_context<io::retry_strategy::best_effort> retries{ true };
|
|
49
49
|
|
|
50
|
-
|
|
50
|
+
[[nodiscard]] std::error_code encode_to(encoded_request_type& encoded, mcbp_context&&)
|
|
51
51
|
{
|
|
52
52
|
encoded.opaque(opaque);
|
|
53
|
+
return {};
|
|
53
54
|
}
|
|
54
55
|
};
|
|
55
56
|
|
|
56
57
|
collections_manifest_get_response
|
|
57
58
|
make_response(std::error_code ec,
|
|
58
59
|
collections_manifest_get_request& request,
|
|
59
|
-
collections_manifest_get_request::encoded_response_type encoded)
|
|
60
|
+
collections_manifest_get_request::encoded_response_type&& encoded)
|
|
60
61
|
{
|
|
61
62
|
collections_manifest_get_response response{ request.id, encoded.opaque(), ec };
|
|
62
63
|
if (ec && response.opaque == 0) {
|
|
@@ -166,7 +166,7 @@ struct analytics_request {
|
|
|
166
166
|
std::vector<tao::json::value> positional_parameters{};
|
|
167
167
|
std::map<std::string, tao::json::value> named_parameters{};
|
|
168
168
|
|
|
169
|
-
|
|
169
|
+
[[nodiscard]] std::error_code encode_to(encoded_request_type& encoded, http_context& context)
|
|
170
170
|
{
|
|
171
171
|
tao::json::value body{ { "statement", statement },
|
|
172
172
|
{ "client_context_id", client_context_id },
|
|
@@ -212,11 +212,12 @@ struct analytics_request {
|
|
|
212
212
|
} else {
|
|
213
213
|
spdlog::debug("ANALYTICS: {}", tao::json::to_string(body["statement"]));
|
|
214
214
|
}
|
|
215
|
+
return {};
|
|
215
216
|
}
|
|
216
217
|
};
|
|
217
218
|
|
|
218
219
|
analytics_response
|
|
219
|
-
make_response(std::error_code ec, analytics_request& request, analytics_request::encoded_response_type encoded)
|
|
220
|
+
make_response(std::error_code ec, analytics_request& request, analytics_request::encoded_response_type&& encoded)
|
|
220
221
|
{
|
|
221
222
|
analytics_response response{ request.client_context_id, ec };
|
|
222
223
|
if (!ec) {
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
|
|
2
|
+
/*
|
|
3
|
+
* Copyright 2020 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 <protocol/cmd_append.hxx>
|
|
21
|
+
#include <protocol/durability_level.hxx>
|
|
22
|
+
#include <io/retry_context.hxx>
|
|
23
|
+
|
|
24
|
+
namespace couchbase::operations
|
|
25
|
+
{
|
|
26
|
+
|
|
27
|
+
struct append_response {
|
|
28
|
+
document_id id;
|
|
29
|
+
std::uint32_t opaque;
|
|
30
|
+
std::error_code ec{};
|
|
31
|
+
std::uint64_t cas{};
|
|
32
|
+
mutation_token token{};
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
struct append_request {
|
|
36
|
+
using encoded_request_type = protocol::client_request<protocol::append_request_body>;
|
|
37
|
+
using encoded_response_type = protocol::client_response<protocol::append_response_body>;
|
|
38
|
+
|
|
39
|
+
document_id id;
|
|
40
|
+
std::string value;
|
|
41
|
+
uint16_t partition{};
|
|
42
|
+
uint32_t opaque{};
|
|
43
|
+
protocol::durability_level durability_level{ protocol::durability_level::none };
|
|
44
|
+
std::optional<std::uint16_t> durability_timeout{};
|
|
45
|
+
std::chrono::milliseconds timeout{ timeout_defaults::key_value_timeout };
|
|
46
|
+
io::retry_context<io::retry_strategy::best_effort> retries{ false };
|
|
47
|
+
|
|
48
|
+
[[nodiscard]] std::error_code encode_to(encoded_request_type& encoded, mcbp_context&&)
|
|
49
|
+
{
|
|
50
|
+
encoded.opaque(opaque);
|
|
51
|
+
encoded.partition(partition);
|
|
52
|
+
encoded.body().id(id);
|
|
53
|
+
encoded.body().content(value);
|
|
54
|
+
if (durability_level != protocol::durability_level::none) {
|
|
55
|
+
encoded.body().durability(durability_level, durability_timeout);
|
|
56
|
+
}
|
|
57
|
+
return {};
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
append_response
|
|
62
|
+
make_response(std::error_code ec, append_request& request, append_request::encoded_response_type&& encoded)
|
|
63
|
+
{
|
|
64
|
+
append_response response{ request.id, encoded.opaque(), ec };
|
|
65
|
+
if (ec && response.opaque == 0) {
|
|
66
|
+
response.opaque = request.opaque;
|
|
67
|
+
}
|
|
68
|
+
if (!ec) {
|
|
69
|
+
response.cas = encoded.cas();
|
|
70
|
+
response.token = encoded.body().token();
|
|
71
|
+
response.token.partition_id = request.partition;
|
|
72
|
+
response.token.bucket_name = response.id.bucket;
|
|
73
|
+
}
|
|
74
|
+
return response;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
} // namespace couchbase::operations
|
|
@@ -48,7 +48,7 @@ struct decrement_request {
|
|
|
48
48
|
std::chrono::milliseconds timeout{ timeout_defaults::key_value_timeout };
|
|
49
49
|
io::retry_context<io::retry_strategy::best_effort> retries{ false };
|
|
50
50
|
|
|
51
|
-
|
|
51
|
+
[[nodiscard]] std::error_code encode_to(encoded_request_type& encoded, mcbp_context&&)
|
|
52
52
|
{
|
|
53
53
|
encoded.opaque(opaque);
|
|
54
54
|
encoded.partition(partition);
|
|
@@ -64,11 +64,12 @@ struct decrement_request {
|
|
|
64
64
|
if (durability_level != protocol::durability_level::none) {
|
|
65
65
|
encoded.body().durability(durability_level, durability_timeout);
|
|
66
66
|
}
|
|
67
|
+
return {};
|
|
67
68
|
}
|
|
68
69
|
};
|
|
69
70
|
|
|
70
71
|
decrement_response
|
|
71
|
-
make_response(std::error_code ec, decrement_request& request, decrement_request::encoded_response_type encoded)
|
|
72
|
+
make_response(std::error_code ec, decrement_request& request, decrement_request::encoded_response_type&& encoded)
|
|
72
73
|
{
|
|
73
74
|
decrement_response response{ request.id, encoded.opaque(), ec };
|
|
74
75
|
if (ec && response.opaque == 0) {
|
|
@@ -45,15 +45,16 @@ struct exists_request {
|
|
|
45
45
|
std::chrono::milliseconds timeout{ timeout_defaults::key_value_timeout };
|
|
46
46
|
io::retry_context<io::retry_strategy::best_effort> retries{ false };
|
|
47
47
|
|
|
48
|
-
|
|
48
|
+
[[nodiscard]] std::error_code encode_to(encoded_request_type& encoded, mcbp_context&&)
|
|
49
49
|
{
|
|
50
50
|
encoded.opaque(opaque);
|
|
51
51
|
encoded.body().id(partition, id);
|
|
52
|
+
return {};
|
|
52
53
|
}
|
|
53
54
|
};
|
|
54
55
|
|
|
55
56
|
exists_response
|
|
56
|
-
make_response(std::error_code ec, exists_request& request, exists_request::encoded_response_type encoded)
|
|
57
|
+
make_response(std::error_code ec, exists_request& request, exists_request::encoded_response_type&& encoded)
|
|
57
58
|
{
|
|
58
59
|
exists_response response{ request.id, encoded.opaque(), ec, request.partition };
|
|
59
60
|
if (!ec) {
|
|
@@ -43,16 +43,17 @@ struct get_request {
|
|
|
43
43
|
std::chrono::milliseconds timeout{ timeout_defaults::key_value_timeout };
|
|
44
44
|
io::retry_context<io::retry_strategy::best_effort> retries{ true };
|
|
45
45
|
|
|
46
|
-
|
|
46
|
+
[[nodiscard]] std::error_code encode_to(encoded_request_type& encoded, mcbp_context&&)
|
|
47
47
|
{
|
|
48
48
|
encoded.opaque(opaque);
|
|
49
49
|
encoded.partition(partition);
|
|
50
50
|
encoded.body().id(id);
|
|
51
|
+
return {};
|
|
51
52
|
}
|
|
52
53
|
};
|
|
53
54
|
|
|
54
55
|
get_response
|
|
55
|
-
make_response(std::error_code ec, get_request& request, get_request::encoded_response_type encoded)
|
|
56
|
+
make_response(std::error_code ec, get_request& request, get_request::encoded_response_type&& encoded)
|
|
56
57
|
{
|
|
57
58
|
get_response response{ request.id, encoded.opaque(), ec };
|
|
58
59
|
if (ec && response.opaque == 0) {
|
|
@@ -44,17 +44,18 @@ struct get_and_lock_request {
|
|
|
44
44
|
std::chrono::milliseconds timeout{ timeout_defaults::key_value_timeout };
|
|
45
45
|
io::retry_context<io::retry_strategy::best_effort> retries{ false };
|
|
46
46
|
|
|
47
|
-
|
|
47
|
+
[[nodiscard]] std::error_code encode_to(encoded_request_type& encoded, mcbp_context&&)
|
|
48
48
|
{
|
|
49
49
|
encoded.opaque(opaque);
|
|
50
50
|
encoded.partition(partition);
|
|
51
51
|
encoded.body().id(id);
|
|
52
52
|
encoded.body().lock_time(lock_time);
|
|
53
|
+
return {};
|
|
53
54
|
}
|
|
54
55
|
};
|
|
55
56
|
|
|
56
57
|
get_and_lock_response
|
|
57
|
-
make_response(std::error_code ec, get_and_lock_request& request, get_and_lock_request::encoded_response_type encoded)
|
|
58
|
+
make_response(std::error_code ec, get_and_lock_request& request, get_and_lock_request::encoded_response_type&& encoded)
|
|
58
59
|
{
|
|
59
60
|
get_and_lock_response response{ request.id, encoded.opaque(), ec };
|
|
60
61
|
if (ec && response.opaque == 0) {
|
|
@@ -44,17 +44,18 @@ struct get_and_touch_request {
|
|
|
44
44
|
std::chrono::milliseconds timeout{ timeout_defaults::key_value_timeout };
|
|
45
45
|
io::retry_context<io::retry_strategy::best_effort> retries{ false };
|
|
46
46
|
|
|
47
|
-
|
|
47
|
+
[[nodiscard]] std::error_code encode_to(encoded_request_type& encoded, mcbp_context&&)
|
|
48
48
|
{
|
|
49
49
|
encoded.opaque(opaque);
|
|
50
50
|
encoded.partition(partition);
|
|
51
51
|
encoded.body().id(id);
|
|
52
52
|
encoded.body().expiry(expiry);
|
|
53
|
+
return {};
|
|
53
54
|
}
|
|
54
55
|
};
|
|
55
56
|
|
|
56
57
|
get_and_touch_response
|
|
57
|
-
make_response(std::error_code ec, get_and_touch_request& request, get_and_touch_request::encoded_response_type encoded)
|
|
58
|
+
make_response(std::error_code ec, get_and_touch_request& request, get_and_touch_request::encoded_response_type&& encoded)
|
|
58
59
|
{
|
|
59
60
|
get_and_touch_response response{ request.id, encoded.opaque(), ec };
|
|
60
61
|
if (ec && response.opaque == 0) {
|
|
@@ -48,7 +48,7 @@ struct get_projected_request {
|
|
|
48
48
|
std::chrono::milliseconds timeout{ timeout_defaults::key_value_timeout };
|
|
49
49
|
io::retry_context<io::retry_strategy::best_effort> retries{ true };
|
|
50
50
|
|
|
51
|
-
|
|
51
|
+
[[nodiscard]] std::error_code encode_to(encoded_request_type& encoded, mcbp_context&&)
|
|
52
52
|
{
|
|
53
53
|
encoded.opaque(opaque);
|
|
54
54
|
encoded.partition(partition);
|
|
@@ -76,6 +76,7 @@ struct get_projected_request {
|
|
|
76
76
|
}
|
|
77
77
|
}
|
|
78
78
|
encoded.body().specs(specs);
|
|
79
|
+
return {};
|
|
79
80
|
}
|
|
80
81
|
};
|
|
81
82
|
|
|
@@ -197,7 +198,7 @@ subdoc_apply_projection(tao::json::value& root, const std::string& path, tao::js
|
|
|
197
198
|
} // namespace priv
|
|
198
199
|
|
|
199
200
|
get_projected_response
|
|
200
|
-
make_response(std::error_code ec, get_projected_request& request, get_projected_request::encoded_response_type encoded)
|
|
201
|
+
make_response(std::error_code ec, get_projected_request& request, get_projected_request::encoded_response_type&& encoded)
|
|
201
202
|
{
|
|
202
203
|
get_projected_response response{ request.id, encoded.opaque(), ec };
|
|
203
204
|
if (ec && response.opaque == 0) {
|
|
@@ -50,7 +50,7 @@ struct increment_request {
|
|
|
50
50
|
std::chrono::milliseconds timeout{ timeout_defaults::key_value_timeout };
|
|
51
51
|
io::retry_context<io::retry_strategy::best_effort> retries{ false };
|
|
52
52
|
|
|
53
|
-
|
|
53
|
+
[[nodiscard]] std::error_code encode_to(encoded_request_type& encoded, mcbp_context&&)
|
|
54
54
|
{
|
|
55
55
|
encoded.opaque(opaque);
|
|
56
56
|
encoded.partition(partition);
|
|
@@ -66,11 +66,12 @@ struct increment_request {
|
|
|
66
66
|
if (durability_level != protocol::durability_level::none) {
|
|
67
67
|
encoded.body().durability(durability_level, durability_timeout);
|
|
68
68
|
}
|
|
69
|
+
return {};
|
|
69
70
|
}
|
|
70
71
|
};
|
|
71
72
|
|
|
72
73
|
increment_response
|
|
73
|
-
make_response(std::error_code ec, increment_request& request, increment_request::encoded_response_type encoded)
|
|
74
|
+
make_response(std::error_code ec, increment_request& request, increment_request::encoded_response_type&& encoded)
|
|
74
75
|
{
|
|
75
76
|
increment_response response{ request.id, encoded.opaque(), ec };
|
|
76
77
|
if (ec && response.opaque == 0) {
|
|
@@ -48,7 +48,7 @@ struct insert_request {
|
|
|
48
48
|
std::chrono::milliseconds timeout{ timeout_defaults::key_value_timeout };
|
|
49
49
|
io::retry_context<io::retry_strategy::best_effort> retries{ false };
|
|
50
50
|
|
|
51
|
-
|
|
51
|
+
[[nodiscard]] std::error_code encode_to(encoded_request_type& encoded, mcbp_context&&)
|
|
52
52
|
{
|
|
53
53
|
encoded.opaque(opaque);
|
|
54
54
|
encoded.partition(partition);
|
|
@@ -59,11 +59,12 @@ struct insert_request {
|
|
|
59
59
|
if (durability_level != protocol::durability_level::none) {
|
|
60
60
|
encoded.body().durability(durability_level, durability_timeout);
|
|
61
61
|
}
|
|
62
|
+
return {};
|
|
62
63
|
}
|
|
63
64
|
};
|
|
64
65
|
|
|
65
66
|
insert_response
|
|
66
|
-
make_response(std::error_code ec, insert_request& request, insert_request::encoded_response_type encoded)
|
|
67
|
+
make_response(std::error_code ec, insert_request& request, insert_request::encoded_response_type&& encoded)
|
|
67
68
|
{
|
|
68
69
|
insert_response response{ request.id, encoded.opaque(), ec };
|
|
69
70
|
if (ec && response.opaque == 0) {
|
|
@@ -39,6 +39,7 @@ struct lookup_in_response {
|
|
|
39
39
|
std::error_code ec{};
|
|
40
40
|
std::uint64_t cas{};
|
|
41
41
|
std::vector<field> fields{};
|
|
42
|
+
bool deleted{ false };
|
|
42
43
|
};
|
|
43
44
|
|
|
44
45
|
struct lookup_in_request {
|
|
@@ -53,7 +54,7 @@ struct lookup_in_request {
|
|
|
53
54
|
std::chrono::milliseconds timeout{ timeout_defaults::key_value_timeout };
|
|
54
55
|
io::retry_context<io::retry_strategy::best_effort> retries{ false };
|
|
55
56
|
|
|
56
|
-
|
|
57
|
+
[[nodiscard]] std::error_code encode_to(encoded_request_type& encoded, mcbp_context&&)
|
|
57
58
|
{
|
|
58
59
|
for (std::size_t i = 0; i < specs.entries.size(); ++i) {
|
|
59
60
|
auto& entry = specs.entries[i];
|
|
@@ -72,16 +73,21 @@ struct lookup_in_request {
|
|
|
72
73
|
encoded.body().id(id);
|
|
73
74
|
encoded.body().access_deleted(access_deleted);
|
|
74
75
|
encoded.body().specs(specs);
|
|
76
|
+
return {};
|
|
75
77
|
}
|
|
76
78
|
};
|
|
77
79
|
|
|
78
80
|
lookup_in_response
|
|
79
|
-
make_response(std::error_code ec, lookup_in_request& request, lookup_in_request::encoded_response_type encoded)
|
|
81
|
+
make_response(std::error_code ec, lookup_in_request& request, lookup_in_request::encoded_response_type&& encoded)
|
|
80
82
|
{
|
|
81
83
|
lookup_in_response response{ request.id, encoded.opaque(), ec };
|
|
82
84
|
if (ec && response.opaque == 0) {
|
|
83
85
|
response.opaque = request.opaque;
|
|
84
86
|
}
|
|
87
|
+
if (encoded.status() == protocol::status::subdoc_success_deleted ||
|
|
88
|
+
encoded.status() == protocol::status::subdoc_multi_path_failure_deleted) {
|
|
89
|
+
response.deleted = true;
|
|
90
|
+
}
|
|
85
91
|
if (!ec) {
|
|
86
92
|
response.cas = encoded.cas();
|
|
87
93
|
response.fields.resize(request.specs.entries.size());
|
|
@@ -50,6 +50,7 @@ struct mutate_in_response {
|
|
|
50
50
|
mutation_token token{};
|
|
51
51
|
std::vector<field> fields{};
|
|
52
52
|
std::optional<std::size_t> first_error_index{};
|
|
53
|
+
bool deleted{ false };
|
|
53
54
|
};
|
|
54
55
|
|
|
55
56
|
struct mutate_in_request {
|
|
@@ -61,6 +62,7 @@ struct mutate_in_request {
|
|
|
61
62
|
uint32_t opaque{};
|
|
62
63
|
uint64_t cas{ 0 };
|
|
63
64
|
bool access_deleted{ false };
|
|
65
|
+
bool create_as_deleted{ false };
|
|
64
66
|
std::optional<std::uint32_t> expiry{};
|
|
65
67
|
protocol::mutate_in_request_body::store_semantics_type store_semantics{
|
|
66
68
|
protocol::mutate_in_request_body::store_semantics_type::replace
|
|
@@ -71,8 +73,11 @@ struct mutate_in_request {
|
|
|
71
73
|
std::chrono::milliseconds timeout{ timeout_defaults::key_value_timeout };
|
|
72
74
|
io::retry_context<io::retry_strategy::best_effort> retries{ false };
|
|
73
75
|
|
|
74
|
-
|
|
76
|
+
[[nodiscard]] std::error_code encode_to(encoded_request_type& encoded, mcbp_context&& ctx)
|
|
75
77
|
{
|
|
78
|
+
if (create_as_deleted && !ctx.supports_feature(protocol::hello_feature::subdoc_create_as_deleted)) {
|
|
79
|
+
return std::make_error_code(error::common_errc::unsupported_operation);
|
|
80
|
+
}
|
|
76
81
|
for (std::size_t i = 0; i < specs.entries.size(); ++i) {
|
|
77
82
|
auto& entry = specs.entries[i];
|
|
78
83
|
entry.original_index = i;
|
|
@@ -93,21 +98,27 @@ struct mutate_in_request {
|
|
|
93
98
|
encoded.body().expiry(*expiry);
|
|
94
99
|
}
|
|
95
100
|
encoded.body().access_deleted(access_deleted);
|
|
101
|
+
encoded.body().create_as_deleted(create_as_deleted);
|
|
96
102
|
encoded.body().store_semantics(store_semantics);
|
|
97
103
|
encoded.body().specs(specs);
|
|
98
104
|
if (durability_level != protocol::durability_level::none) {
|
|
99
105
|
encoded.body().durability(durability_level, durability_timeout);
|
|
100
106
|
}
|
|
107
|
+
return {};
|
|
101
108
|
}
|
|
102
109
|
};
|
|
103
110
|
|
|
104
111
|
mutate_in_response
|
|
105
|
-
make_response(std::error_code ec, mutate_in_request& request, mutate_in_request::encoded_response_type encoded)
|
|
112
|
+
make_response(std::error_code ec, mutate_in_request& request, mutate_in_request::encoded_response_type&& encoded)
|
|
106
113
|
{
|
|
107
114
|
mutate_in_response response{ request.id, encoded.opaque(), ec };
|
|
108
115
|
if (ec && response.opaque == 0) {
|
|
109
116
|
response.opaque = request.opaque;
|
|
110
117
|
}
|
|
118
|
+
if (encoded.status() == protocol::status::subdoc_success_deleted ||
|
|
119
|
+
encoded.status() == protocol::status::subdoc_multi_path_failure_deleted) {
|
|
120
|
+
response.deleted = true;
|
|
121
|
+
}
|
|
111
122
|
if (!ec) {
|
|
112
123
|
response.cas = encoded.cas();
|
|
113
124
|
response.token = encoded.body().token();
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
|
|
2
|
+
/*
|
|
3
|
+
* Copyright 2020 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 <protocol/cmd_prepend.hxx>
|
|
21
|
+
#include <protocol/durability_level.hxx>
|
|
22
|
+
#include <io/retry_context.hxx>
|
|
23
|
+
|
|
24
|
+
namespace couchbase::operations
|
|
25
|
+
{
|
|
26
|
+
|
|
27
|
+
struct prepend_response {
|
|
28
|
+
document_id id;
|
|
29
|
+
std::uint32_t opaque;
|
|
30
|
+
std::error_code ec{};
|
|
31
|
+
std::uint64_t cas{};
|
|
32
|
+
mutation_token token{};
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
struct prepend_request {
|
|
36
|
+
using encoded_request_type = protocol::client_request<protocol::prepend_request_body>;
|
|
37
|
+
using encoded_response_type = protocol::client_response<protocol::prepend_response_body>;
|
|
38
|
+
|
|
39
|
+
document_id id;
|
|
40
|
+
std::string value;
|
|
41
|
+
uint16_t partition{};
|
|
42
|
+
uint32_t opaque{};
|
|
43
|
+
protocol::durability_level durability_level{ protocol::durability_level::none };
|
|
44
|
+
std::optional<std::uint16_t> durability_timeout{};
|
|
45
|
+
std::chrono::milliseconds timeout{ timeout_defaults::key_value_timeout };
|
|
46
|
+
io::retry_context<io::retry_strategy::best_effort> retries{ false };
|
|
47
|
+
|
|
48
|
+
[[nodiscard]] std::error_code encode_to(encoded_request_type& encoded, mcbp_context&&)
|
|
49
|
+
{
|
|
50
|
+
encoded.opaque(opaque);
|
|
51
|
+
encoded.partition(partition);
|
|
52
|
+
encoded.body().id(id);
|
|
53
|
+
encoded.body().content(value);
|
|
54
|
+
if (durability_level != protocol::durability_level::none) {
|
|
55
|
+
encoded.body().durability(durability_level, durability_timeout);
|
|
56
|
+
}
|
|
57
|
+
return {};
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
prepend_response
|
|
62
|
+
make_response(std::error_code ec, prepend_request& request, prepend_request::encoded_response_type&& encoded)
|
|
63
|
+
{
|
|
64
|
+
prepend_response response{ request.id, encoded.opaque(), ec };
|
|
65
|
+
if (ec && response.opaque == 0) {
|
|
66
|
+
response.opaque = request.opaque;
|
|
67
|
+
}
|
|
68
|
+
if (!ec) {
|
|
69
|
+
response.cas = encoded.cas();
|
|
70
|
+
response.token = encoded.body().token();
|
|
71
|
+
response.token.partition_id = request.partition;
|
|
72
|
+
response.token.bucket_name = response.id.bucket;
|
|
73
|
+
}
|
|
74
|
+
return response;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
} // namespace couchbase::operations
|