couchbase 3.4.0 → 3.4.1
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.
- 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
|
+
}
|