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,418 @@
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 "utils.hxx"
19
+
20
+ #include <core/logger/configuration.hxx>
21
+ #include <core/logger/logger.hxx>
22
+ #include <core/meta/version.hxx>
23
+
24
+ #include <couchbase/fmt/durability_level.hxx>
25
+ #include <couchbase/fmt/query_scan_consistency.hxx>
26
+ #include <couchbase/fmt/tls_verify_mode.hxx>
27
+
28
+ #include <spdlog/details/os.h>
29
+ #include <spdlog/spdlog.h>
30
+
31
+ #include <regex>
32
+
33
+ namespace cbc
34
+ {
35
+ docopt::Options
36
+ parse_options(const std::string& doc, const std::vector<std::string>& argv, bool options_first)
37
+ {
38
+ try {
39
+ return docopt::docopt_parse(doc, argv, false, true, options_first);
40
+ } catch (const docopt::DocoptExitHelp&) {
41
+ fmt::print(stdout, doc);
42
+ std::exit(0);
43
+ } catch (const docopt::DocoptExitVersion&) {
44
+ fmt::print(stdout, "cbc {}\n", couchbase::core::meta::sdk_semver());
45
+ std::exit(0);
46
+ } catch (const docopt::DocoptLanguageError& error) {
47
+ fmt::print(stdout, "Docopt usage string could not be parsed. Please report this error.\n{}\n", error.what());
48
+ std::exit(-1);
49
+ } catch (const docopt::DocoptArgumentError&) {
50
+ fmt::print(stdout, doc);
51
+ fflush(stdout);
52
+ throw;
53
+ }
54
+ }
55
+
56
+ static auto
57
+ getenv_or_default(std::string_view var_name, const std::string& default_value) -> std::string
58
+ {
59
+ if (auto val = spdlog::details::os::getenv(var_name.data()); !val.empty()) {
60
+ return val;
61
+ }
62
+ return default_value;
63
+ }
64
+
65
+ auto
66
+ default_cluster_options() -> const couchbase::cluster_options&
67
+ {
68
+ static const couchbase::cluster_options default_cluster_options_(getenv_or_default("CBC_USERNAME", "Administrator"),
69
+ getenv_or_default("CBC_PASSWORD", "password"));
70
+ return default_cluster_options_;
71
+ }
72
+
73
+ auto
74
+ default_connection_string() -> const std::string&
75
+ {
76
+ static const std::string default_connection_string_ = getenv_or_default("CBC_CONNECTION_STRING", "couchbase://localhost");
77
+
78
+ return default_connection_string_;
79
+ }
80
+
81
+ auto
82
+ usage_block_for_cluster_options() -> std::string
83
+ {
84
+ const auto default_user_agent_extra{ "cbc" };
85
+ const auto default_options = default_cluster_options().build();
86
+ const auto connection_string = default_connection_string();
87
+
88
+ return fmt::format(
89
+ R"(
90
+ Connection options:
91
+ --connection-string=STRING Connection string for the cluster. CBC_CONNECTION_STRING. [default: {connection_string}]
92
+ --username=STRING Username for the cluster. CBC_USERNAME. [default: {username}]
93
+ --password=STRING Password for the cluster. CBC_PASSWORD. [default: {password}]
94
+ --certificate-path=STRING Path to the certificate.
95
+ --key-path=STRING Path to the key.
96
+ --ldap-compatible Whether to select authentication mechanism that is compatible with LDAP.
97
+ --configuration-profile=STRING Apply configuration profile. (available profiles: {available_configuration_profiles})
98
+
99
+ Security options:
100
+ --disable-tls Whether to disable TLS.
101
+ --trust-certificate-path=STRING Path to the trust certificate bundle.
102
+ --tls-verify-mode=MODE Path to the certificate (allowed values: peer, none). [default: {tls_verify_mode}]
103
+
104
+ Timeout options:
105
+ --bootstrap-timeout=DURATION Timeout for overall bootstrap of the SDK. [default: {bootstrap_timeout}]
106
+ --connect-timeout=DURATION Timeout for socket connection. [default: {connect_timeout}]
107
+ --resolve-timeout=DURATION Timeout to resolve DNS address for the sockets. [default: {resolve_timeout}]
108
+ --key-value-timeout=DURATION Timeout for Key/Value operations. [default: {key_value_timeout}]
109
+ --key-value-durable-timeout=DURATION Timeout for Key/Value durable operations. [default: {key_value_durable_timeout}]
110
+ --query-timeout=DURATION Timeout for Query service. [default: {query_timeout}]
111
+ --search-timeout=DURATION Timeout for Search service. [default: {search_timeout}]
112
+ --eventing-timeout=DURATION Timeout for Eventing service. [default: {eventing_timeout}]
113
+ --analytics-timeout=DURATION Timeout for Analytics service. [default: {analytics_timeout}]
114
+ --view-timeout=DURATION Timeout for View service. [default: {view_timeout}]
115
+ --management-timeout=DURATION Timeout for management operations. [default: {management_timeout}]
116
+
117
+ Compression options:
118
+ --disable-compression Whether to disable compression.
119
+ --compression-minimum-size=INTEGER The minimum size of the document (in bytes), that will be compressed. [default: {compression_minimum_size}]
120
+ --compression-minimum-ratio=FLOAT The minimum compression ratio to allow compressed form to be used. [default: {compression_minimum_ratio}]
121
+
122
+ DNS-SRV options:
123
+ --dns-srv-timeout=DURATION Timeout for DNS SRV requests. [default: {dns_srv_timeout}]
124
+ --dns-srv-nameserver=STRING Hostname of the DNS server where the DNS SRV requests will be sent.
125
+ --dns-srv-port=INTEGER Port of the DNS server where the DNS SRV requests will be sent.
126
+
127
+ Network options:
128
+ --tcp-keep-alive-interval=DURATION Interval for TCP keep alive. [default: {tcp_keep_alive_interval}]
129
+ --config-poll-interval=DURATION How often the library should poll for new configuration. [default: {config_poll_interval}]
130
+ --idle-http-connection-timeout=DURATION Period to wait before calling HTTP connection idle. [default: {idle_http_connection_timeout}]
131
+
132
+ Transactions options:
133
+ --transactions-durability-level=LEVEL Durability level of the transaction (allowed values: none, majority, majority_and_persist_to_active, persist_to_majority). [default: {transactions_durability_level}]
134
+ --transactions-expiration-time=DURATION Expiration time of the transaction. [default: {transactions_expiration_time}]
135
+ --transactions-key-value-timeout=DURATION Override Key/Value timeout just for the transaction.
136
+ --transactions-metadata-bucket=STRING Bucket name where transaction metadata is stored.
137
+ --transactions-metadata-scope=STRING Scope name where transaction metadata is stored. [default: {transactions_metadata_scope}]
138
+ --transactions-metadata-collection=STRING Collection name where transaction metadata is stored. [default: {transactions_metadata_collection}]
139
+ --transactions-query-scan-consistency=MODE Scan consistency for queries in transactions (allowed values: not_bounded, request_plus). [default: {transactions_query_scan_consistency}]
140
+ --transactions-cleanup-ignore-lost-attempts Do not cleanup lost attempts.
141
+ --transactions-cleanup-ignore-client-attempts Do not cleanup client attempts.
142
+ --transactions-cleanup-window=DURATION Cleanup window. [default: {transactions_cleanup_window}]
143
+
144
+ Metrics options:
145
+ --disable-metrics Disable collecting and reporting metrics.
146
+ --metrics-emit-interval=DURATION Interval to emit metrics report on INFO log level. [default:{metrics_emit_interval}]
147
+
148
+ Tracing options:
149
+ --disable-tracing Disable collecting and reporting trace information.
150
+ --tracing-orphaned-emit-interval=DURATION Interval to emit report about orphan operations. [default: {tracing_orphaned_emit_interval}]
151
+ --tracing-orphaned-sample-size=INTEGER Size of the sample of the orphan report. [default: {tracing_orphaned_sample_size}]
152
+ --tracing-threshold-emit-interval=DURATION Interval to emit report about operations exceeding threshold. [default: {tracing_threshold_emit_interval}]
153
+ --tracing-threshold-sample-size=INTEGER Size of the sample of the threshold report. [default: {tracing_threshold_sample_size}]
154
+ --tracing-threshold-key-value=DURATION Threshold for Key/Value service. [default: {tracing_threshold_key_value}]
155
+ --tracing-threshold-query=DURATION Threshold for Query service. [default: {tracing_threshold_query}]
156
+ --tracing-threshold-search=DURATION Threshold for Search service. [default: {tracing_threshold_search}]
157
+ --tracing-threshold-analytics=DURATION Threshold for Analytics service. [default: {tracing_threshold_analytics}]
158
+ --tracing-threshold-management=DURATION Threshold for Management operations. [default: {tracing_threshold_management}]
159
+ --tracing-threshold-eventing=DURATION Threshold for Eventing service. [default: {tracing_threshold_eventing}]
160
+ --tracing-threshold-view=DURATION Threshold for View service. [default: {tracing_threshold_view}]
161
+
162
+ Behavior options:
163
+ --user-agent-extra=STRING Append extra string SDK identifiers (full user-agent is "{sdk_id};{user_agent_extra}"). [default: {user_agent_extra}].
164
+ --show-queries Log queries on INFO level.
165
+ --enable-clustermap-notifications Allow server to send notifications when cluster configuration changes.
166
+ --disable-mutation-tokens Do not request Key/Value service to send mutation tokens.
167
+ --disable-unordered-execution Disable unordered execution for Key/Value service.
168
+ )",
169
+ fmt::arg("connection_string", connection_string),
170
+ fmt::arg("username", default_options.username),
171
+ fmt::arg("password", default_options.password),
172
+ fmt::arg("available_configuration_profiles", fmt::join(couchbase::configuration_profiles_registry::available_profiles(), ", ")),
173
+ fmt::arg("tls_verify_mode", default_options.security.tls_verify),
174
+ fmt::arg("bootstrap_timeout", default_options.timeouts.bootstrap_timeout),
175
+ fmt::arg("connect_timeout", default_options.timeouts.connect_timeout),
176
+ fmt::arg("resolve_timeout", default_options.timeouts.resolve_timeout),
177
+ fmt::arg("key_value_timeout", default_options.timeouts.key_value_timeout),
178
+ fmt::arg("key_value_durable_timeout", default_options.timeouts.key_value_durable_timeout),
179
+ fmt::arg("query_timeout", default_options.timeouts.query_timeout),
180
+ fmt::arg("search_timeout", default_options.timeouts.search_timeout),
181
+ fmt::arg("eventing_timeout", default_options.timeouts.eventing_timeout),
182
+ fmt::arg("analytics_timeout", default_options.timeouts.analytics_timeout),
183
+ fmt::arg("view_timeout", default_options.timeouts.view_timeout),
184
+ fmt::arg("management_timeout", default_options.timeouts.management_timeout),
185
+ fmt::arg("compression_minimum_size", default_options.compression.min_size),
186
+ fmt::arg("compression_minimum_ratio", default_options.compression.min_ratio),
187
+ fmt::arg("dns_srv_timeout", default_options.dns.timeout),
188
+ fmt::arg("tcp_keep_alive_interval", default_options.network.tcp_keep_alive_interval),
189
+ fmt::arg("config_poll_interval", default_options.network.config_poll_interval),
190
+ fmt::arg("idle_http_connection_timeout", default_options.network.idle_http_connection_timeout),
191
+ fmt::arg("transactions_durability_level", default_options.transactions.level),
192
+ fmt::arg("transactions_expiration_time",
193
+ std::chrono::duration_cast<std::chrono::milliseconds>(default_options.transactions.expiration_time)),
194
+ fmt::arg("transactions_metadata_scope", couchbase::scope::default_name),
195
+ fmt::arg("transactions_metadata_collection", couchbase::scope::default_name),
196
+ fmt::arg("transactions_query_scan_consistency", default_options.transactions.query_config.scan_consistency),
197
+ fmt::arg("transactions_cleanup_window", default_options.transactions.cleanup_config.cleanup_window),
198
+ fmt::arg("metrics_emit_interval", default_options.metrics.emit_interval),
199
+ fmt::arg("tracing_orphaned_emit_interval", default_options.tracing.orphaned_emit_interval),
200
+ fmt::arg("tracing_orphaned_sample_size", default_options.tracing.orphaned_sample_size),
201
+ fmt::arg("tracing_threshold_emit_interval", default_options.tracing.threshold_emit_interval),
202
+ fmt::arg("tracing_threshold_sample_size", default_options.tracing.threshold_sample_size),
203
+ fmt::arg("tracing_threshold_key_value", default_options.tracing.key_value_threshold),
204
+ fmt::arg("tracing_threshold_query", default_options.tracing.query_threshold),
205
+ fmt::arg("tracing_threshold_view", default_options.tracing.view_threshold),
206
+ fmt::arg("tracing_threshold_search", default_options.tracing.search_threshold),
207
+ fmt::arg("tracing_threshold_analytics", default_options.tracing.analytics_threshold),
208
+ fmt::arg("tracing_threshold_management", default_options.tracing.management_threshold),
209
+ fmt::arg("tracing_threshold_eventing", default_options.tracing.eventing_threshold),
210
+ fmt::arg("sdk_id", couchbase::core::meta::sdk_id()),
211
+ fmt::arg("user_agent_extra", default_user_agent_extra));
212
+ }
213
+
214
+ void
215
+ fill_cluster_options(const docopt::Options& options, couchbase::cluster_options& cluster_options, std::string& connection_string)
216
+ {
217
+ connection_string = options.at("--connection-string").asString();
218
+ if (options.find("--certificate-path") != options.end() && options.at("--certificate-path") &&
219
+ options.find("--key-path") != options.end() && options.at("--key-path")) {
220
+ cluster_options = couchbase::cluster_options(
221
+ couchbase::certificate_authenticator(options.at("--certificate-path").asString(), options.at("--key-path").asString()));
222
+ } else {
223
+ auto username = options.at("--username").asString();
224
+ auto password = options.at("--password").asString();
225
+ if (options.find("--ldap-compatible") != options.end() && options.at("--ldap-compatible") &&
226
+ options.at("--ldap-compatible").asBool()) {
227
+ cluster_options = couchbase::cluster_options(couchbase::password_authenticator::ldap_compatible(username, password));
228
+ } else {
229
+ cluster_options = couchbase::cluster_options(couchbase::password_authenticator(username, password));
230
+ }
231
+ }
232
+
233
+ if (options.find("--configuration-profile") != options.end() && options.at("--configuration-profile")) {
234
+ cluster_options.apply_profile(options.at("--configuration-profile").asString());
235
+ }
236
+
237
+ parse_disable_option(cluster_options.security().enabled, "--disable-tls");
238
+ parse_string_option(cluster_options.security().trust_certificate, "--trust-certificate-path");
239
+ if (options.find("--tls-verify-mode") != options.end() && options.at("--tls-verify-mode")) {
240
+ if (auto value = options.at("--tls-verify-mode").asString(); value == "none") {
241
+ cluster_options.security().tls_verify(couchbase::tls_verify_mode::none);
242
+ } else if (value == "peer") {
243
+ cluster_options.security().tls_verify(couchbase::tls_verify_mode::peer);
244
+ } else {
245
+ throw docopt::DocoptArgumentError(fmt::format("unexpected value '{}' for --tls-verify-mode", value));
246
+ }
247
+ }
248
+
249
+ parse_duration_option(cluster_options.timeouts().bootstrap_timeout, "--bootstrap-timeout");
250
+ parse_duration_option(cluster_options.timeouts().connect_timeout, "--connect-timeout");
251
+ parse_duration_option(cluster_options.timeouts().resolve_timeout, "--resolve-timeout");
252
+ parse_duration_option(cluster_options.timeouts().key_value_timeout, "--key-value-timeout");
253
+ parse_duration_option(cluster_options.timeouts().key_value_durable_timeout, "--key-value-durable-timeout");
254
+ parse_duration_option(cluster_options.timeouts().query_timeout, "--query-timeout");
255
+ parse_duration_option(cluster_options.timeouts().search_timeout, "--search-timeout");
256
+ parse_duration_option(cluster_options.timeouts().eventing_timeout, "--eventing-timeout");
257
+ parse_duration_option(cluster_options.timeouts().analytics_timeout, "--analytics-timeout");
258
+ parse_duration_option(cluster_options.timeouts().view_timeout, "--view-timeout");
259
+ parse_duration_option(cluster_options.timeouts().management_timeout, "--management-timeout");
260
+
261
+ parse_disable_option(cluster_options.compression().enabled, "--disable-compression");
262
+ parse_integer_option(cluster_options.compression().min_size, "--compression-minimum-size");
263
+ parse_float_option(cluster_options.compression().min_ratio, "--compression-minimum-ratio");
264
+
265
+ parse_duration_option(cluster_options.dns().timeout, "--dns-srv-timeout");
266
+ if (options.find("--dns-srv-nameserver") != options.end() && options.at("--dns-srv-nameserver")) {
267
+ auto hostname = options.at("--dns-srv-nameserver").asString();
268
+ if (options.find("--dns-srv-port") != options.end() && options.at("--dns-srv-port")) {
269
+ auto value = options.at("--dns-srv-port").asString();
270
+ try {
271
+ cluster_options.dns().nameserver(hostname, static_cast<std::uint16_t>(std::stoul(value, nullptr, 10)));
272
+ } catch (const std::invalid_argument&) {
273
+ throw docopt::DocoptArgumentError(fmt::format("cannot parse '{}' as integer in --dns-srv-port: not a number", value));
274
+ } catch (const std::out_of_range&) {
275
+ throw docopt::DocoptArgumentError(fmt::format("cannot parse '{}' as integer in --dns-srv-port: out of range", value));
276
+ }
277
+ } else {
278
+ cluster_options.dns().nameserver(hostname);
279
+ }
280
+ }
281
+
282
+ parse_duration_option(cluster_options.network().tcp_keep_alive_interval, "--tcp-keep-alive-interval");
283
+ parse_duration_option(cluster_options.network().config_poll_interval, "--config-poll-interval");
284
+ parse_duration_option(cluster_options.network().idle_http_connection_timeout, "--idle-http-connection-timeout");
285
+
286
+ if (options.find("--transactions-durability-level") != options.end() && options.at("--transactions-durability-level")) {
287
+ if (auto value = options.at("--transactions-durability-level").asString(); value == "none") {
288
+ cluster_options.transactions().durability_level(couchbase::durability_level::none);
289
+ } else if (value == "majority") {
290
+ cluster_options.transactions().durability_level(couchbase::durability_level::majority);
291
+ } else if (value == "majority_and_persist_to_active") {
292
+ cluster_options.transactions().durability_level(couchbase::durability_level::majority_and_persist_to_active);
293
+ } else if (value == "persist_to_majority") {
294
+ cluster_options.transactions().durability_level(couchbase::durability_level::persist_to_majority);
295
+ } else {
296
+ throw docopt::DocoptArgumentError(fmt::format("unexpected value '{}' for --transactions-durability-level", value));
297
+ }
298
+ }
299
+ parse_duration_option(cluster_options.transactions().expiration_time, "--transactions-expiration-time");
300
+ parse_duration_option(cluster_options.transactions().kv_timeout, "--transactions-key-value-timeout");
301
+ if (options.find("--transactions-metadata-bucket") != options.end() && options.at("--transactions-metadata-bucket")) {
302
+ if (auto bucket = options.at("--transactions-metadata-bucket").asString(); !bucket.empty()) {
303
+ cluster_options.transactions().metadata_collection({ bucket,
304
+ options.at("--transactions-metadata-scope").asString(),
305
+ options.at("--transactions-metadata-collection").asString() });
306
+ } else {
307
+ throw docopt::DocoptArgumentError("empty value for --transactions-metadata-bucket");
308
+ }
309
+ }
310
+ if (options.find("--transactions-query-scan-consistency") != options.end() && options.at("--transactions-query-scan-consistency")) {
311
+ if (auto value = options.at("--transactions-query-scan-consistency").asString(); value == "not_bounded") {
312
+ cluster_options.transactions().query_config().scan_consistency(couchbase::query_scan_consistency::not_bounded);
313
+ } else if (value == "request_plus") {
314
+ cluster_options.transactions().query_config().scan_consistency(couchbase::query_scan_consistency::request_plus);
315
+ } else {
316
+ throw docopt::DocoptArgumentError(fmt::format("unexpected value '{}' for --transactions-query-scan-consistency", value));
317
+ }
318
+ }
319
+ parse_disable_option(cluster_options.transactions().cleanup_config().cleanup_lost_attempts,
320
+ "--transactions-cleanup-ignore-lost-attempts");
321
+ parse_disable_option(cluster_options.transactions().cleanup_config().cleanup_client_attempts,
322
+ "--transactions-cleanup-ignore-client-attempts");
323
+ parse_duration_option(cluster_options.transactions().cleanup_config().cleanup_window, "--transactions-cleanup-window");
324
+
325
+ parse_disable_option(cluster_options.metrics().enable, "--disable-metrics");
326
+ parse_duration_option(cluster_options.metrics().emit_interval, "--metrics-emit-interval");
327
+
328
+ parse_disable_option(cluster_options.tracing().enable, "--disable-tracing");
329
+ parse_duration_option(cluster_options.tracing().orphaned_emit_interval, "--tracing-orphaned-emit-interval");
330
+ parse_integer_option(cluster_options.tracing().orphaned_sample_size, "--tracing-orphaned-sample-size");
331
+ parse_duration_option(cluster_options.tracing().threshold_emit_interval, "--tracing-threshold-emit-interval");
332
+ parse_integer_option(cluster_options.tracing().threshold_sample_size, "--tracing-threshold-sample-size");
333
+ parse_duration_option(cluster_options.tracing().key_value_threshold, "--tracing-threshold-key-value");
334
+ parse_duration_option(cluster_options.tracing().query_threshold, "--tracing-threshold-query");
335
+ parse_duration_option(cluster_options.tracing().search_threshold, "--tracing-threshold-search");
336
+ parse_duration_option(cluster_options.tracing().analytics_threshold, "--tracing-threshold-analytics");
337
+ parse_duration_option(cluster_options.tracing().management_threshold, "--tracing-threshold-management");
338
+ parse_duration_option(cluster_options.tracing().eventing_threshold, "--tracing-threshold-eventing");
339
+ parse_duration_option(cluster_options.tracing().view_threshold, "--tracing-threshold-view");
340
+
341
+ parse_string_option(cluster_options.behavior().append_to_user_agent, "--user-agent-extra");
342
+ parse_enable_option(cluster_options.behavior().show_queries, "--show-queries");
343
+ parse_enable_option(cluster_options.behavior().enable_clustermap_notification, "--enable-clustermap-notification");
344
+ parse_disable_option(cluster_options.behavior().enable_mutation_tokens, "--disable-mutation-tokens");
345
+ parse_disable_option(cluster_options.behavior().enable_unordered_execution, "--disable-disable-unordered-execution");
346
+ }
347
+
348
+ auto
349
+ default_log_level() -> const std::string&
350
+ {
351
+ static const std::string default_log_level_ = getenv_or_default("CBC_LOG_LEVEL", "off");
352
+
353
+ return default_log_level_;
354
+ }
355
+
356
+ auto
357
+ usage_block_for_logger() -> std::string
358
+ {
359
+ static const std::vector<std::string> allowed_log_levels{
360
+ "trace", "debug", "info", "warning", "error", "critical", "off",
361
+ };
362
+
363
+ return fmt::format(R"(
364
+ Logger options:
365
+ --log-level=LEVEL Log level (allowed values are: {allowed_levels}). CBC_LOG_LEVEL. [default: {log_level}]
366
+ --log-output=PATH File to send logs (when is not set, logs will be written to STDERR).
367
+ )",
368
+ fmt::arg("allowed_levels", fmt::join(allowed_log_levels, ", ")),
369
+ fmt::arg("log_level", default_log_level()));
370
+ }
371
+
372
+ void
373
+ apply_logger_options(const docopt::Options& options)
374
+ {
375
+ auto log_level = options.at("--log-level").asString();
376
+ auto level = couchbase::core::logger::level_from_str(log_level);
377
+
378
+ if (level != couchbase::core::logger::level::off) {
379
+ couchbase::core::logger::configuration configuration{};
380
+
381
+ if (options.find("--log-output") != options.end() && options.at("--log-output")) {
382
+ configuration.filename = options.at("--log-output").asString();
383
+ } else {
384
+ configuration.console = true;
385
+ configuration.unit_test = true;
386
+ }
387
+ configuration.log_level = level;
388
+ couchbase::core::logger::create_file_logger(configuration);
389
+ }
390
+
391
+ spdlog::set_level(spdlog::level::from_str(log_level));
392
+ couchbase::core::logger::set_log_levels(level);
393
+ }
394
+
395
+ auto
396
+ extract_inlined_keyspace(const std::string& id) -> std::optional<keyspace_with_id>
397
+ {
398
+ static const std::regex inlined_keyspace_regex{ R"(^(.*?):(.*?)\.(.*?):(.*)$)" };
399
+
400
+ std::smatch match;
401
+ if (std::regex_match(id, match, inlined_keyspace_regex)) {
402
+ keyspace_with_id ks_id{};
403
+ ks_id.bucket_name = match[1];
404
+ ks_id.scope_name = match[2];
405
+ ks_id.collection_name = match[3];
406
+ ks_id.id = match[4];
407
+ return ks_id;
408
+ }
409
+
410
+ return {};
411
+ }
412
+
413
+ bool
414
+ get_bool_option(const docopt::Options& options, const std::string& name)
415
+ {
416
+ return options.find(name) != options.end() && options.at(name) && options.at(name).asBool();
417
+ }
418
+ } // namespace cbc
@@ -0,0 +1,150 @@
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 <core/utils/duration_parser.hxx>
21
+ #include <couchbase/cluster_options.hxx>
22
+ #include <couchbase/codec/transcoder_traits.hxx>
23
+
24
+ #include <docopt.h>
25
+ #include <fmt/chrono.h>
26
+
27
+ #include <string>
28
+ #include <vector>
29
+
30
+ namespace cbc
31
+ {
32
+ auto
33
+ parse_options(const std::string& doc, const std::vector<std::string>& argv, bool options_first = false) -> docopt::Options;
34
+
35
+ void
36
+ fill_cluster_options(const docopt::Options& options, couchbase::cluster_options& cluster_options, std::string& connection_string);
37
+
38
+ auto
39
+ default_cluster_options() -> const couchbase::cluster_options&;
40
+
41
+ auto
42
+ default_connection_string() -> const std::string&;
43
+
44
+ auto
45
+ usage_block_for_cluster_options() -> std::string;
46
+
47
+ auto
48
+ default_log_level() -> const std::string&;
49
+
50
+ auto
51
+ usage_block_for_logger() -> std::string;
52
+
53
+ void
54
+ apply_logger_options(const docopt::Options& options);
55
+
56
+ struct keyspace_with_id {
57
+ std::string bucket_name;
58
+ std::string scope_name;
59
+ std::string collection_name;
60
+ std::string id;
61
+ };
62
+
63
+ auto
64
+ extract_inlined_keyspace(const std::string& id) -> std::optional<keyspace_with_id>;
65
+
66
+ struct passthrough_transcoder {
67
+ using document_type = std::pair<std::vector<std::byte>, std::uint32_t>;
68
+
69
+ static auto decode(const couchbase::codec::encoded_value& encoded) -> document_type
70
+ {
71
+ return { encoded.data, encoded.flags };
72
+ }
73
+ };
74
+
75
+ [[nodiscard]] bool
76
+ get_bool_option(const docopt::Options& options, const std::string& name);
77
+ } // namespace cbc
78
+
79
+ template<>
80
+ struct couchbase::codec::is_transcoder<cbc::passthrough_transcoder> : public std::true_type {
81
+ };
82
+
83
+ #define parse_duration_option(setter, option_name) \
84
+ do { \
85
+ if (options.find(option_name) != options.end() && options.at(option_name)) { \
86
+ auto value = options.at(option_name).asString(); \
87
+ try { \
88
+ setter(std::chrono::duration_cast<std::chrono::milliseconds>(couchbase::core::utils::parse_duration(value))); \
89
+ } catch (const couchbase::core::utils::duration_parse_error&) { \
90
+ try { \
91
+ setter(std::chrono::milliseconds(std::stoull(value, nullptr, 10))); \
92
+ } catch (const std::invalid_argument&) { \
93
+ throw docopt::DocoptArgumentError( \
94
+ fmt::format("cannot parse '{}' as duration in " option_name ": not a number", value)); \
95
+ } catch (const std::out_of_range&) { \
96
+ throw docopt::DocoptArgumentError( \
97
+ fmt::format("cannot parse '{}' as duration in " option_name ": out of range", value)); \
98
+ } \
99
+ } \
100
+ } \
101
+ } while (0)
102
+
103
+ #define parse_string_option(setter, option_name) \
104
+ do { \
105
+ if (options.find(option_name) != options.end() && options.at(option_name)) { \
106
+ setter(options.at(option_name).asString()); \
107
+ } \
108
+ } while (0)
109
+
110
+ #define parse_disable_option(setter, option_name) \
111
+ do { \
112
+ if (options.find(option_name) != options.end() && options.at(option_name)) { \
113
+ setter(!options.at(option_name).asBool()); \
114
+ } \
115
+ } while (0)
116
+
117
+ #define parse_enable_option(setter, option_name) \
118
+ do { \
119
+ if (options.find(option_name) != options.end() && options.at(option_name)) { \
120
+ setter(options.at(option_name).asBool()); \
121
+ } \
122
+ } while (0)
123
+
124
+ #define parse_integer_option(setter, option_name) \
125
+ do { \
126
+ if (options.find(option_name) != options.end() && options.at(option_name)) { \
127
+ auto value = options.at(option_name).asString(); \
128
+ try { \
129
+ setter(std::stoull(value, nullptr, 10)); \
130
+ } catch (const std::invalid_argument&) { \
131
+ throw docopt::DocoptArgumentError(fmt::format("cannot parse '{}' as integer in " option_name ": not a number", value)); \
132
+ } catch (const std::out_of_range&) { \
133
+ throw docopt::DocoptArgumentError(fmt::format("cannot parse '{}' as integer in " option_name ": out of range", value)); \
134
+ } \
135
+ } \
136
+ } while (0)
137
+
138
+ #define parse_float_option(setter, option_name) \
139
+ do { \
140
+ if (options.find(option_name) != options.end() && options.at(option_name)) { \
141
+ auto value = options.at(option_name).asString(); \
142
+ try { \
143
+ setter(std::stod(value, nullptr)); \
144
+ } catch (const std::invalid_argument&) { \
145
+ throw docopt::DocoptArgumentError(fmt::format("cannot parse '{}' as float in " option_name ": not a number", value)); \
146
+ } catch (const std::out_of_range&) { \
147
+ throw docopt::DocoptArgumentError(fmt::format("cannot parse '{}' as float in " option_name ": out of range", value)); \
148
+ } \
149
+ } \
150
+ } while (0)
@@ -0,0 +1,82 @@
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 "version.hxx"
19
+
20
+ #include "utils.hxx"
21
+
22
+ #include <core/meta/version.hxx>
23
+
24
+ #include <tao/json.hpp>
25
+
26
+ namespace cbc
27
+ {
28
+ static constexpr auto* USAGE =
29
+ R"(Display version information.
30
+
31
+ Usage:
32
+ cbc version [options]
33
+ cbc version (-h|--help)
34
+
35
+ Options:
36
+ -h --help Show this screen.
37
+ --json Dump version and build info in JSON format.
38
+ )";
39
+
40
+ void
41
+ cbc::version::execute(const std::vector<std::string>& argv)
42
+ {
43
+ try {
44
+ auto options = cbc::parse_options(USAGE, argv);
45
+ if (options["--help"].asBool()) {
46
+ fmt::print(stdout, USAGE);
47
+ return;
48
+ }
49
+ if (options["--json"].asBool()) {
50
+ tao::json::value info;
51
+ for (const auto& [name, value] : couchbase::core::meta::sdk_build_info()) {
52
+ if (name == "version_major" || name == "version_minor" || name == "version_patch" || name == "version_build") {
53
+ info[name] = std::stoi(value);
54
+ } else if (name == "snapshot" || name == "static_stdlib" || name == "static_openssl") {
55
+ info[name] = value == "true";
56
+ } else {
57
+ info[name] = value;
58
+ }
59
+ }
60
+ fmt::print(stdout, "{}\n", tao::json::to_string(info, 2));
61
+ return;
62
+ }
63
+ fmt::print(stdout, "Version: {}\n", couchbase::core::meta::sdk_semver());
64
+ auto info = couchbase::core::meta::sdk_build_info();
65
+ fmt::print(stdout, "Build date: {}\n", info["build_timestamp"]);
66
+ fmt::print(stdout, "Build type: {}\n", info["cmake_build_type"]);
67
+ fmt::print(stdout, "Platform: {}, {}\n", info["platform"], info["cpu"]);
68
+ fmt::print(stdout, "C compiler: {}\n", info["cc"]);
69
+ fmt::print(stdout, "C++ compiler: {}\n", info["cxx"]);
70
+ fmt::print(stdout, "CMake: {}\n", info["cmake_version"]);
71
+ fmt::print(stdout, "ASIO: {}\n", info["asio"]);
72
+ fmt::print(stdout, "Snappy: {}\n", info["snappy"]);
73
+ fmt::print(stdout, "OpenSSL:\n");
74
+ fmt::print(stdout, " headers: {}\n", info["openssl_headers"]);
75
+ fmt::print(stdout, " runtime: {}\n", info["openssl_runtime"]);
76
+ fmt::print(stdout, " default certificate directory: {}\n", info["openssl_default_cert_dir"]);
77
+ fmt::print(stdout, " default certificate file: {}\n", info["openssl_default_cert_file"]);
78
+ } catch (const docopt::DocoptArgumentError& e) {
79
+ fmt::print(stderr, "Error: {}\n", e.what());
80
+ }
81
+ }
82
+ } // namespace cbc