couchbase 3.4.0-arm64-darwin-20 → 3.4.2-arm64-darwin-20
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/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/libcouchbase.bundle +0 -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 +7 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: faa96b8ef64469a07b7665a4d70a8f25cc43003361ee727c403db2514890b96b
|
4
|
+
data.tar.gz: 43936d9b52ce4a258d24a83111d85b4d19704d54a3ab26d5169a32c1af5d79d8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6ca2f3e4cd54458cc4b4ee6399d79ba31e716640f1727aaee9f37d8916a3de13f5cdcb8e4a4849fa4c9d50b6bbe982ed8c728351b957fa4f5484ae96d96ba891
|
7
|
+
data.tar.gz: 712cf52caa8edfeb978c879575f204d44c69f42f9867d1b2232337d6ce103a4407669136ad27619e721c35f0b2802b6530966662b0d0806bc45aad59810ed1b1
|
data/README.md
CHANGED
@@ -23,7 +23,7 @@ The library has been tested with MRI 3.0, 3.1 and 3.2. Supported platforms are L
|
|
23
23
|
Add this line to your application's Gemfile:
|
24
24
|
|
25
25
|
```ruby
|
26
|
-
gem "couchbase", "3.4.
|
26
|
+
gem "couchbase", "3.4.2"
|
27
27
|
```
|
28
28
|
|
29
29
|
And then execute:
|
@@ -139,7 +139,7 @@ Now the API reference is accessible using a web browser (where `VERSION` is the
|
|
139
139
|
|
140
140
|
The gem is available as open source under the terms of the [Apache2 License](https://opensource.org/licenses/Apache-2.0).
|
141
141
|
|
142
|
-
Copyright 2011-
|
142
|
+
Copyright 2011-Present Couchbase, Inc.
|
143
143
|
|
144
144
|
Licensed under the Apache License, Version 2.0 (the "License");
|
145
145
|
you may not use this file except in compliance with the License.
|
@@ -38,7 +38,7 @@ module Couchbase
|
|
38
38
|
# collection.get("mydoc", Options::Get(transcoder: nil)).content #=> "foobar"
|
39
39
|
#
|
40
40
|
# @return [Collection::MutationResult]
|
41
|
-
def append(id, content, options = Options::Append
|
41
|
+
def append(id, content, options = Options::Append::DEFAULT)
|
42
42
|
resp = @backend.document_append(@collection.bucket_name, @collection.scope_name, @collection.name,
|
43
43
|
id, content, options.to_backend)
|
44
44
|
Collection::MutationResult.new do |res|
|
@@ -59,7 +59,7 @@ module Couchbase
|
|
59
59
|
# collection.get("mydoc", Options::Get(transcoder: nil)).content #=> "barfoo"
|
60
60
|
#
|
61
61
|
# @return [Collection::MutationResult]
|
62
|
-
def prepend(id, content, options = Options::Prepend
|
62
|
+
def prepend(id, content, options = Options::Prepend::DEFAULT)
|
63
63
|
resp = @backend.document_prepend(@collection.bucket_name, @collection.scope_name, @collection.name,
|
64
64
|
id, content, options.to_backend)
|
65
65
|
Collection::MutationResult.new do |res|
|
@@ -80,7 +80,7 @@ module Couchbase
|
|
80
80
|
# res.content #=> 10
|
81
81
|
#
|
82
82
|
# @return [CounterResult]
|
83
|
-
def increment(id, options = Options::Increment
|
83
|
+
def increment(id, options = Options::Increment::DEFAULT)
|
84
84
|
resp = @backend.document_increment(@collection.bucket_name, @collection.scope_name, @collection.name, id,
|
85
85
|
options.to_backend)
|
86
86
|
CounterResult.new do |res|
|
@@ -102,7 +102,7 @@ module Couchbase
|
|
102
102
|
# res.value #=> 98
|
103
103
|
#
|
104
104
|
# @return [CounterResult]
|
105
|
-
def decrement(id, options = Options::Decrement
|
105
|
+
def decrement(id, options = Options::Decrement::DEFAULT)
|
106
106
|
resp = @backend.document_decrement(@collection.bucket_name, @collection.scope_name, @collection.name, id,
|
107
107
|
options.to_backend)
|
108
108
|
CounterResult.new do |res|
|
data/lib/couchbase/cluster.rb
CHANGED
@@ -32,13 +32,13 @@ module Couchbase
|
|
32
32
|
|
33
33
|
# Connect to the Couchbase cluster
|
34
34
|
#
|
35
|
-
# @overload connect(
|
36
|
-
# @param [String]
|
35
|
+
# @overload connect(connection_string_or_config, options)
|
36
|
+
# @param [String, Configuration] connection_string_or_config connection string used to locate the Couchbase Cluster
|
37
37
|
# @param [Options::Cluster] options custom options when creating the cluster connection
|
38
38
|
#
|
39
|
-
# @overload connect(
|
39
|
+
# @overload connect(connection_string_or_config, username, password, options)
|
40
40
|
# Shortcut for {PasswordAuthenticator}
|
41
|
-
# @param [String]
|
41
|
+
# @param [String] connection_string_or_config connection string used to locate the Couchbase Cluster
|
42
42
|
# @param [String] username name of the user
|
43
43
|
# @param [String] password password of the user
|
44
44
|
# @param [Options::Cluster, nil] options custom options when creating the cluster connection
|
@@ -62,12 +62,16 @@ module Couchbase
|
|
62
62
|
# @see https://docs.couchbase.com/server/current/manage/manage-security/configure-client-certificates.html
|
63
63
|
#
|
64
64
|
# @return [Cluster]
|
65
|
-
def self.connect(
|
66
|
-
|
67
|
-
|
68
|
-
|
65
|
+
def self.connect(connection_string_or_config, *options)
|
66
|
+
connection_string = if connection_string_or_config.is_a?(Configuration)
|
67
|
+
connection_string_or_config.connection_string
|
68
|
+
else
|
69
|
+
connection_string_or_config
|
70
|
+
end
|
71
|
+
if connection_string =~ /\Acouchbases?:\/\/.*\z/i || !connection_string.include?("://")
|
72
|
+
Cluster.new(connection_string_or_config, *options)
|
69
73
|
else
|
70
|
-
ClusterRegistry.instance.connect(
|
74
|
+
ClusterRegistry.instance.connect(connection_string_or_config, *options)
|
71
75
|
end
|
72
76
|
end
|
73
77
|
|
@@ -26,9 +26,14 @@ module Couchbase
|
|
26
26
|
@handlers = {}
|
27
27
|
end
|
28
28
|
|
29
|
-
def connect(
|
29
|
+
def connect(connection_string_or_config, *options)
|
30
|
+
connection_string = if connection_string_or_config.is_a?(Configuration)
|
31
|
+
connection_string_or_config.connection_string
|
32
|
+
else
|
33
|
+
connection_string_or_config
|
34
|
+
end
|
30
35
|
@handlers.each do |regexp, cluster_class|
|
31
|
-
return cluster_class.connect(
|
36
|
+
return cluster_class.connect(connection_string_or_config, *options) if regexp.match?(connection_string)
|
32
37
|
end
|
33
38
|
raise(Error::FeatureNotAvailable, "Connection string '#{connection_string}' not supported.")
|
34
39
|
end
|
data/lib/couchbase/collection.rb
CHANGED
@@ -43,6 +43,11 @@ module Couchbase
|
|
43
43
|
BinaryCollection.new(self)
|
44
44
|
end
|
45
45
|
|
46
|
+
# @return [Management::CollectionQueryIndexManager]
|
47
|
+
def query_indexes
|
48
|
+
Management::CollectionQueryIndexManager.new(@backend, @bucket_name, @scope_name, @name)
|
49
|
+
end
|
50
|
+
|
46
51
|
# Fetches the full document from the collection
|
47
52
|
#
|
48
53
|
# @param [String] id the document id which is used to uniquely identify it
|
@@ -33,10 +33,9 @@ module Couchbase
|
|
33
33
|
private
|
34
34
|
|
35
35
|
def load_configuration(settings)
|
36
|
-
|
37
|
-
@
|
38
|
-
@
|
39
|
-
@password = configuration[:password]
|
36
|
+
@connection_string = settings[:connection_string] || settings["connection_string"]
|
37
|
+
@username = settings[:username] || settings["username"]
|
38
|
+
@password = settings[:password] || settings["password"]
|
40
39
|
end
|
41
40
|
|
42
41
|
def load_yaml(path, environment)
|
data/lib/couchbase/errors.rb
CHANGED
@@ -21,6 +21,11 @@ module Couchbase
|
|
21
21
|
# @return [Hash] attributes associated with the error
|
22
22
|
attr_reader :context
|
23
23
|
|
24
|
+
def initialize(msg = nil, context = nil)
|
25
|
+
@context = context unless context.nil?
|
26
|
+
super(msg)
|
27
|
+
end
|
28
|
+
|
24
29
|
def to_s
|
25
30
|
defined?(@context) ? "#{super}, context=#{JSON.generate(@context)}" : super
|
26
31
|
end
|
@@ -30,6 +35,11 @@ module Couchbase
|
|
30
35
|
# @return [Hash] attributes associated with the error
|
31
36
|
attr_reader :context
|
32
37
|
|
38
|
+
def initialize(msg = nil, context = nil)
|
39
|
+
@context = context unless context.nil?
|
40
|
+
super(msg)
|
41
|
+
end
|
42
|
+
|
33
43
|
def to_s
|
34
44
|
defined?(@context) ? "#{super}, context=#{JSON.generate(@context)}" : super
|
35
45
|
end
|
Binary file
|
@@ -0,0 +1,183 @@
|
|
1
|
+
# Copyright 2023 Couchbase, Inc.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
require "couchbase/management/query_index_manager"
|
16
|
+
require "couchbase/utils/time"
|
17
|
+
|
18
|
+
module Couchbase
|
19
|
+
module Management
|
20
|
+
class CollectionQueryIndexManager
|
21
|
+
alias inspect to_s
|
22
|
+
|
23
|
+
# @param [Couchbase::Backend] backend
|
24
|
+
# @param [String] bucket_name name of the bucket
|
25
|
+
# @param [String] scope_name name of the scope
|
26
|
+
# @param [String] collection_name name of the collection
|
27
|
+
def initialize(backend, bucket_name, scope_name, collection_name)
|
28
|
+
@backend = backend
|
29
|
+
@bucket_name = bucket_name
|
30
|
+
@scope_name = scope_name
|
31
|
+
@collection_name = collection_name
|
32
|
+
end
|
33
|
+
|
34
|
+
# Fetches all indexes from the server
|
35
|
+
#
|
36
|
+
# @param [Options::Query::GetAllIndexes] options
|
37
|
+
#
|
38
|
+
# @return [Array<QueryIndex>]
|
39
|
+
#
|
40
|
+
# @raise [ArgumentError]
|
41
|
+
def get_all_indexes(options = Options::Query::GetAllIndexes.new)
|
42
|
+
res = @backend.collection_query_index_get_all(@bucket_name, @scope_name, @collection_name, options.to_backend)
|
43
|
+
res[:indexes].map do |idx|
|
44
|
+
QueryIndex.new do |index|
|
45
|
+
index.name = idx[:name]
|
46
|
+
index.is_primary = idx[:is_primary]
|
47
|
+
index.type = idx[:type]
|
48
|
+
index.state = idx[:state]
|
49
|
+
index.bucket = idx[:bucket_name]
|
50
|
+
index.scope = idx[:scope_name]
|
51
|
+
index.collection = idx[:collection_name]
|
52
|
+
index.index_key = idx[:index_key]
|
53
|
+
index.condition = idx[:condition]
|
54
|
+
index.partition = idx[:partition]
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
# Creates a new index
|
60
|
+
#
|
61
|
+
# @param [String] index_name name of the index
|
62
|
+
# @param [Array<String>] fields the lists of fields to create th index over
|
63
|
+
# @param [Options::Query::CreateIndex] options
|
64
|
+
#
|
65
|
+
# @return void
|
66
|
+
#
|
67
|
+
# @raise [ArgumentError]
|
68
|
+
# @raise [Error::IndexExists]
|
69
|
+
def create_index(index_name, fields, options = Options::Query::CreateIndex.new)
|
70
|
+
unless options.scope_name.nil?
|
71
|
+
raise ArgumentError, "Scope name cannot be set in the options when using the Query Index manager at the collection level"
|
72
|
+
end
|
73
|
+
|
74
|
+
unless options.collection_name.nil?
|
75
|
+
raise ArgumentError, "Collection name cannot be set in the options when using the Query Index manager at the collection level"
|
76
|
+
end
|
77
|
+
|
78
|
+
@backend.collection_query_index_create(@bucket_name, @scope_name, @collection_name, index_name, fields, options.to_backend)
|
79
|
+
end
|
80
|
+
|
81
|
+
# Creates new primary index
|
82
|
+
#
|
83
|
+
# @param [Options::Query::CreatePrimaryIndex] options
|
84
|
+
#
|
85
|
+
# @return void
|
86
|
+
#
|
87
|
+
# @raise [ArgumentError]
|
88
|
+
# @raise [Error::IndexExists]
|
89
|
+
def create_primary_index(options = Options::Query::CreatePrimaryIndex.new)
|
90
|
+
unless options.scope_name.nil?
|
91
|
+
raise ArgumentError, "Scope name cannot be set in the options when using the Query Index manager at the collection level"
|
92
|
+
end
|
93
|
+
|
94
|
+
unless options.collection_name.nil?
|
95
|
+
raise ArgumentError, "Collection name cannot be set in the options when using the Query Index manager at the collection level"
|
96
|
+
end
|
97
|
+
|
98
|
+
@backend.collection_query_index_create_primary(@bucket_name, @scope_name, @collection_name, options.to_backend)
|
99
|
+
end
|
100
|
+
|
101
|
+
# Drops the index
|
102
|
+
#
|
103
|
+
# @param [String] index_name name of the index
|
104
|
+
# @param [Options::Query::DropIndex] options
|
105
|
+
#
|
106
|
+
# @return void
|
107
|
+
#
|
108
|
+
# @raise [ArgumentError]
|
109
|
+
# @raise [Error::IndexNotFound]
|
110
|
+
def drop_index(index_name, options = Options::Query::DropIndex.new)
|
111
|
+
unless options.scope_name.nil?
|
112
|
+
raise ArgumentError, "Scope name cannot be set in the options when using the Query Index manager at the collection level"
|
113
|
+
end
|
114
|
+
|
115
|
+
unless options.collection_name.nil?
|
116
|
+
raise ArgumentError, "Collection name cannot be set in the options when using the Query Index manager at the collection level"
|
117
|
+
end
|
118
|
+
|
119
|
+
@backend.collection_query_index_drop(@bucket_name, @scope_name, @collection_name, index_name, options.to_backend)
|
120
|
+
end
|
121
|
+
|
122
|
+
# Drops the primary index
|
123
|
+
#
|
124
|
+
# @param [Options::Query::DropPrimaryIndex] options
|
125
|
+
#
|
126
|
+
# @return void
|
127
|
+
#
|
128
|
+
# @raise [ArgumentError]
|
129
|
+
# @raise [Error::IndexNotFound]
|
130
|
+
def drop_primary_index(options = Options::Query::DropPrimaryIndex.new)
|
131
|
+
unless options.scope_name.nil?
|
132
|
+
raise ArgumentError, "Scope name cannot be set in the options when using the Query Index manager at the collection level"
|
133
|
+
end
|
134
|
+
|
135
|
+
unless options.collection_name.nil?
|
136
|
+
raise ArgumentError, "Collection name cannot be set in the options when using the Query Index manager at the collection level"
|
137
|
+
end
|
138
|
+
|
139
|
+
@backend.collection_query_index_drop_primary(@bucket_name, @scope_name, @collection_name, options.to_backend)
|
140
|
+
end
|
141
|
+
|
142
|
+
# Build all indexes which are currently in deferred state
|
143
|
+
#
|
144
|
+
# @param [Options::Query::BuildDeferredIndexes] options
|
145
|
+
#
|
146
|
+
# @return void
|
147
|
+
#
|
148
|
+
# @raise [ArgumentError]
|
149
|
+
def build_deferred_indexes(options = Options::Query::BuildDeferredIndexes.new)
|
150
|
+
@backend.collection_query_index_build_deferred(@bucket_name, @scope_name, @collection_name, options.to_backend)
|
151
|
+
end
|
152
|
+
|
153
|
+
# Polls indexes until they are online
|
154
|
+
#
|
155
|
+
# @param [Array<String>] index_names names of the indexes to watch
|
156
|
+
# @param [Integer, #in_milliseconds] timeout the time in milliseconds allowed for the operation to complete
|
157
|
+
# @param [Options::Query::WatchIndexes] options
|
158
|
+
#
|
159
|
+
# @raise [ArgumentError]
|
160
|
+
# @raise [Error::IndexNotFound]
|
161
|
+
def watch_indexes(index_names, timeout, options = Options::Query::WatchIndexes.new)
|
162
|
+
index_names.append("#primary") if options.watch_primary
|
163
|
+
|
164
|
+
interval_millis = 50
|
165
|
+
deadline = Time.now + (Utils::Time.extract_duration(timeout) * 0.001)
|
166
|
+
while Time.now <= deadline
|
167
|
+
get_all_opts = Options::Query::GetAllIndexes.new(timeout: ((deadline - Time.now) * 1000).round)
|
168
|
+
indexes = get_all_indexes(get_all_opts).select { |idx| index_names.include? idx.name }
|
169
|
+
indexes_not_found = index_names - indexes.map(&:name)
|
170
|
+
raise Error::IndexNotFound, "Failed to find the indexes: #{indexes_not_found.join(', ')}" unless indexes_not_found.empty?
|
171
|
+
|
172
|
+
all_online = indexes.all? { |idx| idx.state == :online }
|
173
|
+
return if all_online
|
174
|
+
|
175
|
+
sleep(interval_millis / 1000)
|
176
|
+
interval_millis += 500
|
177
|
+
interval_millis = 1000 if interval_millis > 1000
|
178
|
+
end
|
179
|
+
raise Error::UnambiguousTimeout, "Failed to find all indexes online within the allotted time"
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end
|
@@ -14,6 +14,7 @@
|
|
14
14
|
|
15
15
|
require "couchbase/errors"
|
16
16
|
require "couchbase/options"
|
17
|
+
require "couchbase/utils/time"
|
17
18
|
|
18
19
|
module Couchbase
|
19
20
|
module Management
|
@@ -371,6 +372,10 @@ module Couchbase
|
|
371
372
|
# @raise [ArgumentError]
|
372
373
|
# @raise [Error::IndexExists]
|
373
374
|
def create_index(bucket_name, index_name, fields, options = Options::Query::CreateIndex.new)
|
375
|
+
unless options.scope_name.nil? && options.collection_name.nil?
|
376
|
+
warn "The attributes 'scope_name' and 'collection_name' have been deprecated. Use 'collection.query_indexes' instead"
|
377
|
+
end
|
378
|
+
|
374
379
|
@backend.query_index_create(bucket_name, index_name, fields, options.to_backend)
|
375
380
|
end
|
376
381
|
|
@@ -384,6 +389,10 @@ module Couchbase
|
|
384
389
|
# @raise [ArgumentError]
|
385
390
|
# @raise [Error::IndexExists]
|
386
391
|
def create_primary_index(bucket_name, options = Options::Query::CreatePrimaryIndex.new)
|
392
|
+
unless options.scope_name.nil? && options.collection_name.nil?
|
393
|
+
warn "The attributes 'scope_name' and 'collection_name' have been deprecated. Use 'collection.query_indexes' instead"
|
394
|
+
end
|
395
|
+
|
387
396
|
@backend.query_index_create_primary(bucket_name, options.to_backend)
|
388
397
|
end
|
389
398
|
|
@@ -398,8 +407,11 @@ module Couchbase
|
|
398
407
|
# @raise [ArgumentError]
|
399
408
|
# @raise [Error::IndexNotFound]
|
400
409
|
def drop_index(bucket_name, index_name, options = Options::Query::DropIndex.new)
|
410
|
+
unless options.scope_name.nil? && options.collection_name.nil?
|
411
|
+
warn "The attributes 'scope_name' and 'collection_name' have been deprecated. Use 'collection.query_indexes' instead"
|
412
|
+
end
|
413
|
+
|
401
414
|
@backend.query_index_drop(bucket_name, index_name, options.to_backend)
|
402
|
-
true
|
403
415
|
end
|
404
416
|
|
405
417
|
# Drops the primary index
|
@@ -412,8 +424,11 @@ module Couchbase
|
|
412
424
|
# @raise [ArgumentError]
|
413
425
|
# @raise [Error::IndexNotFound]
|
414
426
|
def drop_primary_index(bucket_name, options = Options::Query::DropPrimaryIndex.new)
|
427
|
+
unless options.scope_name.nil? && options.collection_name.nil?
|
428
|
+
warn "The attributes 'scope_name' and 'collection_name' have been deprecated. Use 'collection.query_indexes' instead"
|
429
|
+
end
|
430
|
+
|
415
431
|
@backend.query_index_drop_primary(bucket_name, options.to_backend)
|
416
|
-
true
|
417
432
|
end
|
418
433
|
|
419
434
|
# Build all indexes which are currently in deferred state
|
@@ -438,7 +453,24 @@ module Couchbase
|
|
438
453
|
# @raise [ArgumentError]
|
439
454
|
# @raise [Error::IndexNotFound]
|
440
455
|
def watch_indexes(bucket_name, index_names, timeout, options = Options::Query::WatchIndexes.new)
|
441
|
-
|
456
|
+
index_names.append("#primary") if options.watch_primary
|
457
|
+
|
458
|
+
interval_millis = 50
|
459
|
+
deadline = Time.now + (Utils::Time.extract_duration(timeout) * 0.001)
|
460
|
+
while Time.now <= deadline
|
461
|
+
get_all_opts = Options::Query::GetAllIndexes.new(timeout: ((deadline - Time.now) * 1000).round)
|
462
|
+
indexes = get_all_indexes(bucket_name, get_all_opts).select { |idx| index_names.include? idx.name }
|
463
|
+
indexes_not_found = index_names - indexes.map(&:name)
|
464
|
+
raise Error::IndexNotFound, "Failed to find the indexes: #{indexes_not_found.join(', ')}" unless indexes_not_found.empty?
|
465
|
+
|
466
|
+
all_online = indexes.all? { |idx| idx.state == :online }
|
467
|
+
return if all_online
|
468
|
+
|
469
|
+
sleep(interval_millis / 1000)
|
470
|
+
interval_millis += 500
|
471
|
+
interval_millis = 1000 if interval_millis > 1000
|
472
|
+
end
|
473
|
+
raise Error::UnambiguousTimeout, "Failed to find all indexes online within the allotted time"
|
442
474
|
end
|
443
475
|
|
444
476
|
# @api private
|
data/lib/couchbase/management.rb
CHANGED
@@ -22,6 +22,7 @@ require "couchbase/management/analytics_index_manager"
|
|
22
22
|
require "couchbase/management/bucket_manager"
|
23
23
|
require "couchbase/management/collection_manager"
|
24
24
|
require "couchbase/management/query_index_manager"
|
25
|
+
require "couchbase/management/collection_query_index_manager"
|
25
26
|
require "couchbase/management/search_index_manager"
|
26
27
|
require "couchbase/management/user_manager"
|
27
28
|
require "couchbase/management/view_index_manager"
|
data/lib/couchbase/options.rb
CHANGED
@@ -1029,10 +1029,38 @@ module Couchbase
|
|
1029
1029
|
# Options for {BinaryCollection#append}
|
1030
1030
|
class Append < Base
|
1031
1031
|
attr_accessor :cas # @return [Integer]
|
1032
|
+
attr_accessor :durability_level # @return [Symbol]
|
1033
|
+
attr_accessor :replicate_to # @return [Symbol]
|
1034
|
+
attr_accessor :persist_to # @return [Symbol]
|
1032
1035
|
|
1033
1036
|
# Creates an instance of options for {BinaryCollection#append}
|
1034
1037
|
#
|
1035
1038
|
# @param [Integer] cas The default CAS used (0 means no CAS in this context)
|
1039
|
+
# @param [Symbol] durability_level level of durability
|
1040
|
+
# +:none+::
|
1041
|
+
# no enhanced durability required for the mutation
|
1042
|
+
# +:majority+::
|
1043
|
+
# the mutation must be replicated to a majority of the Data Service nodes
|
1044
|
+
# (that is, held in the memory allocated to the bucket)
|
1045
|
+
# +:majority_and_persist_to_active+::
|
1046
|
+
# The mutation must be replicated to a majority of the Data Service nodes.
|
1047
|
+
# Additionally, it must be persisted (that is, written and synchronised to disk) on the
|
1048
|
+
# node hosting the active partition (vBucket) for the data.
|
1049
|
+
# +:persist_to_majority+::
|
1050
|
+
# The mutation must be persisted to a majority of the Data Service nodes.
|
1051
|
+
# Accordingly, it will be written to disk on those nodes.
|
1052
|
+
# @param [Symbol] replicate_to number of nodes to replicate
|
1053
|
+
# +:none+:: do not apply any replication requirements.
|
1054
|
+
# +:one+:: wait for replication to at least one node.
|
1055
|
+
# +:two+:: wait for replication to at least two nodes.
|
1056
|
+
# +:three+:: wait for replication to at least three nodes.
|
1057
|
+
# @param [Symbol] persist_to number of nodes to persist
|
1058
|
+
# +:none+:: do not apply any persistence requirements.
|
1059
|
+
# +:active+:: wait for persistence to active node
|
1060
|
+
# +:one+:: wait for persistence to at least one node.
|
1061
|
+
# +:two+:: wait for persistence to at least two nodes.
|
1062
|
+
# +:three+:: wait for persistence to at least three nodes.
|
1063
|
+
# +:four+:: wait for persistence to four nodes (active and replicas).
|
1036
1064
|
#
|
1037
1065
|
# @param [Integer, #in_milliseconds, nil] timeout
|
1038
1066
|
# @param [Proc, nil] retry_strategy the custom retry strategy, if set
|
@@ -1041,12 +1069,23 @@ module Couchbase
|
|
1041
1069
|
#
|
1042
1070
|
# @yieldparam [Append] self
|
1043
1071
|
def initialize(cas: nil,
|
1072
|
+
durability_level: :none,
|
1073
|
+
replicate_to: :none,
|
1074
|
+
persist_to: :none,
|
1044
1075
|
timeout: nil,
|
1045
1076
|
retry_strategy: nil,
|
1046
1077
|
client_context: nil,
|
1047
1078
|
parent_span: nil)
|
1048
1079
|
super(timeout: timeout, retry_strategy: retry_strategy, client_context: client_context, parent_span: parent_span)
|
1049
1080
|
@cas = cas
|
1081
|
+
|
1082
|
+
if durability_level != :none && (replicate_to != :none || persist_to != :none)
|
1083
|
+
raise ArgumentError, "durability_level conflicts with replicate_to and persist_to options"
|
1084
|
+
end
|
1085
|
+
|
1086
|
+
@durability_level = durability_level
|
1087
|
+
@replicate_to = replicate_to
|
1088
|
+
@persist_to = persist_to
|
1050
1089
|
yield self if block_given?
|
1051
1090
|
end
|
1052
1091
|
|
@@ -1055,6 +1094,9 @@ module Couchbase
|
|
1055
1094
|
{
|
1056
1095
|
timeout: Utils::Time.extract_duration(@timeout),
|
1057
1096
|
cas: @cas,
|
1097
|
+
durability_level: @durability_level,
|
1098
|
+
persist_to: @persist_to,
|
1099
|
+
replicate_to: @replicate_to,
|
1058
1100
|
}
|
1059
1101
|
end
|
1060
1102
|
|
@@ -1064,12 +1106,39 @@ module Couchbase
|
|
1064
1106
|
|
1065
1107
|
# Options for {BinaryCollection#prepend}
|
1066
1108
|
class Prepend < Base
|
1067
|
-
# @return [Integer]
|
1068
|
-
attr_accessor :
|
1109
|
+
attr_accessor :cas # @return [Integer]
|
1110
|
+
attr_accessor :durability_level # @return [Symbol]
|
1111
|
+
attr_accessor :replicate_to # @return [Symbol]
|
1112
|
+
attr_accessor :persist_to # @return [Symbol]
|
1069
1113
|
|
1070
1114
|
# Creates an instance of options for {BinaryCollection#prepend}
|
1071
1115
|
#
|
1072
1116
|
# @param [Integer] cas The default CAS used (0 means no CAS in this context)
|
1117
|
+
# @param [Symbol] durability_level level of durability
|
1118
|
+
# +:none+::
|
1119
|
+
# no enhanced durability required for the mutation
|
1120
|
+
# +:majority+::
|
1121
|
+
# the mutation must be replicated to a majority of the Data Service nodes
|
1122
|
+
# (that is, held in the memory allocated to the bucket)
|
1123
|
+
# +:majority_and_persist_to_active+::
|
1124
|
+
# The mutation must be replicated to a majority of the Data Service nodes.
|
1125
|
+
# Additionally, it must be persisted (that is, written and synchronised to disk) on the
|
1126
|
+
# node hosting the active partition (vBucket) for the data.
|
1127
|
+
# +:persist_to_majority+::
|
1128
|
+
# The mutation must be persisted to a majority of the Data Service nodes.
|
1129
|
+
# Accordingly, it will be written to disk on those nodes.
|
1130
|
+
# @param [Symbol] replicate_to number of nodes to replicate
|
1131
|
+
# +:none+:: do not apply any replication requirements.
|
1132
|
+
# +:one+:: wait for replication to at least one node.
|
1133
|
+
# +:two+:: wait for replication to at least two nodes.
|
1134
|
+
# +:three+:: wait for replication to at least three nodes.
|
1135
|
+
# @param [Symbol] persist_to number of nodes to persist
|
1136
|
+
# +:none+:: do not apply any persistence requirements.
|
1137
|
+
# +:active+:: wait for persistence to active node
|
1138
|
+
# +:one+:: wait for persistence to at least one node.
|
1139
|
+
# +:two+:: wait for persistence to at least two nodes.
|
1140
|
+
# +:three+:: wait for persistence to at least three nodes.
|
1141
|
+
# +:four+:: wait for persistence to four nodes (active and replicas).
|
1073
1142
|
#
|
1074
1143
|
# @param [Integer, #in_milliseconds, nil] timeout
|
1075
1144
|
# @param [Proc, nil] retry_strategy the custom retry strategy, if set
|
@@ -1078,12 +1147,23 @@ module Couchbase
|
|
1078
1147
|
#
|
1079
1148
|
# @yieldparam [Prepend] self
|
1080
1149
|
def initialize(cas: nil,
|
1150
|
+
durability_level: :none,
|
1151
|
+
replicate_to: :none,
|
1152
|
+
persist_to: :none,
|
1081
1153
|
timeout: nil,
|
1082
1154
|
retry_strategy: nil,
|
1083
1155
|
client_context: nil,
|
1084
1156
|
parent_span: nil)
|
1085
1157
|
super(timeout: timeout, retry_strategy: retry_strategy, client_context: client_context, parent_span: parent_span)
|
1086
1158
|
@cas = cas
|
1159
|
+
|
1160
|
+
if durability_level != :none && (replicate_to != :none || persist_to != :none)
|
1161
|
+
raise ArgumentError, "durability_level conflicts with replicate_to and persist_to options"
|
1162
|
+
end
|
1163
|
+
|
1164
|
+
@durability_level = durability_level
|
1165
|
+
@replicate_to = replicate_to
|
1166
|
+
@persist_to = persist_to
|
1087
1167
|
yield self if block_given?
|
1088
1168
|
end
|
1089
1169
|
|
@@ -1092,6 +1172,9 @@ module Couchbase
|
|
1092
1172
|
{
|
1093
1173
|
timeout: Utils::Time.extract_duration(@timeout),
|
1094
1174
|
cas: @cas,
|
1175
|
+
durability_level: @durability_level,
|
1176
|
+
persist_to: @persist_to,
|
1177
|
+
replicate_to: @replicate_to,
|
1095
1178
|
}
|
1096
1179
|
end
|
1097
1180
|
|
@@ -2091,7 +2174,7 @@ module Couchbase
|
|
2091
2174
|
attr_reader :scan_consistency
|
2092
2175
|
|
2093
2176
|
# @api private
|
2094
|
-
def to_backend(
|
2177
|
+
def to_backend(*)
|
2095
2178
|
{
|
2096
2179
|
timeout: Utils::Time.extract_duration(@timeout),
|
2097
2180
|
limit: @limit,
|
@@ -2099,8 +2182,7 @@ module Couchbase
|
|
2099
2182
|
explain: @explain,
|
2100
2183
|
disable_scoring: @disable_scoring,
|
2101
2184
|
include_locations: @include_locations,
|
2102
|
-
|
2103
|
-
collections: scope_name ? @collections : nil,
|
2185
|
+
collections: @collections,
|
2104
2186
|
highlight_style: @highlight_style,
|
2105
2187
|
highlight_fields: @highlight_fields,
|
2106
2188
|
fields: @fields,
|