couchbase 3.4.3-arm64-darwin-20 → 3.4.5-arm64-darwin-20
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
[![license](https://img.shields.io/github/license/couchbase/couchbase-ruby-client?color=brightgreen)](https://opensource.org/licenses/Apache-2.0)
|
4
4
|
[![gem](https://img.shields.io/gem/v/couchbase?color=brightgreen)](https://rubygems.org/gems/couchbase)
|
5
|
-
[![commits](https://img.shields.io/github/commits-since/couchbase/couchbase-ruby-client/latest?color=brightgreen)](https://github.com/couchbase/couchbase-ruby-client/commits/
|
5
|
+
[![commits](https://img.shields.io/github/commits-since/couchbase/couchbase-ruby-client/latest?color=brightgreen)](https://github.com/couchbase/couchbase-ruby-client/commits/main)
|
6
6
|
[![linters](https://img.shields.io/github/actions/workflow/status/couchbase/couchbase-ruby-client/linters.yml?branch=main&label=linters)](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:
|