couchbase 3.0.0.alpha.2-universal-darwin-19 → 3.0.0.alpha.3-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.
Files changed (83) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/tests-dev-preview.yml +52 -0
  3. data/.gitmodules +3 -0
  4. data/.idea/vcs.xml +1 -0
  5. data/.yardopts +1 -0
  6. data/README.md +1 -1
  7. data/Rakefile +5 -1
  8. data/bin/init-cluster +13 -5
  9. data/couchbase.gemspec +2 -1
  10. data/examples/managing_query_indexes.rb +1 -1
  11. data/examples/managing_search_indexes.rb +62 -0
  12. data/examples/search.rb +187 -0
  13. data/ext/.clang-tidy +1 -0
  14. data/ext/build_version.hxx.in +1 -1
  15. data/ext/couchbase/bucket.hxx +0 -40
  16. data/ext/couchbase/couchbase.cxx +2578 -1368
  17. data/ext/couchbase/io/http_session.hxx +27 -7
  18. data/ext/couchbase/io/mcbp_parser.hxx +2 -0
  19. data/ext/couchbase/io/mcbp_session.hxx +53 -24
  20. data/ext/couchbase/io/session_manager.hxx +6 -1
  21. data/ext/couchbase/operations.hxx +13 -0
  22. data/ext/couchbase/operations/bucket_create.hxx +1 -0
  23. data/ext/couchbase/operations/bucket_drop.hxx +1 -0
  24. data/ext/couchbase/operations/bucket_flush.hxx +1 -0
  25. data/ext/couchbase/operations/bucket_get.hxx +1 -0
  26. data/ext/couchbase/operations/bucket_get_all.hxx +1 -0
  27. data/ext/couchbase/operations/bucket_update.hxx +1 -0
  28. data/ext/couchbase/operations/cluster_developer_preview_enable.hxx +1 -0
  29. data/ext/couchbase/operations/collection_create.hxx +6 -1
  30. data/ext/couchbase/operations/collection_drop.hxx +1 -0
  31. data/ext/couchbase/operations/command.hxx +86 -11
  32. data/ext/couchbase/operations/document_decrement.hxx +1 -0
  33. data/ext/couchbase/operations/document_exists.hxx +1 -0
  34. data/ext/couchbase/operations/document_get.hxx +1 -0
  35. data/ext/couchbase/operations/document_get_and_lock.hxx +1 -0
  36. data/ext/couchbase/operations/document_get_and_touch.hxx +1 -0
  37. data/ext/couchbase/operations/document_get_projected.hxx +243 -0
  38. data/ext/couchbase/operations/document_increment.hxx +4 -1
  39. data/ext/couchbase/operations/document_insert.hxx +1 -0
  40. data/ext/couchbase/operations/document_lookup_in.hxx +1 -0
  41. data/ext/couchbase/operations/document_mutate_in.hxx +1 -0
  42. data/ext/couchbase/operations/document_query.hxx +13 -2
  43. data/ext/couchbase/operations/document_remove.hxx +1 -0
  44. data/ext/couchbase/operations/document_replace.hxx +1 -0
  45. data/ext/couchbase/operations/document_search.hxx +337 -0
  46. data/ext/couchbase/operations/document_touch.hxx +1 -0
  47. data/ext/couchbase/operations/document_unlock.hxx +1 -0
  48. data/ext/couchbase/operations/document_upsert.hxx +1 -0
  49. data/ext/couchbase/operations/query_index_build_deferred.hxx +1 -0
  50. data/ext/couchbase/operations/query_index_create.hxx +1 -0
  51. data/ext/couchbase/operations/query_index_drop.hxx +1 -0
  52. data/ext/couchbase/operations/query_index_get_all.hxx +1 -0
  53. data/ext/couchbase/operations/scope_create.hxx +1 -0
  54. data/ext/couchbase/operations/scope_drop.hxx +1 -0
  55. data/ext/couchbase/operations/scope_get_all.hxx +2 -0
  56. data/ext/couchbase/operations/search_index.hxx +62 -0
  57. data/ext/couchbase/operations/search_index_analyze_document.hxx +92 -0
  58. data/ext/couchbase/operations/search_index_control_ingest.hxx +78 -0
  59. data/ext/couchbase/operations/search_index_control_plan_freeze.hxx +80 -0
  60. data/ext/couchbase/operations/search_index_control_query.hxx +80 -0
  61. data/ext/couchbase/operations/search_index_drop.hxx +77 -0
  62. data/ext/couchbase/operations/search_index_get.hxx +80 -0
  63. data/ext/couchbase/operations/search_index_get_all.hxx +82 -0
  64. data/ext/couchbase/operations/search_index_get_documents_count.hxx +81 -0
  65. data/ext/couchbase/operations/search_index_upsert.hxx +106 -0
  66. data/ext/couchbase/protocol/client_opcode.hxx +10 -0
  67. data/ext/couchbase/protocol/cmd_get_collection_id.hxx +117 -0
  68. data/ext/couchbase/timeout_defaults.hxx +32 -0
  69. data/ext/couchbase/version.hxx +1 -1
  70. data/ext/test/main.cxx +5 -5
  71. data/lib/couchbase/binary_collection.rb +16 -12
  72. data/lib/couchbase/binary_collection_options.rb +4 -0
  73. data/lib/couchbase/cluster.rb +88 -8
  74. data/lib/couchbase/collection.rb +39 -15
  75. data/lib/couchbase/collection_options.rb +19 -2
  76. data/lib/couchbase/json_transcoder.rb +2 -2
  77. data/lib/couchbase/management/bucket_manager.rb +37 -23
  78. data/lib/couchbase/management/collection_manager.rb +15 -6
  79. data/lib/couchbase/management/query_index_manager.rb +16 -6
  80. data/lib/couchbase/management/search_index_manager.rb +61 -14
  81. data/lib/couchbase/search_options.rb +1492 -0
  82. data/lib/couchbase/version.rb +1 -1
  83. metadata +22 -2
@@ -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 <tao/json.hpp>
21
+
22
+ #include <version.hxx>
23
+
24
+ namespace couchbase::operations
25
+ {
26
+ struct search_index_drop_response {
27
+ uuid::uuid_t client_context_id;
28
+ std::error_code ec;
29
+ std::string status{};
30
+ std::string error{};
31
+ };
32
+
33
+ struct search_index_drop_request {
34
+ using response_type = search_index_drop_response;
35
+ using encoded_request_type = io::http_request;
36
+ using encoded_response_type = io::http_response;
37
+
38
+ static const inline service_type type = service_type::search;
39
+
40
+ uuid::uuid_t client_context_id{ uuid::random() };
41
+ std::chrono::milliseconds timeout{ timeout_defaults::management_timeout };
42
+
43
+ std::string index_name;
44
+
45
+ void encode_to(encoded_request_type& encoded)
46
+ {
47
+ encoded.method = "DELETE";
48
+ encoded.path = fmt::format("/api/index/{}", index_name);
49
+ }
50
+ };
51
+
52
+ search_index_drop_response
53
+ make_response(std::error_code ec, search_index_drop_request& request, search_index_drop_request::encoded_response_type encoded)
54
+ {
55
+ search_index_drop_response response{ request.client_context_id, ec };
56
+ if (!ec) {
57
+ if (encoded.status_code == 200) {
58
+ auto payload = tao::json::from_string(encoded.body);
59
+ response.status = payload.at("status").get_string();
60
+ if (response.status == "ok") {
61
+ return response;
62
+ }
63
+ } else if (encoded.status_code == 400) {
64
+ auto payload = tao::json::from_string(encoded.body);
65
+ response.status = payload.at("status").get_string();
66
+ response.error = payload.at("error").get_string();
67
+ if (response.error.find("index not found") != std::string::npos) {
68
+ response.ec = std::make_error_code(error::common_errc::index_not_found);
69
+ return response;
70
+ }
71
+ }
72
+ response.ec = std::make_error_code(error::common_errc::internal_server_failure);
73
+ }
74
+ return response;
75
+ }
76
+
77
+ } // namespace couchbase::operations
@@ -0,0 +1,80 @@
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 <tao/json.hpp>
21
+ #include <operations/search_index.hxx>
22
+
23
+ #include <version.hxx>
24
+
25
+ namespace couchbase::operations
26
+ {
27
+ struct search_index_get_response {
28
+ uuid::uuid_t client_context_id;
29
+ std::error_code ec;
30
+ std::string status{};
31
+ search_index index{};
32
+ std::string error{};
33
+ };
34
+
35
+ struct search_index_get_request {
36
+ using response_type = search_index_get_response;
37
+ using encoded_request_type = io::http_request;
38
+ using encoded_response_type = io::http_response;
39
+
40
+ static const inline service_type type = service_type::search;
41
+
42
+ uuid::uuid_t client_context_id{ uuid::random() };
43
+ std::chrono::milliseconds timeout{ timeout_defaults::management_timeout };
44
+
45
+ std::string index_name;
46
+
47
+ void encode_to(encoded_request_type& encoded)
48
+ {
49
+ encoded.method = "GET";
50
+ encoded.path = fmt::format("/api/index/{}", index_name);
51
+ }
52
+ };
53
+
54
+ search_index_get_response
55
+ make_response(std::error_code ec, search_index_get_request& request, search_index_get_request::encoded_response_type encoded)
56
+ {
57
+ search_index_get_response response{ request.client_context_id, ec };
58
+ if (!ec) {
59
+ if (encoded.status_code == 200) {
60
+ auto payload = tao::json::from_string(encoded.body);
61
+ response.status = payload.at("status").get_string();
62
+ if (response.status == "ok") {
63
+ response.index = payload.at("indexDef").as<search_index>();
64
+ return response;
65
+ }
66
+ } else if (encoded.status_code == 400) {
67
+ auto payload = tao::json::from_string(encoded.body);
68
+ response.status = payload.at("status").get_string();
69
+ response.error = payload.at("error").get_string();
70
+ if (response.error.find("index not found") != std::string::npos) {
71
+ response.ec = std::make_error_code(error::common_errc::index_not_found);
72
+ return response;
73
+ }
74
+ }
75
+ response.ec = std::make_error_code(error::common_errc::internal_server_failure);
76
+ }
77
+ return response;
78
+ }
79
+
80
+ } // namespace couchbase::operations
@@ -0,0 +1,82 @@
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 <tao/json.hpp>
21
+ #include <operations/search_index.hxx>
22
+
23
+ #include <version.hxx>
24
+
25
+ namespace couchbase::operations
26
+ {
27
+ struct search_index_get_all_response {
28
+ uuid::uuid_t client_context_id;
29
+ std::error_code ec;
30
+ std::string status{};
31
+ std::string impl_version{};
32
+ std::vector<search_index> indexes{};
33
+ };
34
+
35
+ struct search_index_get_all_request {
36
+ using response_type = search_index_get_all_response;
37
+ using encoded_request_type = io::http_request;
38
+ using encoded_response_type = io::http_response;
39
+
40
+ static const inline service_type type = service_type::search;
41
+
42
+ uuid::uuid_t client_context_id{ uuid::random() };
43
+ std::chrono::milliseconds timeout{ timeout_defaults::management_timeout };
44
+
45
+ std::string index_name;
46
+
47
+ void encode_to(encoded_request_type& encoded)
48
+ {
49
+ encoded.method = "GET";
50
+ encoded.path = fmt::format("/api/index");
51
+ }
52
+ };
53
+
54
+ search_index_get_all_response
55
+ make_response(std::error_code ec, search_index_get_all_request& request, search_index_get_all_request::encoded_response_type encoded)
56
+ {
57
+ search_index_get_all_response response{ request.client_context_id, ec };
58
+ if (!ec) {
59
+ if (encoded.status_code == 200) {
60
+ auto payload = tao::json::from_string(encoded.body);
61
+ response.status = payload.at("status").get_string();
62
+ if (response.status == "ok") {
63
+ const auto* indexDefs = payload.find("indexDefs");
64
+ if (indexDefs != nullptr && indexDefs->is_object()) {
65
+ const auto* impl_ver = indexDefs->find("implVersion");
66
+ if (impl_ver != nullptr && impl_ver->is_string()) {
67
+ response.impl_version = impl_ver->get_string();
68
+ }
69
+ const auto* indexes = indexDefs->find("indexDefs");
70
+ for (const auto& entry : indexes->get_object()) {
71
+ response.indexes.emplace_back(entry.second.as<search_index>());
72
+ }
73
+ }
74
+ return response;
75
+ }
76
+ }
77
+ return response;
78
+ }
79
+ return response;
80
+ }
81
+
82
+ } // namespace couchbase::operations
@@ -0,0 +1,81 @@
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 <tao/json.hpp>
21
+
22
+ #include <version.hxx>
23
+
24
+ namespace couchbase::operations
25
+ {
26
+ struct search_index_get_documents_count_response {
27
+ uuid::uuid_t client_context_id;
28
+ std::error_code ec;
29
+ std::string status{};
30
+ std::uint64_t count{ 0 };
31
+ std::string error{};
32
+ };
33
+
34
+ struct search_index_get_documents_count_request {
35
+ using response_type = search_index_get_documents_count_response;
36
+ using encoded_request_type = io::http_request;
37
+ using encoded_response_type = io::http_response;
38
+
39
+ static const inline service_type type = service_type::search;
40
+
41
+ uuid::uuid_t client_context_id{ uuid::random() };
42
+ std::chrono::milliseconds timeout{ timeout_defaults::management_timeout };
43
+
44
+ std::string index_name;
45
+
46
+ void encode_to(encoded_request_type& encoded)
47
+ {
48
+ encoded.method = "GET";
49
+ encoded.path = fmt::format("/api/index/{}/count", index_name);
50
+ }
51
+ };
52
+
53
+ search_index_get_documents_count_response
54
+ make_response(std::error_code ec,
55
+ search_index_get_documents_count_request& request,
56
+ search_index_get_documents_count_request::encoded_response_type encoded)
57
+ {
58
+ search_index_get_documents_count_response response{ request.client_context_id, ec };
59
+ if (!ec) {
60
+ if (encoded.status_code == 200) {
61
+ auto payload = tao::json::from_string(encoded.body);
62
+ response.status = payload.at("status").get_string();
63
+ if (response.status == "ok") {
64
+ response.count = payload.at("count").get_unsigned();
65
+ return response;
66
+ }
67
+ } else if (encoded.status_code == 400) {
68
+ auto payload = tao::json::from_string(encoded.body);
69
+ response.status = payload.at("status").get_string();
70
+ response.error = payload.at("error").get_string();
71
+ if (response.error.find("index not found") != std::string::npos) {
72
+ response.ec = std::make_error_code(error::common_errc::index_not_found);
73
+ return response;
74
+ }
75
+ }
76
+ response.ec = std::make_error_code(error::common_errc::internal_server_failure);
77
+ }
78
+ return response;
79
+ }
80
+
81
+ } // namespace couchbase::operations
@@ -0,0 +1,106 @@
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 <tao/json.hpp>
21
+
22
+ #include <version.hxx>
23
+
24
+ namespace couchbase::operations
25
+ {
26
+ struct search_index_upsert_response {
27
+ uuid::uuid_t client_context_id;
28
+ std::error_code ec;
29
+ std::string status{};
30
+ std::string error{};
31
+ };
32
+
33
+ struct search_index_upsert_request {
34
+ using response_type = search_index_upsert_response;
35
+ using encoded_request_type = io::http_request;
36
+ using encoded_response_type = io::http_response;
37
+
38
+ static const inline service_type type = service_type::search;
39
+
40
+ uuid::uuid_t client_context_id{ uuid::random() };
41
+ std::chrono::milliseconds timeout{ timeout_defaults::management_timeout };
42
+
43
+ search_index index;
44
+
45
+ void encode_to(encoded_request_type& encoded)
46
+ {
47
+ encoded.method = "PUT";
48
+ encoded.headers["cache-control"] = "no-cache";
49
+ encoded.headers["content-type"] = "application/json";
50
+ encoded.path = fmt::format("/api/index/{}", index.name);
51
+ tao::json::value body{
52
+ { "name", index.name },
53
+ { "type", index.type },
54
+ { "sourceType", index.source_type },
55
+ };
56
+ if (!index.uuid.empty()) {
57
+ body["uuid"] = index.uuid;
58
+ }
59
+ if (!index.params_json.empty()) {
60
+ body["params"] = tao::json::from_string(index.params_json);
61
+ }
62
+ if (!index.source_name.empty()) {
63
+ body["sourceName"] = index.source_name;
64
+ }
65
+ if (!index.source_uuid.empty()) {
66
+ body["sourceUUID"] = index.source_uuid;
67
+ }
68
+ if (!index.source_params_json.empty()) {
69
+ body["sourceParams"] = tao::json::from_string(index.source_params_json);
70
+ }
71
+ if (!index.plan_params_json.empty()) {
72
+ body["planParams"] = tao::json::from_string(index.plan_params_json);
73
+ }
74
+ encoded.body = tao::json::to_string(body);
75
+ }
76
+ };
77
+
78
+ search_index_upsert_response
79
+ make_response(std::error_code ec, search_index_upsert_request& request, search_index_upsert_request::encoded_response_type encoded)
80
+ {
81
+ search_index_upsert_response response{ request.client_context_id, ec };
82
+ if (!ec) {
83
+ if (encoded.status_code == 200) {
84
+ auto payload = tao::json::from_string(encoded.body);
85
+ response.status = payload.at("status").get_string();
86
+ if (response.status == "ok") {
87
+ return response;
88
+ }
89
+ } else if (encoded.status_code == 400) {
90
+ auto payload = tao::json::from_string(encoded.body);
91
+ response.status = payload.at("status").get_string();
92
+ response.error = payload.at("error").get_string();
93
+ if (response.error.find("index not found") != std::string::npos) {
94
+ response.ec = std::make_error_code(error::common_errc::index_not_found);
95
+ return response;
96
+ } else if (response.error.find("index with the same name already exists") != std::string::npos) {
97
+ response.ec = std::make_error_code(error::common_errc::index_exists);
98
+ return response;
99
+ }
100
+ }
101
+ response.ec = std::make_error_code(error::common_errc::internal_server_failure);
102
+ }
103
+ return response;
104
+ }
105
+
106
+ } // namespace couchbase::operations
@@ -41,6 +41,7 @@ enum class client_opcode : uint8_t {
41
41
  get_and_lock = 0x94,
42
42
  unlock = 0x95,
43
43
  get_collections_manifest = 0xba,
44
+ get_collection_id = 0xbb,
44
45
  subdoc_multi_lookup = 0xd0,
45
46
  subdoc_multi_mutation = 0xd1,
46
47
  get_cluster_config = 0xb5,
@@ -52,6 +53,7 @@ enum class client_opcode : uint8_t {
52
53
  * subdocument opcodes are listed separately, because we are not going to implement/support single-op messages
53
54
  */
54
55
  enum class subdoc_opcode : uint8_t {
56
+ get_doc = 0x00,
55
57
  get = 0xc5,
56
58
  exists = 0xc6,
57
59
  dict_add = 0xc7,
@@ -93,6 +95,7 @@ is_valid_client_opcode(uint8_t code)
93
95
  case client_opcode::get_and_touch:
94
96
  case client_opcode::increment:
95
97
  case client_opcode::decrement:
98
+ case client_opcode::get_collection_id:
96
99
  return true;
97
100
  }
98
101
  return false;
@@ -114,6 +117,7 @@ is_valid_subdoc_opcode(uint8_t code)
114
117
  case subdoc_opcode::array_add_unique:
115
118
  case subdoc_opcode::counter:
116
119
  case subdoc_opcode::get_count:
120
+ case subdoc_opcode::get_doc:
117
121
  return true;
118
122
  }
119
123
  return false;
@@ -196,6 +200,9 @@ struct fmt::formatter<couchbase::protocol::client_opcode> : formatter<string_vie
196
200
  case couchbase::protocol::client_opcode::decrement:
197
201
  name = "decrement";
198
202
  break;
203
+ case couchbase::protocol::client_opcode::get_collection_id:
204
+ name = "get_collection_uid";
205
+ break;
199
206
  }
200
207
  return formatter<string_view>::format(name, ctx);
201
208
  }
@@ -244,6 +251,9 @@ struct fmt::formatter<couchbase::protocol::subdoc_opcode> : formatter<string_vie
244
251
  case couchbase::protocol::subdoc_opcode::get_count:
245
252
  name = "get_count";
246
253
  break;
254
+ case couchbase::protocol::subdoc_opcode::get_doc:
255
+ name = "get_doc";
256
+ break;
247
257
  }
248
258
  return formatter<string_view>::format(name, ctx);
249
259
  }