couchbase 3.4.0 → 3.4.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.
- checksums.yaml +4 -4
- data/README.md +2 -2
- data/ext/couchbase/CMakeLists.txt +10 -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/ThirdPartyDependencies.cmake +4 -0
- data/ext/couchbase/cmake/VersionInfo.cmake +39 -3
- data/ext/couchbase/cmake/test_openssl.cxx +7 -0
- data/ext/couchbase/core/cluster_options.hxx +0 -1
- data/ext/couchbase/core/config_profile.cxx +23 -1
- data/ext/couchbase/core/config_profile.hxx +2 -12
- data/ext/couchbase/core/crypto/CMakeLists.txt +5 -1
- data/ext/couchbase/core/impl/analytics.cxx +236 -0
- data/ext/couchbase/core/impl/cluster.cxx +0 -1
- data/ext/couchbase/core/impl/collection_query_index_manager.cxx +3 -3
- data/ext/couchbase/core/impl/dns_srv_tracker.cxx +5 -3
- data/ext/couchbase/core/impl/get_all_query_indexes.cxx +3 -3
- data/ext/couchbase/core/impl/query.cxx +5 -5
- data/ext/couchbase/core/impl/transaction_get_result.cxx +54 -0
- data/ext/couchbase/core/io/dns_client.cxx +225 -0
- data/ext/couchbase/core/io/dns_client.hxx +19 -188
- 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/active_transaction_record.hxx +2 -2
- data/ext/couchbase/core/transactions/atr_cleanup_entry.cxx +1 -0
- data/ext/couchbase/core/transactions/attempt_context_impl.cxx +65 -31
- data/ext/couchbase/core/transactions/attempt_context_impl.hxx +44 -23
- data/ext/couchbase/core/transactions/forward_compat.hxx +2 -2
- data/ext/couchbase/core/transactions/internal/transaction_context.hxx +13 -13
- data/ext/couchbase/core/transactions/internal/transaction_fields.hxx +1 -0
- data/ext/couchbase/core/transactions/internal/transactions_cleanup.hxx +7 -1
- 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 +9 -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/transactions_cleanup.cxx +144 -155
- data/ext/couchbase/core/transactions/waitable_op_list.hxx +1 -0
- data/ext/couchbase/core/utils/connection_string.cxx +10 -3
- data/ext/couchbase/core/utils/connection_string.hxx +3 -3
- data/ext/couchbase/couchbase/analytics_error_context.hxx +143 -0
- data/ext/couchbase/couchbase/analytics_meta_data.hxx +155 -0
- data/ext/couchbase/couchbase/analytics_metrics.hxx +163 -0
- data/ext/couchbase/couchbase/analytics_options.hxx +359 -0
- data/ext/couchbase/couchbase/analytics_result.hxx +102 -0
- data/ext/couchbase/couchbase/analytics_scan_consistency.hxx +46 -0
- data/ext/couchbase/couchbase/analytics_status.hxx +41 -0
- data/ext/couchbase/couchbase/analytics_warning.hxx +85 -0
- data/ext/couchbase/couchbase/cluster.hxx +35 -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/analytics_status.hxx +76 -0
- 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/query_options.hxx +0 -1
- data/ext/couchbase/couchbase/scope.hxx +34 -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/attempt_context.hxx +1 -1
- 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 +3 -2
- data/ext/couchbase/test/test_helper.hxx +1 -1
- data/ext/couchbase/test/test_integration_analytics.cxx +289 -13
- data/ext/couchbase/test/test_integration_crud.cxx +8 -1
- data/ext/couchbase/test/test_integration_examples.cxx +182 -0
- data/ext/couchbase/test/test_integration_management.cxx +15 -3
- data/ext/couchbase/test/test_integration_search.cxx +601 -0
- data/ext/couchbase/test/test_transaction_transaction_simple.cxx +73 -0
- data/ext/couchbase/test/test_unit_config_profiles.cxx +12 -12
- data/ext/couchbase/test/test_unit_connection_string.cxx +35 -0
- data/ext/couchbase/test/test_unit_transaction_utils.cxx +76 -19
- data/ext/couchbase/third_party/snappy/CMakeLists.txt +150 -27
- data/ext/couchbase/third_party/snappy/cmake/config.h.in +28 -24
- data/ext/couchbase/third_party/snappy/snappy-internal.h +189 -25
- data/ext/couchbase/third_party/snappy/snappy-sinksource.cc +26 -9
- data/ext/couchbase/third_party/snappy/snappy-sinksource.h +11 -11
- data/ext/couchbase/third_party/snappy/snappy-stubs-internal.cc +1 -1
- data/ext/couchbase/third_party/snappy/snappy-stubs-internal.h +227 -308
- data/ext/couchbase/third_party/snappy/snappy-stubs-public.h.in +0 -11
- data/ext/couchbase/third_party/snappy/snappy.cc +1176 -410
- data/ext/couchbase/third_party/snappy/snappy.h +19 -4
- data/ext/couchbase.cxx +506 -26
- data/ext/extconf.rb +2 -1
- data/ext/revisions.rb +3 -2
- data/lib/couchbase/binary_collection.rb +4 -4
- data/lib/couchbase/cluster.rb +13 -9
- data/lib/couchbase/cluster_registry.rb +7 -2
- data/lib/couchbase/collection.rb +5 -0
- data/lib/couchbase/configuration.rb +3 -4
- 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 +87 -5
- data/lib/couchbase/search_options.rb +158 -240
- data/lib/couchbase/version.rb +1 -1
- metadata +21 -6
- data/ext/couchbase/core/CMakeLists.txt +0 -0
|
@@ -39,7 +39,9 @@
|
|
|
39
39
|
#ifndef THIRD_PARTY_SNAPPY_SNAPPY_H__
|
|
40
40
|
#define THIRD_PARTY_SNAPPY_SNAPPY_H__
|
|
41
41
|
|
|
42
|
-
#include <
|
|
42
|
+
#include <stddef.h>
|
|
43
|
+
#include <stdint.h>
|
|
44
|
+
|
|
43
45
|
#include <string>
|
|
44
46
|
|
|
45
47
|
#include "snappy-stubs-public.h"
|
|
@@ -63,20 +65,27 @@ namespace snappy {
|
|
|
63
65
|
// Also note that this leaves "*source" in a state that is unsuitable for
|
|
64
66
|
// further operations, such as RawUncompress(). You will need to rewind
|
|
65
67
|
// or recreate the source yourself before attempting any further calls.
|
|
66
|
-
bool GetUncompressedLength(Source* source,
|
|
68
|
+
bool GetUncompressedLength(Source* source, uint32_t* result);
|
|
67
69
|
|
|
68
70
|
// ------------------------------------------------------------------------
|
|
69
71
|
// Higher-level string based routines (should be sufficient for most users)
|
|
70
72
|
// ------------------------------------------------------------------------
|
|
71
73
|
|
|
72
|
-
// Sets "*compressed" to the compressed version of "input[0
|
|
74
|
+
// Sets "*compressed" to the compressed version of "input[0..input_length-1]".
|
|
73
75
|
// Original contents of *compressed are lost.
|
|
74
76
|
//
|
|
75
77
|
// REQUIRES: "input[]" is not an alias of "*compressed".
|
|
76
78
|
size_t Compress(const char* input, size_t input_length,
|
|
77
79
|
std::string* compressed);
|
|
78
80
|
|
|
79
|
-
//
|
|
81
|
+
// Same as `Compress` above but taking an `iovec` array as input. Note that
|
|
82
|
+
// this function preprocesses the inputs to compute the sum of
|
|
83
|
+
// `iov[0..iov_cnt-1].iov_len` before reading. To avoid this, use
|
|
84
|
+
// `RawCompressFromIOVec` below.
|
|
85
|
+
size_t CompressFromIOVec(const struct iovec* iov, size_t iov_cnt,
|
|
86
|
+
std::string* compressed);
|
|
87
|
+
|
|
88
|
+
// Decompresses "compressed[0..compressed_length-1]" to "*uncompressed".
|
|
80
89
|
// Original contents of "*uncompressed" are lost.
|
|
81
90
|
//
|
|
82
91
|
// REQUIRES: "compressed[]" is not an alias of "*uncompressed".
|
|
@@ -122,6 +131,12 @@ namespace snappy {
|
|
|
122
131
|
char* compressed,
|
|
123
132
|
size_t* compressed_length);
|
|
124
133
|
|
|
134
|
+
// Same as `RawCompress` above but taking an `iovec` array as input. Note that
|
|
135
|
+
// `uncompressed_length` is the total number of bytes to be read from the
|
|
136
|
+
// elements of `iov` (_not_ the number of elements in `iov`).
|
|
137
|
+
void RawCompressFromIOVec(const struct iovec* iov, size_t uncompressed_length,
|
|
138
|
+
char* compressed, size_t* compressed_length);
|
|
139
|
+
|
|
125
140
|
// Given data in "compressed[0..compressed_length-1]" generated by
|
|
126
141
|
// calling the Snappy::Compress routine, this routine
|
|
127
142
|
// stores the uncompressed data to
|
data/ext/couchbase.cxx
CHANGED
|
@@ -1820,8 +1820,9 @@ cb_extract_option_bool(bool& field, VALUE options, const char* name)
|
|
|
1820
1820
|
}
|
|
1821
1821
|
}
|
|
1822
1822
|
|
|
1823
|
+
template<typename Integer>
|
|
1823
1824
|
static void
|
|
1824
|
-
cb_extract_option_number(
|
|
1825
|
+
cb_extract_option_number(Integer& field, VALUE options, const char* name)
|
|
1825
1826
|
{
|
|
1826
1827
|
if (!NIL_P(options) && TYPE(options) == T_HASH) {
|
|
1827
1828
|
VALUE val = rb_hash_aref(options, rb_id2sym(rb_intern(name)));
|
|
@@ -1830,10 +1831,10 @@ cb_extract_option_number(std::size_t& field, VALUE options, const char* name)
|
|
|
1830
1831
|
}
|
|
1831
1832
|
switch (TYPE(val)) {
|
|
1832
1833
|
case T_FIXNUM:
|
|
1833
|
-
field = FIX2ULONG(val);
|
|
1834
|
+
field = static_cast<Integer>(FIX2ULONG(val));
|
|
1834
1835
|
break;
|
|
1835
1836
|
case T_BIGNUM:
|
|
1836
|
-
field = NUM2ULL(val);
|
|
1837
|
+
field = static_cast<Integer>(NUM2ULL(val));
|
|
1837
1838
|
break;
|
|
1838
1839
|
default:
|
|
1839
1840
|
throw ruby_exception(rb_eArgError, rb_sprintf("%s must be a Integer, but given %+" PRIsVALUE, name, val));
|
|
@@ -1884,6 +1885,25 @@ cb_extract_option_string(std::string& target, VALUE options, const char* name);
|
|
|
1884
1885
|
static void
|
|
1885
1886
|
cb_extract_option_symbol(VALUE& val, VALUE options, const char* name);
|
|
1886
1887
|
|
|
1888
|
+
static void
|
|
1889
|
+
cb_extract_dns_config(couchbase::core::io::dns::dns_config& config, VALUE options)
|
|
1890
|
+
{
|
|
1891
|
+
if (!NIL_P(options) && TYPE(options) == T_HASH) {
|
|
1892
|
+
return;
|
|
1893
|
+
}
|
|
1894
|
+
|
|
1895
|
+
auto timeout{ couchbase::core::timeout_defaults::dns_srv_timeout };
|
|
1896
|
+
cb_extract_option_milliseconds(timeout, options, "dns_srv_timeout");
|
|
1897
|
+
|
|
1898
|
+
std::string nameserver{ couchbase::core::io::dns::dns_config::default_nameserver };
|
|
1899
|
+
cb_extract_option_string(nameserver, options, "dns_srv_nameserver");
|
|
1900
|
+
|
|
1901
|
+
std::uint16_t port{ couchbase::core::io::dns::dns_config::default_port };
|
|
1902
|
+
cb_extract_option_number(port, options, "dns_srv_port");
|
|
1903
|
+
|
|
1904
|
+
config = couchbase::core::io::dns::dns_config(nameserver, port, timeout);
|
|
1905
|
+
}
|
|
1906
|
+
|
|
1887
1907
|
static VALUE
|
|
1888
1908
|
cb_Backend_open(VALUE self, VALUE connection_string, VALUE credentials, VALUE options)
|
|
1889
1909
|
{
|
|
@@ -1983,13 +2003,14 @@ cb_Backend_open(VALUE self, VALUE connection_string, VALUE credentials, VALUE op
|
|
|
1983
2003
|
cb_extract_option_milliseconds(origin.options().analytics_timeout, options, "analytics_timeout");
|
|
1984
2004
|
cb_extract_option_milliseconds(origin.options().search_timeout, options, "search_timeout");
|
|
1985
2005
|
cb_extract_option_milliseconds(origin.options().management_timeout, options, "management_timeout");
|
|
1986
|
-
cb_extract_option_milliseconds(origin.options().dns_srv_timeout, options, "dns_srv_timeout");
|
|
1987
2006
|
cb_extract_option_milliseconds(origin.options().tcp_keep_alive_interval, options, "tcp_keep_alive_interval");
|
|
1988
2007
|
cb_extract_option_milliseconds(origin.options().config_poll_interval, options, "config_poll_interval");
|
|
1989
2008
|
cb_extract_option_milliseconds(origin.options().config_poll_floor, options, "config_poll_floor");
|
|
1990
2009
|
cb_extract_option_milliseconds(origin.options().config_idle_redial_timeout, options, "config_idle_redial_timeout");
|
|
1991
2010
|
cb_extract_option_milliseconds(origin.options().idle_http_connection_timeout, options, "idle_http_connection_timeout");
|
|
1992
2011
|
|
|
2012
|
+
cb_extract_dns_config(origin.options().dns_config, options);
|
|
2013
|
+
|
|
1993
2014
|
cb_extract_option_number(origin.options().max_http_connections, options, "max_http_connections");
|
|
1994
2015
|
|
|
1995
2016
|
cb_extract_option_bool(origin.options().enable_tls, options, "enable_tls");
|
|
@@ -5084,9 +5105,9 @@ cb_Backend_query_index_get_all(VALUE self, VALUE bucket_name, VALUE options)
|
|
|
5084
5105
|
VALUE indexes = rb_ary_new_capa(static_cast<long>(resp.indexes.size()));
|
|
5085
5106
|
for (const auto& idx : resp.indexes) {
|
|
5086
5107
|
VALUE index = rb_hash_new();
|
|
5087
|
-
rb_hash_aset(index, rb_id2sym(rb_intern("state")),
|
|
5108
|
+
rb_hash_aset(index, rb_id2sym(rb_intern("state")), rb_id2sym(rb_intern(idx.state.c_str())));
|
|
5088
5109
|
rb_hash_aset(index, rb_id2sym(rb_intern("name")), cb_str_new(idx.name));
|
|
5089
|
-
rb_hash_aset(index, rb_id2sym(rb_intern("type")),
|
|
5110
|
+
rb_hash_aset(index, rb_id2sym(rb_intern("type")), rb_id2sym(rb_intern(idx.type.c_str())));
|
|
5090
5111
|
rb_hash_aset(index, rb_id2sym(rb_intern("is_primary")), idx.is_primary ? Qtrue : Qfalse);
|
|
5091
5112
|
VALUE index_key = rb_ary_new_capa(static_cast<long>(idx.index_key.size()));
|
|
5092
5113
|
for (const auto& key : idx.index_key) {
|
|
@@ -5463,16 +5484,473 @@ cb_Backend_query_index_build_deferred(VALUE self, VALUE bucket_name, VALUE optio
|
|
|
5463
5484
|
}
|
|
5464
5485
|
|
|
5465
5486
|
static VALUE
|
|
5466
|
-
|
|
5487
|
+
cb_Backend_collection_query_index_get_all(VALUE self, VALUE bucket_name, VALUE scope_name, VALUE collection_name, VALUE options)
|
|
5488
|
+
{
|
|
5489
|
+
const auto& cluster = cb_backend_to_cluster(self);
|
|
5490
|
+
|
|
5491
|
+
Check_Type(bucket_name, T_STRING);
|
|
5492
|
+
Check_Type(scope_name, T_STRING);
|
|
5493
|
+
Check_Type(collection_name, T_STRING);
|
|
5494
|
+
if (!NIL_P(options)) {
|
|
5495
|
+
Check_Type(options, T_HASH);
|
|
5496
|
+
}
|
|
5497
|
+
|
|
5498
|
+
try {
|
|
5499
|
+
couchbase::core::operations::management::query_index_get_all_request req{};
|
|
5500
|
+
req.bucket_name = cb_string_new(bucket_name);
|
|
5501
|
+
req.scope_name = cb_string_new(scope_name);
|
|
5502
|
+
req.collection_name = cb_string_new(collection_name);
|
|
5503
|
+
cb_extract_timeout(req, options);
|
|
5504
|
+
auto barrier = std::make_shared<std::promise<couchbase::core::operations::management::query_index_get_all_response>>();
|
|
5505
|
+
auto f = barrier->get_future();
|
|
5506
|
+
cluster->execute(req, [barrier](couchbase::core::operations::management::query_index_get_all_response&& resp) {
|
|
5507
|
+
barrier->set_value(std::move(resp));
|
|
5508
|
+
});
|
|
5509
|
+
auto resp = cb_wait_for_future(f);
|
|
5510
|
+
if (resp.ctx.ec) {
|
|
5511
|
+
cb_throw_error_code(resp.ctx, fmt::format("unable to get list of the indexes of the collection \"{}\"", req.collection_name));
|
|
5512
|
+
}
|
|
5513
|
+
|
|
5514
|
+
VALUE res = rb_hash_new();
|
|
5515
|
+
rb_hash_aset(res, rb_id2sym(rb_intern("status")), cb_str_new(resp.status));
|
|
5516
|
+
VALUE indexes = rb_ary_new_capa(static_cast<long>(resp.indexes.size()));
|
|
5517
|
+
for (const auto& idx : resp.indexes) {
|
|
5518
|
+
VALUE index = rb_hash_new();
|
|
5519
|
+
rb_hash_aset(index, rb_id2sym(rb_intern("state")), rb_id2sym(rb_intern(idx.state.c_str())));
|
|
5520
|
+
rb_hash_aset(index, rb_id2sym(rb_intern("name")), cb_str_new(idx.name));
|
|
5521
|
+
rb_hash_aset(index, rb_id2sym(rb_intern("type")), rb_id2sym(rb_intern(idx.type.c_str())));
|
|
5522
|
+
rb_hash_aset(index, rb_id2sym(rb_intern("is_primary")), idx.is_primary ? Qtrue : Qfalse);
|
|
5523
|
+
VALUE index_key = rb_ary_new_capa(static_cast<long>(idx.index_key.size()));
|
|
5524
|
+
for (const auto& key : idx.index_key) {
|
|
5525
|
+
rb_ary_push(index_key, cb_str_new(key));
|
|
5526
|
+
}
|
|
5527
|
+
rb_hash_aset(index, rb_id2sym(rb_intern("index_key")), index_key);
|
|
5528
|
+
if (idx.collection_name) {
|
|
5529
|
+
rb_hash_aset(index, rb_id2sym(rb_intern("collection_name")), cb_str_new(idx.collection_name.value()));
|
|
5530
|
+
}
|
|
5531
|
+
if (idx.scope_name) {
|
|
5532
|
+
rb_hash_aset(index, rb_id2sym(rb_intern("scope_name")), cb_str_new(idx.scope_name.value()));
|
|
5533
|
+
}
|
|
5534
|
+
rb_hash_aset(index, rb_id2sym(rb_intern("bucket_name")), cb_str_new(idx.bucket_name));
|
|
5535
|
+
if (idx.condition) {
|
|
5536
|
+
rb_hash_aset(index, rb_id2sym(rb_intern("condition")), cb_str_new(idx.condition.value()));
|
|
5537
|
+
}
|
|
5538
|
+
if (idx.partition) {
|
|
5539
|
+
rb_hash_aset(index, rb_id2sym(rb_intern("partition")), cb_str_new(idx.partition.value()));
|
|
5540
|
+
}
|
|
5541
|
+
rb_ary_push(indexes, index);
|
|
5542
|
+
}
|
|
5543
|
+
|
|
5544
|
+
rb_hash_aset(res, rb_id2sym(rb_intern("indexes")), indexes);
|
|
5545
|
+
|
|
5546
|
+
return res;
|
|
5547
|
+
} catch (const std::system_error& se) {
|
|
5548
|
+
rb_exc_raise(cb_map_error_code(se.code(), fmt::format("failed to perform {}: {}", __func__, se.what()), false));
|
|
5549
|
+
} catch (const ruby_exception& e) {
|
|
5550
|
+
rb_exc_raise(e.exception_object());
|
|
5551
|
+
}
|
|
5552
|
+
return Qnil;
|
|
5553
|
+
}
|
|
5554
|
+
|
|
5555
|
+
static VALUE
|
|
5556
|
+
cb_Backend_collection_query_index_create(VALUE self,
|
|
5557
|
+
VALUE bucket_name,
|
|
5558
|
+
VALUE scope_name,
|
|
5559
|
+
VALUE collection_name,
|
|
5560
|
+
VALUE index_name,
|
|
5561
|
+
VALUE fields,
|
|
5562
|
+
VALUE options)
|
|
5563
|
+
{
|
|
5564
|
+
const auto& cluster = cb_backend_to_cluster(self);
|
|
5565
|
+
|
|
5566
|
+
Check_Type(bucket_name, T_STRING);
|
|
5567
|
+
Check_Type(scope_name, T_STRING);
|
|
5568
|
+
Check_Type(collection_name, T_STRING);
|
|
5569
|
+
Check_Type(index_name, T_STRING);
|
|
5570
|
+
Check_Type(fields, T_ARRAY);
|
|
5571
|
+
if (!NIL_P(options)) {
|
|
5572
|
+
Check_Type(options, T_HASH);
|
|
5573
|
+
}
|
|
5574
|
+
|
|
5575
|
+
try {
|
|
5576
|
+
couchbase::core::operations::management::query_index_create_request req{};
|
|
5577
|
+
cb_extract_timeout(req, options);
|
|
5578
|
+
req.bucket_name = cb_string_new(bucket_name);
|
|
5579
|
+
req.scope_name = cb_string_new(scope_name);
|
|
5580
|
+
req.collection_name = cb_string_new(collection_name);
|
|
5581
|
+
req.index_name = cb_string_new(index_name);
|
|
5582
|
+
auto fields_num = static_cast<std::size_t>(RARRAY_LEN(fields));
|
|
5583
|
+
req.fields.reserve(fields_num);
|
|
5584
|
+
for (std::size_t i = 0; i < fields_num; ++i) {
|
|
5585
|
+
VALUE entry = rb_ary_entry(fields, static_cast<long>(i));
|
|
5586
|
+
cb_check_type(entry, T_STRING);
|
|
5587
|
+
req.fields.emplace_back(RSTRING_PTR(entry), static_cast<std::size_t>(RSTRING_LEN(entry)));
|
|
5588
|
+
}
|
|
5589
|
+
if (!NIL_P(options)) {
|
|
5590
|
+
if (VALUE ignore_if_exists = rb_hash_aref(options, rb_id2sym(rb_intern("ignore_if_exists"))); ignore_if_exists == Qtrue) {
|
|
5591
|
+
req.ignore_if_exists = true;
|
|
5592
|
+
} else if (ignore_if_exists == Qfalse) {
|
|
5593
|
+
req.ignore_if_exists = false;
|
|
5594
|
+
} /* else use backend default */
|
|
5595
|
+
if (VALUE deferred = rb_hash_aref(options, rb_id2sym(rb_intern("deferred"))); deferred == Qtrue) {
|
|
5596
|
+
req.deferred = true;
|
|
5597
|
+
} else if (deferred == Qfalse) {
|
|
5598
|
+
req.deferred = false;
|
|
5599
|
+
} /* else use backend default */
|
|
5600
|
+
if (VALUE num_replicas = rb_hash_aref(options, rb_id2sym(rb_intern("num_replicas"))); !NIL_P(num_replicas)) {
|
|
5601
|
+
req.num_replicas = NUM2UINT(num_replicas);
|
|
5602
|
+
} /* else use backend default */
|
|
5603
|
+
if (VALUE condition = rb_hash_aref(options, rb_id2sym(rb_intern("condition"))); !NIL_P(condition)) {
|
|
5604
|
+
req.condition.emplace(cb_string_new(condition));
|
|
5605
|
+
} /* else use backend default */
|
|
5606
|
+
if (VALUE scope_name = rb_hash_aref(options, rb_id2sym(rb_intern("scope_name"))); TYPE(scope_name) == T_STRING) {
|
|
5607
|
+
req.scope_name = cb_string_new(scope_name);
|
|
5608
|
+
}
|
|
5609
|
+
if (VALUE collection_name = rb_hash_aref(options, rb_id2sym(rb_intern("collection_name"))); TYPE(collection_name) == T_STRING) {
|
|
5610
|
+
req.collection_name = cb_string_new(collection_name);
|
|
5611
|
+
}
|
|
5612
|
+
}
|
|
5613
|
+
|
|
5614
|
+
auto barrier = std::make_shared<std::promise<couchbase::core::operations::management::query_index_create_response>>();
|
|
5615
|
+
auto f = barrier->get_future();
|
|
5616
|
+
cluster->execute(req, [barrier](couchbase::core::operations::management::query_index_create_response&& resp) {
|
|
5617
|
+
barrier->set_value(std::move(resp));
|
|
5618
|
+
});
|
|
5619
|
+
auto resp = cb_wait_for_future(f);
|
|
5620
|
+
if (resp.ctx.ec) {
|
|
5621
|
+
if (!resp.errors.empty()) {
|
|
5622
|
+
const auto& first_error = resp.errors.front();
|
|
5623
|
+
cb_throw_error_code(resp.ctx,
|
|
5624
|
+
fmt::format(R"(unable to create index "{}" on the collection "{}" ({}: {}))",
|
|
5625
|
+
req.index_name,
|
|
5626
|
+
req.collection_name,
|
|
5627
|
+
first_error.code,
|
|
5628
|
+
first_error.message));
|
|
5629
|
+
} else {
|
|
5630
|
+
cb_throw_error_code(
|
|
5631
|
+
resp.ctx, fmt::format(R"(unable to create index "{}" on the collection "{}")", req.index_name, req.collection_name));
|
|
5632
|
+
}
|
|
5633
|
+
}
|
|
5634
|
+
VALUE res = rb_hash_new();
|
|
5635
|
+
rb_hash_aset(res, rb_id2sym(rb_intern("status")), cb_str_new(resp.status));
|
|
5636
|
+
if (!resp.errors.empty()) {
|
|
5637
|
+
VALUE errors = rb_ary_new_capa(static_cast<long>(resp.errors.size()));
|
|
5638
|
+
for (const auto& err : resp.errors) {
|
|
5639
|
+
VALUE error = rb_hash_new();
|
|
5640
|
+
rb_hash_aset(error, rb_id2sym(rb_intern("code")), ULL2NUM(err.code));
|
|
5641
|
+
rb_hash_aset(error, rb_id2sym(rb_intern("message")), cb_str_new(err.message));
|
|
5642
|
+
rb_ary_push(errors, error);
|
|
5643
|
+
}
|
|
5644
|
+
rb_hash_aset(res, rb_id2sym(rb_intern("errors")), errors);
|
|
5645
|
+
}
|
|
5646
|
+
return res;
|
|
5647
|
+
} catch (const std::system_error& se) {
|
|
5648
|
+
rb_exc_raise(cb_map_error_code(se.code(), fmt::format("failed to perform {}: {}", __func__, se.what()), false));
|
|
5649
|
+
} catch (const ruby_exception& e) {
|
|
5650
|
+
rb_exc_raise(e.exception_object());
|
|
5651
|
+
}
|
|
5652
|
+
return Qnil;
|
|
5653
|
+
}
|
|
5654
|
+
|
|
5655
|
+
static VALUE
|
|
5656
|
+
cb_Backend_collection_query_index_drop(VALUE self,
|
|
5657
|
+
VALUE bucket_name,
|
|
5658
|
+
VALUE scope_name,
|
|
5659
|
+
VALUE collection_name,
|
|
5660
|
+
VALUE index_name,
|
|
5661
|
+
VALUE options)
|
|
5662
|
+
{
|
|
5663
|
+
const auto& cluster = cb_backend_to_cluster(self);
|
|
5664
|
+
|
|
5665
|
+
Check_Type(bucket_name, T_STRING);
|
|
5666
|
+
Check_Type(scope_name, T_STRING);
|
|
5667
|
+
Check_Type(collection_name, T_STRING);
|
|
5668
|
+
Check_Type(index_name, T_STRING);
|
|
5669
|
+
if (!NIL_P(options)) {
|
|
5670
|
+
Check_Type(options, T_HASH);
|
|
5671
|
+
}
|
|
5672
|
+
|
|
5673
|
+
try {
|
|
5674
|
+
couchbase::core::operations::management::query_index_drop_request req{};
|
|
5675
|
+
cb_extract_timeout(req, options);
|
|
5676
|
+
req.bucket_name = cb_string_new(bucket_name);
|
|
5677
|
+
req.scope_name = cb_string_new(scope_name);
|
|
5678
|
+
req.collection_name = cb_string_new(collection_name);
|
|
5679
|
+
req.index_name = cb_string_new(index_name);
|
|
5680
|
+
if (!NIL_P(options)) {
|
|
5681
|
+
if (VALUE ignore_if_does_not_exist = rb_hash_aref(options, rb_id2sym(rb_intern("ignore_if_does_not_exist")));
|
|
5682
|
+
ignore_if_does_not_exist == Qtrue) {
|
|
5683
|
+
req.ignore_if_does_not_exist = true;
|
|
5684
|
+
} else if (ignore_if_does_not_exist == Qfalse) {
|
|
5685
|
+
req.ignore_if_does_not_exist = false;
|
|
5686
|
+
} /* else use backend default */
|
|
5687
|
+
if (VALUE scope_name = rb_hash_aref(options, rb_id2sym(rb_intern("scope_name"))); TYPE(scope_name) == T_STRING) {
|
|
5688
|
+
req.scope_name = cb_string_new(scope_name);
|
|
5689
|
+
}
|
|
5690
|
+
if (VALUE collection_name = rb_hash_aref(options, rb_id2sym(rb_intern("collection_name"))); TYPE(collection_name) == T_STRING) {
|
|
5691
|
+
req.collection_name = cb_string_new(collection_name);
|
|
5692
|
+
}
|
|
5693
|
+
}
|
|
5694
|
+
|
|
5695
|
+
auto barrier = std::make_shared<std::promise<couchbase::core::operations::management::query_index_drop_response>>();
|
|
5696
|
+
auto f = barrier->get_future();
|
|
5697
|
+
cluster->execute(req, [barrier](couchbase::core::operations::management::query_index_drop_response&& resp) {
|
|
5698
|
+
barrier->set_value(std::move(resp));
|
|
5699
|
+
});
|
|
5700
|
+
auto resp = cb_wait_for_future(f);
|
|
5701
|
+
if (resp.ctx.ec) {
|
|
5702
|
+
if (!resp.errors.empty()) {
|
|
5703
|
+
const auto& first_error = resp.errors.front();
|
|
5704
|
+
cb_throw_error_code(resp.ctx,
|
|
5705
|
+
fmt::format(R"(unable to drop index "{}" on the collection "{}" ({}: {}))",
|
|
5706
|
+
req.index_name,
|
|
5707
|
+
req.collection_name,
|
|
5708
|
+
first_error.code,
|
|
5709
|
+
first_error.message));
|
|
5710
|
+
} else {
|
|
5711
|
+
cb_throw_error_code(
|
|
5712
|
+
resp.ctx, fmt::format(R"(unable to drop index "{}" on the collection "{}")", req.index_name, req.collection_name));
|
|
5713
|
+
}
|
|
5714
|
+
}
|
|
5715
|
+
VALUE res = rb_hash_new();
|
|
5716
|
+
rb_hash_aset(res, rb_id2sym(rb_intern("status")), cb_str_new(resp.status));
|
|
5717
|
+
if (!resp.errors.empty()) {
|
|
5718
|
+
VALUE errors = rb_ary_new_capa(static_cast<long>(resp.errors.size()));
|
|
5719
|
+
for (const auto& err : resp.errors) {
|
|
5720
|
+
VALUE error = rb_hash_new();
|
|
5721
|
+
rb_hash_aset(error, rb_id2sym(rb_intern("code")), ULL2NUM(err.code));
|
|
5722
|
+
rb_hash_aset(error, rb_id2sym(rb_intern("message")), cb_str_new(err.message));
|
|
5723
|
+
rb_ary_push(errors, error);
|
|
5724
|
+
}
|
|
5725
|
+
rb_hash_aset(res, rb_id2sym(rb_intern("errors")), errors);
|
|
5726
|
+
}
|
|
5727
|
+
return res;
|
|
5728
|
+
} catch (const std::system_error& se) {
|
|
5729
|
+
rb_exc_raise(cb_map_error_code(se.code(), fmt::format("failed to perform {}: {}", __func__, se.what()), false));
|
|
5730
|
+
} catch (const ruby_exception& e) {
|
|
5731
|
+
rb_exc_raise(e.exception_object());
|
|
5732
|
+
}
|
|
5733
|
+
return Qnil;
|
|
5734
|
+
}
|
|
5735
|
+
|
|
5736
|
+
static VALUE
|
|
5737
|
+
cb_Backend_collection_query_index_create_primary(VALUE self, VALUE bucket_name, VALUE scope_name, VALUE collection_name, VALUE options)
|
|
5738
|
+
{
|
|
5739
|
+
const auto& cluster = cb_backend_to_cluster(self);
|
|
5740
|
+
|
|
5741
|
+
Check_Type(bucket_name, T_STRING);
|
|
5742
|
+
Check_Type(scope_name, T_STRING);
|
|
5743
|
+
Check_Type(collection_name, T_STRING);
|
|
5744
|
+
if (!NIL_P(options)) {
|
|
5745
|
+
Check_Type(options, T_HASH);
|
|
5746
|
+
}
|
|
5747
|
+
|
|
5748
|
+
try {
|
|
5749
|
+
couchbase::core::operations::management::query_index_create_request req{};
|
|
5750
|
+
cb_extract_timeout(req, options);
|
|
5751
|
+
req.is_primary = true;
|
|
5752
|
+
req.bucket_name = cb_string_new(bucket_name);
|
|
5753
|
+
req.scope_name = cb_string_new(scope_name);
|
|
5754
|
+
req.collection_name = cb_string_new(collection_name);
|
|
5755
|
+
if (!NIL_P(options)) {
|
|
5756
|
+
if (VALUE ignore_if_exists = rb_hash_aref(options, rb_id2sym(rb_intern("ignore_if_exists"))); ignore_if_exists == Qtrue) {
|
|
5757
|
+
req.ignore_if_exists = true;
|
|
5758
|
+
} else if (ignore_if_exists == Qfalse) {
|
|
5759
|
+
req.ignore_if_exists = false;
|
|
5760
|
+
} /* else use backend default */
|
|
5761
|
+
if (VALUE deferred = rb_hash_aref(options, rb_id2sym(rb_intern("deferred"))); deferred == Qtrue) {
|
|
5762
|
+
req.deferred = true;
|
|
5763
|
+
} else if (deferred == Qfalse) {
|
|
5764
|
+
req.deferred = false;
|
|
5765
|
+
} /* else use backend default */
|
|
5766
|
+
if (VALUE num_replicas = rb_hash_aref(options, rb_id2sym(rb_intern("num_replicas"))); !NIL_P(num_replicas)) {
|
|
5767
|
+
req.num_replicas = NUM2UINT(num_replicas);
|
|
5768
|
+
} /* else use backend default */
|
|
5769
|
+
if (VALUE index_name = rb_hash_aref(options, rb_id2sym(rb_intern("index_name"))); TYPE(index_name) == T_STRING) {
|
|
5770
|
+
req.index_name = cb_string_new(index_name);
|
|
5771
|
+
} /* else use backend default */
|
|
5772
|
+
if (VALUE scope_name = rb_hash_aref(options, rb_id2sym(rb_intern("scope_name"))); TYPE(scope_name) == T_STRING) {
|
|
5773
|
+
req.scope_name = cb_string_new(scope_name);
|
|
5774
|
+
}
|
|
5775
|
+
if (VALUE collection_name = rb_hash_aref(options, rb_id2sym(rb_intern("collection_name"))); TYPE(collection_name) == T_STRING) {
|
|
5776
|
+
req.collection_name = cb_string_new(collection_name);
|
|
5777
|
+
}
|
|
5778
|
+
}
|
|
5779
|
+
|
|
5780
|
+
auto barrier = std::make_shared<std::promise<couchbase::core::operations::management::query_index_create_response>>();
|
|
5781
|
+
auto f = barrier->get_future();
|
|
5782
|
+
cluster->execute(req, [barrier](couchbase::core::operations::management::query_index_create_response&& resp) {
|
|
5783
|
+
barrier->set_value(std::move(resp));
|
|
5784
|
+
});
|
|
5785
|
+
auto resp = cb_wait_for_future(f);
|
|
5786
|
+
if (resp.ctx.ec) {
|
|
5787
|
+
if (!resp.errors.empty()) {
|
|
5788
|
+
const auto& first_error = resp.errors.front();
|
|
5789
|
+
cb_throw_error_code(resp.ctx,
|
|
5790
|
+
fmt::format(R"(unable to create primary index on the collection "{}" ({}: {}))",
|
|
5791
|
+
req.collection_name,
|
|
5792
|
+
first_error.code,
|
|
5793
|
+
first_error.message));
|
|
5794
|
+
} else {
|
|
5795
|
+
cb_throw_error_code(resp.ctx, fmt::format(R"(unable to create primary index on the collection "{}")", req.collection_name));
|
|
5796
|
+
}
|
|
5797
|
+
}
|
|
5798
|
+
VALUE res = rb_hash_new();
|
|
5799
|
+
rb_hash_aset(res, rb_id2sym(rb_intern("status")), cb_str_new(resp.status));
|
|
5800
|
+
if (!resp.errors.empty()) {
|
|
5801
|
+
VALUE errors = rb_ary_new_capa(static_cast<long>(resp.errors.size()));
|
|
5802
|
+
for (const auto& err : resp.errors) {
|
|
5803
|
+
VALUE error = rb_hash_new();
|
|
5804
|
+
rb_hash_aset(error, rb_id2sym(rb_intern("code")), ULL2NUM(err.code));
|
|
5805
|
+
rb_hash_aset(error, rb_id2sym(rb_intern("message")), cb_str_new(err.message));
|
|
5806
|
+
rb_ary_push(errors, error);
|
|
5807
|
+
}
|
|
5808
|
+
rb_hash_aset(res, rb_id2sym(rb_intern("errors")), errors);
|
|
5809
|
+
}
|
|
5810
|
+
return res;
|
|
5811
|
+
} catch (const std::system_error& se) {
|
|
5812
|
+
rb_exc_raise(cb_map_error_code(se.code(), fmt::format("failed to perform {}: {}", __func__, se.what()), false));
|
|
5813
|
+
} catch (const ruby_exception& e) {
|
|
5814
|
+
rb_exc_raise(e.exception_object());
|
|
5815
|
+
}
|
|
5816
|
+
return Qnil;
|
|
5817
|
+
}
|
|
5818
|
+
|
|
5819
|
+
static VALUE
|
|
5820
|
+
cb_Backend_collection_query_index_drop_primary(VALUE self, VALUE bucket_name, VALUE scope_name, VALUE collection_name, VALUE options)
|
|
5821
|
+
{
|
|
5822
|
+
const auto& cluster = cb_backend_to_cluster(self);
|
|
5823
|
+
|
|
5824
|
+
Check_Type(bucket_name, T_STRING);
|
|
5825
|
+
Check_Type(scope_name, T_STRING);
|
|
5826
|
+
Check_Type(collection_name, T_STRING);
|
|
5827
|
+
if (!NIL_P(options)) {
|
|
5828
|
+
Check_Type(options, T_HASH);
|
|
5829
|
+
}
|
|
5830
|
+
|
|
5831
|
+
try {
|
|
5832
|
+
couchbase::core::operations::management::query_index_drop_request req{};
|
|
5833
|
+
cb_extract_timeout(req, options);
|
|
5834
|
+
req.is_primary = true;
|
|
5835
|
+
req.bucket_name = cb_string_new(bucket_name);
|
|
5836
|
+
req.scope_name = cb_string_new(scope_name);
|
|
5837
|
+
req.collection_name = cb_string_new(collection_name);
|
|
5838
|
+
if (!NIL_P(options)) {
|
|
5839
|
+
if (VALUE ignore_if_does_not_exist = rb_hash_aref(options, rb_id2sym(rb_intern("ignore_if_does_not_exist")));
|
|
5840
|
+
ignore_if_does_not_exist == Qtrue) {
|
|
5841
|
+
req.ignore_if_does_not_exist = true;
|
|
5842
|
+
} else if (ignore_if_does_not_exist == Qfalse) {
|
|
5843
|
+
req.ignore_if_does_not_exist = false;
|
|
5844
|
+
} /* else use backend default */
|
|
5845
|
+
if (VALUE index_name = rb_hash_aref(options, rb_id2sym(rb_intern("index_name"))); !NIL_P(index_name)) {
|
|
5846
|
+
cb_check_type(options, T_STRING);
|
|
5847
|
+
req.is_primary = false;
|
|
5848
|
+
req.bucket_name = cb_string_new(index_name);
|
|
5849
|
+
}
|
|
5850
|
+
if (VALUE scope_name = rb_hash_aref(options, rb_id2sym(rb_intern("scope_name"))); TYPE(scope_name) == T_STRING) {
|
|
5851
|
+
req.scope_name = cb_string_new(scope_name);
|
|
5852
|
+
}
|
|
5853
|
+
if (VALUE collection_name = rb_hash_aref(options, rb_id2sym(rb_intern("collection_name"))); TYPE(collection_name) == T_STRING) {
|
|
5854
|
+
req.collection_name = cb_string_new(collection_name);
|
|
5855
|
+
}
|
|
5856
|
+
}
|
|
5857
|
+
|
|
5858
|
+
auto barrier = std::make_shared<std::promise<couchbase::core::operations::management::query_index_drop_response>>();
|
|
5859
|
+
auto f = barrier->get_future();
|
|
5860
|
+
cluster->execute(req, [barrier](couchbase::core::operations::management::query_index_drop_response&& resp) {
|
|
5861
|
+
barrier->set_value(std::move(resp));
|
|
5862
|
+
});
|
|
5863
|
+
auto resp = cb_wait_for_future(f);
|
|
5864
|
+
if (resp.ctx.ec) {
|
|
5865
|
+
if (!resp.errors.empty()) {
|
|
5866
|
+
const auto& first_error = resp.errors.front();
|
|
5867
|
+
cb_throw_error_code(resp.ctx,
|
|
5868
|
+
fmt::format(R"(unable to drop primary index on the collection "{}" ({}: {}))",
|
|
5869
|
+
req.collection_name,
|
|
5870
|
+
first_error.code,
|
|
5871
|
+
first_error.message));
|
|
5872
|
+
} else {
|
|
5873
|
+
cb_throw_error_code(resp.ctx, fmt::format(R"(unable to drop primary index on the collection "{}")", req.collection_name));
|
|
5874
|
+
}
|
|
5875
|
+
}
|
|
5876
|
+
VALUE res = rb_hash_new();
|
|
5877
|
+
rb_hash_aset(res, rb_id2sym(rb_intern("status")), cb_str_new(resp.status));
|
|
5878
|
+
if (!resp.errors.empty()) {
|
|
5879
|
+
VALUE errors = rb_ary_new_capa(static_cast<long>(resp.errors.size()));
|
|
5880
|
+
for (const auto& err : resp.errors) {
|
|
5881
|
+
VALUE error = rb_hash_new();
|
|
5882
|
+
rb_hash_aset(error, rb_id2sym(rb_intern("code")), ULL2NUM(err.code));
|
|
5883
|
+
rb_hash_aset(error, rb_id2sym(rb_intern("message")), cb_str_new(err.message));
|
|
5884
|
+
rb_ary_push(errors, error);
|
|
5885
|
+
}
|
|
5886
|
+
rb_hash_aset(res, rb_id2sym(rb_intern("errors")), errors);
|
|
5887
|
+
}
|
|
5888
|
+
return res;
|
|
5889
|
+
} catch (const std::system_error& se) {
|
|
5890
|
+
rb_exc_raise(cb_map_error_code(se.code(), fmt::format("failed to perform {}: {}", __func__, se.what()), false));
|
|
5891
|
+
} catch (const ruby_exception& e) {
|
|
5892
|
+
rb_exc_raise(e.exception_object());
|
|
5893
|
+
}
|
|
5894
|
+
return Qnil;
|
|
5895
|
+
}
|
|
5896
|
+
|
|
5897
|
+
static VALUE
|
|
5898
|
+
cb_Backend_collection_query_index_build_deferred(VALUE self, VALUE bucket_name, VALUE scope_name, VALUE collection_name, VALUE options)
|
|
5467
5899
|
{
|
|
5900
|
+
const auto& cluster = cb_backend_to_cluster(self);
|
|
5901
|
+
|
|
5468
5902
|
Check_Type(bucket_name, T_STRING);
|
|
5469
|
-
Check_Type(
|
|
5470
|
-
Check_Type(
|
|
5903
|
+
Check_Type(scope_name, T_STRING);
|
|
5904
|
+
Check_Type(collection_name, T_STRING);
|
|
5471
5905
|
if (!NIL_P(options)) {
|
|
5472
5906
|
Check_Type(options, T_HASH);
|
|
5473
5907
|
}
|
|
5474
5908
|
|
|
5475
|
-
|
|
5909
|
+
try {
|
|
5910
|
+
couchbase::core::operations::management::query_index_build_deferred_request req{};
|
|
5911
|
+
cb_extract_timeout(req, options);
|
|
5912
|
+
req.bucket_name = cb_string_new(bucket_name);
|
|
5913
|
+
req.scope_name = cb_string_new(scope_name);
|
|
5914
|
+
req.collection_name = cb_string_new(collection_name);
|
|
5915
|
+
|
|
5916
|
+
auto barrier = std::make_shared<std::promise<couchbase::core::operations::management::query_index_build_deferred_response>>();
|
|
5917
|
+
auto f = barrier->get_future();
|
|
5918
|
+
cluster->execute(req, [barrier](couchbase::core::operations::management::query_index_build_deferred_response&& resp) {
|
|
5919
|
+
barrier->set_value(std::move(resp));
|
|
5920
|
+
});
|
|
5921
|
+
auto resp = cb_wait_for_future(f);
|
|
5922
|
+
if (resp.ctx.ec) {
|
|
5923
|
+
if (!resp.errors.empty()) {
|
|
5924
|
+
const auto& first_error = resp.errors.front();
|
|
5925
|
+
cb_throw_error_code(resp.ctx,
|
|
5926
|
+
fmt::format(R"(unable to build deferred indexes on the collection "{}" ({}: {}))",
|
|
5927
|
+
req.collection_name.value(),
|
|
5928
|
+
first_error.code,
|
|
5929
|
+
first_error.message));
|
|
5930
|
+
} else {
|
|
5931
|
+
cb_throw_error_code(resp.ctx,
|
|
5932
|
+
fmt::format(R"(unable to build deferred indexes on the collection "{}")", req.collection_name.value()));
|
|
5933
|
+
}
|
|
5934
|
+
}
|
|
5935
|
+
VALUE res = rb_hash_new();
|
|
5936
|
+
rb_hash_aset(res, rb_id2sym(rb_intern("status")), cb_str_new(resp.status));
|
|
5937
|
+
if (!resp.errors.empty()) {
|
|
5938
|
+
VALUE errors = rb_ary_new_capa(static_cast<long>(resp.errors.size()));
|
|
5939
|
+
for (const auto& err : resp.errors) {
|
|
5940
|
+
VALUE error = rb_hash_new();
|
|
5941
|
+
rb_hash_aset(error, rb_id2sym(rb_intern("code")), ULL2NUM(err.code));
|
|
5942
|
+
rb_hash_aset(error, rb_id2sym(rb_intern("message")), cb_str_new(err.message));
|
|
5943
|
+
rb_ary_push(errors, error);
|
|
5944
|
+
}
|
|
5945
|
+
rb_hash_aset(res, rb_id2sym(rb_intern("errors")), errors);
|
|
5946
|
+
}
|
|
5947
|
+
return res;
|
|
5948
|
+
} catch (const std::system_error& se) {
|
|
5949
|
+
rb_exc_raise(cb_map_error_code(se.code(), fmt::format("failed to perform {}: {}", __func__, se.what()), false));
|
|
5950
|
+
} catch (const ruby_exception& e) {
|
|
5951
|
+
rb_exc_raise(e.exception_object());
|
|
5952
|
+
}
|
|
5953
|
+
return Qnil;
|
|
5476
5954
|
}
|
|
5477
5955
|
|
|
5478
5956
|
static void
|
|
@@ -6150,19 +6628,15 @@ cb_Backend_document_search(VALUE self, VALUE index_name, VALUE query, VALUE opti
|
|
|
6150
6628
|
}
|
|
6151
6629
|
}
|
|
6152
6630
|
|
|
6153
|
-
|
|
6154
|
-
|
|
6155
|
-
|
|
6156
|
-
|
|
6157
|
-
|
|
6158
|
-
|
|
6159
|
-
|
|
6160
|
-
|
|
6161
|
-
|
|
6162
|
-
VALUE collection = rb_ary_entry(collections, static_cast<long>(i));
|
|
6163
|
-
cb_check_type(collection, T_STRING);
|
|
6164
|
-
req.collections.emplace_back(cb_string_new(collection));
|
|
6165
|
-
}
|
|
6631
|
+
VALUE collections = rb_hash_aref(options, rb_id2sym(rb_intern("collections")));
|
|
6632
|
+
if (!NIL_P(collections)) {
|
|
6633
|
+
cb_check_type(collections, T_ARRAY);
|
|
6634
|
+
auto collections_size = static_cast<std::size_t>(RARRAY_LEN(collections));
|
|
6635
|
+
req.collections.reserve(collections_size);
|
|
6636
|
+
for (std::size_t i = 0; i < collections_size; ++i) {
|
|
6637
|
+
VALUE collection = rb_ary_entry(collections, static_cast<long>(i));
|
|
6638
|
+
cb_check_type(collection, T_STRING);
|
|
6639
|
+
req.collections.emplace_back(cb_string_new(collection));
|
|
6166
6640
|
}
|
|
6167
6641
|
}
|
|
6168
6642
|
|
|
@@ -6366,12 +6840,12 @@ cb_Backend_dns_srv(VALUE self, VALUE hostname, VALUE service)
|
|
|
6366
6840
|
if (tls) {
|
|
6367
6841
|
service_name = "_couchbases";
|
|
6368
6842
|
}
|
|
6369
|
-
auto barrier = std::make_shared<std::promise<couchbase::core::io::dns::
|
|
6843
|
+
auto barrier = std::make_shared<std::promise<couchbase::core::io::dns::dns_srv_response>>();
|
|
6370
6844
|
auto f = barrier->get_future();
|
|
6371
6845
|
client.query_srv(host_name,
|
|
6372
6846
|
service_name,
|
|
6373
6847
|
couchbase::core::io::dns::dns_config::system_config(),
|
|
6374
|
-
[barrier](couchbase::core::io::dns::
|
|
6848
|
+
[barrier](couchbase::core::io::dns::dns_srv_response&& resp) { barrier->set_value(std::move(resp)); });
|
|
6375
6849
|
ctx.run();
|
|
6376
6850
|
auto resp = cb_wait_for_future(f);
|
|
6377
6851
|
if (resp.ec) {
|
|
@@ -8132,7 +8606,13 @@ init_backend(VALUE mCouchbase)
|
|
|
8132
8606
|
rb_define_method(cBackend, "query_index_drop", VALUE_FUNC(cb_Backend_query_index_drop), 3);
|
|
8133
8607
|
rb_define_method(cBackend, "query_index_drop_primary", VALUE_FUNC(cb_Backend_query_index_drop_primary), 2);
|
|
8134
8608
|
rb_define_method(cBackend, "query_index_build_deferred", VALUE_FUNC(cb_Backend_query_index_build_deferred), 2);
|
|
8135
|
-
|
|
8609
|
+
|
|
8610
|
+
rb_define_method(cBackend, "collection_query_index_get_all", VALUE_FUNC(cb_Backend_collection_query_index_get_all), 4);
|
|
8611
|
+
rb_define_method(cBackend, "collection_query_index_create", VALUE_FUNC(cb_Backend_collection_query_index_create), 6);
|
|
8612
|
+
rb_define_method(cBackend, "collection_query_index_create_primary", VALUE_FUNC(cb_Backend_collection_query_index_create_primary), 4);
|
|
8613
|
+
rb_define_method(cBackend, "collection_query_index_drop", VALUE_FUNC(cb_Backend_collection_query_index_drop), 5);
|
|
8614
|
+
rb_define_method(cBackend, "collection_query_index_drop_primary", VALUE_FUNC(cb_Backend_collection_query_index_drop_primary), 4);
|
|
8615
|
+
rb_define_method(cBackend, "collection_query_index_build_deferred", VALUE_FUNC(cb_Backend_collection_query_index_build_deferred), 4);
|
|
8136
8616
|
|
|
8137
8617
|
rb_define_method(cBackend, "search_get_stats", VALUE_FUNC(cb_Backend_search_get_stats), 1);
|
|
8138
8618
|
rb_define_method(cBackend, "search_index_get_all", VALUE_FUNC(cb_Backend_search_index_get_all), 1);
|