couchbase 3.4.3-arm64-darwin-20 → 3.4.5-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/cluster.rb +1 -1
- data/lib/couchbase/collection.rb +108 -0
- data/lib/couchbase/collection_options.rb +100 -1
- data/lib/couchbase/errors.rb +5 -0
- data/lib/couchbase/key_value_scan.rb +125 -0
- data/lib/couchbase/libcouchbase.bundle +0 -0
- data/lib/couchbase/management/bucket_manager.rb +22 -15
- data/lib/couchbase/management/collection_manager.rb +158 -9
- data/lib/couchbase/options.rb +151 -0
- data/lib/couchbase/scope.rb +1 -1
- data/lib/couchbase/utils/time.rb +14 -1
- data/lib/couchbase/version.rb +1 -1
- metadata +6 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 57331d93037221ed8fbe9284f153ea87233e09a777c2640490720502fa774706
|
4
|
+
data.tar.gz: e9efa936c5c41ed691f9814ad9a9e32df4d27f3e2ff1c87b7e8aa6a68de399c8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 38ad5e1953b01fec6f2019fd523a19dce4aefb58312f649164d36b7cfdcee9e6fa177e0183afbc92cc6d8a237392a8db8d9fdae059bf162c9cfd6ee36d0ff774
|
7
|
+
data.tar.gz: aec1ea54457a8483a993e7551e37e79c49f090e483c265738c4db7c8f3d4263cb1c845308c349ca4c13dd54e13d3be002d98a54a4ff3d32988281cb6385905d5
|
data/README.md
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
[](https://opensource.org/licenses/Apache-2.0)
|
4
4
|
[](https://rubygems.org/gems/couchbase)
|
5
|
-
[](https://github.com/couchbase/couchbase-ruby-client/commits/
|
5
|
+
[](https://github.com/couchbase/couchbase-ruby-client/commits/main)
|
6
6
|
[](https://github.com/couchbase/couchbase-ruby-client/actions?query=workflow%3Alinters)
|
7
7
|
|
8
8
|
This repository contains the third generation of the official Couchbase SDK for Ruby (aka. SDKv3)
|
@@ -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.5"
|
27
27
|
```
|
28
28
|
|
29
29
|
And then execute:
|
data/lib/couchbase/cluster.rb
CHANGED
@@ -124,7 +124,7 @@ module Couchbase
|
|
124
124
|
metrics.warning_count = resp[:meta][:metrics][:warning_count]
|
125
125
|
end
|
126
126
|
end
|
127
|
-
|
127
|
+
meta.warnings = resp[:warnings].map { |warn| QueryWarning.new(warn[:code], warn[:message]) } if resp[:warnings]
|
128
128
|
end
|
129
129
|
res.instance_variable_set(:@rows, resp[:rows])
|
130
130
|
end
|
data/lib/couchbase/collection.rb
CHANGED
@@ -15,6 +15,7 @@
|
|
15
15
|
require "couchbase/errors"
|
16
16
|
require "couchbase/collection_options"
|
17
17
|
require "couchbase/binary_collection"
|
18
|
+
require "couchbase/key_value_scan"
|
18
19
|
|
19
20
|
module Couchbase
|
20
21
|
# Provides access to all collection APIs
|
@@ -481,11 +482,68 @@ module Couchbase
|
|
481
482
|
f.index = field[:index]
|
482
483
|
f.path = field[:path]
|
483
484
|
f.value = field[:value]
|
485
|
+
f.error = field[:error]
|
484
486
|
end
|
485
487
|
end
|
486
488
|
end
|
487
489
|
end
|
488
490
|
|
491
|
+
# Performs lookups to document fragments. Reads from the active node and all available replicas and returns the
|
492
|
+
# first result found
|
493
|
+
#
|
494
|
+
# @param [String] id the document id which is used to uniquely identify it.
|
495
|
+
# @param [Array<LookupInSpec>] specs the list of specifications which describe the types of the lookups to perform
|
496
|
+
# @param [Options::LookupInAnyReplica] options request customization
|
497
|
+
#
|
498
|
+
# @return [LookupInReplicaResult]
|
499
|
+
#
|
500
|
+
# @raise [Error::DocumentIrretrievable]
|
501
|
+
# @raise [Error::Timeout]
|
502
|
+
# @raise [Error::CouchbaseError]
|
503
|
+
# @raise [Error::FeatureNotAvailable]
|
504
|
+
def lookup_in_any_replica(id, specs, options = Options::LookupInAnyReplica::DEFAULT)
|
505
|
+
resp = @backend.document_lookup_in_any_replica(
|
506
|
+
bucket_name, @scope_name, @name, id,
|
507
|
+
specs.map do |s|
|
508
|
+
{
|
509
|
+
opcode: s.type,
|
510
|
+
xattr: s.xattr?,
|
511
|
+
path: s.path,
|
512
|
+
}
|
513
|
+
end, options.to_backend
|
514
|
+
)
|
515
|
+
extract_lookup_in_replica_result(resp, options)
|
516
|
+
end
|
517
|
+
|
518
|
+
# Performs lookups to document fragments. Reads from the active node and all available replicas and returns all of
|
519
|
+
# the results
|
520
|
+
#
|
521
|
+
# @param [String] id the document id which is used to uniquely identify it.
|
522
|
+
# @param [Array<LookupInSpec>] specs the list of specifications which describe the types of the lookups to perform
|
523
|
+
# @param [Options::LookupInAllReplicas] options request customization
|
524
|
+
#
|
525
|
+
# @return [Array<LookupInReplicaResult>]
|
526
|
+
#
|
527
|
+
# @raise [Error::DocumentNotFound]
|
528
|
+
# @raise [Error::Timeout]
|
529
|
+
# @raise [Error::CouchbaseError]
|
530
|
+
# @raise [Error::FeatureNotAvailable]
|
531
|
+
def lookup_in_all_replicas(id, specs, options = Options::LookupInAllReplicas::DEFAULT)
|
532
|
+
resp = @backend.document_lookup_in_all_replicas(
|
533
|
+
bucket_name, @scope_name, @name, id,
|
534
|
+
specs.map do |s|
|
535
|
+
{
|
536
|
+
opcode: s.type,
|
537
|
+
xattr: s.xattr?,
|
538
|
+
path: s.path,
|
539
|
+
}
|
540
|
+
end, options.to_backend
|
541
|
+
)
|
542
|
+
resp.map do |entry|
|
543
|
+
extract_lookup_in_replica_result(entry, options)
|
544
|
+
end
|
545
|
+
end
|
546
|
+
|
489
547
|
# Performs mutations to document fragments
|
490
548
|
#
|
491
549
|
# @param [String] id the document id which is used to uniquely identify it.
|
@@ -535,6 +593,38 @@ module Couchbase
|
|
535
593
|
end
|
536
594
|
end
|
537
595
|
|
596
|
+
# Performs a key-value scan operation on the collection
|
597
|
+
#
|
598
|
+
# @api uncommitted
|
599
|
+
#
|
600
|
+
# @param [RangeScan, PrefixScan, SamplingScan] scan_type the type of the scan
|
601
|
+
# @param [Options::Scan] options request customization
|
602
|
+
#
|
603
|
+
# @example Get a sample of up to 5 documents from the collection and store their IDs in an array
|
604
|
+
# result = collection.scan(SamplingScan.new(5), Options::Scan.new(ids_only: true))
|
605
|
+
# ids = result.map { |item| item.id }
|
606
|
+
#
|
607
|
+
# @example Get all documents whose ID starts with 'customer_1' and output their content
|
608
|
+
# result = collection.scan(PrefixScan.new("customer_1"))
|
609
|
+
# result.each { |item| puts item.content }
|
610
|
+
#
|
611
|
+
# @example Get all documents with ID between 'customer_1' and 'customer_2', excluding 'customer_2' and output their content
|
612
|
+
# result = collection.scan(RangeScan.new(
|
613
|
+
# from: ScanTerm.new("customer_1"),
|
614
|
+
# to: ScanTerm.new("customer_2", exclusive: true)
|
615
|
+
# ))
|
616
|
+
# result.each { |item| puts item.content }
|
617
|
+
#
|
618
|
+
# @return [ScanResults]
|
619
|
+
def scan(scan_type, options = Options::Scan::DEFAULT)
|
620
|
+
ScanResults.new(
|
621
|
+
core_scan_result: @backend.document_scan_create(
|
622
|
+
@bucket_name, @scope_name, @name, scan_type.to_backend, options.to_backend
|
623
|
+
),
|
624
|
+
transcoder: options.transcoder
|
625
|
+
)
|
626
|
+
end
|
627
|
+
|
538
628
|
private
|
539
629
|
|
540
630
|
def extract_mutation_token(resp)
|
@@ -548,6 +638,24 @@ module Couchbase
|
|
548
638
|
end
|
549
639
|
end
|
550
640
|
|
641
|
+
def extract_lookup_in_replica_result(resp, options)
|
642
|
+
LookupInReplicaResult.new do |res|
|
643
|
+
res.transcoder = options.transcoder
|
644
|
+
res.cas = resp[:cas]
|
645
|
+
res.deleted = resp[:deleted]
|
646
|
+
res.is_replica = resp[:is_replica]
|
647
|
+
res.encoded = resp[:fields].map do |field|
|
648
|
+
SubDocumentField.new do |f|
|
649
|
+
f.exists = field[:exists]
|
650
|
+
f.index = field[:index]
|
651
|
+
f.path = field[:path]
|
652
|
+
f.value = field[:value]
|
653
|
+
f.error = field[:error]
|
654
|
+
end
|
655
|
+
end
|
656
|
+
end
|
657
|
+
end
|
658
|
+
|
551
659
|
# @api private
|
552
660
|
# TODO: deprecate in 3.1
|
553
661
|
GetOptions = ::Couchbase::Options::Get
|
@@ -15,6 +15,9 @@
|
|
15
15
|
require "rubygems/deprecate"
|
16
16
|
|
17
17
|
require "couchbase/json_transcoder"
|
18
|
+
require "couchbase/raw_string_transcoder"
|
19
|
+
require "couchbase/raw_json_transcoder"
|
20
|
+
require "couchbase/raw_binary_transcoder"
|
18
21
|
require "couchbase/subdoc"
|
19
22
|
require "couchbase/mutation_state"
|
20
23
|
|
@@ -164,7 +167,8 @@ module Couchbase
|
|
164
167
|
# @return [Object] the decoded
|
165
168
|
def content(path_or_index, transcoder = self.transcoder)
|
166
169
|
field = get_field_at_index(path_or_index)
|
167
|
-
|
170
|
+
|
171
|
+
raise field.error unless field.error.nil?
|
168
172
|
|
169
173
|
transcoder.decode(field.value, :json)
|
170
174
|
end
|
@@ -186,6 +190,8 @@ module Couchbase
|
|
186
190
|
end
|
187
191
|
return false unless field
|
188
192
|
|
193
|
+
raise field.error unless field.error.nil? || field.error.is_a?(Error::PathNotFound)
|
194
|
+
|
189
195
|
field.exists
|
190
196
|
end
|
191
197
|
|
@@ -227,6 +233,18 @@ module Couchbase
|
|
227
233
|
end
|
228
234
|
end
|
229
235
|
|
236
|
+
class LookupInReplicaResult < LookupInResult
|
237
|
+
# @return [Boolean] true if the document was read from a replica node
|
238
|
+
attr_accessor :is_replica
|
239
|
+
alias replica? is_replica
|
240
|
+
|
241
|
+
# @yieldparam [LookupInReplicaResult] self
|
242
|
+
def initialize
|
243
|
+
super
|
244
|
+
yield self if block_given?
|
245
|
+
end
|
246
|
+
end
|
247
|
+
|
230
248
|
class MutateInResult < MutationResult
|
231
249
|
# Decodes the content at the given index
|
232
250
|
#
|
@@ -291,10 +309,91 @@ module Couchbase
|
|
291
309
|
# @return [String] path
|
292
310
|
attr_accessor :path
|
293
311
|
|
312
|
+
# @return [CouchbaseError] error
|
313
|
+
attr_accessor :error
|
314
|
+
|
294
315
|
# @yieldparam [SubDocumentField] self
|
295
316
|
def initialize
|
296
317
|
yield self if block_given?
|
297
318
|
end
|
298
319
|
end
|
320
|
+
|
321
|
+
class ScanResult
|
322
|
+
# @return [String] identifier of the document
|
323
|
+
attr_accessor :id
|
324
|
+
|
325
|
+
# @return [Boolean] whether only ids are returned from this scan
|
326
|
+
attr_accessor :id_only
|
327
|
+
|
328
|
+
# @return [Integer, nil] holds the CAS value of the fetched document
|
329
|
+
attr_accessor :cas
|
330
|
+
|
331
|
+
# @return [Integer, nil] the expiration if fetched and present
|
332
|
+
attr_accessor :expiry
|
333
|
+
|
334
|
+
# @return [JsonTranscoder, RawBinaryTranscoder, RawJsonTranscoder, RawStringTranscoder, #decode] The default
|
335
|
+
# transcoder which should be used
|
336
|
+
attr_accessor :transcoder
|
337
|
+
|
338
|
+
def initialize(id:, id_only:, cas: nil, expiry: nil, encoded: nil, flags: nil, transcoder: JsonTranscoder.new)
|
339
|
+
@id = id
|
340
|
+
@id_only = id_only
|
341
|
+
@cas = cas
|
342
|
+
@expiry = expiry
|
343
|
+
@encoded = encoded
|
344
|
+
@flags = flags
|
345
|
+
@transcoder = transcoder
|
346
|
+
|
347
|
+
yield self if block_given?
|
348
|
+
end
|
349
|
+
|
350
|
+
# Decodes the content of the document using given (or default transcoder)
|
351
|
+
#
|
352
|
+
# @param [JsonTranscoder, RawJsonTranscoder, RawBinaryTranscoder, RawStringTranscoder] transcoder custom transcoder
|
353
|
+
#
|
354
|
+
# @return [Object, nil]
|
355
|
+
def content(transcoder = self.transcoder)
|
356
|
+
return nil if @encoded.nil?
|
357
|
+
|
358
|
+
transcoder ? transcoder.decode(@encoded, @flags) : @encoded
|
359
|
+
end
|
360
|
+
end
|
361
|
+
|
362
|
+
class ScanResults
|
363
|
+
include Enumerable
|
364
|
+
|
365
|
+
def initialize(core_scan_result:, transcoder:)
|
366
|
+
@core_scan_result = core_scan_result
|
367
|
+
@transcoder = transcoder
|
368
|
+
end
|
369
|
+
|
370
|
+
def each
|
371
|
+
return enum_for(:each) unless block_given?
|
372
|
+
|
373
|
+
loop do
|
374
|
+
resp = @core_scan_result.next_item
|
375
|
+
|
376
|
+
break if resp.nil?
|
377
|
+
|
378
|
+
if resp[:id_only]
|
379
|
+
yield ScanResult.new(
|
380
|
+
id: resp[:id],
|
381
|
+
id_only: resp[:id_only],
|
382
|
+
transcoder: @transcoder
|
383
|
+
)
|
384
|
+
else
|
385
|
+
yield ScanResult.new(
|
386
|
+
id: resp[:id],
|
387
|
+
id_only: resp[:id_only],
|
388
|
+
cas: resp[:cas],
|
389
|
+
expiry: resp[:expiry],
|
390
|
+
encoded: resp[:encoded],
|
391
|
+
flags: resp[:flags],
|
392
|
+
transcoder: @transcoder
|
393
|
+
)
|
394
|
+
end
|
395
|
+
end
|
396
|
+
end
|
397
|
+
end
|
299
398
|
end
|
300
399
|
end
|
data/lib/couchbase/errors.rb
CHANGED
@@ -183,6 +183,11 @@ module Couchbase
|
|
183
183
|
class DurableWriteReCommitInProgress < CouchbaseError
|
184
184
|
end
|
185
185
|
|
186
|
+
# Happens when consistency requirements are specified but the partition uuid of the requirements do not align
|
187
|
+
# with the server
|
188
|
+
class MutationTokenOutdated < CouchbaseError
|
189
|
+
end
|
190
|
+
|
186
191
|
# Subdocument exception thrown when a path does not exist in the document. The exact meaning of path existence
|
187
192
|
# depends on the operation and inputs.
|
188
193
|
class PathNotFound < CouchbaseError
|
@@ -0,0 +1,125 @@
|
|
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
|
+
module Couchbase
|
16
|
+
# A scan term used to specify the bounds of a range scan
|
17
|
+
class ScanTerm
|
18
|
+
attr_accessor :term # @return [ScanTerm]
|
19
|
+
attr_accessor :exclusive # @return [Boolean]
|
20
|
+
|
21
|
+
# Creates an instance of a ScanTerm
|
22
|
+
#
|
23
|
+
# @api uncommitted
|
24
|
+
#
|
25
|
+
# @param [String] term the key pattern of this term
|
26
|
+
# @param [Boolean] exclusive specifies if this term is excluded while scanning, the bounds are included by default
|
27
|
+
def initialize(term, exclusive: false)
|
28
|
+
@term = term
|
29
|
+
@exclusive = exclusive
|
30
|
+
end
|
31
|
+
|
32
|
+
# @api private
|
33
|
+
def to_backend
|
34
|
+
{
|
35
|
+
term: @term,
|
36
|
+
exclusive: @exclusive,
|
37
|
+
}
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
# A range scan performs a scan on a range of keys
|
42
|
+
class RangeScan
|
43
|
+
attr_accessor :from # @return [ScanTerm, nil]
|
44
|
+
attr_accessor :to # @return [ScanTerm, nil]
|
45
|
+
|
46
|
+
# Creates an instance of a RangeScan scan type
|
47
|
+
#
|
48
|
+
# @api uncommitted
|
49
|
+
#
|
50
|
+
# @param [ScanTerm, String, nil] from the lower bound of the range, if set
|
51
|
+
# @param [ScanTerm, String, nil] to the upper bound of the range, if set
|
52
|
+
def initialize(from: nil, to: nil)
|
53
|
+
@from =
|
54
|
+
if from.nil? || from.instance_of?(ScanTerm)
|
55
|
+
from
|
56
|
+
else
|
57
|
+
ScanTerm(from)
|
58
|
+
end
|
59
|
+
@to =
|
60
|
+
if to.nil? || to.instance_of?(ScanTerm)
|
61
|
+
to
|
62
|
+
else
|
63
|
+
ScanTerm(to)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
# @api private
|
68
|
+
def to_backend
|
69
|
+
{
|
70
|
+
scan_type: :range,
|
71
|
+
from: @from&.to_backend,
|
72
|
+
to: @to&.to_backend,
|
73
|
+
}
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
# A prefix scan performs a scan that includes all documents whose keys start with the given prefix
|
78
|
+
class PrefixScan
|
79
|
+
attr_accessor :prefix # @return [String]
|
80
|
+
|
81
|
+
# Creates an instance of a PrefixScan scan type
|
82
|
+
#
|
83
|
+
# @api uncommitted
|
84
|
+
#
|
85
|
+
# @param [String, nil] prefix the prefix all document keys should start with
|
86
|
+
def initialize(prefix)
|
87
|
+
@prefix = prefix
|
88
|
+
end
|
89
|
+
|
90
|
+
# @api private
|
91
|
+
def to_backend
|
92
|
+
{
|
93
|
+
scan_type: :prefix,
|
94
|
+
prefix: @prefix,
|
95
|
+
}
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
# A sampling scan performs a scan that randomly selects documents up to a configured limit
|
100
|
+
class SamplingScan
|
101
|
+
attr_accessor :limit # @return [Integer]
|
102
|
+
attr_accessor :seed # @return [Integer, nil]
|
103
|
+
|
104
|
+
# Creates an instance of a SamplingScan scan type
|
105
|
+
#
|
106
|
+
# @api uncommitted
|
107
|
+
#
|
108
|
+
# @param [Integer] limit the maximum number of documents the sampling scan can return
|
109
|
+
# @param [Integer, nil] seed the seed used for the random number generator that selects the documents. If not set,
|
110
|
+
# a seed is generated at random
|
111
|
+
def initialize(limit, seed = nil)
|
112
|
+
@limit = limit
|
113
|
+
@seed = seed
|
114
|
+
end
|
115
|
+
|
116
|
+
# @api private
|
117
|
+
def to_backend
|
118
|
+
{
|
119
|
+
scan_type: :sampling,
|
120
|
+
limit: @limit,
|
121
|
+
seed: @seed,
|
122
|
+
}
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
Binary file
|
@@ -211,12 +211,15 @@ module Couchbase
|
|
211
211
|
num_replicas: settings.num_replicas,
|
212
212
|
replica_indexes: settings.replica_indexes,
|
213
213
|
bucket_type: settings.bucket_type,
|
214
|
-
|
214
|
+
eviction_policy: settings.eviction_policy,
|
215
215
|
max_expiry: settings.max_expiry,
|
216
216
|
compression_mode: settings.compression_mode,
|
217
217
|
minimum_durability_level: settings.minimum_durability_level,
|
218
218
|
conflict_resolution_type: settings.conflict_resolution_type,
|
219
219
|
storage_backend: settings.storage_backend,
|
220
|
+
history_retention_collection_default: settings.history_retention_collection_default,
|
221
|
+
history_retention_duration: settings.history_retention_duration,
|
222
|
+
history_retention_bytes: settings.history_retention_bytes,
|
220
223
|
}, options.to_backend
|
221
224
|
)
|
222
225
|
end
|
@@ -239,11 +242,14 @@ module Couchbase
|
|
239
242
|
num_replicas: settings.num_replicas,
|
240
243
|
replica_indexes: settings.replica_indexes,
|
241
244
|
bucket_type: settings.bucket_type,
|
242
|
-
|
245
|
+
eviction_policy: settings.eviction_policy,
|
243
246
|
max_expiry: settings.max_expiry,
|
244
247
|
compression_mode: settings.compression_mode,
|
245
248
|
minimum_durability_level: settings.minimum_durability_level,
|
246
249
|
storage_backend: settings.storage_backend,
|
250
|
+
history_retention_collection_default: settings.history_retention_collection_default,
|
251
|
+
history_retention_bytes: settings.history_retention_bytes,
|
252
|
+
history_retention_duration: settings.history_retention_duration,
|
247
253
|
}, options.to_backend
|
248
254
|
)
|
249
255
|
end
|
@@ -334,6 +340,9 @@ module Couchbase
|
|
334
340
|
bucket.minimum_durability_level = entry[:minimum_durability_level]
|
335
341
|
bucket.compression_mode = entry[:compression_mode]
|
336
342
|
bucket.instance_variable_set(:@healthy, entry[:nodes].all? { |node| node[:status] == "healthy" })
|
343
|
+
bucket.history_retention_collection_default = entry[:history_retention_collection_default]
|
344
|
+
bucket.history_retention_bytes = entry[:history_retention_bytes]
|
345
|
+
bucket.history_retention_duration = entry[:history_retention_duration]
|
337
346
|
end
|
338
347
|
end
|
339
348
|
end
|
@@ -394,6 +403,17 @@ module Couchbase
|
|
394
403
|
# @return [nil, :none, :majority, :majority_and_persist_to_active, :persist_to_majority] the minimum durability level
|
395
404
|
attr_accessor :minimum_durability_level
|
396
405
|
|
406
|
+
# @return [Boolean, nil] whether to enable history retention on collections by default
|
407
|
+
attr_accessor :history_retention_collection_default
|
408
|
+
|
409
|
+
# @return [Integer, nil] the maximum size, in bytes, of the change history that is written to disk for all
|
410
|
+
# collections in this bucket
|
411
|
+
attr_accessor :history_retention_bytes
|
412
|
+
|
413
|
+
# @return [Integer, nil] the maximum duration, in seconds, to be covered by the change history that is written to disk for all
|
414
|
+
# collections in this bucket
|
415
|
+
attr_accessor :history_retention_duration
|
416
|
+
|
397
417
|
# @api private
|
398
418
|
# @return [Boolean] false if status of the bucket is not healthy
|
399
419
|
def healthy?
|
@@ -416,19 +436,6 @@ module Couchbase
|
|
416
436
|
|
417
437
|
# @yieldparam [BucketSettings] self
|
418
438
|
def initialize
|
419
|
-
@bucket_type = :couchbase
|
420
|
-
@name = nil
|
421
|
-
@minimum_durability_level = nil
|
422
|
-
@healthy = true
|
423
|
-
@flush_enabled = false
|
424
|
-
@ram_quota_mb = 100
|
425
|
-
@num_replicas = 1
|
426
|
-
@replica_indexes = false
|
427
|
-
@max_expiry = 0
|
428
|
-
@compression_mode = :passive
|
429
|
-
@conflict_resolution_type = :sequence_number
|
430
|
-
@eviction_policy = :value_only
|
431
|
-
@storage_backend = nil
|
432
439
|
yield self if block_given?
|
433
440
|
end
|
434
441
|
end
|
@@ -38,6 +38,8 @@ module Couchbase
|
|
38
38
|
super
|
39
39
|
yield self if block_given?
|
40
40
|
end
|
41
|
+
|
42
|
+
DEFAULT = GetAllScopes.new.freeze
|
41
43
|
end
|
42
44
|
|
43
45
|
# Options for {CollectionManager#create_scope}
|
@@ -57,6 +59,8 @@ module Couchbase
|
|
57
59
|
super
|
58
60
|
yield self if block_given?
|
59
61
|
end
|
62
|
+
|
63
|
+
DEFAULT = CreateScope.new.freeze
|
60
64
|
end
|
61
65
|
|
62
66
|
# Options for {CollectionManager#drop_scope}
|
@@ -76,6 +80,8 @@ module Couchbase
|
|
76
80
|
super
|
77
81
|
yield self if block_given?
|
78
82
|
end
|
83
|
+
|
84
|
+
DEFAULT = DropScope.new.freeze
|
79
85
|
end
|
80
86
|
|
81
87
|
# Options for {CollectionManager#create_collection}
|
@@ -95,6 +101,29 @@ module Couchbase
|
|
95
101
|
super
|
96
102
|
yield self if block_given?
|
97
103
|
end
|
104
|
+
|
105
|
+
DEFAULT = CreateCollection.new.freeze
|
106
|
+
end
|
107
|
+
|
108
|
+
# Options for {CollectionManager#update_collection}
|
109
|
+
class UpdateCollection < ::Couchbase::Options::Base
|
110
|
+
# Creates an instance of options for {CollectionManager#update_collection}
|
111
|
+
#
|
112
|
+
# @param [Integer, #in_milliseconds, nil] timeout the time in milliseconds allowed for the operation to complete
|
113
|
+
# @param [Proc, nil] retry_strategy the custom retry strategy, if set
|
114
|
+
# @param [Hash, nil] client_context the client context data, if set
|
115
|
+
# @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
|
116
|
+
#
|
117
|
+
# @yieldparam [UpdateCollection] self
|
118
|
+
def initialize(timeout: nil,
|
119
|
+
retry_strategy: nil,
|
120
|
+
client_context: nil,
|
121
|
+
parent_span: nil)
|
122
|
+
super
|
123
|
+
yield self if block_given?
|
124
|
+
end
|
125
|
+
|
126
|
+
DEFAULT = UpdateCollection.new.freeze
|
98
127
|
end
|
99
128
|
|
100
129
|
# Options for {CollectionManager#drop_collection}
|
@@ -114,6 +143,8 @@ module Couchbase
|
|
114
143
|
super
|
115
144
|
yield self if block_given?
|
116
145
|
end
|
146
|
+
|
147
|
+
DEFAULT = DropCollection.new.freeze
|
117
148
|
end
|
118
149
|
|
119
150
|
# rubocop:disable Naming/MethodName constructor shortcuts
|
@@ -184,6 +215,8 @@ module Couchbase
|
|
184
215
|
CollectionSpec.new do |collection|
|
185
216
|
collection.name = c[:name]
|
186
217
|
collection.scope_name = s[:name]
|
218
|
+
collection.max_expiry = c[:max_expiry]
|
219
|
+
collection.history = c[:history]
|
187
220
|
end
|
188
221
|
end
|
189
222
|
end
|
@@ -232,29 +265,88 @@ module Couchbase
|
|
232
265
|
end
|
233
266
|
|
234
267
|
# Creates a new collection
|
268
|
+
# @overload create_collection(scope_name, collection_name, settings = CreateCollectionSettings::DEFAULT,
|
269
|
+
# options = Options::Collection::CreateCollection::DEFAULT)
|
270
|
+
# @param [String] scope_name the name of the scope the collection will be created in
|
271
|
+
# @param [String] collection_name the name of the collection to be created
|
272
|
+
# @param [CreateCollectionSettings] settings settings for the new collection
|
273
|
+
# @param [Options::Collection::CreateCollection] options
|
235
274
|
#
|
236
|
-
# @
|
237
|
-
#
|
275
|
+
# @overload create_collection(collection, options = Options::Collection::CreateCollection)
|
276
|
+
# @param [CollectionSpec] collection specification of the collection
|
277
|
+
# @param [Options::Collection::CreateCollection] options
|
278
|
+
#
|
279
|
+
# @deprecated Use +#create_collection(scope_name, collection_name, settings, options)+ instead
|
238
280
|
#
|
239
281
|
# @return void
|
240
282
|
#
|
241
283
|
# @raise [ArgumentError]
|
242
|
-
# @raise [Error::
|
284
|
+
# @raise [Error::CollectionExists]
|
285
|
+
# @raise [Error::ScopeNotFound]
|
286
|
+
def create_collection(*args)
|
287
|
+
if args[0].is_a?(CollectionSpec)
|
288
|
+
collection = args[0]
|
289
|
+
options = args[1] || Options::Collection::CreateCollection::DEFAULT
|
290
|
+
settings = CreateCollectionSettings.new(max_expiry: collection.max_expiry, history: collection.history)
|
291
|
+
|
292
|
+
warn "Calling create_collection with a CollectionSpec object has been deprecated, supply scope name, " \
|
293
|
+
"collection name and optionally a CreateCollectionSettings instance"
|
294
|
+
|
295
|
+
@backend.collection_create(@bucket_name, collection.scope_name, collection.name, settings.to_backend, options.to_backend)
|
296
|
+
else
|
297
|
+
scope_name = args[0]
|
298
|
+
collection_name = args[1]
|
299
|
+
settings = args[2] || CreateCollectionSettings::DEFAULT
|
300
|
+
options = args[3] || Options::Collection::CreateCollection::DEFAULT
|
301
|
+
@backend.collection_create(@bucket_name, scope_name, collection_name, settings.to_backend, options.to_backend)
|
302
|
+
end
|
303
|
+
end
|
304
|
+
|
305
|
+
# Updates the settings of an existing collection
|
306
|
+
#
|
307
|
+
# @param [String] scope_name the name of the scope the collection is in
|
308
|
+
# @param [String] collection_name the name of the collection to be updated
|
309
|
+
# @param [UpdateCollectionSettings] settings the settings that should be updated
|
310
|
+
#
|
311
|
+
# @raise [ArgumentError]
|
312
|
+
# @raise [Error::CollectionNotFound]
|
243
313
|
# @raise [Error::ScopeNotFound]
|
244
|
-
def
|
245
|
-
|
314
|
+
def update_collection(scope_name, collection_name, settings = UpdateCollectionSettings::DEFAULT,
|
315
|
+
options = Options::Collection::UpdateCollection::DEFAULT)
|
316
|
+
@backend.collection_update(@bucket_name, scope_name, collection_name, settings.to_backend, options.to_backend)
|
246
317
|
end
|
247
318
|
|
248
319
|
# Removes a collection
|
320
|
+
# @overload drop_collection(scope_name, collection_name, settings = CreateCollectionSettings::DEFAULT,
|
321
|
+
# options = Options::Collection::CreateCollection::DEFAULT)
|
322
|
+
# @param [String] scope_name the name of the scope the collection is in
|
323
|
+
# @param [String] collection_name the name of the collection to be removed
|
249
324
|
#
|
250
|
-
# @
|
251
|
-
#
|
325
|
+
# @overload drop_collection(collection, options = Options::Collection::CreateCollection)
|
326
|
+
# @param [CollectionSpec] collection specification of the collection
|
327
|
+
# @param [Options::Collection::CreateCollection] options
|
328
|
+
#
|
329
|
+
# @deprecated Use +#drop_collection(scope_name, collection_name, options)+ instead
|
252
330
|
#
|
253
331
|
# @return void
|
254
332
|
#
|
333
|
+
# @raise [ArgumentError]
|
255
334
|
# @raise [Error::CollectionNotFound]
|
256
|
-
|
257
|
-
|
335
|
+
# @raise [Error::ScopeNotFound]
|
336
|
+
def drop_collection(*args)
|
337
|
+
if args[0].is_a?(CollectionSpec)
|
338
|
+
collection = args[0]
|
339
|
+
options = args[1] || Options::Collection::CreateCollection::DEFAULT
|
340
|
+
|
341
|
+
warn "Calling drop_collection with a CollectionSpec object has been deprecated, supply scope name and collection name"
|
342
|
+
|
343
|
+
@backend.collection_drop(@bucket_name, collection.scope_name, collection.name, options.to_backend)
|
344
|
+
else
|
345
|
+
scope_name = args[0]
|
346
|
+
collection_name = args[1]
|
347
|
+
options = args[2] || Options::Collection::CreateCollection::DEFAULT
|
348
|
+
@backend.collection_drop(@bucket_name, scope_name, collection_name, options.to_backend)
|
349
|
+
end
|
258
350
|
end
|
259
351
|
|
260
352
|
# @deprecated use {CollectionManager#get_all_scopes} instead
|
@@ -289,6 +381,60 @@ module Couchbase
|
|
289
381
|
DropCollectionOptions = ::Couchbase::Management::Options::Collection::DropCollection
|
290
382
|
end
|
291
383
|
|
384
|
+
class CreateCollectionSettings
|
385
|
+
# @return [Integer, nil] time in seconds of the maximum expiration time for new documents in the collection
|
386
|
+
# (set to +nil+ to disable it)
|
387
|
+
attr_accessor :max_expiry
|
388
|
+
|
389
|
+
# @return [Boolean, nil] whether history retention override should be enabled in the collection (set to +nil+ to
|
390
|
+
# default to the bucket-level setting)
|
391
|
+
attr_accessor :history
|
392
|
+
|
393
|
+
def initialize(max_expiry: nil, history: nil)
|
394
|
+
@max_expiry = max_expiry
|
395
|
+
@history = history
|
396
|
+
|
397
|
+
yield self if block_given?
|
398
|
+
end
|
399
|
+
|
400
|
+
# @api private
|
401
|
+
def to_backend
|
402
|
+
{
|
403
|
+
max_expiry: @max_expiry,
|
404
|
+
history: @history,
|
405
|
+
}
|
406
|
+
end
|
407
|
+
|
408
|
+
DEFAULT = CreateCollectionSettings.new.freeze
|
409
|
+
end
|
410
|
+
|
411
|
+
class UpdateCollectionSettings
|
412
|
+
# @return [Integer, nil] time in seconds of the maximum expiration time for new documents in the collection
|
413
|
+
# (set to +nil+ to disable it)
|
414
|
+
attr_accessor :max_expiry
|
415
|
+
|
416
|
+
# @return [Boolean, nil] whether history retention override should be enabled in the collection (set to +nil+ to
|
417
|
+
# default to the bucket-level setting)
|
418
|
+
attr_accessor :history
|
419
|
+
|
420
|
+
def initialize(max_expiry: nil, history: nil)
|
421
|
+
@max_expiry = max_expiry
|
422
|
+
@history = history
|
423
|
+
|
424
|
+
yield self if block_given?
|
425
|
+
end
|
426
|
+
|
427
|
+
# @api private
|
428
|
+
def to_backend
|
429
|
+
{
|
430
|
+
max_expiry: @max_expiry,
|
431
|
+
history: @history,
|
432
|
+
}
|
433
|
+
end
|
434
|
+
|
435
|
+
DEFAULT = UpdateCollectionSettings.new.freeze
|
436
|
+
end
|
437
|
+
|
292
438
|
class ScopeSpec
|
293
439
|
# @return [String] name of the scope
|
294
440
|
attr_accessor :name
|
@@ -312,6 +458,9 @@ module Couchbase
|
|
312
458
|
# @return [Integer] time in seconds of the expiration for new documents in the collection (set to +nil+ to disable it)
|
313
459
|
attr_accessor :max_expiry
|
314
460
|
|
461
|
+
# @return [Boolean, nil] whether history retention is enabled for this collection
|
462
|
+
attr_accessor :history
|
463
|
+
|
315
464
|
# @yieldparam [CollectionSpec] self
|
316
465
|
def initialize
|
317
466
|
yield self if block_given?
|
data/lib/couchbase/options.rb
CHANGED
@@ -1026,6 +1026,151 @@ module Couchbase
|
|
1026
1026
|
DEFAULT = LookupIn.new.freeze
|
1027
1027
|
end
|
1028
1028
|
|
1029
|
+
# Options for {Collection#lookup_in_any_replica}
|
1030
|
+
class LookupInAnyReplica < Base
|
1031
|
+
attr_accessor :transcoder # @return [JsonTranscoder, #decode(String)]
|
1032
|
+
|
1033
|
+
# Creates an instance of options for {Collection#lookup_in_any_replica}
|
1034
|
+
#
|
1035
|
+
# @param [JsonTranscoder, #decode(String)] transcoder used for encoding
|
1036
|
+
#
|
1037
|
+
# @param [Integer, #in_milliseconds, nil] timeout
|
1038
|
+
# @param [Proc, nil] retry_strategy the custom retry strategy, if set
|
1039
|
+
# @param [Hash, nil] client_context the client context data, if set
|
1040
|
+
# @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
|
1041
|
+
#
|
1042
|
+
# @yieldparam [LookupIn] self
|
1043
|
+
def initialize(transcoder: JsonTranscoder.new,
|
1044
|
+
timeout: nil,
|
1045
|
+
retry_strategy: nil,
|
1046
|
+
client_context: nil,
|
1047
|
+
parent_span: nil)
|
1048
|
+
super(timeout: timeout, retry_strategy: retry_strategy, client_context: client_context, parent_span: parent_span)
|
1049
|
+
@transcoder = transcoder
|
1050
|
+
yield self if block_given?
|
1051
|
+
end
|
1052
|
+
|
1053
|
+
# @api private
|
1054
|
+
def to_backend
|
1055
|
+
{
|
1056
|
+
timeout: Utils::Time.extract_duration(@timeout),
|
1057
|
+
}
|
1058
|
+
end
|
1059
|
+
|
1060
|
+
# @api private
|
1061
|
+
# @return [Boolean]
|
1062
|
+
attr_accessor :access_deleted
|
1063
|
+
|
1064
|
+
# @api private
|
1065
|
+
DEFAULT = LookupInAnyReplica.new.freeze
|
1066
|
+
end
|
1067
|
+
|
1068
|
+
# Options for {Collection#lookup_in_all_replicas}
|
1069
|
+
class LookupInAllReplicas < Base
|
1070
|
+
attr_accessor :transcoder # @return [JsonTranscoder, #decode(String)]
|
1071
|
+
|
1072
|
+
# Creates an instance of options for {Collection#lookup_in_all_replicas}
|
1073
|
+
#
|
1074
|
+
# @param [JsonTranscoder, #decode(String)] transcoder used for encoding
|
1075
|
+
#
|
1076
|
+
# @param [Integer, #in_milliseconds, nil] timeout
|
1077
|
+
# @param [Proc, nil] retry_strategy the custom retry strategy, if set
|
1078
|
+
# @param [Hash, nil] client_context the client context data, if set
|
1079
|
+
# @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
|
1080
|
+
#
|
1081
|
+
# @yieldparam [LookupInAllReplicas] self
|
1082
|
+
def initialize(transcoder: JsonTranscoder.new,
|
1083
|
+
timeout: nil,
|
1084
|
+
retry_strategy: nil,
|
1085
|
+
client_context: nil,
|
1086
|
+
parent_span: nil)
|
1087
|
+
super(timeout: timeout, retry_strategy: retry_strategy, client_context: client_context, parent_span: parent_span)
|
1088
|
+
@transcoder = transcoder
|
1089
|
+
yield self if block_given?
|
1090
|
+
end
|
1091
|
+
|
1092
|
+
# @api private
|
1093
|
+
def to_backend
|
1094
|
+
{
|
1095
|
+
timeout: Utils::Time.extract_duration(@timeout),
|
1096
|
+
}
|
1097
|
+
end
|
1098
|
+
|
1099
|
+
# @api private
|
1100
|
+
DEFAULT = LookupInAllReplicas.new.freeze
|
1101
|
+
end
|
1102
|
+
|
1103
|
+
# Options for {Collection#scan}
|
1104
|
+
class Scan < Base
|
1105
|
+
attr_accessor :ids_only # @return [Boolean]
|
1106
|
+
attr_accessor :transcoder # @return [JsonTranscoder, #decode(String)]
|
1107
|
+
attr_accessor :mutation_state # @return [MutationState, nil]
|
1108
|
+
attr_accessor :batch_byte_limit # @return [Integer, nil]
|
1109
|
+
attr_accessor :batch_item_limit # @return [Integer, nil]
|
1110
|
+
attr_accessor :concurrency # @return [Integer, nil]
|
1111
|
+
|
1112
|
+
# Creates an instance of options for {Collection#scan}
|
1113
|
+
#
|
1114
|
+
# @param [Boolean] ids_only if set to true, the content of the documents is not included in the results
|
1115
|
+
# @param [JsonTranscoder, #decode(String)] transcoder used for decoding
|
1116
|
+
# @param [MutationState, nil] mutation_state sets the mutation tokens this scan should be consistent with
|
1117
|
+
# @param [Integer, nil] batch_byte_limit allows to limit the maximum amount of bytes that are sent from the server
|
1118
|
+
# to the client on each partition batch, defaults to 15,000
|
1119
|
+
# @param [Integer, nil] batch_item_limit allows to limit the maximum amount of items that are sent from the server
|
1120
|
+
# to the client on each partition batch, defaults to 50
|
1121
|
+
# @param [Integer, nil] concurrency specifies the maximum number of partitions that can be scanned concurrently,
|
1122
|
+
# defaults to 1
|
1123
|
+
#
|
1124
|
+
# @param [Integer, #in_milliseconds, nil] timeout
|
1125
|
+
# @param [Proc, nil] retry_strategy the custom retry strategy, if set
|
1126
|
+
# @param [Hash, nil] client_context the client context data, if set
|
1127
|
+
# @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
|
1128
|
+
#
|
1129
|
+
# @yieldparam [LookupIn] self
|
1130
|
+
def initialize(ids_only: false,
|
1131
|
+
transcoder: JsonTranscoder.new,
|
1132
|
+
mutation_state: nil,
|
1133
|
+
batch_byte_limit: nil,
|
1134
|
+
batch_item_limit: nil,
|
1135
|
+
concurrency: nil,
|
1136
|
+
timeout: nil,
|
1137
|
+
retry_strategy: nil,
|
1138
|
+
client_context: nil,
|
1139
|
+
parent_span: nil)
|
1140
|
+
super(timeout: timeout, retry_strategy: retry_strategy, client_context: client_context, parent_span: parent_span)
|
1141
|
+
@ids_only = ids_only
|
1142
|
+
@transcoder = transcoder
|
1143
|
+
@mutation_state = mutation_state
|
1144
|
+
@batch_byte_limit = batch_byte_limit
|
1145
|
+
@batch_item_limit = batch_item_limit
|
1146
|
+
@concurrency = concurrency
|
1147
|
+
yield self if block_given?
|
1148
|
+
end
|
1149
|
+
|
1150
|
+
# Sets the mutation tokens this query should be consistent with
|
1151
|
+
#
|
1152
|
+
# @note overrides consistency level set by {#scan_consistency=}
|
1153
|
+
#
|
1154
|
+
# @param [MutationState] mutation_state the mutation state containing the mutation tokens
|
1155
|
+
def consistent_with(mutation_state)
|
1156
|
+
@mutation_state = mutation_state
|
1157
|
+
end
|
1158
|
+
|
1159
|
+
# @api private
|
1160
|
+
def to_backend
|
1161
|
+
{
|
1162
|
+
timeout: Utils::Time.extract_duration(@timeout),
|
1163
|
+
ids_only: @ids_only,
|
1164
|
+
mutation_state: @mutation_state.to_a,
|
1165
|
+
batch_byte_limit: @batch_byte_limit,
|
1166
|
+
batch_item_limit: @batch_item_limit,
|
1167
|
+
concurrency: @concurrency,
|
1168
|
+
}
|
1169
|
+
end
|
1170
|
+
|
1171
|
+
DEFAULT = Scan.new.freeze
|
1172
|
+
end
|
1173
|
+
|
1029
1174
|
# Options for {BinaryCollection#append}
|
1030
1175
|
class Append < Base
|
1031
1176
|
attr_accessor :cas # @return [Integer]
|
@@ -1849,6 +1994,7 @@ module Couchbase
|
|
1849
1994
|
attr_accessor :profile # @return [Symbol]
|
1850
1995
|
attr_accessor :flex_index # @return [Boolean]
|
1851
1996
|
attr_accessor :preserve_expiry # @return [Boolean]
|
1997
|
+
attr_accessor :use_replica # @return [Boolean, nil]
|
1852
1998
|
attr_accessor :scope_qualifier # @return [String]
|
1853
1999
|
attr_accessor :transcoder # @return [JsonTranscoder, #decode(String)]
|
1854
2000
|
|
@@ -1894,6 +2040,8 @@ module Couchbase
|
|
1894
2040
|
# @param [Boolean, nil] flex_index Tells the query engine to use a flex index (utilizing the search service)
|
1895
2041
|
# @param [Boolean, nil] preserve_expiry Tells the query engine to preserve expiration values set on any documents
|
1896
2042
|
# modified by this query.
|
2043
|
+
# @param [Boolean, nil] use_replica Specifies that the query engine should use replica nodes for KV fetches if
|
2044
|
+
# the active node is down. If not provided, the server default will be used
|
1897
2045
|
# @param [String, nil] scope_qualifier Associate scope qualifier (also known as +query_context+) with the query.
|
1898
2046
|
# The qualifier must be in form +{bucket_name}.{scope_name}+ or +default:{bucket_name}.{scope_name}+.
|
1899
2047
|
# @param [JsonTranscoder] transcoder to decode rows
|
@@ -1925,6 +2073,7 @@ module Couchbase
|
|
1925
2073
|
profile: :off,
|
1926
2074
|
flex_index: nil,
|
1927
2075
|
preserve_expiry: nil,
|
2076
|
+
use_replica: nil,
|
1928
2077
|
scope_qualifier: nil,
|
1929
2078
|
scan_consistency: :not_bounded,
|
1930
2079
|
mutation_state: nil,
|
@@ -1950,6 +2099,7 @@ module Couchbase
|
|
1950
2099
|
@profile = profile
|
1951
2100
|
@flex_index = flex_index
|
1952
2101
|
@preserve_expiry = preserve_expiry
|
2102
|
+
@use_replica = use_replica
|
1953
2103
|
@scope_qualifier = scope_qualifier
|
1954
2104
|
@scan_consistency = scan_consistency
|
1955
2105
|
@mutation_state = mutation_state
|
@@ -2043,6 +2193,7 @@ module Couchbase
|
|
2043
2193
|
readonly: @readonly,
|
2044
2194
|
flex_index: @flex_index,
|
2045
2195
|
preserve_expiry: @preserve_expiry,
|
2196
|
+
use_replica: @use_replica,
|
2046
2197
|
scan_wait: Utils::Time.extract_duration(@scan_wait),
|
2047
2198
|
scan_cap: @scan_cap,
|
2048
2199
|
pipeline_batch: @pipeline_batch,
|
data/lib/couchbase/scope.rb
CHANGED
@@ -79,7 +79,7 @@ module Couchbase
|
|
79
79
|
metrics.warning_count = resp[:meta][:metrics][:warning_count]
|
80
80
|
end
|
81
81
|
end
|
82
|
-
|
82
|
+
meta.warnings = resp[:warnings].map { |warn| Cluster::QueryWarning.new(warn[:code], warn[:message]) } if resp[:warnings]
|
83
83
|
end
|
84
84
|
res.instance_variable_set(:@rows, resp[:rows])
|
85
85
|
end
|
data/lib/couchbase/utils/time.rb
CHANGED
@@ -48,8 +48,21 @@ module Couchbase
|
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
51
|
+
# This method converts its argument to milliseconds
|
52
|
+
#
|
53
|
+
# 1. Integer values are interpreted as a number of milliseconds
|
54
|
+
# 2. If the argument is a Duration-like object and responds to #in_milliseconds,
|
55
|
+
# then use it and convert result to Integer
|
56
|
+
# 3. Otherwise invoke #to_i on the argument and interpret it as a number of milliseconds
|
51
57
|
def extract_duration(number_or_duration)
|
52
|
-
|
58
|
+
return unless number_or_duration
|
59
|
+
return number_or_duration if number_or_duration.class == Integer # rubocop:disable Style/ClassEqualityComparison avoid overrides of #is_a?, #kind_of?
|
60
|
+
|
61
|
+
if number_or_duration.respond_to?(:in_milliseconds)
|
62
|
+
number_or_duration.public_send(:in_milliseconds)
|
63
|
+
else
|
64
|
+
number_or_duration
|
65
|
+
end.to_i
|
53
66
|
end
|
54
67
|
end
|
55
68
|
end
|
data/lib/couchbase/version.rb
CHANGED
@@ -19,5 +19,5 @@ module Couchbase
|
|
19
19
|
# $ ruby -rcouchbase -e 'pp Couchbase::VERSION'
|
20
20
|
# {:sdk=>"3.4.0", :ruby_abi=>"3.1.0", :revision=>"416fe68e6029ec8a4c40611cf6e6b30d3b90d20f"}
|
21
21
|
VERSION = {} unless defined?(VERSION) # rubocop:disable Style/MutableConstant
|
22
|
-
VERSION.update(:sdk => "3.4.
|
22
|
+
VERSION.update(:sdk => "3.4.5".freeze)
|
23
23
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: couchbase
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.4.
|
4
|
+
version: 3.4.5
|
5
5
|
platform: arm64-darwin-20
|
6
6
|
authors:
|
7
7
|
- Sergey Avseyev
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-10-10 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Modern SDK for Couchbase Server
|
14
14
|
email:
|
@@ -41,6 +41,7 @@ files:
|
|
41
41
|
- lib/couchbase/diagnostics.rb
|
42
42
|
- lib/couchbase/errors.rb
|
43
43
|
- lib/couchbase/json_transcoder.rb
|
44
|
+
- lib/couchbase/key_value_scan.rb
|
44
45
|
- lib/couchbase/libcouchbase.bundle
|
45
46
|
- lib/couchbase/logger.rb
|
46
47
|
- lib/couchbase/management.rb
|
@@ -77,9 +78,9 @@ metadata:
|
|
77
78
|
homepage_uri: https://docs.couchbase.com/ruby-sdk/current/hello-world/start-using-sdk.html
|
78
79
|
bug_tracker_uri: https://couchbase.com/issues/browse/RCBC
|
79
80
|
mailing_list_uri: https://forums.couchbase.com/c/ruby-sdk
|
80
|
-
source_code_uri: https://github.com/couchbase/couchbase-ruby-client/tree/3.4.
|
81
|
-
changelog_uri: https://github.com/couchbase/couchbase-ruby-client/releases/tag/3.4.
|
82
|
-
documentation_uri: https://docs.couchbase.com/sdk-api/couchbase-ruby-client-3.4.
|
81
|
+
source_code_uri: https://github.com/couchbase/couchbase-ruby-client/tree/3.4.5
|
82
|
+
changelog_uri: https://github.com/couchbase/couchbase-ruby-client/releases/tag/3.4.5
|
83
|
+
documentation_uri: https://docs.couchbase.com/sdk-api/couchbase-ruby-client-3.4.5/index.html
|
83
84
|
github_repo: ssh://github.com/couchbase/couchbase-ruby-client
|
84
85
|
rubygems_mfa_required: 'true'
|
85
86
|
post_install_message:
|