couchbase 3.0.2 → 3.0.3

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 (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
@@ -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.
@@ -24,8 +24,7 @@
24
24
  namespace couchbase::operations
25
25
  {
26
26
  struct search_index_control_query_response {
27
- std::string client_context_id;
28
- std::error_code ec;
27
+ error_context::http ctx;
29
28
  std::string status{};
30
29
  std::string error{};
31
30
  };
@@ -34,6 +33,7 @@ struct search_index_control_query_request {
34
33
  using response_type = search_index_control_query_response;
35
34
  using encoded_request_type = io::http_request;
36
35
  using encoded_response_type = io::http_response;
36
+ using error_context_type = error_context::http;
37
37
 
38
38
  static const inline service_type type = service_type::search;
39
39
 
@@ -52,28 +52,40 @@ struct search_index_control_query_request {
52
52
  };
53
53
 
54
54
  search_index_control_query_response
55
- make_response(std::error_code ec,
56
- search_index_control_query_request& request,
55
+ make_response(error_context::http&& ctx,
56
+ search_index_control_query_request&,
57
57
  search_index_control_query_request::encoded_response_type&& encoded)
58
58
  {
59
- search_index_control_query_response response{ request.client_context_id, ec };
60
- if (!ec) {
59
+ search_index_control_query_response response{ ctx };
60
+ if (!response.ctx.ec) {
61
61
  if (encoded.status_code == 200) {
62
- auto payload = tao::json::from_string(encoded.body);
62
+ tao::json::value payload{};
63
+ try {
64
+ payload = tao::json::from_string(encoded.body);
65
+ } catch (tao::json::pegtl::parse_error& e) {
66
+ response.ctx.ec = std::make_error_code(error::common_errc::parsing_failure);
67
+ return response;
68
+ }
63
69
  response.status = payload.at("status").get_string();
64
70
  if (response.status == "ok") {
65
71
  return response;
66
72
  }
67
73
  } else if (encoded.status_code == 400) {
68
- auto payload = tao::json::from_string(encoded.body);
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
+ }
69
81
  response.status = payload.at("status").get_string();
70
82
  response.error = payload.at("error").get_string();
71
83
  if (response.error.find("index not found") != std::string::npos) {
72
- response.ec = std::make_error_code(error::common_errc::index_not_found);
84
+ response.ctx.ec = std::make_error_code(error::common_errc::index_not_found);
73
85
  return response;
74
86
  }
75
87
  }
76
- response.ec = std::make_error_code(error::common_errc::internal_server_failure);
88
+ response.ctx.ec = std::make_error_code(error::common_errc::internal_server_failure);
77
89
  }
78
90
  return response;
79
91
  }
@@ -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.
@@ -24,8 +24,7 @@
24
24
  namespace couchbase::operations
25
25
  {
26
26
  struct search_index_drop_response {
27
- std::string client_context_id;
28
- std::error_code ec;
27
+ error_context::http ctx;
29
28
  std::string status{};
30
29
  std::string error{};
31
30
  };
@@ -34,6 +33,7 @@ struct search_index_drop_request {
34
33
  using response_type = search_index_drop_response;
35
34
  using encoded_request_type = io::http_request;
36
35
  using encoded_response_type = io::http_response;
36
+ using error_context_type = error_context::http;
37
37
 
38
38
  static const inline service_type type = service_type::search;
39
39
 
@@ -51,26 +51,38 @@ struct search_index_drop_request {
51
51
  };
52
52
 
53
53
  search_index_drop_response
54
- make_response(std::error_code ec, search_index_drop_request& request, search_index_drop_request::encoded_response_type&& encoded)
54
+ make_response(error_context::http&& ctx, search_index_drop_request&, search_index_drop_request::encoded_response_type&& encoded)
55
55
  {
56
- search_index_drop_response response{ request.client_context_id, ec };
57
- if (!ec) {
56
+ search_index_drop_response response{ ctx };
57
+ if (!response.ctx.ec) {
58
58
  if (encoded.status_code == 200) {
59
- auto payload = tao::json::from_string(encoded.body);
59
+ tao::json::value payload{};
60
+ try {
61
+ payload = tao::json::from_string(encoded.body);
62
+ } catch (tao::json::pegtl::parse_error& e) {
63
+ response.ctx.ec = std::make_error_code(error::common_errc::parsing_failure);
64
+ return response;
65
+ }
60
66
  response.status = payload.at("status").get_string();
61
67
  if (response.status == "ok") {
62
68
  return response;
63
69
  }
64
70
  } else if (encoded.status_code == 400) {
65
- auto payload = tao::json::from_string(encoded.body);
71
+ tao::json::value payload{};
72
+ try {
73
+ payload = tao::json::from_string(encoded.body);
74
+ } catch (tao::json::pegtl::parse_error& e) {
75
+ response.ctx.ec = std::make_error_code(error::common_errc::parsing_failure);
76
+ return response;
77
+ }
66
78
  response.status = payload.at("status").get_string();
67
79
  response.error = payload.at("error").get_string();
68
80
  if (response.error.find("index not found") != std::string::npos) {
69
- response.ec = std::make_error_code(error::common_errc::index_not_found);
81
+ response.ctx.ec = std::make_error_code(error::common_errc::index_not_found);
70
82
  return response;
71
83
  }
72
84
  }
73
- response.ec = std::make_error_code(error::common_errc::internal_server_failure);
85
+ response.ctx.ec = std::make_error_code(error::common_errc::internal_server_failure);
74
86
  }
75
87
  return response;
76
88
  }
@@ -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.
@@ -25,8 +25,7 @@
25
25
  namespace couchbase::operations
26
26
  {
27
27
  struct search_index_get_response {
28
- std::string client_context_id;
29
- std::error_code ec;
28
+ error_context::http ctx;
30
29
  std::string status{};
31
30
  search_index index{};
32
31
  std::string error{};
@@ -36,6 +35,7 @@ struct search_index_get_request {
36
35
  using response_type = search_index_get_response;
37
36
  using encoded_request_type = io::http_request;
38
37
  using encoded_response_type = io::http_response;
38
+ using error_context_type = error_context::http;
39
39
 
40
40
  static const inline service_type type = service_type::search;
41
41
 
@@ -53,27 +53,39 @@ struct search_index_get_request {
53
53
  };
54
54
 
55
55
  search_index_get_response
56
- make_response(std::error_code ec, search_index_get_request& request, search_index_get_request::encoded_response_type&& encoded)
56
+ make_response(error_context::http&& ctx, search_index_get_request&, search_index_get_request::encoded_response_type&& encoded)
57
57
  {
58
- search_index_get_response response{ request.client_context_id, ec };
59
- if (!ec) {
58
+ search_index_get_response response{ ctx };
59
+ if (!response.ctx.ec) {
60
60
  if (encoded.status_code == 200) {
61
- auto payload = tao::json::from_string(encoded.body);
61
+ tao::json::value payload{};
62
+ try {
63
+ payload = tao::json::from_string(encoded.body);
64
+ } catch (tao::json::pegtl::parse_error& e) {
65
+ response.ctx.ec = std::make_error_code(error::common_errc::parsing_failure);
66
+ return response;
67
+ }
62
68
  response.status = payload.at("status").get_string();
63
69
  if (response.status == "ok") {
64
70
  response.index = payload.at("indexDef").as<search_index>();
65
71
  return response;
66
72
  }
67
73
  } else if (encoded.status_code == 400) {
68
- auto payload = tao::json::from_string(encoded.body);
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
+ }
69
81
  response.status = payload.at("status").get_string();
70
82
  response.error = payload.at("error").get_string();
71
83
  if (response.error.find("index not found") != std::string::npos) {
72
- response.ec = std::make_error_code(error::common_errc::index_not_found);
84
+ response.ctx.ec = std::make_error_code(error::common_errc::index_not_found);
73
85
  return response;
74
86
  }
75
87
  }
76
- response.ec = std::make_error_code(error::common_errc::internal_server_failure);
88
+ response.ctx.ec = std::make_error_code(error::common_errc::internal_server_failure);
77
89
  }
78
90
  return response;
79
91
  }
@@ -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.
@@ -25,8 +25,7 @@
25
25
  namespace couchbase::operations
26
26
  {
27
27
  struct search_index_get_all_response {
28
- std::string client_context_id;
29
- std::error_code ec;
28
+ error_context::http ctx;
30
29
  std::string status{};
31
30
  std::string impl_version{};
32
31
  std::vector<search_index> indexes{};
@@ -36,6 +35,7 @@ struct search_index_get_all_request {
36
35
  using response_type = search_index_get_all_response;
37
36
  using encoded_request_type = io::http_request;
38
37
  using encoded_response_type = io::http_response;
38
+ using error_context_type = error_context::http;
39
39
 
40
40
  static const inline service_type type = service_type::search;
41
41
 
@@ -53,12 +53,18 @@ struct search_index_get_all_request {
53
53
  };
54
54
 
55
55
  search_index_get_all_response
56
- make_response(std::error_code ec, search_index_get_all_request& request, search_index_get_all_request::encoded_response_type&& encoded)
56
+ make_response(error_context::http&& ctx, search_index_get_all_request&, search_index_get_all_request::encoded_response_type&& encoded)
57
57
  {
58
- search_index_get_all_response response{ request.client_context_id, ec };
59
- if (!ec) {
58
+ search_index_get_all_response response{ ctx };
59
+ if (!response.ctx.ec) {
60
60
  if (encoded.status_code == 200) {
61
- auto payload = tao::json::from_string(encoded.body);
61
+ tao::json::value payload{};
62
+ try {
63
+ payload = tao::json::from_string(encoded.body);
64
+ } catch (tao::json::pegtl::parse_error& e) {
65
+ response.ctx.ec = std::make_error_code(error::common_errc::parsing_failure);
66
+ return response;
67
+ }
62
68
  response.status = payload.at("status").get_string();
63
69
  if (response.status == "ok") {
64
70
  const auto* indexDefs = payload.find("indexDefs");
@@ -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.
@@ -24,8 +24,7 @@
24
24
  namespace couchbase::operations
25
25
  {
26
26
  struct search_index_get_documents_count_response {
27
- std::string client_context_id;
28
- std::error_code ec;
27
+ error_context::http ctx;
29
28
  std::string status{};
30
29
  std::uint64_t count{ 0 };
31
30
  std::string error{};
@@ -35,6 +34,7 @@ struct search_index_get_documents_count_request {
35
34
  using response_type = search_index_get_documents_count_response;
36
35
  using encoded_request_type = io::http_request;
37
36
  using encoded_response_type = io::http_response;
37
+ using error_context_type = error_context::http;
38
38
 
39
39
  static const inline service_type type = service_type::search;
40
40
 
@@ -52,16 +52,21 @@ struct search_index_get_documents_count_request {
52
52
  };
53
53
 
54
54
  search_index_get_documents_count_response
55
- make_response(std::error_code ec,
56
- search_index_get_documents_count_request& request,
55
+ make_response(error_context::http&& ctx,
56
+ search_index_get_documents_count_request&,
57
57
  search_index_get_documents_count_request::encoded_response_type&& encoded)
58
58
  {
59
- search_index_get_documents_count_response response{ request.client_context_id, ec };
60
- if (!ec) {
59
+ search_index_get_documents_count_response response{ ctx };
60
+ if (!response.ctx.ec) {
61
61
  switch (encoded.status_code) {
62
62
  case 200: {
63
-
64
- auto payload = tao::json::from_string(encoded.body);
63
+ tao::json::value payload{};
64
+ try {
65
+ payload = tao::json::from_string(encoded.body);
66
+ } catch (tao::json::pegtl::parse_error& e) {
67
+ response.ctx.ec = std::make_error_code(error::common_errc::parsing_failure);
68
+ return response;
69
+ }
65
70
  response.status = payload.at("status").get_string();
66
71
  if (response.status == "ok") {
67
72
  response.count = payload.at("count").get_unsigned();
@@ -70,19 +75,25 @@ make_response(std::error_code ec,
70
75
  } break;
71
76
  case 400:
72
77
  case 500: {
73
- auto payload = tao::json::from_string(encoded.body);
78
+ tao::json::value payload{};
79
+ try {
80
+ payload = tao::json::from_string(encoded.body);
81
+ } catch (tao::json::pegtl::parse_error& e) {
82
+ response.ctx.ec = std::make_error_code(error::common_errc::parsing_failure);
83
+ return response;
84
+ }
74
85
  response.status = payload.at("status").get_string();
75
86
  response.error = payload.at("error").get_string();
76
87
  if (response.error.find("index not found") != std::string::npos) {
77
- response.ec = std::make_error_code(error::common_errc::index_not_found);
88
+ response.ctx.ec = std::make_error_code(error::common_errc::index_not_found);
78
89
  return response;
79
90
  } else if (response.error.find("no planPIndexes for indexName") != std::string::npos) {
80
- response.ec = std::make_error_code(error::search_errc::index_not_ready);
91
+ response.ctx.ec = std::make_error_code(error::search_errc::index_not_ready);
81
92
  return response;
82
93
  }
83
94
  } break;
84
95
  }
85
- response.ec = std::make_error_code(error::common_errc::internal_server_failure);
96
+ response.ctx.ec = std::make_error_code(error::common_errc::internal_server_failure);
86
97
  }
87
98
  return response;
88
99
  }
@@ -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.
@@ -24,8 +24,7 @@
24
24
  namespace couchbase::operations
25
25
  {
26
26
  struct search_index_get_stats_response {
27
- std::string client_context_id;
28
- std::error_code ec;
27
+ error_context::http ctx;
29
28
  std::string status{};
30
29
  std::string error{};
31
30
  std::string stats{};
@@ -35,6 +34,7 @@ struct search_index_get_stats_request {
35
34
  using response_type = search_index_get_stats_response;
36
35
  using encoded_request_type = io::http_request;
37
36
  using encoded_response_type = io::http_response;
37
+ using error_context_type = error_context::http;
38
38
 
39
39
  static const inline service_type type = service_type::search;
40
40
 
@@ -52,29 +52,35 @@ struct search_index_get_stats_request {
52
52
  };
53
53
 
54
54
  search_index_get_stats_response
55
- make_response(std::error_code ec, search_index_get_stats_request& request, search_index_get_stats_request::encoded_response_type&& encoded)
55
+ make_response(error_context::http&& ctx, search_index_get_stats_request&, search_index_get_stats_request::encoded_response_type&& encoded)
56
56
  {
57
- search_index_get_stats_response response{ request.client_context_id, ec };
58
- if (!ec) {
57
+ search_index_get_stats_response response{ ctx };
58
+ if (!response.ctx.ec) {
59
59
  switch (encoded.status_code) {
60
60
  case 200:
61
61
  response.stats = encoded.body;
62
62
  return response;
63
63
  case 400:
64
64
  case 500: {
65
- auto payload = tao::json::from_string(encoded.body);
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
+ }
66
72
  response.status = payload.at("status").get_string();
67
73
  response.error = payload.at("error").get_string();
68
74
  if (response.error.find("index not found") != std::string::npos) {
69
- response.ec = std::make_error_code(error::common_errc::index_not_found);
75
+ response.ctx.ec = std::make_error_code(error::common_errc::index_not_found);
70
76
  return response;
71
77
  } else if (response.error.find("no planPIndexes for indexName") != std::string::npos) {
72
- response.ec = std::make_error_code(error::search_errc::index_not_ready);
78
+ response.ctx.ec = std::make_error_code(error::search_errc::index_not_ready);
73
79
  return response;
74
80
  }
75
81
  } break;
76
82
  }
77
- response.ec = std::make_error_code(error::common_errc::internal_server_failure);
83
+ response.ctx.ec = std::make_error_code(error::common_errc::internal_server_failure);
78
84
  }
79
85
  return response;
80
86
  }
@@ -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.
@@ -24,8 +24,7 @@
24
24
  namespace couchbase::operations
25
25
  {
26
26
  struct search_index_upsert_response {
27
- std::string client_context_id;
28
- std::error_code ec;
27
+ error_context::http ctx;
29
28
  std::string status{};
30
29
  std::string error{};
31
30
  };
@@ -34,6 +33,7 @@ struct search_index_upsert_request {
34
33
  using response_type = search_index_upsert_response;
35
34
  using encoded_request_type = io::http_request;
36
35
  using encoded_response_type = io::http_response;
36
+ using error_context_type = error_context::http;
37
37
 
38
38
  static const inline service_type type = service_type::search;
39
39
 
@@ -77,29 +77,41 @@ struct search_index_upsert_request {
77
77
  };
78
78
 
79
79
  search_index_upsert_response
80
- make_response(std::error_code ec, search_index_upsert_request& request, search_index_upsert_request::encoded_response_type&& encoded)
80
+ make_response(error_context::http&& ctx, search_index_upsert_request&, search_index_upsert_request::encoded_response_type&& encoded)
81
81
  {
82
- search_index_upsert_response response{ request.client_context_id, ec };
83
- if (!ec) {
82
+ search_index_upsert_response response{ ctx };
83
+ if (!response.ctx.ec) {
84
84
  if (encoded.status_code == 200) {
85
- auto payload = tao::json::from_string(encoded.body);
85
+ tao::json::value payload{};
86
+ try {
87
+ payload = tao::json::from_string(encoded.body);
88
+ } catch (tao::json::pegtl::parse_error& e) {
89
+ response.ctx.ec = std::make_error_code(error::common_errc::parsing_failure);
90
+ return response;
91
+ }
86
92
  response.status = payload.at("status").get_string();
87
93
  if (response.status == "ok") {
88
94
  return response;
89
95
  }
90
96
  } else if (encoded.status_code == 400) {
91
- auto payload = tao::json::from_string(encoded.body);
97
+ tao::json::value payload{};
98
+ try {
99
+ payload = tao::json::from_string(encoded.body);
100
+ } catch (tao::json::pegtl::parse_error& e) {
101
+ response.ctx.ec = std::make_error_code(error::common_errc::parsing_failure);
102
+ return response;
103
+ }
92
104
  response.status = payload.at("status").get_string();
93
105
  response.error = payload.at("error").get_string();
94
106
  if (response.error.find("index not found") != std::string::npos) {
95
- response.ec = std::make_error_code(error::common_errc::index_not_found);
107
+ response.ctx.ec = std::make_error_code(error::common_errc::index_not_found);
96
108
  return response;
97
109
  } else if (response.error.find("index with the same name already exists") != std::string::npos) {
98
- response.ec = std::make_error_code(error::common_errc::index_exists);
110
+ response.ctx.ec = std::make_error_code(error::common_errc::index_exists);
99
111
  return response;
100
112
  }
101
113
  }
102
- response.ec = std::make_error_code(error::common_errc::internal_server_failure);
114
+ response.ctx.ec = std::make_error_code(error::common_errc::internal_server_failure);
103
115
  }
104
116
  return response;
105
117
  }