couchbase 3.4.0 → 3.4.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/ext/couchbase/CMakeLists.txt +8 -3
- data/ext/couchbase/cmake/CompilerWarnings.cmake +12 -4
- data/ext/couchbase/cmake/Documentation.cmake +4 -3
- data/ext/couchbase/cmake/OpenSSL.cmake +52 -7
- data/ext/couchbase/cmake/VersionInfo.cmake +39 -3
- data/ext/couchbase/cmake/test_openssl.cxx +7 -0
- data/ext/couchbase/core/crypto/CMakeLists.txt +5 -1
- data/ext/couchbase/core/impl/collection_query_index_manager.cxx +3 -3
- data/ext/couchbase/core/impl/get_all_query_indexes.cxx +3 -3
- data/ext/couchbase/core/impl/transaction_get_result.cxx +54 -0
- data/ext/couchbase/core/meta/CMakeLists.txt +7 -5
- data/ext/couchbase/core/meta/version.cxx +19 -0
- data/ext/couchbase/core/operations/document_search.cxx +5 -2
- data/ext/couchbase/core/operations/document_search.hxx +0 -1
- data/ext/couchbase/core/transactions/atr_cleanup_entry.cxx +1 -0
- data/ext/couchbase/core/transactions/attempt_context_impl.cxx +62 -31
- data/ext/couchbase/core/transactions/attempt_context_impl.hxx +43 -22
- data/ext/couchbase/core/transactions/forward_compat.hxx +2 -2
- data/ext/couchbase/core/transactions/internal/transaction_context.hxx +1 -1
- data/ext/couchbase/core/transactions/internal/transaction_fields.hxx +1 -0
- data/ext/couchbase/core/transactions/staged_mutation.cxx +1 -1
- data/ext/couchbase/core/transactions/staged_mutation.hxx +12 -2
- data/ext/couchbase/core/transactions/transaction_context.cxx +8 -11
- data/ext/couchbase/core/transactions/transaction_get_result.cxx +41 -31
- data/ext/couchbase/core/transactions/transaction_get_result.hxx +7 -3
- data/ext/couchbase/core/transactions/transaction_links.hxx +13 -1
- data/ext/couchbase/core/transactions/waitable_op_list.hxx +1 -0
- data/ext/couchbase/couchbase/cluster.hxx +2 -2
- data/ext/couchbase/couchbase/cluster_options.hxx +10 -10
- data/ext/couchbase/couchbase/collection.hxx +22 -17
- data/ext/couchbase/couchbase/collection_query_index_manager.hxx +1 -1
- data/ext/couchbase/couchbase/common_options.hxx +1 -1
- data/ext/couchbase/couchbase/configuration_profile.hxx +1 -1
- data/ext/couchbase/couchbase/configuration_profiles_registry.hxx +0 -1
- data/ext/couchbase/couchbase/create_primary_query_index_options.hxx +1 -1
- data/ext/couchbase/couchbase/drop_primary_query_index_options.hxx +1 -1
- data/ext/couchbase/couchbase/drop_query_index_options.hxx +1 -1
- data/ext/couchbase/couchbase/fmt/cas.hxx +12 -0
- data/ext/couchbase/couchbase/fmt/durability_level.hxx +6 -0
- data/ext/couchbase/couchbase/fmt/key_value_extended_error_info.hxx +6 -0
- data/ext/couchbase/couchbase/fmt/key_value_status_code.hxx +6 -0
- data/ext/couchbase/couchbase/fmt/mutation_token.hxx +6 -0
- data/ext/couchbase/couchbase/fmt/query_scan_consistency.hxx +6 -0
- data/ext/couchbase/couchbase/fmt/query_status.hxx +6 -0
- data/ext/couchbase/couchbase/fmt/retry_reason.hxx +6 -0
- data/ext/couchbase/couchbase/fmt/tls_verify_mode.hxx +6 -0
- data/ext/couchbase/couchbase/get_all_query_indexes_options.hxx +5 -4
- data/ext/couchbase/couchbase/query_index_manager.hxx +4 -2
- data/ext/couchbase/couchbase/scope.hxx +1 -1
- data/ext/couchbase/couchbase/subdoc/array_add_unique.hxx +2 -0
- data/ext/couchbase/couchbase/subdoc/array_append.hxx +2 -0
- data/ext/couchbase/couchbase/subdoc/array_insert.hxx +2 -0
- data/ext/couchbase/couchbase/subdoc/array_prepend.hxx +2 -0
- data/ext/couchbase/couchbase/subdoc/count.hxx +2 -0
- data/ext/couchbase/couchbase/subdoc/counter.hxx +2 -0
- data/ext/couchbase/couchbase/subdoc/exists.hxx +2 -0
- data/ext/couchbase/couchbase/subdoc/get.hxx +2 -0
- data/ext/couchbase/couchbase/subdoc/insert.hxx +2 -0
- data/ext/couchbase/couchbase/subdoc/remove.hxx +2 -0
- data/ext/couchbase/couchbase/subdoc/replace.hxx +3 -1
- data/ext/couchbase/couchbase/subdoc/upsert.hxx +2 -0
- data/ext/couchbase/couchbase/transaction_op_error_context.hxx +4 -4
- data/ext/couchbase/couchbase/transactions/transaction_get_result.hxx +36 -51
- data/ext/couchbase/couchbase/transactions/transactions_config.hxx +1 -1
- data/ext/couchbase/test/CMakeLists.txt +2 -0
- data/ext/couchbase/test/test_integration_examples.cxx +141 -0
- data/ext/couchbase/test/test_unit_transaction_utils.cxx +76 -19
- data/ext/couchbase.cxx +479 -20
- data/ext/extconf.rb +2 -1
- data/ext/revisions.rb +3 -2
- data/lib/couchbase/binary_collection.rb +4 -4
- data/lib/couchbase/collection.rb +5 -0
- data/lib/couchbase/errors.rb +10 -0
- data/lib/couchbase/management/collection_query_index_manager.rb +183 -0
- data/lib/couchbase/management/query_index_manager.rb +35 -3
- data/lib/couchbase/management.rb +1 -0
- data/lib/couchbase/options.rb +2 -3
- data/lib/couchbase/version.rb +1 -1
- metadata +9 -5
@@ -21,6 +21,12 @@
|
|
21
21
|
|
22
22
|
#include <fmt/core.h>
|
23
23
|
|
24
|
+
/**
|
25
|
+
* Helper for fmtlib to format @ref couchbase::query_scan_consistency objects.
|
26
|
+
*
|
27
|
+
* @since 1.0.0
|
28
|
+
* @committed
|
29
|
+
*/
|
24
30
|
template<>
|
25
31
|
struct fmt::formatter<couchbase::query_scan_consistency> {
|
26
32
|
template<typename ParseContext>
|
@@ -21,6 +21,12 @@
|
|
21
21
|
|
22
22
|
#include <fmt/core.h>
|
23
23
|
|
24
|
+
/**
|
25
|
+
* Helper for fmtlib to format @ref couchbase::query_status objects.
|
26
|
+
*
|
27
|
+
* @since 1.0.0
|
28
|
+
* @committed
|
29
|
+
*/
|
24
30
|
template<>
|
25
31
|
struct fmt::formatter<couchbase::query_status> {
|
26
32
|
template<typename ParseContext>
|
@@ -21,6 +21,12 @@
|
|
21
21
|
|
22
22
|
#include <fmt/core.h>
|
23
23
|
|
24
|
+
/**
|
25
|
+
* Helper for fmtlib to format @ref couchbase::retry_reason objects.
|
26
|
+
*
|
27
|
+
* @since 1.0.0
|
28
|
+
* @committed
|
29
|
+
*/
|
24
30
|
template<>
|
25
31
|
struct fmt::formatter<couchbase::retry_reason> {
|
26
32
|
template<typename ParseContext>
|
@@ -21,6 +21,12 @@
|
|
21
21
|
|
22
22
|
#include <fmt/core.h>
|
23
23
|
|
24
|
+
/**
|
25
|
+
* Helper for fmtlib to format @ref couchbase::tls_verify_mode objects.
|
26
|
+
*
|
27
|
+
* @since 1.0.0
|
28
|
+
* @committed
|
29
|
+
*/
|
24
30
|
template<>
|
25
31
|
struct fmt::formatter<couchbase::tls_verify_mode> {
|
26
32
|
template<typename ParseContext>
|
@@ -66,7 +66,8 @@ class get_all_query_indexes_options : public common_options<get_all_query_indexe
|
|
66
66
|
* @uncommitted
|
67
67
|
*/
|
68
68
|
|
69
|
-
using
|
69
|
+
using get_all_query_indexes_handler =
|
70
|
+
std::function<void(couchbase::manager_error_context, std::vector<couchbase::management::query::index>)>;
|
70
71
|
|
71
72
|
#ifndef COUCHBASE_CXX_CLIENT_DOXYGEN
|
72
73
|
namespace core
|
@@ -84,7 +85,7 @@ void
|
|
84
85
|
initiate_get_all_query_indexes(std::shared_ptr<couchbase::core::cluster> core,
|
85
86
|
std::string bucket_name,
|
86
87
|
couchbase::get_all_query_indexes_options::built options,
|
87
|
-
|
88
|
+
get_all_query_indexes_handler&& handler);
|
88
89
|
|
89
90
|
void
|
90
91
|
initiate_get_all_query_indexes(std::shared_ptr<couchbase::core::cluster> core,
|
@@ -92,9 +93,9 @@ initiate_get_all_query_indexes(std::shared_ptr<couchbase::core::cluster> core,
|
|
92
93
|
couchbase::get_all_query_indexes_options::built options,
|
93
94
|
query_context query_ctx,
|
94
95
|
std::string collection_name,
|
95
|
-
|
96
|
+
get_all_query_indexes_handler&& handler);
|
96
97
|
|
97
98
|
#endif
|
98
99
|
} // namespace impl
|
99
100
|
} // namespace core
|
100
|
-
} // namespace couchbase
|
101
|
+
} // namespace couchbase
|
@@ -59,10 +59,12 @@ class query_index_manager
|
|
59
59
|
* @since 1.0.0
|
60
60
|
* @committed
|
61
61
|
*/
|
62
|
-
void get_all_indexes(std::string bucket_name,
|
62
|
+
void get_all_indexes(std::string bucket_name,
|
63
|
+
const get_all_query_indexes_options& options,
|
64
|
+
get_all_query_indexes_handler&& handler) const
|
63
65
|
{
|
64
66
|
return core::impl::initiate_get_all_query_indexes(
|
65
|
-
core_, std::move(bucket_name), options.build(), std::forward<
|
67
|
+
core_, std::move(bucket_name), options.build(), std::forward<get_all_query_indexes_handler>(handler));
|
66
68
|
}
|
67
69
|
[[nodiscard]] auto get_all_indexes(std::string bucket_name, const get_all_query_indexes_options& options) const
|
68
70
|
-> std::future<std::pair<manager_error_context, std::vector<couchbase::management::query::index>>>
|
@@ -121,7 +121,7 @@ class scope
|
|
121
121
|
* @since 1.0.0
|
122
122
|
* @committed
|
123
123
|
*/
|
124
|
-
[[nodiscard]] auto query(std::string statement, const query_options& options) const
|
124
|
+
[[nodiscard]] auto query(std::string statement, const query_options& options = {}) const
|
125
125
|
-> std::future<std::pair<query_error_context, query_result>>
|
126
126
|
{
|
127
127
|
auto barrier = std::make_shared<std::promise<std::pair<query_error_context, query_result>>>();
|
@@ -56,7 +56,9 @@ class replace
|
|
56
56
|
}
|
57
57
|
|
58
58
|
private:
|
59
|
+
#ifndef COUCHBASE_CXX_CLIENT_DOXYGEN
|
59
60
|
friend couchbase::mutate_in_specs;
|
61
|
+
#endif
|
60
62
|
|
61
63
|
replace(std::string path, std::vector<std::byte> value)
|
62
64
|
: path_(std::move(path))
|
@@ -86,4 +88,4 @@ class replace
|
|
86
88
|
bool expand_macro_{ false };
|
87
89
|
};
|
88
90
|
} // namespace subdoc
|
89
|
-
} // namespace couchbase
|
91
|
+
} // namespace couchbase
|
@@ -46,13 +46,13 @@ class transaction_op_error_context
|
|
46
46
|
}
|
47
47
|
|
48
48
|
/**
|
49
|
-
* The error_code associated with this error context.
|
49
|
+
* The error_code associated with this error context.
|
50
50
|
*
|
51
51
|
* Note that some query errors are not _transaction_ errors, so this error code will be 0, but there will be
|
52
|
-
* a @ref
|
52
|
+
* a @ref cause() with a @ref query_error_context in it. These errors do not rollback a
|
53
53
|
* transaction. If you want to roll it back, raise an exception.
|
54
54
|
*
|
55
|
-
* @return a
|
55
|
+
* @return a error code, if any.
|
56
56
|
*/
|
57
57
|
[[nodiscard]] std::error_code ec() const
|
58
58
|
{
|
@@ -60,7 +60,7 @@ class transaction_op_error_context
|
|
60
60
|
}
|
61
61
|
|
62
62
|
/**
|
63
|
-
* The underlying cause of this error. This can be either a @ref
|
63
|
+
* The underlying cause of this error. This can be either a @ref key_value_error_context or a @ref query_error_context.
|
64
64
|
*
|
65
65
|
* @return the error_context associated with the underlying cause of this error.
|
66
66
|
*/
|
@@ -24,36 +24,31 @@
|
|
24
24
|
#include <couchbase/result.hxx>
|
25
25
|
#include <couchbase/transaction_op_error_context.hxx>
|
26
26
|
|
27
|
+
// forward declarations...
|
28
|
+
namespace couchbase::core::transactions
|
29
|
+
{
|
30
|
+
class transaction_get_result;
|
31
|
+
class transaction_links;
|
32
|
+
class document_metadata;
|
33
|
+
} // namespace couchbase::core::transactions
|
34
|
+
|
27
35
|
namespace couchbase::transactions
|
28
36
|
{
|
29
37
|
|
30
|
-
class transaction_get_result
|
38
|
+
class transaction_get_result
|
31
39
|
{
|
32
|
-
|
33
|
-
std::string bucket_{};
|
34
|
-
std::string scope_{};
|
35
|
-
std::string collection_{};
|
36
|
-
std::string key_{};
|
37
|
-
std::vector<std::byte> content_{};
|
40
|
+
friend class couchbase::core::transactions::transaction_get_result;
|
38
41
|
|
39
|
-
|
40
|
-
transaction_get_result
|
41
|
-
|
42
|
-
transaction_get_result(std::
|
43
|
-
|
44
|
-
std::string collection,
|
45
|
-
std::string key,
|
46
|
-
couchbase::cas cas,
|
47
|
-
std::vector<std::byte> content)
|
48
|
-
: result(cas)
|
49
|
-
, bucket_(std::move(bucket))
|
50
|
-
, scope_(std::move(scope))
|
51
|
-
, collection_(std::move(collection))
|
52
|
-
, key_(std::move(key))
|
53
|
-
, content_(std::move(content))
|
42
|
+
private:
|
43
|
+
std::shared_ptr<couchbase::core::transactions::transaction_get_result> base_{};
|
44
|
+
|
45
|
+
transaction_get_result(std::shared_ptr<couchbase::core::transactions::transaction_get_result> base)
|
46
|
+
: base_(base)
|
54
47
|
{
|
55
48
|
}
|
56
49
|
|
50
|
+
public:
|
51
|
+
transaction_get_result();
|
57
52
|
/**
|
58
53
|
* Content of the document.
|
59
54
|
*
|
@@ -62,7 +57,7 @@ class transaction_get_result : public result
|
|
62
57
|
template<typename Content>
|
63
58
|
[[nodiscard]] Content content() const
|
64
59
|
{
|
65
|
-
return codec::tao_json_serializer::deserialize<Content>(
|
60
|
+
return codec::tao_json_serializer::deserialize<Content>(content());
|
66
61
|
}
|
67
62
|
|
68
63
|
/**
|
@@ -70,64 +65,54 @@ class transaction_get_result : public result
|
|
70
65
|
*
|
71
66
|
* @return content
|
72
67
|
*/
|
73
|
-
[[nodiscard]] const std::vector<std::byte>& content() const
|
74
|
-
|
75
|
-
return content_;
|
76
|
-
}
|
68
|
+
[[nodiscard]] const std::vector<std::byte>& content() const;
|
69
|
+
|
77
70
|
/**
|
78
71
|
* Copy content into document
|
79
72
|
* @param content
|
80
73
|
*/
|
81
|
-
void content(std::vector<std::byte> content)
|
82
|
-
|
83
|
-
content_ = std::move(content);
|
84
|
-
}
|
74
|
+
void content(std::vector<std::byte> content);
|
75
|
+
|
85
76
|
/**
|
86
77
|
* Move content into document
|
87
78
|
*
|
88
79
|
* @param content
|
89
80
|
*/
|
90
|
-
void content(std::vector<std::byte>&& content)
|
91
|
-
{
|
92
|
-
content_ = std::move(content);
|
93
|
-
}
|
81
|
+
void content(std::vector<std::byte>&& content);
|
94
82
|
|
95
83
|
/**
|
96
84
|
* Get document id.
|
97
85
|
*
|
98
86
|
* @return the id of this document.
|
99
87
|
*/
|
100
|
-
[[nodiscard]] const std::string key() const
|
101
|
-
{
|
102
|
-
return key_;
|
103
|
-
}
|
88
|
+
[[nodiscard]] const std::string key() const;
|
104
89
|
|
105
90
|
/**
|
106
91
|
* Get the name of the bucket this document is in.
|
107
92
|
*
|
108
93
|
* @return name of the bucket which contains the document.
|
109
94
|
*/
|
110
|
-
[[nodiscard]] const std::string bucket() const
|
111
|
-
|
112
|
-
return bucket_;
|
113
|
-
}
|
95
|
+
[[nodiscard]] const std::string bucket() const;
|
96
|
+
|
114
97
|
/**
|
115
98
|
* Get the name of the scope this document is in.
|
116
99
|
*
|
117
100
|
* @return name of the scope which contains the document.
|
118
101
|
*/
|
119
|
-
[[nodiscard]] const std::string scope() const
|
120
|
-
|
121
|
-
return scope_;
|
122
|
-
}
|
102
|
+
[[nodiscard]] const std::string scope() const;
|
103
|
+
|
123
104
|
/**
|
124
105
|
* Get the name of the collection this document is in.
|
125
106
|
*
|
126
107
|
* @return name of the collection which contains the document.
|
127
108
|
*/
|
128
|
-
[[nodiscard]] const std::string collection() const
|
129
|
-
|
130
|
-
|
131
|
-
|
109
|
+
[[nodiscard]] const std::string collection() const;
|
110
|
+
|
111
|
+
/**
|
112
|
+
* Get the CAS fot this document
|
113
|
+
*
|
114
|
+
* @return the CAS of the document.
|
115
|
+
*/
|
116
|
+
[[nodiscard]] const couchbase::cas cas() const;
|
132
117
|
};
|
133
118
|
} // namespace couchbase::transactions
|
@@ -115,7 +115,7 @@ class transactions_config
|
|
115
115
|
/**
|
116
116
|
* @brief Set the expiration time for transactions.
|
117
117
|
*
|
118
|
-
* @param duration desired expiration for transactions. see @expiration_time().
|
118
|
+
* @param duration desired expiration for transactions. see @ref expiration_time().
|
119
119
|
* @return reference to this, so calls can be chained.
|
120
120
|
*/
|
121
121
|
template<typename T>
|
@@ -0,0 +1,141 @@
|
|
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 "test_helper_integration.hxx"
|
19
|
+
|
20
|
+
#include <couchbase/cluster.hxx>
|
21
|
+
#include <couchbase/fmt/cas.hxx>
|
22
|
+
#include <couchbase/fmt/mutation_token.hxx>
|
23
|
+
|
24
|
+
#include <tao/json.hpp>
|
25
|
+
|
26
|
+
namespace start_using
|
27
|
+
{
|
28
|
+
//! [start-using]
|
29
|
+
#include <couchbase/cluster.hxx>
|
30
|
+
#include <couchbase/fmt/cas.hxx>
|
31
|
+
#include <couchbase/fmt/mutation_token.hxx>
|
32
|
+
|
33
|
+
#include <tao/json.hpp>
|
34
|
+
|
35
|
+
int
|
36
|
+
main(int argc, const char* argv[])
|
37
|
+
{
|
38
|
+
if (argc != 4) {
|
39
|
+
fmt::print("USAGE: ./start_using couchbase://127.0.0.1 Administrator password\n");
|
40
|
+
return 1;
|
41
|
+
}
|
42
|
+
|
43
|
+
std::string connection_string{ argv[1] };
|
44
|
+
std::string username{ argv[2] };
|
45
|
+
std::string password{ argv[3] };
|
46
|
+
std::string bucket_name{ "travel-sample" };
|
47
|
+
|
48
|
+
// run IO context on separate thread
|
49
|
+
asio::io_context io;
|
50
|
+
auto guard = asio::make_work_guard(io);
|
51
|
+
std::thread io_thread([&io]() { io.run(); });
|
52
|
+
|
53
|
+
auto options = couchbase::cluster_options(username, password);
|
54
|
+
// customize through the 'options'.
|
55
|
+
// For example, optimize timeouts for WAN
|
56
|
+
options.apply_profile("wan_development");
|
57
|
+
|
58
|
+
auto [cluster, ec] = couchbase::cluster::connect(io, connection_string, options).get();
|
59
|
+
if (ec) {
|
60
|
+
fmt::print("unable to connect to the cluster: {}\n", ec.message());
|
61
|
+
return 1;
|
62
|
+
}
|
63
|
+
|
64
|
+
// get a bucket reference
|
65
|
+
auto bucket = cluster.bucket(bucket_name);
|
66
|
+
|
67
|
+
// get a user-defined collection reference
|
68
|
+
auto scope = bucket.scope("tenant_agent_00");
|
69
|
+
auto collection = scope.collection("users");
|
70
|
+
|
71
|
+
{
|
72
|
+
// upsert document
|
73
|
+
auto [ctx, upsert_result] = collection.upsert("my-document", tao::json::value{ { "name", "mike" } }).get();
|
74
|
+
if (ctx.ec()) {
|
75
|
+
fmt::print("unable to upsert the document \"{}\": {}\n", ctx.id(), ctx.ec().message());
|
76
|
+
return 1;
|
77
|
+
}
|
78
|
+
fmt::print("saved document \"{}\", cas={}, token={}\n", ctx.id(), upsert_result.cas(), upsert_result.mutation_token().value());
|
79
|
+
}
|
80
|
+
|
81
|
+
{
|
82
|
+
// get document
|
83
|
+
auto [ctx, get_result] = collection.get("my-document").get();
|
84
|
+
if (ctx.ec()) {
|
85
|
+
fmt::print("unable to get the document \"{}\": {}\n", ctx.id(), ctx.ec().message());
|
86
|
+
return 1;
|
87
|
+
}
|
88
|
+
auto name = get_result.content_as<tao::json::value>()["name"].get_string();
|
89
|
+
fmt::print("retrieved document \"{}\", name=\"{}\"\n", ctx.id(), name);
|
90
|
+
}
|
91
|
+
|
92
|
+
{
|
93
|
+
// N1QL query
|
94
|
+
auto inventory_scope = bucket.scope("inventory");
|
95
|
+
auto [ctx, query_result] = inventory_scope.query("SELECT * FROM airline WHERE id = 10").get();
|
96
|
+
if (ctx.ec()) {
|
97
|
+
fmt::print("unable to perform query: {}, ({}, {})\n", ctx.ec().message(), ctx.first_error_code(), ctx.first_error_message());
|
98
|
+
return 1;
|
99
|
+
}
|
100
|
+
for (const auto& row : query_result.rows_as_json()) {
|
101
|
+
fmt::print("row: {}\n", tao::json::to_string(row));
|
102
|
+
}
|
103
|
+
}
|
104
|
+
|
105
|
+
// close cluster connection
|
106
|
+
cluster.close();
|
107
|
+
guard.reset();
|
108
|
+
|
109
|
+
io_thread.join();
|
110
|
+
return 0;
|
111
|
+
}
|
112
|
+
|
113
|
+
/*
|
114
|
+
|
115
|
+
$ ./start_using couchbase://127.0.0.1 Administrator password
|
116
|
+
saved document "my-document", cas=17486a1722b20000
|
117
|
+
retrieved document "my-document", name="mike"
|
118
|
+
row: {"airline":{"callsign":"MILE-AIR","country":"United States","iata":"Q5","icao":"MLA","id":10,"name":"40-Mile Air","type":"airline"}}
|
119
|
+
|
120
|
+
*/
|
121
|
+
//! [start-using]
|
122
|
+
|
123
|
+
} // namespace start_using
|
124
|
+
|
125
|
+
TEST_CASE("example: start using", "[integration]")
|
126
|
+
{
|
127
|
+
test::utils::integration_test_guard integration;
|
128
|
+
if (!integration.cluster_version().supports_collections()) {
|
129
|
+
return;
|
130
|
+
}
|
131
|
+
|
132
|
+
const auto env = test::utils::test_context::load_from_environment();
|
133
|
+
const char* argv[] = {
|
134
|
+
"start_using", // name of the "executable"
|
135
|
+
env.connection_string.c_str(),
|
136
|
+
env.username.c_str(),
|
137
|
+
env.password.c_str(),
|
138
|
+
};
|
139
|
+
|
140
|
+
REQUIRE(start_using::main(4, argv) == 0);
|
141
|
+
}
|