couchbase 3.0.2 → 3.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (136) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/ext/CMakeLists.txt +3 -0
  4. data/ext/build_version.hxx.in +1 -1
  5. data/ext/cmake/CompilerWarnings.cmake +1 -0
  6. data/ext/cmake/PreventInSourceBuilds.cmake +4 -1
  7. data/ext/couchbase/bucket.hxx +28 -2
  8. data/ext/couchbase/cluster.hxx +8 -2
  9. data/ext/couchbase/couchbase.cxx +955 -511
  10. data/ext/couchbase/error_context/analytics.hxx +46 -0
  11. data/ext/couchbase/error_context/http.hxx +44 -0
  12. data/ext/couchbase/error_context/key_value.hxx +47 -0
  13. data/ext/couchbase/error_context/query.hxx +46 -0
  14. data/ext/couchbase/error_context/search.hxx +47 -0
  15. data/ext/couchbase/error_context/view.hxx +47 -0
  16. data/ext/couchbase/io/dns_codec.hxx +1 -2
  17. data/ext/couchbase/io/http_command.hxx +16 -3
  18. data/ext/couchbase/io/http_context.hxx +1 -1
  19. data/ext/couchbase/io/http_session.hxx +12 -6
  20. data/ext/couchbase/io/http_session_manager.hxx +25 -24
  21. data/ext/couchbase/io/mcbp_session.hxx +8 -2
  22. data/ext/couchbase/io/retry_context.hxx +1 -1
  23. data/ext/couchbase/operations/analytics_dataset_create.hxx +19 -12
  24. data/ext/couchbase/operations/analytics_dataset_drop.hxx +18 -10
  25. data/ext/couchbase/operations/analytics_dataset_get_all.hxx +16 -10
  26. data/ext/couchbase/operations/analytics_dataverse_create.hxx +18 -11
  27. data/ext/couchbase/operations/analytics_dataverse_drop.hxx +17 -11
  28. data/ext/couchbase/operations/analytics_get_pending_mutations.hxx +17 -10
  29. data/ext/couchbase/operations/analytics_index_create.hxx +17 -11
  30. data/ext/couchbase/operations/analytics_index_drop.hxx +16 -10
  31. data/ext/couchbase/operations/analytics_index_get_all.hxx +14 -10
  32. data/ext/couchbase/operations/analytics_link_connect.hxx +15 -9
  33. data/ext/couchbase/operations/analytics_link_disconnect.hxx +16 -10
  34. data/ext/couchbase/operations/bucket_create.hxx +33 -10
  35. data/ext/couchbase/operations/bucket_drop.hxx +9 -8
  36. data/ext/couchbase/operations/bucket_flush.hxx +8 -8
  37. data/ext/couchbase/operations/bucket_get.hxx +15 -10
  38. data/ext/couchbase/operations/bucket_get_all.hxx +14 -7
  39. data/ext/couchbase/operations/bucket_settings.hxx +16 -0
  40. data/ext/couchbase/operations/bucket_update.hxx +32 -10
  41. data/ext/couchbase/operations/cluster_developer_preview_enable.hxx +6 -6
  42. data/ext/couchbase/operations/collection_create.hxx +19 -13
  43. data/ext/couchbase/operations/collection_drop.hxx +18 -12
  44. data/ext/couchbase/operations/collections_manifest_get.hxx +5 -10
  45. data/ext/couchbase/operations/document_analytics.hxx +39 -17
  46. data/ext/couchbase/operations/document_append.hxx +5 -10
  47. data/ext/couchbase/operations/document_decrement.hxx +5 -10
  48. data/ext/couchbase/operations/document_exists.hxx +4 -6
  49. data/ext/couchbase/operations/document_get.hxx +6 -10
  50. data/ext/couchbase/operations/document_get_and_lock.hxx +4 -9
  51. data/ext/couchbase/operations/document_get_and_touch.hxx +4 -9
  52. data/ext/couchbase/operations/document_get_projected.hxx +21 -14
  53. data/ext/couchbase/operations/document_increment.hxx +5 -10
  54. data/ext/couchbase/operations/document_insert.hxx +5 -10
  55. data/ext/couchbase/operations/document_lookup_in.hxx +4 -9
  56. data/ext/couchbase/operations/document_mutate_in.hxx +7 -12
  57. data/ext/couchbase/operations/document_prepend.hxx +5 -10
  58. data/ext/couchbase/operations/document_query.hxx +45 -28
  59. data/ext/couchbase/operations/document_remove.hxx +5 -10
  60. data/ext/couchbase/operations/document_replace.hxx +5 -10
  61. data/ext/couchbase/operations/document_search.hxx +37 -16
  62. data/ext/couchbase/operations/document_touch.hxx +4 -9
  63. data/ext/couchbase/operations/document_unlock.hxx +4 -9
  64. data/ext/couchbase/operations/document_upsert.hxx +5 -10
  65. data/ext/couchbase/operations/document_view.hxx +29 -13
  66. data/ext/couchbase/operations/group_drop.hxx +7 -7
  67. data/ext/couchbase/operations/group_get.hxx +14 -10
  68. data/ext/couchbase/operations/group_get_all.hxx +14 -8
  69. data/ext/couchbase/operations/group_upsert.hxx +15 -9
  70. data/ext/couchbase/operations/http_noop.hxx +5 -5
  71. data/ext/couchbase/operations/mcbp_noop.hxx +3 -9
  72. data/ext/couchbase/operations/query_index_build_deferred.hxx +15 -9
  73. data/ext/couchbase/operations/query_index_create.hxx +16 -10
  74. data/ext/couchbase/operations/query_index_drop.hxx +16 -10
  75. data/ext/couchbase/operations/query_index_get_all.hxx +13 -7
  76. data/ext/couchbase/operations/role_get_all.hxx +14 -8
  77. data/ext/couchbase/operations/scope_create.hxx +19 -13
  78. data/ext/couchbase/operations/scope_drop.hxx +17 -11
  79. data/ext/couchbase/operations/scope_get_all.hxx +15 -10
  80. data/ext/couchbase/operations/search_get_stats.hxx +5 -5
  81. data/ext/couchbase/operations/search_index_analyze_document.hxx +25 -13
  82. data/ext/couchbase/operations/search_index_control_ingest.hxx +23 -11
  83. data/ext/couchbase/operations/search_index_control_plan_freeze.hxx +23 -11
  84. data/ext/couchbase/operations/search_index_control_query.hxx +23 -11
  85. data/ext/couchbase/operations/search_index_drop.hxx +22 -10
  86. data/ext/couchbase/operations/search_index_get.hxx +22 -10
  87. data/ext/couchbase/operations/search_index_get_all.hxx +13 -7
  88. data/ext/couchbase/operations/search_index_get_documents_count.hxx +24 -13
  89. data/ext/couchbase/operations/search_index_get_stats.hxx +16 -10
  90. data/ext/couchbase/operations/search_index_upsert.hxx +23 -11
  91. data/ext/couchbase/operations/user_drop.hxx +8 -8
  92. data/ext/couchbase/operations/user_get.hxx +14 -10
  93. data/ext/couchbase/operations/user_get_all.hxx +14 -8
  94. data/ext/couchbase/operations/user_upsert.hxx +15 -9
  95. data/ext/couchbase/operations/view_index_drop.hxx +7 -7
  96. data/ext/couchbase/operations/view_index_get.hxx +15 -9
  97. data/ext/couchbase/operations/view_index_get_all.hxx +15 -9
  98. data/ext/couchbase/operations/view_index_upsert.hxx +8 -8
  99. data/ext/couchbase/origin.hxx +1 -0
  100. data/ext/couchbase/platform/terminate_handler.cc +12 -8
  101. data/ext/couchbase/protocol/client_request.hxx +2 -1
  102. data/ext/couchbase/protocol/client_response.hxx +18 -15
  103. data/ext/couchbase/protocol/cmd_exists.hxx +1 -0
  104. data/ext/couchbase/protocol/cmd_get.hxx +1 -1
  105. data/ext/couchbase/protocol/cmd_mutate_in.hxx +3 -4
  106. data/ext/couchbase/protocol/enhanced_error_info.hxx +28 -0
  107. data/ext/couchbase/utils/connection_string.hxx +1 -1
  108. data/ext/couchbase/version.hxx +1 -1
  109. data/ext/extconf.rb +1 -1
  110. data/ext/test/test_native_binary_operations.cxx +18 -18
  111. data/ext/test/test_native_diagnostics.cxx +2 -2
  112. data/ext/test/test_native_trivial_crud.cxx +2 -2
  113. data/ext/third_party/json/include/tao/json/external/pegtl/internal/file_reader.hpp +1 -5
  114. data/lib/active_support/cache/couchbase_store.rb +362 -0
  115. data/lib/couchbase.rb +2 -0
  116. data/lib/couchbase/authenticator.rb +26 -0
  117. data/lib/couchbase/binary_collection.rb +1 -0
  118. data/lib/couchbase/bucket.rb +1 -0
  119. data/lib/couchbase/cluster.rb +51 -27
  120. data/lib/couchbase/collection.rb +19 -4
  121. data/lib/couchbase/collection_options.rb +10 -0
  122. data/lib/couchbase/configuration.rb +57 -0
  123. data/lib/couchbase/datastructures.rb +6 -0
  124. data/lib/couchbase/errors.rb +111 -3
  125. data/lib/couchbase/management.rb +27 -0
  126. data/lib/couchbase/management/bucket_manager.rb +9 -2
  127. data/lib/couchbase/management/collection_manager.rb +1 -1
  128. data/lib/couchbase/management/user_manager.rb +18 -2
  129. data/lib/couchbase/options.rb +33 -23
  130. data/lib/couchbase/railtie.rb +45 -0
  131. data/lib/couchbase/scope.rb +44 -3
  132. data/lib/couchbase/utils.rb +21 -0
  133. data/lib/couchbase/utils/time.rb +52 -0
  134. data/lib/couchbase/version.rb +1 -1
  135. data/lib/rails/generators/couchbase/config/config_generator.rb +27 -0
  136. metadata +19 -5
@@ -126,7 +126,7 @@ class mcbp_session : public std::enable_shared_from_this<mcbp_session>
126
126
  : session_(session)
127
127
  , sasl_([origin = session_->origin_]() -> std::string { return origin.username(); },
128
128
  [origin = session_->origin_]() -> std::string { return origin.password(); },
129
- { "SCRAM-SHA512", "SCRAM-SHA256", "SCRAM-SHA1", "PLAIN" })
129
+ session_->origin_.credentials().allowed_sasl_mechanisms)
130
130
  {
131
131
  tao::json::value user_agent{
132
132
  { "a", couchbase::sdk_id() },
@@ -545,11 +545,17 @@ class mcbp_session : public std::enable_shared_from_this<mcbp_session>
545
545
 
546
546
  std::string remote_address() const
547
547
  {
548
+ if (endpoint_.protocol() == asio::ip::tcp::v6()) {
549
+ return fmt::format("[{}]:{}", endpoint_address_, endpoint_.port());
550
+ }
548
551
  return fmt::format("{}:{}", endpoint_address_, endpoint_.port());
549
552
  }
550
553
 
551
554
  std::string local_address() const
552
555
  {
556
+ if (endpoint_.protocol() == asio::ip::tcp::v6()) {
557
+ return fmt::format("[{}]:{}", local_endpoint_address_, local_endpoint_.port());
558
+ }
553
559
  return fmt::format("{}:{}", local_endpoint_address_, local_endpoint_.port());
554
560
  }
555
561
 
@@ -1001,7 +1007,7 @@ class mcbp_session : public std::enable_shared_from_this<mcbp_session>
1001
1007
  }
1002
1008
  if (config_->rev && config.rev) {
1003
1009
  if (*config_->rev == *config.rev) {
1004
- spdlog::debug("{} received a configuration with identical revision (rev={}), ignoring", log_prefix_, *config.rev);
1010
+ spdlog::trace("{} received a configuration with identical revision (rev={}), ignoring", log_prefix_, *config.rev);
1005
1011
  return;
1006
1012
  }
1007
1013
  if (*config_->rev > *config.rev) {
@@ -17,8 +17,8 @@
17
17
 
18
18
  #pragma once
19
19
 
20
- #include <set>
21
20
  #include <chrono>
21
+ #include <set>
22
22
 
23
23
  #include <io/retry_reason.hxx>
24
24
  #include <io/retry_strategy.hxx>
@@ -1,6 +1,6 @@
1
1
  /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
2
  /*
3
- * Copyright 2020 Couchbase, Inc.
3
+ * Copyright 2020-2021 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.
@@ -19,6 +19,7 @@
19
19
 
20
20
  #include <tao/json.hpp>
21
21
 
22
+ #include <error_context/http.hxx>
22
23
  #include <version.hxx>
23
24
 
24
25
  namespace couchbase::operations
@@ -29,8 +30,7 @@ struct analytics_dataset_create_response {
29
30
  std::string message;
30
31
  };
31
32
 
32
- std::string client_context_id;
33
- std::error_code ec;
33
+ error_context::http ctx;
34
34
  std::string status{};
35
35
  std::vector<problem> errors{};
36
36
  };
@@ -39,6 +39,7 @@ struct analytics_dataset_create_request {
39
39
  using response_type = analytics_dataset_create_response;
40
40
  using encoded_request_type = io::http_request;
41
41
  using encoded_response_type = io::http_response;
42
+ using error_context_type = error_context::http;
42
43
 
43
44
  static const inline service_type type = service_type::analytics;
44
45
 
@@ -53,7 +54,7 @@ struct analytics_dataset_create_request {
53
54
 
54
55
  bool ignore_if_exists{ false };
55
56
 
56
- [[nodiscard]] std::error_code encode_to(encoded_request_type& encoded, http_context&)
57
+ [[nodiscard]] std::error_code encode_to(encoded_request_type& encoded, http_context& /* context */)
57
58
  {
58
59
  std::string where_clause = condition ? fmt::format("WHERE {}", *condition) : "";
59
60
  std::string if_not_exists_clause = ignore_if_exists ? "IF NOT EXISTS" : "";
@@ -72,13 +73,19 @@ struct analytics_dataset_create_request {
72
73
  };
73
74
 
74
75
  analytics_dataset_create_response
75
- make_response(std::error_code ec,
76
- analytics_dataset_create_request& request,
76
+ make_response(error_context::http&& ctx,
77
+ analytics_dataset_create_request& /* request */,
77
78
  analytics_dataset_create_request::encoded_response_type&& encoded)
78
79
  {
79
- analytics_dataset_create_response response{ request.client_context_id, ec };
80
- if (!ec) {
81
- auto payload = tao::json::from_string(encoded.body);
80
+ analytics_dataset_create_response response{ ctx };
81
+ if (!response.ctx.ec) {
82
+ tao::json::value payload{};
83
+ try {
84
+ payload = tao::json::from_string(encoded.body);
85
+ } catch (tao::json::pegtl::parse_error& e) {
86
+ response.ctx.ec = std::make_error_code(error::common_errc::parsing_failure);
87
+ return response;
88
+ }
82
89
  response.status = payload.at("status").get_string();
83
90
 
84
91
  if (response.status != "success") {
@@ -104,11 +111,11 @@ make_response(std::error_code ec,
104
111
  }
105
112
  }
106
113
  if (dataset_exists) {
107
- response.ec = std::make_error_code(error::analytics_errc::dataset_exists);
114
+ response.ctx.ec = std::make_error_code(error::analytics_errc::dataset_exists);
108
115
  } else if (link_not_found) {
109
- response.ec = std::make_error_code(error::analytics_errc::link_not_found);
116
+ response.ctx.ec = std::make_error_code(error::analytics_errc::link_not_found);
110
117
  } else {
111
- response.ec = std::make_error_code(error::common_errc::internal_server_failure);
118
+ response.ctx.ec = std::make_error_code(error::common_errc::internal_server_failure);
112
119
  }
113
120
  }
114
121
  }
@@ -1,6 +1,6 @@
1
1
  /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
2
  /*
3
- * Copyright 2020 Couchbase, Inc.
3
+ * Copyright 2020-2021 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.
@@ -29,8 +29,7 @@ struct analytics_dataset_drop_response {
29
29
  std::string message;
30
30
  };
31
31
 
32
- std::string client_context_id;
33
- std::error_code ec;
32
+ error_context::http ctx;
34
33
  std::string status{};
35
34
  std::vector<problem> errors{};
36
35
  };
@@ -39,6 +38,7 @@ struct analytics_dataset_drop_request {
39
38
  using response_type = analytics_dataset_drop_response;
40
39
  using encoded_request_type = io::http_request;
41
40
  using encoded_response_type = io::http_response;
41
+ using error_context_type = error_context::http;
42
42
 
43
43
  static const inline service_type type = service_type::analytics;
44
44
 
@@ -50,7 +50,7 @@ struct analytics_dataset_drop_request {
50
50
 
51
51
  bool ignore_if_does_not_exist{ false };
52
52
 
53
- [[nodiscard]] std::error_code encode_to(encoded_request_type& encoded, http_context&)
53
+ [[nodiscard]] std::error_code encode_to(encoded_request_type& encoded, http_context& /* context */)
54
54
  {
55
55
  std::string if_exists_clause = ignore_if_does_not_exist ? "IF EXISTS" : "";
56
56
 
@@ -66,11 +66,19 @@ struct analytics_dataset_drop_request {
66
66
  };
67
67
 
68
68
  analytics_dataset_drop_response
69
- make_response(std::error_code ec, analytics_dataset_drop_request& request, analytics_dataset_drop_request::encoded_response_type&& encoded)
69
+ make_response(error_context::http&& ctx,
70
+ analytics_dataset_drop_request& /* request */,
71
+ analytics_dataset_drop_request::encoded_response_type&& encoded)
70
72
  {
71
- analytics_dataset_drop_response response{ request.client_context_id, ec };
72
- if (!ec) {
73
- auto payload = tao::json::from_string(encoded.body);
73
+ analytics_dataset_drop_response response{ ctx };
74
+ if (!response.ctx.ec) {
75
+ tao::json::value payload{};
76
+ try {
77
+ payload = tao::json::from_string(encoded.body);
78
+ } catch (tao::json::pegtl::parse_error& e) {
79
+ response.ctx.ec = std::make_error_code(error::common_errc::parsing_failure);
80
+ return response;
81
+ }
74
82
  response.status = payload.at("status").get_string();
75
83
 
76
84
  if (response.status != "success") {
@@ -92,9 +100,9 @@ make_response(std::error_code ec, analytics_dataset_drop_request& request, analy
92
100
  }
93
101
  }
94
102
  if (dataset_does_not_exist) {
95
- response.ec = std::make_error_code(error::analytics_errc::dataset_not_found);
103
+ response.ctx.ec = std::make_error_code(error::analytics_errc::dataset_not_found);
96
104
  } else {
97
- response.ec = std::make_error_code(error::common_errc::internal_server_failure);
105
+ response.ctx.ec = std::make_error_code(error::common_errc::internal_server_failure);
98
106
  }
99
107
  }
100
108
  }
@@ -1,6 +1,6 @@
1
1
  /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
2
  /*
3
- * Copyright 2020 Couchbase, Inc.
3
+ * Copyright 2020-2021 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.
@@ -36,8 +36,7 @@ struct analytics_dataset_get_all_response {
36
36
  std::string message;
37
37
  };
38
38
 
39
- std::string client_context_id;
40
- std::error_code ec;
39
+ error_context::http ctx;
41
40
  std::string status{};
42
41
  std::vector<dataset> datasets{};
43
42
  std::vector<problem> errors{};
@@ -47,13 +46,14 @@ struct analytics_dataset_get_all_request {
47
46
  using response_type = analytics_dataset_get_all_response;
48
47
  using encoded_request_type = io::http_request;
49
48
  using encoded_response_type = io::http_response;
49
+ using error_context_type = error_context::http;
50
50
 
51
51
  static const inline service_type type = service_type::analytics;
52
52
 
53
53
  std::string client_context_id{ uuid::to_string(uuid::random()) };
54
54
  std::chrono::milliseconds timeout{ timeout_defaults::management_timeout };
55
55
 
56
- [[nodiscard]] std::error_code encode_to(encoded_request_type& encoded, http_context&)
56
+ [[nodiscard]] std::error_code encode_to(encoded_request_type& encoded, http_context& /* context */)
57
57
  {
58
58
  tao::json::value body{
59
59
  { "statement", "SELECT d.* FROM Metadata.`Dataset` d WHERE d.DataverseName <> \"Metadata\"" },
@@ -67,14 +67,20 @@ struct analytics_dataset_get_all_request {
67
67
  };
68
68
 
69
69
  analytics_dataset_get_all_response
70
- make_response(std::error_code ec,
71
- analytics_dataset_get_all_request& request,
70
+ make_response(error_context::http&& ctx,
71
+ analytics_dataset_get_all_request& /* request */,
72
72
  analytics_dataset_get_all_request::encoded_response_type&& encoded)
73
73
  {
74
- analytics_dataset_get_all_response response{ request.client_context_id, ec };
74
+ analytics_dataset_get_all_response response{ ctx };
75
75
 
76
- if (!ec) {
77
- auto payload = tao::json::from_string(encoded.body);
76
+ if (!response.ctx.ec) {
77
+ tao::json::value payload{};
78
+ try {
79
+ payload = tao::json::from_string(encoded.body);
80
+ } catch (tao::json::pegtl::parse_error& e) {
81
+ response.ctx.ec = std::make_error_code(error::common_errc::parsing_failure);
82
+ return response;
83
+ }
78
84
  response.status = payload.at("status").get_string();
79
85
  if (response.status == "success") {
80
86
  auto* results = payload.find("results");
@@ -99,7 +105,7 @@ make_response(std::error_code ec,
99
105
  response.errors.emplace_back(err);
100
106
  }
101
107
  }
102
- response.ec = std::make_error_code(error::common_errc::internal_server_failure);
108
+ response.ctx.ec = std::make_error_code(error::common_errc::internal_server_failure);
103
109
  }
104
110
  }
105
111
  return response;
@@ -1,6 +1,6 @@
1
1
  /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
2
  /*
3
- * Copyright 2020 Couchbase, Inc.
3
+ * Copyright 2020-2021 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.
@@ -19,6 +19,7 @@
19
19
 
20
20
  #include <tao/json.hpp>
21
21
 
22
+ #include <error_context/http.hxx>
22
23
  #include <version.hxx>
23
24
 
24
25
  namespace couchbase::operations
@@ -29,8 +30,7 @@ struct analytics_dataverse_create_response {
29
30
  std::string message;
30
31
  };
31
32
 
32
- std::string client_context_id;
33
- std::error_code ec;
33
+ error_context::http ctx;
34
34
  std::string status{};
35
35
  std::vector<problem> errors{};
36
36
  };
@@ -39,6 +39,7 @@ struct analytics_dataverse_create_request {
39
39
  using response_type = analytics_dataverse_create_response;
40
40
  using encoded_request_type = io::http_request;
41
41
  using encoded_response_type = io::http_response;
42
+ using error_context_type = error_context::http;
42
43
 
43
44
  static const inline service_type type = service_type::analytics;
44
45
 
@@ -49,7 +50,7 @@ struct analytics_dataverse_create_request {
49
50
 
50
51
  bool ignore_if_exists{ false };
51
52
 
52
- [[nodiscard]] std::error_code encode_to(encoded_request_type& encoded, http_context&)
53
+ [[nodiscard]] std::error_code encode_to(encoded_request_type& encoded, http_context& /* context */)
53
54
  {
54
55
  std::string if_not_exists_clause = ignore_if_exists ? "IF NOT EXISTS" : "";
55
56
 
@@ -65,13 +66,19 @@ struct analytics_dataverse_create_request {
65
66
  };
66
67
 
67
68
  analytics_dataverse_create_response
68
- make_response(std::error_code ec,
69
- analytics_dataverse_create_request& request,
69
+ make_response(error_context::http&& ctx,
70
+ analytics_dataverse_create_request& /* request */,
70
71
  analytics_dataverse_create_request::encoded_response_type&& encoded)
71
72
  {
72
- analytics_dataverse_create_response response{ request.client_context_id, ec };
73
- if (!ec) {
74
- auto payload = tao::json::from_string(encoded.body);
73
+ analytics_dataverse_create_response response{ ctx };
74
+ if (!response.ctx.ec) {
75
+ tao::json::value payload{};
76
+ try {
77
+ payload = tao::json::from_string(encoded.body);
78
+ } catch (tao::json::pegtl::parse_error& e) {
79
+ response.ctx.ec = std::make_error_code(error::common_errc::parsing_failure);
80
+ return response;
81
+ }
75
82
  response.status = payload.at("status").get_string();
76
83
 
77
84
  if (response.status != "success") {
@@ -93,9 +100,9 @@ make_response(std::error_code ec,
93
100
  }
94
101
  }
95
102
  if (dataverse_exists) {
96
- response.ec = std::make_error_code(error::analytics_errc::dataverse_exists);
103
+ response.ctx.ec = std::make_error_code(error::analytics_errc::dataverse_exists);
97
104
  } else {
98
- response.ec = std::make_error_code(error::common_errc::internal_server_failure);
105
+ response.ctx.ec = std::make_error_code(error::common_errc::internal_server_failure);
99
106
  }
100
107
  }
101
108
  }
@@ -1,6 +1,6 @@
1
1
  /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
2
  /*
3
- * Copyright 2020 Couchbase, Inc.
3
+ * Copyright 2020-2021 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.
@@ -29,8 +29,7 @@ struct analytics_dataverse_drop_response {
29
29
  std::string message;
30
30
  };
31
31
 
32
- std::string client_context_id;
33
- std::error_code ec;
32
+ error_context::http ctx;
34
33
  std::string status{};
35
34
  std::vector<problem> errors{};
36
35
  };
@@ -39,6 +38,7 @@ struct analytics_dataverse_drop_request {
39
38
  using response_type = analytics_dataverse_drop_response;
40
39
  using encoded_request_type = io::http_request;
41
40
  using encoded_response_type = io::http_response;
41
+ using error_context_type = error_context::http;
42
42
 
43
43
  static const inline service_type type = service_type::analytics;
44
44
 
@@ -49,7 +49,7 @@ struct analytics_dataverse_drop_request {
49
49
 
50
50
  bool ignore_if_does_not_exist{ false };
51
51
 
52
- [[nodiscard]] std::error_code encode_to(encoded_request_type& encoded, http_context&)
52
+ [[nodiscard]] std::error_code encode_to(encoded_request_type& encoded, http_context& /* context */)
53
53
  {
54
54
  std::string if_exists_clause = ignore_if_does_not_exist ? "IF EXISTS" : "";
55
55
 
@@ -65,13 +65,19 @@ struct analytics_dataverse_drop_request {
65
65
  };
66
66
 
67
67
  analytics_dataverse_drop_response
68
- make_response(std::error_code ec,
69
- analytics_dataverse_drop_request& request,
68
+ make_response(error_context::http&& ctx,
69
+ analytics_dataverse_drop_request& /* request */,
70
70
  analytics_dataverse_drop_request::encoded_response_type&& encoded)
71
71
  {
72
- analytics_dataverse_drop_response response{ request.client_context_id, ec };
73
- if (!ec) {
74
- auto payload = tao::json::from_string(encoded.body);
72
+ analytics_dataverse_drop_response response{ ctx };
73
+ if (!response.ctx.ec) {
74
+ tao::json::value payload{};
75
+ try {
76
+ payload = tao::json::from_string(encoded.body);
77
+ } catch (tao::json::pegtl::parse_error& e) {
78
+ response.ctx.ec = std::make_error_code(error::common_errc::parsing_failure);
79
+ return response;
80
+ }
75
81
  response.status = payload.at("status").get_string();
76
82
 
77
83
  if (response.status != "success") {
@@ -93,9 +99,9 @@ make_response(std::error_code ec,
93
99
  }
94
100
  }
95
101
  if (dataverse_does_not_exist) {
96
- response.ec = std::make_error_code(error::analytics_errc::dataverse_not_found);
102
+ response.ctx.ec = std::make_error_code(error::analytics_errc::dataverse_not_found);
97
103
  } else {
98
- response.ec = std::make_error_code(error::common_errc::internal_server_failure);
104
+ response.ctx.ec = std::make_error_code(error::common_errc::internal_server_failure);
99
105
  }
100
106
  }
101
107
  }
@@ -1,6 +1,6 @@
1
1
  /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
2
  /*
3
- * Copyright 2020 Couchbase, Inc.
3
+ * Copyright 2020-2021 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.
@@ -19,6 +19,7 @@
19
19
 
20
20
  #include <tao/json.hpp>
21
21
 
22
+ #include <error_context/http.hxx>
22
23
  #include <version.hxx>
23
24
 
24
25
  namespace couchbase::operations
@@ -29,8 +30,7 @@ struct analytics_get_pending_mutations_response {
29
30
  std::string message;
30
31
  };
31
32
 
32
- std::string client_context_id;
33
- std::error_code ec;
33
+ error_context::http ctx;
34
34
  std::string status{};
35
35
  std::vector<problem> errors{};
36
36
  std::map<std::string, std::uint64_t> stats{};
@@ -40,13 +40,14 @@ struct analytics_get_pending_mutations_request {
40
40
  using response_type = analytics_get_pending_mutations_response;
41
41
  using encoded_request_type = io::http_request;
42
42
  using encoded_response_type = io::http_response;
43
+ using error_context_type = error_context::http;
43
44
 
44
45
  static const inline service_type type = service_type::analytics;
45
46
 
46
47
  std::string client_context_id{ uuid::to_string(uuid::random()) };
47
48
  std::chrono::milliseconds timeout{ timeout_defaults::management_timeout };
48
49
 
49
- [[nodiscard]] std::error_code encode_to(encoded_request_type& encoded, http_context&)
50
+ [[nodiscard]] std::error_code encode_to(encoded_request_type& encoded, http_context& /* context */)
50
51
  {
51
52
  encoded.method = "GET";
52
53
  encoded.path = "/analytics/node/agg/stats/remaining";
@@ -55,13 +56,19 @@ struct analytics_get_pending_mutations_request {
55
56
  };
56
57
 
57
58
  analytics_get_pending_mutations_response
58
- make_response(std::error_code ec,
59
- analytics_get_pending_mutations_request& request,
59
+ make_response(error_context::http&& ctx,
60
+ analytics_get_pending_mutations_request& /* request */,
60
61
  analytics_get_pending_mutations_request::encoded_response_type&& encoded)
61
62
  {
62
- analytics_get_pending_mutations_response response{ request.client_context_id, ec };
63
- if (!ec) {
64
- auto payload = tao::json::from_string(encoded.body);
63
+ analytics_get_pending_mutations_response response{ ctx };
64
+ if (!response.ctx.ec) {
65
+ tao::json::value payload{};
66
+ try {
67
+ payload = tao::json::from_string(encoded.body);
68
+ } catch (tao::json::pegtl::parse_error& e) {
69
+ response.ctx.ec = std::make_error_code(error::common_errc::parsing_failure);
70
+ return response;
71
+ }
65
72
  if (encoded.status_code == 200) {
66
73
  if (payload.is_object()) {
67
74
  for (const auto& entry : payload.get_object()) {
@@ -84,7 +91,7 @@ make_response(std::error_code ec,
84
91
  response.errors.emplace_back(err);
85
92
  }
86
93
  }
87
- response.ec = std::make_error_code(error::common_errc::internal_server_failure);
94
+ response.ctx.ec = std::make_error_code(error::common_errc::internal_server_failure);
88
95
  }
89
96
  return response;
90
97
  }