couchbase 4.2.1 → 4.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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