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
@@ -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
  }