couchbase 4.2.1 → 4.2.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (162) hide show
  1. package/CMakeLists.txt +1 -0
  2. package/deps/couchbase-cxx-client/.gitmodules +3 -0
  3. package/deps/couchbase-cxx-client/.idea/misc.xml +1 -0
  4. package/deps/couchbase-cxx-client/.idea/vcs.xml +1 -0
  5. package/deps/couchbase-cxx-client/CMakeLists.txt +11 -1
  6. package/deps/couchbase-cxx-client/README.md +3 -3
  7. package/deps/couchbase-cxx-client/cmake/CompilerWarnings.cmake +4 -1
  8. package/deps/couchbase-cxx-client/cmake/VersionInfo.cmake +13 -1
  9. package/deps/couchbase-cxx-client/cmake/build_version.hxx.in +1 -0
  10. package/deps/couchbase-cxx-client/core/cluster.hxx +15 -5
  11. package/deps/couchbase-cxx-client/core/impl/build_deferred_query_indexes.cxx +17 -6
  12. package/deps/couchbase-cxx-client/core/impl/cluster.cxx +1 -1
  13. package/deps/couchbase-cxx-client/core/impl/collection_query_index_manager.cxx +93 -0
  14. package/deps/couchbase-cxx-client/core/impl/configuration_profiles_registry.cxx +11 -0
  15. package/deps/couchbase-cxx-client/core/impl/create_query_index.cxx +119 -0
  16. package/deps/couchbase-cxx-client/core/impl/drop_query_index.cxx +108 -0
  17. package/deps/couchbase-cxx-client/core/impl/get.cxx +1 -1
  18. package/deps/couchbase-cxx-client/core/impl/get_all_query_indexes.cxx +76 -0
  19. package/deps/couchbase-cxx-client/core/impl/query.cxx +5 -7
  20. package/deps/couchbase-cxx-client/core/impl/watch_query_indexes.cxx +168 -0
  21. package/deps/couchbase-cxx-client/core/io/mcbp_session.cxx +15 -1
  22. package/deps/couchbase-cxx-client/core/logger/configuration.hxx +3 -0
  23. package/deps/couchbase-cxx-client/core/logger/level.hxx +21 -0
  24. package/deps/couchbase-cxx-client/core/logger/logger.hxx +4 -6
  25. package/deps/couchbase-cxx-client/core/meta/CMakeLists.txt +4 -2
  26. package/deps/couchbase-cxx-client/core/meta/features.hxx +31 -0
  27. package/deps/couchbase-cxx-client/core/meta/version.cxx +67 -5
  28. package/deps/couchbase-cxx-client/core/meta/version.hxx +12 -1
  29. package/deps/couchbase-cxx-client/core/metrics/CMakeLists.txt +4 -1
  30. package/deps/couchbase-cxx-client/core/metrics/logging_meter.cxx +46 -5
  31. package/deps/couchbase-cxx-client/core/metrics/logging_meter.hxx +10 -26
  32. package/deps/couchbase-cxx-client/core/operations/document_get_projected.cxx +3 -2
  33. package/deps/couchbase-cxx-client/core/operations/document_query.cxx +10 -12
  34. package/deps/couchbase-cxx-client/core/operations/document_query.hxx +1 -3
  35. package/deps/couchbase-cxx-client/core/operations/management/query_index_build.cxx +8 -14
  36. package/deps/couchbase-cxx-client/core/operations/management/query_index_build.hxx +2 -1
  37. package/deps/couchbase-cxx-client/core/operations/management/query_index_build_deferred.hxx +15 -8
  38. package/deps/couchbase-cxx-client/core/operations/management/query_index_create.cxx +7 -14
  39. package/deps/couchbase-cxx-client/core/operations/management/query_index_create.hxx +2 -0
  40. package/deps/couchbase-cxx-client/core/operations/management/query_index_drop.cxx +11 -16
  41. package/deps/couchbase-cxx-client/core/operations/management/query_index_drop.hxx +2 -0
  42. package/deps/couchbase-cxx-client/core/operations/management/query_index_get_all.cxx +8 -12
  43. package/deps/couchbase-cxx-client/core/operations/management/query_index_get_all.hxx +4 -3
  44. package/deps/couchbase-cxx-client/core/operations/management/query_index_get_all_deferred.cxx +21 -12
  45. package/deps/couchbase-cxx-client/core/operations/management/query_index_get_all_deferred.hxx +3 -2
  46. package/deps/couchbase-cxx-client/core/origin.hxx +1 -1
  47. package/deps/couchbase-cxx-client/core/platform/uuid.cc +1 -2
  48. package/deps/couchbase-cxx-client/core/protocol/cmd_hello.hxx +5 -1
  49. package/deps/couchbase-cxx-client/core/query_context.hxx +79 -0
  50. package/deps/couchbase-cxx-client/core/tracing/CMakeLists.txt +3 -1
  51. package/deps/couchbase-cxx-client/core/tracing/threshold_logging_tracer.cxx +19 -4
  52. package/deps/couchbase-cxx-client/core/tracing/threshold_logging_tracer.hxx +2 -2
  53. package/deps/couchbase-cxx-client/core/transactions/async_attempt_context.hxx +10 -4
  54. package/deps/couchbase-cxx-client/core/transactions/atr_cleanup_entry.cxx +52 -63
  55. package/deps/couchbase-cxx-client/core/transactions/attempt_context.hxx +8 -3
  56. package/deps/couchbase-cxx-client/core/transactions/attempt_context_impl.cxx +163 -126
  57. package/deps/couchbase-cxx-client/core/transactions/attempt_context_impl.hxx +24 -37
  58. package/deps/couchbase-cxx-client/core/transactions/forward_compat.hxx +4 -4
  59. package/deps/couchbase-cxx-client/core/transactions/internal/atr_cleanup_entry.hxx +51 -13
  60. package/deps/couchbase-cxx-client/core/transactions/internal/client_record.hxx +26 -1
  61. package/deps/couchbase-cxx-client/core/transactions/internal/doc_record.hxx +21 -0
  62. package/deps/couchbase-cxx-client/core/transactions/internal/logging.hxx +40 -18
  63. package/deps/couchbase-cxx-client/core/transactions/internal/transaction_context.hxx +5 -0
  64. package/deps/couchbase-cxx-client/core/transactions/result.hxx +26 -0
  65. package/deps/couchbase-cxx-client/core/transactions/staged_mutation.cxx +48 -47
  66. package/deps/couchbase-cxx-client/core/transactions/staged_mutation.hxx +6 -6
  67. package/deps/couchbase-cxx-client/core/transactions/transaction_context.cxx +33 -19
  68. package/deps/couchbase-cxx-client/core/transactions/transaction_get_result.hxx +18 -2
  69. package/deps/couchbase-cxx-client/core/transactions/transaction_links.hxx +25 -2
  70. package/deps/couchbase-cxx-client/core/transactions/transactions.cxx +4 -4
  71. package/deps/couchbase-cxx-client/core/transactions/transactions_cleanup.cxx +49 -56
  72. package/deps/couchbase-cxx-client/core/transactions/waitable_op_list.hxx +7 -7
  73. package/deps/couchbase-cxx-client/core/transactions.hxx +0 -12
  74. package/deps/couchbase-cxx-client/core/utils/binary.hxx +1 -1
  75. package/deps/couchbase-cxx-client/core/utils/keyspace.hxx +55 -0
  76. package/deps/couchbase-cxx-client/couchbase/build_query_index_options.hxx +12 -45
  77. package/deps/couchbase-cxx-client/couchbase/cluster.hxx +1 -1
  78. package/deps/couchbase-cxx-client/couchbase/cluster_options.hxx +6 -7
  79. package/deps/couchbase-cxx-client/couchbase/collection.hxx +8 -0
  80. package/deps/couchbase-cxx-client/couchbase/collection_query_index_manager.hxx +218 -0
  81. package/deps/couchbase-cxx-client/couchbase/configuration_profiles_registry.hxx +3 -0
  82. package/deps/couchbase-cxx-client/couchbase/create_primary_query_index_options.hxx +166 -0
  83. package/deps/couchbase-cxx-client/couchbase/create_query_index_options.hxx +172 -0
  84. package/deps/couchbase-cxx-client/couchbase/drop_primary_query_index_options.hxx +129 -0
  85. package/deps/couchbase-cxx-client/couchbase/drop_query_index_options.hxx +116 -0
  86. package/deps/couchbase-cxx-client/couchbase/fmt/cas.hxx +1 -1
  87. package/deps/couchbase-cxx-client/couchbase/fmt/query_scan_consistency.hxx +46 -0
  88. package/deps/couchbase-cxx-client/couchbase/fmt/query_status.hxx +70 -0
  89. package/deps/couchbase-cxx-client/couchbase/fmt/tls_verify_mode.hxx +46 -0
  90. package/deps/couchbase-cxx-client/couchbase/get_all_query_indexes_options.hxx +100 -0
  91. package/deps/couchbase-cxx-client/{core → couchbase}/management/query_index.hxx +2 -2
  92. package/deps/couchbase-cxx-client/couchbase/metrics/meter.hxx +16 -0
  93. package/deps/couchbase-cxx-client/couchbase/query_index_manager.hxx +178 -6
  94. package/deps/couchbase-cxx-client/couchbase/query_options.hxx +1 -18
  95. package/deps/couchbase-cxx-client/couchbase/scope.hxx +5 -2
  96. package/deps/couchbase-cxx-client/couchbase/tracing/request_tracer.hxx +16 -0
  97. package/deps/couchbase-cxx-client/couchbase/transactions/async_attempt_context.hxx +11 -4
  98. package/deps/couchbase-cxx-client/couchbase/transactions/attempt_context.hxx +5 -3
  99. package/deps/couchbase-cxx-client/couchbase/transactions/transaction_keyspace.hxx +16 -0
  100. package/deps/couchbase-cxx-client/couchbase/transactions/transaction_query_options.hxx +0 -6
  101. package/deps/couchbase-cxx-client/couchbase/watch_query_indexes_options.hxx +115 -0
  102. package/deps/couchbase-cxx-client/examples/minimal.cxx +3 -1
  103. package/deps/couchbase-cxx-client/test/test_integration_crud.cxx +72 -0
  104. package/deps/couchbase-cxx-client/test/test_integration_management.cxx +727 -310
  105. package/deps/couchbase-cxx-client/test/test_integration_query.cxx +4 -8
  106. package/deps/couchbase-cxx-client/test/test_integration_transcoders.cxx +14 -0
  107. package/deps/couchbase-cxx-client/test/test_transaction_transaction_public_blocking_api.cxx +34 -19
  108. package/deps/couchbase-cxx-client/test/test_unit_transaction_logging.cxx +66 -22
  109. package/deps/couchbase-cxx-client/test/test_unit_utils.cxx +51 -0
  110. package/deps/couchbase-cxx-client/test/tools/tool_kv_loader.cxx +2 -2
  111. package/deps/couchbase-cxx-client/test/utils/integration_test_guard.cxx +2 -0
  112. package/deps/couchbase-cxx-client/test/utils/wait_until.cxx +4 -4
  113. package/deps/couchbase-cxx-client/third_party/docopt/.travis.yml +103 -0
  114. package/deps/couchbase-cxx-client/third_party/docopt/CMakeLists.txt +129 -0
  115. package/deps/couchbase-cxx-client/third_party/docopt/LICENSE-Boost-1.0 +23 -0
  116. package/deps/couchbase-cxx-client/third_party/docopt/LICENSE-MIT +23 -0
  117. package/deps/couchbase-cxx-client/third_party/docopt/README.rst +479 -0
  118. package/deps/couchbase-cxx-client/third_party/docopt/docopt-config.cmake +1 -0
  119. package/deps/couchbase-cxx-client/third_party/docopt/docopt.cpp +687 -0
  120. package/deps/couchbase-cxx-client/third_party/docopt/docopt.h +98 -0
  121. package/deps/couchbase-cxx-client/third_party/docopt/docopt.pc.in +9 -0
  122. package/deps/couchbase-cxx-client/third_party/docopt/docopt_private.h +676 -0
  123. package/deps/couchbase-cxx-client/third_party/docopt/docopt_util.h +122 -0
  124. package/deps/couchbase-cxx-client/third_party/docopt/docopt_value.h +341 -0
  125. package/deps/couchbase-cxx-client/third_party/docopt/examples/naval_fate.cpp +36 -0
  126. package/deps/couchbase-cxx-client/third_party/docopt/main.cpp +16 -0
  127. package/deps/couchbase-cxx-client/third_party/docopt/run_testcase.cpp +40 -0
  128. package/deps/couchbase-cxx-client/third_party/docopt/run_tests.py +72 -0
  129. package/deps/couchbase-cxx-client/third_party/docopt/testcases.docopt +957 -0
  130. package/deps/couchbase-cxx-client/tools/CMakeLists.txt +14 -0
  131. package/deps/couchbase-cxx-client/tools/cbc.cxx +65 -0
  132. package/deps/couchbase-cxx-client/tools/command.hxx +31 -0
  133. package/deps/couchbase-cxx-client/tools/command_registry.cxx +43 -0
  134. package/deps/couchbase-cxx-client/tools/command_registry.hxx +39 -0
  135. package/deps/couchbase-cxx-client/tools/get.cxx +267 -0
  136. package/deps/couchbase-cxx-client/tools/get.hxx +26 -0
  137. package/deps/couchbase-cxx-client/tools/query.cxx +441 -0
  138. package/deps/couchbase-cxx-client/tools/query.hxx +26 -0
  139. package/deps/couchbase-cxx-client/tools/utils.cxx +418 -0
  140. package/deps/couchbase-cxx-client/tools/utils.hxx +150 -0
  141. package/deps/couchbase-cxx-client/tools/version.cxx +82 -0
  142. package/deps/couchbase-cxx-client/tools/version.hxx +26 -0
  143. package/dist/authenticators.d.ts +2 -2
  144. package/dist/authenticators.js +1 -2
  145. package/dist/binding.d.ts +32 -16
  146. package/dist/cluster.js +14 -7
  147. package/dist/collection.d.ts +6 -0
  148. package/dist/collection.js +8 -0
  149. package/dist/queryexecutor.js +1 -1
  150. package/dist/queryindexmanager.d.ts +100 -4
  151. package/dist/queryindexmanager.js +344 -118
  152. package/dist/transactions.js +0 -2
  153. package/package.json +1 -1
  154. package/src/connection.cpp +2 -0
  155. package/src/connection.hpp +1 -0
  156. package/src/connection_autogen.cpp +16 -0
  157. package/src/jstocbpp_autogen.hpp +93 -23
  158. package/src/jstocbpp_basic.hpp +24 -0
  159. package/src/jstocbpp_transactions.hpp +0 -8
  160. package/tools/gen-bindings-js.js +1 -0
  161. package/tools/gen-bindings-json.py +4 -2
  162. package/deps/couchbase-cxx-client/core/transactions/logging.cxx +0 -107
@@ -0,0 +1,14 @@
1
+ add_executable(
2
+ cbc
3
+ cbc.cxx
4
+ utils.cxx
5
+ command_registry.cxx
6
+ get.cxx
7
+ query.cxx
8
+ version.cxx)
9
+ target_include_directories(cbc PUBLIC ${PROJECT_SOURCE_DIR} ${PROJECT_SOURCE_DIR}/private)
10
+ target_link_libraries(
11
+ cbc
12
+ ${CMAKE_THREAD_LIBS_INIT}
13
+ couchbase_cxx_client
14
+ docopt)
@@ -0,0 +1,65 @@
1
+ /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2023-Present Couchbase, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ #include "command_registry.hxx"
19
+ #include "utils.hxx"
20
+
21
+ static constexpr auto* USAGE =
22
+ R"(Talk to Couchbase Server.
23
+
24
+ Usage:
25
+ cbc <command> [<argument>...]
26
+ cbc (-h|--help)
27
+ cbc --version
28
+
29
+ Available commands:
30
+
31
+ version Display version information.
32
+ get Retrieve document from the server.
33
+ query Perform N1QL query.
34
+
35
+ Options:
36
+ -h --help Show this screen.
37
+ --version Show version.
38
+ )";
39
+
40
+ int
41
+ main(int argc, const char** argv)
42
+ {
43
+ cbc::command_registry commands;
44
+ try {
45
+ std::vector<std::string> args{ argv + 1, argv + argc };
46
+ auto options = cbc::parse_options(USAGE, args, true);
47
+
48
+ if (options["--help"].asBool()) {
49
+ fmt::print(stdout, USAGE);
50
+ return 0;
51
+ }
52
+
53
+ auto command_name = options["<command>"].asString();
54
+ if (auto command = commands.get(command_name); command) {
55
+ command->execute(args);
56
+ return 0;
57
+ }
58
+ fmt::print(stderr, "Error: unrecognized command 'cbc {}'\n", command_name);
59
+ fmt::print(stderr, "Try 'cbc --help' for more information\n", command_name);
60
+ return 1;
61
+ } catch (const docopt::DocoptArgumentError&) {
62
+ fmt::print(stderr, "Error: missing command 'cbc <command>'\n");
63
+ return 1;
64
+ }
65
+ }
@@ -0,0 +1,31 @@
1
+ /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2023-Present Couchbase, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ #pragma once
19
+
20
+ #include <string>
21
+ #include <vector>
22
+
23
+ namespace cbc
24
+ {
25
+ class command
26
+ {
27
+ public:
28
+ virtual ~command() = default;
29
+ virtual void execute(const std::vector<std::string>& argv) = 0;
30
+ };
31
+ } // namespace cbc
@@ -0,0 +1,43 @@
1
+ /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2023-Present Couchbase, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ #include "command_registry.hxx"
19
+
20
+ #include "get.hxx"
21
+ #include "query.hxx"
22
+ #include "version.hxx"
23
+
24
+ namespace cbc
25
+ {
26
+ command_registry::command_registry()
27
+ : commands_{
28
+ { "version", std::make_shared<cbc::version>() },
29
+ { "get", std::make_shared<cbc::get>() },
30
+ { "query", std::make_shared<cbc::query>() },
31
+ }
32
+ {
33
+ }
34
+
35
+ auto
36
+ command_registry::get(const std::string& name) -> std::shared_ptr<command>
37
+ {
38
+ if (auto cmd = commands_.find(name); cmd != commands_.end()) {
39
+ return cmd->second;
40
+ }
41
+ return nullptr;
42
+ }
43
+ } // namespace cbc
@@ -0,0 +1,39 @@
1
+ /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2023-Present Couchbase, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ #pragma once
19
+
20
+ #include "command.hxx"
21
+
22
+ #include <map>
23
+ #include <memory>
24
+ #include <string>
25
+
26
+ namespace cbc
27
+ {
28
+ class command_registry
29
+ {
30
+ public:
31
+ command_registry();
32
+
33
+ auto get(const std::string& name) -> std::shared_ptr<command>;
34
+
35
+ private:
36
+ std::map<std::string, std::shared_ptr<command>, std::less<>> commands_;
37
+ };
38
+
39
+ } // namespace cbc
@@ -0,0 +1,267 @@
1
+ /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2023-Present Couchbase, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ #include "get.hxx"
19
+ #include "utils.hxx"
20
+
21
+ #include <core/logger/logger.hxx>
22
+ #include <couchbase/cluster.hxx>
23
+ #include <couchbase/codec/raw_binary_transcoder.hxx>
24
+ #include <couchbase/fmt/cas.hxx>
25
+
26
+ #include <asio/io_context.hpp>
27
+ #include <fmt/chrono.h>
28
+ #include <spdlog/fmt/bin_to_hex.h>
29
+ #include <tao/json.hpp>
30
+
31
+ namespace cbc
32
+ {
33
+ namespace
34
+ {
35
+ static auto
36
+ usage() -> std::string
37
+ {
38
+ static const std::string default_bucket_name{ "default" };
39
+
40
+ static const std::string usage_string = fmt::format(
41
+ R"(Display version information.
42
+
43
+ Usage:
44
+ cbc get [options] <id>...
45
+ cbc get [options] --project=STRING... <id>...
46
+ cbc get (-h|--help)
47
+
48
+ Options:
49
+ -h --help Show this screen.
50
+ --bucket-name=STRING Name of the bucket. [default: {bucket_name}]
51
+ --scope-name=STRING Name of the scope. [default: {scope_name}]
52
+ --collection-name=STRING Name of the collection. [default: {collection_name}]
53
+ --inlined-keyspace Extract bucket, scope, collection and key from the IDs (captures will be done with /^(.*?):(.*?)\.(.*?):(.*)$/).
54
+ --with-expiry Return document expiry time, if set.
55
+ --project=STRING Return only part of the document, that corresponds given JSON-pointer (could be used multiple times, up to {max_projections}).
56
+ --hexdump Print value using hexdump encoding (safe for binary data on STDOUT).
57
+ --pretty-json Try to pretty-print as JSON value (prints AS-IS is the document is not a JSON).
58
+ --json-lines Use JSON Lines format (https://jsonlines.org/) to print results.
59
+
60
+ {logger_options}{cluster_options}
61
+ )",
62
+ fmt::arg("bucket_name", default_bucket_name),
63
+ fmt::arg("scope_name", couchbase::scope::default_name),
64
+ fmt::arg("collection_name", couchbase::collection::default_name),
65
+ fmt::arg("logger_options", usage_block_for_logger()),
66
+ fmt::arg("cluster_options", usage_block_for_cluster_options()),
67
+ fmt::arg("max_projections", couchbase::get_options::maximum_number_of_projections));
68
+
69
+ return usage_string;
70
+ }
71
+
72
+ struct command_options {
73
+ std::string bucket_name;
74
+ std::string scope_name;
75
+ std::string collection_name;
76
+ std::vector<std::string> projections{};
77
+ bool with_expiry{ false };
78
+ bool inlined_keyspace{ false };
79
+ bool hexdump{ false };
80
+ bool pretty_json{ false };
81
+ bool json_lines{ false };
82
+ };
83
+
84
+ static void
85
+ print_result_json_line(const std::string& bucket_name,
86
+ const std::string& scope_name,
87
+ const std::string& collection_name,
88
+ const std::string& document_id,
89
+ const couchbase::key_value_error_context& ctx,
90
+ const couchbase::get_result& resp)
91
+ {
92
+ tao::json::value line = tao::json::empty_object;
93
+ tao::json::value meta = {
94
+ { "bucket_name", bucket_name },
95
+ { "scope_name", scope_name },
96
+ { "collection_name", collection_name },
97
+ { "document_id", document_id },
98
+ };
99
+ if (ctx.ec()) {
100
+ tao::json::value error = {
101
+ { "code", ctx.ec().value() },
102
+ { "message", ctx.ec().message() },
103
+ };
104
+ if (auto ext = ctx.extended_error_info(); ext.has_value()) {
105
+ error["ref"] = ext->reference();
106
+ error["ctx"] = ext->context();
107
+ }
108
+ line["error"] = error;
109
+ } else {
110
+ auto [value, flags] = resp.content_as<cbc::passthrough_transcoder>();
111
+ meta["cas"] = fmt::format("0x{}", resp.cas());
112
+ meta["flags"] = flags;
113
+ if (const auto& expiry = resp.expiry_time(); expiry) {
114
+ meta["expiry_time"] = fmt::format("{}", expiry.value());
115
+ }
116
+ try {
117
+ line["json"] = couchbase::core::utils::json::parse_binary(value);
118
+ } catch (const tao::pegtl::parse_error&) {
119
+ line["base64"] = value;
120
+ }
121
+ }
122
+ line["meta"] = meta;
123
+ fmt::print(stdout, "{}\n", tao::json::to_string<tao::json::events::binary_to_base64>(line));
124
+ (void)fflush(stdout);
125
+ }
126
+
127
+ static void
128
+ print_result(const std::string& bucket_name,
129
+ const std::string& scope_name,
130
+ const std::string& collection_name,
131
+ const std::string& document_id,
132
+ const couchbase::key_value_error_context& ctx,
133
+ const couchbase::get_result& resp,
134
+ const command_options& cmd_options)
135
+ {
136
+ const std::string prefix = fmt::format("bucket: {}, collection: {}.{}, id: {}", bucket_name, scope_name, collection_name, document_id);
137
+ (void)fflush(stderr);
138
+ if (ctx.ec()) {
139
+ if (auto ext = ctx.extended_error_info(); ext.has_value()) {
140
+ fmt::print(stderr, "{}, error: {} (ref: {}, ctx: {})\n", prefix, ctx.ec().message(), ext->reference(), ext->context());
141
+ } else {
142
+ fmt::print(stderr, "{}, error: {}\n", prefix, ctx.ec().message());
143
+ }
144
+ } else {
145
+ auto [value, flags] = resp.content_as<cbc::passthrough_transcoder>();
146
+ if (resp.expiry_time()) {
147
+ fmt::print(stderr,
148
+ "{}, size: {}, CAS: 0x{}, flags: 0x{:08x}, expiry: {}\n",
149
+ prefix,
150
+ value.size(),
151
+ resp.cas(),
152
+ flags,
153
+ resp.expiry_time().value());
154
+ } else {
155
+ fmt::print(stderr, "{}, size: {}, CAS: 0x{}, flags: 0x{:08x}\n", prefix, value.size(), resp.cas(), flags);
156
+ }
157
+ (void)fflush(stderr);
158
+ (void)fflush(stdout);
159
+ if (cmd_options.hexdump) {
160
+ auto hex = fmt::format("{:a}", spdlog::to_hex(value));
161
+ fmt::print(stdout, "{}\n", std::string_view(hex.data() + 1, hex.size() - 1));
162
+ } else if (cmd_options.pretty_json) {
163
+ try {
164
+ auto json = couchbase::core::utils::json::parse_binary(value);
165
+ fmt::print(stdout, "{}\n", tao::json::to_string(json, 2));
166
+ } catch (const tao::pegtl::parse_error&) {
167
+ fmt::print(stdout, "{}\n", std::string_view(reinterpret_cast<const char*>(value.data()), value.size()));
168
+ }
169
+ } else {
170
+ fmt::print(stdout, "{}\n", std::string_view(reinterpret_cast<const char*>(value.data()), value.size()));
171
+ }
172
+ (void)fflush(stdout);
173
+ }
174
+ }
175
+
176
+ static void
177
+ do_work(const std::string& connection_string,
178
+ couchbase::cluster_options& cluster_options,
179
+ const std::vector<std::string>& ids,
180
+ const command_options& cmd_options)
181
+ {
182
+ asio::io_context io;
183
+ auto guard = asio::make_work_guard(io);
184
+ std::thread io_thread([&io]() { io.run(); });
185
+
186
+ auto [cluster, ec] = couchbase::cluster::connect(io, connection_string, cluster_options).get();
187
+ if (ec) {
188
+ throw std::system_error(ec);
189
+ }
190
+
191
+ couchbase::get_options get_options{};
192
+ if (cmd_options.with_expiry) {
193
+ get_options.with_expiry(true);
194
+ }
195
+ if (!cmd_options.projections.empty()) {
196
+ get_options.project(cmd_options.projections);
197
+ }
198
+
199
+ for (const auto& id : ids) {
200
+ auto bucket_name = cmd_options.bucket_name;
201
+ auto scope_name = cmd_options.scope_name;
202
+ auto collection_name = cmd_options.collection_name;
203
+ auto document_id = id;
204
+
205
+ if (cmd_options.inlined_keyspace) {
206
+ if (auto keyspace_with_id = extract_inlined_keyspace(id); keyspace_with_id) {
207
+ bucket_name = keyspace_with_id->bucket_name;
208
+ scope_name = keyspace_with_id->scope_name;
209
+ collection_name = keyspace_with_id->collection_name;
210
+ document_id = keyspace_with_id->id;
211
+ }
212
+ }
213
+
214
+ auto collection = cluster.bucket(bucket_name).scope(scope_name).collection(collection_name);
215
+
216
+ auto [ctx, resp] = collection.get(document_id, get_options).get();
217
+ if (cmd_options.json_lines) {
218
+ print_result_json_line(bucket_name, scope_name, collection_name, document_id, ctx, resp);
219
+ } else {
220
+ print_result(bucket_name, scope_name, collection_name, document_id, ctx, resp, cmd_options);
221
+ }
222
+ }
223
+
224
+ cluster.close();
225
+ guard.reset();
226
+
227
+ io_thread.join();
228
+ }
229
+ } // namespace
230
+
231
+ void
232
+ cbc::get::execute(const std::vector<std::string>& argv)
233
+ {
234
+ try {
235
+
236
+ auto options = cbc::parse_options(usage(), argv);
237
+ if (options["--help"].asBool()) {
238
+ fmt::print(stdout, usage());
239
+ return;
240
+ }
241
+
242
+ cbc::apply_logger_options(options);
243
+
244
+ couchbase::cluster_options cluster_options{ cbc::default_cluster_options() };
245
+ std::string connection_string{ cbc::default_connection_string() };
246
+ cbc::fill_cluster_options(options, cluster_options, connection_string);
247
+
248
+ command_options cmd_options{};
249
+ cmd_options.bucket_name = options["--bucket-name"].asString();
250
+ cmd_options.scope_name = options["--scope-name"].asString();
251
+ cmd_options.collection_name = options["--collection-name"].asString();
252
+ cmd_options.inlined_keyspace = options["--inlined-keyspace"].asBool();
253
+ cmd_options.with_expiry = options["--with-expiry"].asBool();
254
+ cmd_options.hexdump = options["--hexdump"].asBool();
255
+ cmd_options.pretty_json = options["--pretty-json"].asBool();
256
+ cmd_options.projections = options["--project"].asStringList();
257
+ cmd_options.json_lines = options["--json-lines"].asBool();
258
+ auto ids{ options["<id>"].asStringList() };
259
+
260
+ do_work(connection_string, cluster_options, ids, cmd_options);
261
+ } catch (const docopt::DocoptArgumentError& e) {
262
+ fmt::print(stderr, "Error: {}\n", e.what());
263
+ } catch (const std::system_error& e) {
264
+ fmt::print(stderr, "Error: {}\n", e.what());
265
+ }
266
+ }
267
+ } // namespace cbc
@@ -0,0 +1,26 @@
1
+ /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2023-Present Couchbase, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ #include "command.hxx"
19
+
20
+ namespace cbc
21
+ {
22
+ class get : public command
23
+ {
24
+ void execute(const std::vector<std::string>& argv);
25
+ };
26
+ } // namespace cbc