couchbase 4.1.0 → 4.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. package/README.md +8 -0
  2. package/deps/couchbase-cxx-client/.github/workflows/linters.yml +2 -2
  3. package/deps/couchbase-cxx-client/.github/workflows/sanitizers.yml +18 -2
  4. package/deps/couchbase-cxx-client/.github/workflows/tests.yml +14 -34
  5. package/deps/couchbase-cxx-client/.github/workflows/windows.yml +13 -15
  6. package/deps/couchbase-cxx-client/CMakeLists.txt +6 -1
  7. package/deps/couchbase-cxx-client/bin/build-tests +3 -0
  8. package/deps/couchbase-cxx-client/bin/build-tests.rb +3 -0
  9. package/deps/couchbase-cxx-client/bin/init-cluster +1 -1
  10. package/deps/couchbase-cxx-client/bin/run-tests +1 -1
  11. package/deps/couchbase-cxx-client/cmake/StandardProjectSettings.cmake +1 -1
  12. package/deps/couchbase-cxx-client/couchbase/cluster.hxx +25 -6
  13. package/deps/couchbase-cxx-client/couchbase/io/mcbp_session.hxx +21 -7
  14. package/deps/couchbase-cxx-client/couchbase/meta/version.cxx +7 -0
  15. package/deps/couchbase-cxx-client/couchbase/operations/document_decrement.cxx +0 -3
  16. package/deps/couchbase-cxx-client/couchbase/operations/document_decrement.hxx +0 -1
  17. package/deps/couchbase-cxx-client/couchbase/operations/document_increment.cxx +0 -3
  18. package/deps/couchbase-cxx-client/couchbase/operations/document_increment.hxx +0 -1
  19. package/deps/couchbase-cxx-client/couchbase/operations/management/analytics_dataset_get_all.cxx +1 -1
  20. package/deps/couchbase-cxx-client/couchbase/operations/management/analytics_get_pending_mutations.cxx +1 -1
  21. package/deps/couchbase-cxx-client/couchbase/operations/management/analytics_get_pending_mutations.hxx +1 -1
  22. package/deps/couchbase-cxx-client/couchbase/operations/management/query_index_drop.cxx +4 -3
  23. package/deps/couchbase-cxx-client/couchbase/origin.hxx +10 -0
  24. package/deps/couchbase-cxx-client/couchbase/protocol/cmd_decrement.cxx +3 -8
  25. package/deps/couchbase-cxx-client/couchbase/protocol/cmd_decrement.hxx +0 -2
  26. package/deps/couchbase-cxx-client/couchbase/protocol/cmd_increment.cxx +0 -9
  27. package/deps/couchbase-cxx-client/couchbase/protocol/cmd_increment.hxx +0 -2
  28. package/deps/couchbase-cxx-client/couchbase/utils/json_streaming_lexer.cxx +6 -2
  29. package/deps/couchbase-cxx-client/test/test_integration_collections.cxx +4 -6
  30. package/deps/couchbase-cxx-client/test/test_integration_connect.cxx +4 -0
  31. package/deps/couchbase-cxx-client/test/test_integration_management.cxx +194 -138
  32. package/deps/couchbase-cxx-client/test/test_integration_query.cxx +26 -10
  33. package/deps/couchbase-cxx-client/test/test_unit_json_streaming_lexer.cxx +119 -0
  34. package/deps/couchbase-cxx-client/test/utils/integration_test_guard.cxx +1 -1
  35. package/deps/couchbase-cxx-client/test/utils/server_version.cxx +2 -1
  36. package/deps/couchbase-cxx-client/test/utils/server_version.hxx +22 -4
  37. package/deps/couchbase-cxx-client/test/utils/test_context.cxx +11 -1
  38. package/deps/couchbase-cxx-client/test/utils/test_context.hxx +1 -0
  39. package/deps/couchbase-transactions-cxx/CMakeLists.txt +2 -2
  40. package/deps/couchbase-transactions-cxx/deps/couchbase-cxx-client/couchbase/{management/design_document_fmt.hxx → design_document_namespace_fmt.hxx} +5 -5
  41. package/deps/couchbase-transactions-cxx/deps/couchbase-cxx-client/couchbase/operations/management/query_index_get_all.cxx +26 -16
  42. package/deps/couchbase-transactions-cxx/include/couchbase/transactions/durability_level.hxx +15 -0
  43. package/deps/couchbase-transactions-cxx/include/couchbase/transactions.hxx +2 -6
  44. package/deps/couchbase-transactions-cxx/src/transactions/attempt_context_impl.cxx +1 -1
  45. package/deps/couchbase-transactions-cxx/src/transactions/logging.cxx +20 -17
  46. package/deps/couchbase-transactions-cxx/tests/transactions/simple_t.cpp +22 -0
  47. package/deps/couchbase-transactions-cxx/tests/transactions/transactions_env.h +1 -1
  48. package/dist/binding.d.ts +0 -2
  49. package/dist/collection.js +0 -2
  50. package/dist/httpexecutor.d.ts +1 -0
  51. package/package.json +1 -1
  52. package/src/jstocbpp_autogen.hpp +3 -9
  53. package/deps/couchbase-cxx-client/.github/workflows/benchmarks.yml +0 -94
  54. package/deps/couchbase-transactions-cxx/deps/couchbase-cxx-client/.github/workflows/benchmarks.yml +0 -94
package/README.md CHANGED
@@ -85,6 +85,14 @@ respectively.
85
85
  Finally, to build the API reference for the project, run `make docs` from the
86
86
  root directory, and a docs folder will be created with the api reference.
87
87
 
88
+ # Support & Additional Resources
89
+
90
+ If you found an issue, please file it in our [JIRA](https://issues.couchbase.com/projects/JSCBC/issues/).
91
+
92
+ The Couchbase Discord server is a place where you can collaborate about all things Couchbase. Connect with others from the community, learn tips and tricks, and ask questions. [Join Discord and contribute](https://discord.com/invite/sQ5qbPZuTh).
93
+
94
+ You can ask questions in our [forums](https://forums.couchbase.com/).
95
+
88
96
  ## License
89
97
 
90
98
  Copyright 2013 Couchbase Inc.
@@ -2,9 +2,9 @@ name: linters
2
2
 
3
3
  on:
4
4
  push:
5
- branches: [ master ]
5
+ branches: [ main ]
6
6
  pull_request:
7
- branches: [ master ]
7
+ branches: [ main ]
8
8
 
9
9
  jobs:
10
10
  clang_format:
@@ -2,9 +2,9 @@ name: sanitizers
2
2
 
3
3
  on:
4
4
  push:
5
- branches: [master]
5
+ branches: [main]
6
6
  pull_request:
7
- branches: [master]
7
+ branches: [main]
8
8
 
9
9
  jobs:
10
10
  address:
@@ -29,6 +29,10 @@ jobs:
29
29
  submodules: recursive
30
30
  - name: Initialize couchbase
31
31
  run: ./bin/init-cluster
32
+ - name: ccache
33
+ uses: hendrikmuhs/ccache-action@v1.2
34
+ with:
35
+ key: ${{ github.job }}
32
36
  - name: Build tests
33
37
  env:
34
38
  CB_SANITIZER: asan
@@ -68,6 +72,10 @@ jobs:
68
72
  submodules: recursive
69
73
  - name: Initialize couchbase
70
74
  run: ./bin/init-cluster
75
+ - name: ccache
76
+ uses: hendrikmuhs/ccache-action@v1.2
77
+ with:
78
+ key: ${{ github.job }}
71
79
  - name: Build tests
72
80
  env:
73
81
  CB_SANITIZER: lsan
@@ -107,6 +115,10 @@ jobs:
107
115
  submodules: recursive
108
116
  - name: Initialize couchbase
109
117
  run: ./bin/init-cluster
118
+ - name: ccache
119
+ uses: hendrikmuhs/ccache-action@v1.2
120
+ with:
121
+ key: ${{ github.job }}
110
122
  - name: Build tests
111
123
  env:
112
124
  CB_SANITIZER: ubsan
@@ -146,6 +158,10 @@ jobs:
146
158
  submodules: recursive
147
159
  - name: Initialize couchbase
148
160
  run: ./bin/init-cluster
161
+ - name: ccache
162
+ uses: hendrikmuhs/ccache-action@v1.2
163
+ with:
164
+ key: ${{ github.job }}
149
165
  - name: Build tests
150
166
  env:
151
167
  CB_SANITIZER: tsan
@@ -2,16 +2,22 @@ name: tests
2
2
 
3
3
  on:
4
4
  push:
5
- branches: [master]
5
+ branches: [main]
6
6
  pull_request:
7
- branches: [master]
7
+ branches: [main]
8
8
 
9
9
  jobs:
10
- cheshire_cat:
10
+ test:
11
+ strategy:
12
+ matrix:
13
+ server:
14
+ - 7.1.0
15
+ - 7.0.3
16
+ - 6.6.5
11
17
  runs-on: ubuntu-20.04
12
18
  services:
13
19
  couchbase:
14
- image: couchbase:enterprise-7.0.3
20
+ image: couchbase:enterprise-${{ matrix.server }}
15
21
  ports:
16
22
  - 8091-8096:8091-8096
17
23
  - 11210:11210
@@ -25,36 +31,10 @@ jobs:
25
31
  submodules: recursive
26
32
  - name: Initialize couchbase
27
33
  run: ./bin/init-cluster
28
- - name: Build tests
29
- run: ./bin/build-tests
30
- - name: Check couchbase
31
- run: ./bin/check-cluster
32
- - name: Run tests
33
- timeout-minutes: 15
34
- env:
35
- TEST_SERVER_VERSION: 7.0.3
36
- TEST_CONNECTION_STRING: couchbase://127.0.0.1
37
- TEST_LOG_LEVEL: trace
38
- run: ./bin/run-tests
39
-
40
- mad_hatter:
41
- runs-on: ubuntu-20.04
42
- services:
43
- couchbase:
44
- image: couchbase:enterprise-6.6.4
45
- ports:
46
- - 8091-8096:8091-8096
47
- - 11210:11210
48
- steps:
49
- - name: Install build environment
50
- run: |
51
- sudo apt-get update -y
52
- sudo apt-get install -y libssl-dev cmake gcc g++ curl
53
- - uses: actions/checkout@v2
34
+ - name: ccache
35
+ uses: hendrikmuhs/ccache-action@v1.2
54
36
  with:
55
- submodules: recursive
56
- - name: Initialize couchbase
57
- run: ./bin/init-cluster
37
+ key: ${{ github.job }}
58
38
  - name: Build tests
59
39
  run: ./bin/build-tests
60
40
  - name: Check couchbase
@@ -62,7 +42,7 @@ jobs:
62
42
  - name: Run tests
63
43
  timeout-minutes: 15
64
44
  env:
65
- TEST_SERVER_VERSION: 6.6.4
45
+ TEST_SERVER_VERSION: ${{ matrix.server }}
66
46
  TEST_CONNECTION_STRING: couchbase://127.0.0.1
67
47
  TEST_LOG_LEVEL: trace
68
48
  run: ./bin/run-tests
@@ -2,13 +2,16 @@ name: windows
2
2
 
3
3
  on:
4
4
  push:
5
- branches: [master]
5
+ branches: [main]
6
6
  pull_request:
7
- branches: [master]
7
+ branches: [main]
8
8
 
9
9
  jobs:
10
- vs22:
11
- runs-on: windows-2022
10
+ build:
11
+ strategy:
12
+ matrix:
13
+ os: [windows-2022, windows-2019]
14
+ runs-on: ${{ matrix.os }}
12
15
  steps:
13
16
  - name: Install build environment
14
17
  run: |
@@ -16,17 +19,12 @@ jobs:
16
19
  - uses: actions/checkout@v2
17
20
  with:
18
21
  submodules: recursive
19
- - name: Build tests
20
- run: ruby ./bin/build-tests.rb
21
-
22
- vs19:
23
- runs-on: windows-2019
24
- steps:
25
- - name: Install build environment
26
- run: |
27
- choco install --no-progress openssl
28
- - uses: actions/checkout@v2
22
+ - name: ccache
23
+ uses: hendrikmuhs/ccache-action@v1.2
29
24
  with:
30
- submodules: recursive
25
+ key: ${{ github.job }}-${{ matrix.os }}
26
+ variant: sccache
31
27
  - name: Build tests
28
+ env:
29
+ CB_CACHE_OPTION: sccache
32
30
  run: ruby ./bin/build-tests.rb
@@ -101,7 +101,12 @@ target_include_directories(
101
101
  target_link_libraries(couchbase_cxx_client PRIVATE project_options project_warnings)
102
102
 
103
103
  include(cmake/DetectStandardFilesystem.cmake)
104
- couchbase_cxx_check_filesystem(couchbase_cxx_client "filesystem" "std::filesystem" "stdc++fs;c++fs" STD_FILESYSTEM)
104
+ couchbase_cxx_check_filesystem(
105
+ couchbase_cxx_client
106
+ "filesystem"
107
+ "std::filesystem"
108
+ "stdc++fs;c++fs"
109
+ STD_FILESYSTEM)
105
110
  if(STD_FILESYSTEM)
106
111
  message(STATUS "Using std::filesystem")
107
112
  else()
@@ -32,12 +32,14 @@ CB_CC=${CB_CC:-$(which ${CB_DEFAULT_CC})}
32
32
  CB_CXX=${CB_CXX:-$(which ${CB_DEFAULT_CXX})}
33
33
  CB_NUMBER_OF_JOBS=${CB_NUMBER_OF_JOBS:-1}
34
34
  CB_CMAKE_BUILD_TYPE=${CB_CMAKE_BUILD_TYPE:-Debug}
35
+ CB_CACHE_OPTION=${CB_CACHE_OPTION:-ccache}
35
36
 
36
37
  echo "CB_CMAKE=${CB_CMAKE}"
37
38
  echo "CB_CC=${CB_CC}"
38
39
  echo "CB_CXX=${CB_CXX}"
39
40
  echo "CB_NUMBER_OF_JOBS=${CB_NUMBER_OF_JOBS}"
40
41
  echo "CB_CMAKE_BUILD_TYPE=${CB_CMAKE_BUILD_TYPE}"
42
+ echo "CB_CACHE_OPTION=${CB_CACHE_OPTION}"
41
43
 
42
44
  CB_CMAKE_EXTRAS=
43
45
  case "${CB_SANITIZER}" in
@@ -79,6 +81,7 @@ ${CB_CMAKE} \
79
81
  -DCMAKE_CXX_COMPILER="${CB_CXX}" \
80
82
  -DCOUCHBASE_CXX_CLIENT_BUILD_TESTS=ON \
81
83
  -DCOUCHBASE_CXX_CLIENT_BUILD_SHARED=ON \
84
+ -DCACHE_OPTION="${CB_CACHE_OPTION}" \
82
85
  ${CB_CMAKE_EXTRAS} \
83
86
  -B "${BUILD_DIR}" \
84
87
  -S "${PROJECT_ROOT}"
@@ -48,6 +48,7 @@ CB_CC = ENV.fetch("CB_CC", which(CB_DEFAULT_CC))
48
48
  CB_CXX = ENV.fetch("CB_CXX", which(CB_DEFAULT_CXX))
49
49
  CB_NUMBER_OF_JOBS = ENV.fetch("CB_NUMBER_OF_JOBS", "1").to_i
50
50
  CB_CMAKE_BUILD_TYPE = ENV.fetch("CB_CMAKE_BUILD_TYPE", "Debug")
51
+ CB_CACHE_OPTION = ENV.fetch("CB_CACHE_OPTION", "ccache")
51
52
 
52
53
  puts "RUBY_PLATFORM=#{RUBY_PLATFORM}"
53
54
  puts "CB_CMAKE=#{CB_CMAKE}"
@@ -58,6 +59,7 @@ if RUBY_PLATFORM !~ /mswin|mingw/
58
59
  puts "CB_CC=#{CB_CC}"
59
60
  puts "CB_CXX=#{CB_CXX}"
60
61
  end
62
+ puts "CB_CACHE_OPTION=#{CB_CACHE_OPTION}"
61
63
 
62
64
  CB_CMAKE_EXTRAS = []
63
65
  case CB_SANITIZER
@@ -91,6 +93,7 @@ Dir.chdir(BUILD_DIR) do
91
93
  run(CB_CMAKE,
92
94
  "-DCMAKE_BUILD_TYPE=#{CB_CMAKE_BUILD_TYPE}",
93
95
  "-DCOUCHBASE_CXX_CLIENT_BUILD_TESTS=ON",
96
+ "-DCACHE_OPTION=#{CB_CACHE_OPTION}",
94
97
  *CB_CMAKE_EXTRAS,
95
98
  "-B", BUILD_DIR,
96
99
  "-S", PROJECT_ROOT)
@@ -30,7 +30,7 @@ options = {
30
30
  username: ENV.fetch("CB_USERNAME", "Administrator"),
31
31
  password: ENV.fetch("CB_PASSWORD", "password"),
32
32
  bucket: ENV.fetch("CB_BUCKET", "default"),
33
- server_quota: ENV.fetch("CB_SERVER_QUOTA", 1024).to_i,
33
+ server_quota: ENV.fetch("CB_SERVER_QUOTA", 2048).to_i,
34
34
  index_quota: ENV.fetch("CB_INDEX_QUOTA", 256).to_i,
35
35
  bucket_quota: ENV.fetch("CB_BUCKET_QUOTA", 256).to_i,
36
36
  enable_developer_preview: ENV.fetch("CB_DEVELOPER_PREVIEW", false).to_b,
@@ -30,4 +30,4 @@ fi
30
30
 
31
31
  cd "${BUILD_DIR}"
32
32
 
33
- ${CB_CTEST} --output-on-failure --label-regex 'integration|unit'
33
+ ${CB_CTEST} --output-on-failure --label-regex 'integration|unit' --output-junit results.xml
@@ -39,7 +39,7 @@ else()
39
39
  message(STATUS "No colored compiler diagnostic set for '${CMAKE_CXX_COMPILER_ID}' compiler.")
40
40
  endif()
41
41
 
42
- if(WIN32)
42
+ if(MSVC)
43
43
  add_definitions(/bigobj)
44
44
  endif()
45
45
 
@@ -49,6 +49,14 @@ class cluster : public std::enable_shared_from_this<cluster>
49
49
  return std::shared_ptr<cluster>(new cluster(ctx));
50
50
  }
51
51
 
52
+ [[nodiscard]] std::pair<std::error_code, couchbase::origin> origin() const
53
+ {
54
+ if (stopped_) {
55
+ return { error::network_errc::cluster_closed, {} };
56
+ }
57
+ return { {}, origin_ };
58
+ }
59
+
52
60
  template<typename Handler>
53
61
  void open(const couchbase::origin& origin, Handler&& handler)
54
62
  {
@@ -289,21 +297,32 @@ class cluster : public std::enable_shared_from_this<cluster>
289
297
  {
290
298
  // Warn users if they attempt to use Capella without TLS being enabled.
291
299
  {
292
- bool is_capella = false;
300
+ bool has_capella_host = false;
301
+ bool has_non_capella_host = false;
293
302
  static std::string suffix = "cloud.couchbase.com";
294
- auto nodes_list = origin_.get_nodes();
295
- for (auto& node : nodes_list) {
303
+ for (const auto& node : origin_.get_hostnames()) {
296
304
  if (auto pos = node.find(suffix); pos != std::string::npos && pos + suffix.size() == node.size()) {
297
- is_capella = true;
298
- break;
305
+ has_capella_host = true;
306
+ } else {
307
+ has_non_capella_host = true;
299
308
  }
300
309
  }
301
310
 
302
- if (is_capella && !origin_.options().enable_tls) {
311
+ if (has_capella_host && !origin_.options().enable_tls) {
303
312
  LOG_WARNING("[{}]: TLS is required when connecting to Couchbase Capella. Please enable TLS by prefixing "
304
313
  "the connection string with \"couchbases://\" (note the final 's').",
305
314
  id_);
306
315
  }
316
+
317
+ if (origin_.options().enable_tls /* TLS is enabled */
318
+ && origin_.options().trust_certificate.empty() /* No CA certificate (or other SDK-specific trust source) is specified */
319
+ && origin_.options().tls_verify != tls_verify_mode::none /* The user did not disable all TLS verification */
320
+ && has_non_capella_host /* The connection string has a hostname that does NOT end in ".cloud.couchbase.com" */) {
321
+ LOG_ERROR("[{}] When TLS is enabled, the cluster options must specify certificate(s) to trust. (Unless connecting to "
322
+ "cloud.couchbase.com.)",
323
+ id_);
324
+ return handler(error::common_errc::invalid_argument);
325
+ }
307
326
  }
308
327
 
309
328
  if (origin_.options().enable_tls) {
@@ -405,7 +405,9 @@ class mcbp_session : public std::enable_shared_from_this<mcbp_session>
405
405
  }
406
406
  };
407
407
 
408
- class normal_handler : public message_handler
408
+ class normal_handler
409
+ : public message_handler
410
+ , public std::enable_shared_from_this<normal_handler>
409
411
  {
410
412
  private:
411
413
  std::shared_ptr<mcbp_session> session_;
@@ -413,11 +415,18 @@ class mcbp_session : public std::enable_shared_from_this<mcbp_session>
413
415
  std::atomic_bool stopped_{ false };
414
416
 
415
417
  public:
416
- ~normal_handler() override = default;
418
+ ~normal_handler() override
419
+ {
420
+ stop();
421
+ }
417
422
 
418
423
  explicit normal_handler(std::shared_ptr<mcbp_session> session)
419
424
  : session_(session)
420
425
  , heartbeat_timer_(session_->ctx_)
426
+ {
427
+ }
428
+
429
+ void start()
421
430
  {
422
431
  if (session_->supports_gcccp_) {
423
432
  fetch_config({});
@@ -559,11 +568,11 @@ class mcbp_session : public std::enable_shared_from_this<mcbp_session>
559
568
  req.opaque(session_->next_opaque());
560
569
  session_->write_and_flush(req.data());
561
570
  heartbeat_timer_.expires_after(std::chrono::milliseconds(2500));
562
- heartbeat_timer_.async_wait([this](std::error_code e) {
571
+ heartbeat_timer_.async_wait([self = shared_from_this()](std::error_code e) {
563
572
  if (e == asio::error::operation_aborted) {
564
573
  return;
565
574
  }
566
- fetch_config(e);
575
+ self->fetch_config(e);
567
576
  });
568
577
  }
569
578
  };
@@ -782,6 +791,7 @@ class mcbp_session : public std::enable_shared_from_this<mcbp_session>
782
791
  }
783
792
  if (handler_) {
784
793
  handler_->stop();
794
+ handler_ = nullptr;
785
795
  }
786
796
  {
787
797
  std::scoped_lock lock(command_handlers_mutex_);
@@ -1053,7 +1063,11 @@ class mcbp_session : public std::enable_shared_from_this<mcbp_session>
1053
1063
  return stop(retry_reason::node_not_available);
1054
1064
  }
1055
1065
  state_ = diag::endpoint_state::connected;
1056
- handler_ = std::make_unique<normal_handler>(shared_from_this());
1066
+ {
1067
+ auto handler = std::make_shared<normal_handler>(shared_from_this());
1068
+ handler->start();
1069
+ handler_ = handler;
1070
+ }
1057
1071
  std::scoped_lock lock(pending_buffer_mutex_);
1058
1072
  bootstrapped_ = true;
1059
1073
  if (!pending_buffer_.empty()) {
@@ -1149,7 +1163,7 @@ class mcbp_session : public std::enable_shared_from_this<mcbp_session>
1149
1163
  bootstrap_hostname_,
1150
1164
  endpoint_address_,
1151
1165
  endpoint_.port());
1152
- handler_ = std::make_unique<bootstrap_handler>(shared_from_this());
1166
+ handler_ = std::make_shared<bootstrap_handler>(shared_from_this());
1153
1167
  connection_deadline_.expires_at(asio::steady_timer::time_point::max());
1154
1168
  connection_deadline_.cancel();
1155
1169
  }
@@ -1271,7 +1285,7 @@ class mcbp_session : public std::enable_shared_from_this<mcbp_session>
1271
1285
  couchbase::origin origin_;
1272
1286
  std::optional<std::string> bucket_name_;
1273
1287
  mcbp_parser parser_;
1274
- std::unique_ptr<message_handler> handler_;
1288
+ std::shared_ptr<message_handler> handler_;
1275
1289
  utils::movable_function<void(std::error_code, const topology::configuration&)> bootstrap_handler_{};
1276
1290
  std::mutex command_handlers_mutex_{};
1277
1291
  std::map<uint32_t, utils::movable_function<void(std::error_code, retry_reason, io::mcbp_message&&)>> command_handlers_{};
@@ -88,6 +88,13 @@ sdk_build_info()
88
88
  #elif defined(SSLEAY_VERSION)
89
89
  info["openssl_runtime"] = SSLeay_version(SSLEAY_VERSION);
90
90
  #endif
91
+ info["__cplusplus"] = fmt::format("{}", __cplusplus);
92
+ #if defined(_MSC_VER)
93
+ info["_MSC_VER"] = fmt::format("{}", _MSC_VER);
94
+ #endif
95
+ #if defined(__GLIBC__)
96
+ info["libc"] = fmt::format("glibc {}.{}", __GLIBC__, __GLIBC_MINOR__);
97
+ #endif
91
98
 
92
99
  return info;
93
100
  }
@@ -35,9 +35,6 @@ decrement_request::encode_to(decrement_request::encoded_request_type& encoded, m
35
35
  encoded.body().initial_value(0);
36
36
  encoded.body().expiry(0xffff'ffff);
37
37
  }
38
- if (preserve_expiry) {
39
- encoded.body().preserve_expiry();
40
- }
41
38
  return {};
42
39
  }
43
40
 
@@ -50,7 +50,6 @@ struct decrement_request {
50
50
  protocol::durability_level durability_level{ protocol::durability_level::none };
51
51
  std::optional<std::chrono::milliseconds> timeout{};
52
52
  io::retry_context<io::retry_strategy::best_effort> retries{ false };
53
- bool preserve_expiry{ false };
54
53
 
55
54
  [[nodiscard]] std::error_code encode_to(encoded_request_type& encoded, mcbp_context&& context) const;
56
55
 
@@ -35,9 +35,6 @@ increment_request::encode_to(increment_request::encoded_request_type& encoded, m
35
35
  encoded.body().initial_value(0);
36
36
  encoded.body().expiry(0xffff'ffff);
37
37
  }
38
- if (preserve_expiry) {
39
- encoded.body().preserve_expiry();
40
- }
41
38
  return {};
42
39
  }
43
40
 
@@ -50,7 +50,6 @@ struct increment_request {
50
50
  protocol::durability_level durability_level{ protocol::durability_level::none };
51
51
  std::optional<std::chrono::milliseconds> timeout{};
52
52
  io::retry_context<io::retry_strategy::best_effort> retries{ false };
53
- bool preserve_expiry{ false };
54
53
 
55
54
  [[nodiscard]] std::error_code encode_to(encoded_request_type& encoded, mcbp_context&& context) const;
56
55
 
@@ -27,7 +27,7 @@ std::error_code
27
27
  analytics_dataset_get_all_request::encode_to(encoded_request_type& encoded, http_context& /* context */) const
28
28
  {
29
29
  tao::json::value body{
30
- { "statement", "SELECT d.* FROM Metadata.`Dataset` d WHERE d.DataverseName <> \"Metadata\"" },
30
+ { "statement", R"(SELECT d.* FROM Metadata.`Dataset` d WHERE d.DataverseName <> "Metadata" AND d.DatasetType = "INTERNAL")" },
31
31
  };
32
32
  encoded.headers["content-type"] = "application/json";
33
33
  encoded.method = "POST";
@@ -47,7 +47,7 @@ analytics_get_pending_mutations_request::make_response(error_context::http&& ctx
47
47
  if (payload.is_object()) {
48
48
  for (const auto& [dataverse, entry] : payload.get_object()) {
49
49
  for (const auto& [dataset, counter] : entry.get_object()) {
50
- response.stats.try_emplace(fmt::format("{}.{}", dataverse, dataset), counter.get_unsigned());
50
+ response.stats.try_emplace(fmt::format("{}.{}", dataverse, dataset), counter.as<std::int64_t>());
51
51
  }
52
52
  }
53
53
  }
@@ -30,7 +30,7 @@ struct analytics_get_pending_mutations_response {
30
30
  error_context::http ctx;
31
31
  std::string status{};
32
32
  std::vector<analytics_problem> errors{};
33
- std::map<std::string, std::uint64_t> stats{};
33
+ std::map<std::string, std::int64_t> stats{};
34
34
  };
35
35
 
36
36
  struct analytics_get_pending_mutations_request {
@@ -39,13 +39,14 @@ query_index_drop_request::encode_to(encoded_request_type& encoded, http_context&
39
39
  }
40
40
 
41
41
  std::string drop_index_stmt;
42
- if (!scope_name.empty() || !collection_name.empty()) {
42
+ if (is_primary && index_name.empty()) {
43
+ drop_index_stmt = fmt::format(R"(DROP PRIMARY INDEX ON {} USING GSI)", keyspace);
44
+ } else if (!scope_name.empty() || !collection_name.empty()) {
43
45
  drop_index_stmt = fmt::format(R"(DROP INDEX `{}` ON {} USING GSI)", index_name, keyspace);
44
46
  } else {
45
47
  drop_index_stmt = fmt::format(R"(DROP INDEX {}.`{}` USING GSI)", keyspace, index_name);
46
48
  }
47
- tao::json::value body{ { "statement", is_primary ? fmt::format(R"(DROP PRIMARY INDEX ON {} USING GSI)", keyspace) : drop_index_stmt },
48
- { "client_context_id", encoded.client_context_id } };
49
+ tao::json::value body{ { "statement", drop_index_stmt }, { "client_context_id", encoded.client_context_id } };
49
50
  encoded.method = "POST";
50
51
  encoded.path = "/query/service";
51
52
  encoded.body = utils::json::generate(body);
@@ -118,6 +118,16 @@ struct origin {
118
118
  return credentials_.key_path;
119
119
  }
120
120
 
121
+ [[nodiscard]] std::vector<std::string> get_hostnames() const
122
+ {
123
+ std::vector<std::string> res;
124
+ res.reserve(nodes_.size());
125
+ for (const auto& [hostname, _] : nodes_) {
126
+ res.emplace_back(hostname);
127
+ }
128
+ return res;
129
+ }
130
+
121
131
  [[nodiscard]] std::vector<std::string> get_nodes() const
122
132
  {
123
133
  std::vector<std::string> res;
@@ -54,6 +54,7 @@ decrement_response_body::parse(protocol::status status,
54
54
  }
55
55
  return false;
56
56
  }
57
+
57
58
  void
58
59
  decrement_request_body::id(const document_id& id)
59
60
  {
@@ -63,6 +64,7 @@ decrement_request_body::id(const document_id& id)
63
64
  key_.insert(0, encoded.get());
64
65
  }
65
66
  }
67
+
66
68
  void
67
69
  decrement_request_body::durability(protocol::durability_level level, std::optional<std::uint16_t> timeout)
68
70
  {
@@ -83,14 +85,7 @@ decrement_request_body::durability(protocol::durability_level level, std::option
83
85
  framing_extras_[extras_size + 1] = static_cast<std::uint8_t>(level);
84
86
  }
85
87
  }
86
- void
87
- decrement_request_body::preserve_expiry()
88
- {
89
- auto frame_id = static_cast<uint8_t>(protocol::request_frame_info_id::preserve_ttl);
90
- auto extras_size = framing_extras_.size();
91
- framing_extras_.resize(extras_size + 1);
92
- framing_extras_[extras_size + 0] = static_cast<std::uint8_t>(static_cast<std::uint32_t>(frame_id) << 4U | 0U);
93
- }
88
+
94
89
  void
95
90
  decrement_request_body::fill_extras()
96
91
  {
@@ -91,8 +91,6 @@ class decrement_request_body
91
91
 
92
92
  void durability(protocol::durability_level level, std::optional<std::uint16_t> timeout);
93
93
 
94
- void preserve_expiry();
95
-
96
94
  [[nodiscard]] const std::string& key() const
97
95
  {
98
96
  return key_;
@@ -87,15 +87,6 @@ increment_request_body::durability(protocol::durability_level level, std::option
87
87
  }
88
88
  }
89
89
 
90
- void
91
- increment_request_body::preserve_expiry()
92
- {
93
- auto frame_id = static_cast<uint8_t>(protocol::request_frame_info_id::preserve_ttl);
94
- auto extras_size = framing_extras_.size();
95
- framing_extras_.resize(extras_size + 1);
96
- framing_extras_[extras_size + 0] = static_cast<std::uint8_t>(static_cast<std::uint32_t>(frame_id) << 4U | 0U);
97
- }
98
-
99
90
  void
100
91
  increment_request_body::fill_extras()
101
92
  {
@@ -91,8 +91,6 @@ class increment_request_body
91
91
 
92
92
  void durability(protocol::durability_level level, std::optional<std::uint16_t> timeout);
93
93
 
94
- void preserve_expiry();
95
-
96
94
  [[nodiscard]] const std::string& key() const
97
95
  {
98
96
  return key_;
@@ -39,7 +39,7 @@ noop_on_row(std::string&& /* row */)
39
39
  }
40
40
 
41
41
  #define STATE_MARKER_ROOT (reinterpret_cast<void*>(1))
42
- #define STATE_MARKER_ROWSET (reinterpret_cast<void*>(1))
42
+ #define STATE_MARKER_ROWSET (reinterpret_cast<void*>(2))
43
43
 
44
44
  struct streaming_lexer_impl {
45
45
  streaming_lexer_impl(jsonsl_t lexer, jsonsl_jpr_t pointer)
@@ -310,7 +310,7 @@ row_pop_callback(jsonsl_t lexer, jsonsl_action_t /* action */, struct jsonsl_sta
310
310
  }
311
311
 
312
312
  static void
313
- initial_action_pop_callback(jsonsl_t lexer, jsonsl_action_t /* action */, struct jsonsl_state_st* state, const jsonsl_char_t* /* at */)
313
+ initial_action_pop_callback(jsonsl_t lexer, jsonsl_action_t action, struct jsonsl_state_st* state, const jsonsl_char_t* at)
314
314
  {
315
315
  auto* impl = static_cast<detail::streaming_lexer_impl*>(lexer->data);
316
316
 
@@ -321,6 +321,10 @@ initial_action_pop_callback(jsonsl_t lexer, jsonsl_action_t /* action */, struct
321
321
  if (state->type == JSONSL_T_HKEY) {
322
322
  impl->last_key_ = impl->buffer_.substr(state->pos_begin + 1, state->pos_cur - state->pos_begin - 1);
323
323
  }
324
+
325
+ if (state->data == STATE_MARKER_ROOT) {
326
+ trailer_pop_callback(lexer, action, state, at);
327
+ }
324
328
  }
325
329
 
326
330
  static void