couchbase 3.4.2-arm64-darwin-20 → 3.4.4-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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: faa96b8ef64469a07b7665a4d70a8f25cc43003361ee727c403db2514890b96b
4
- data.tar.gz: 43936d9b52ce4a258d24a83111d85b4d19704d54a3ab26d5169a32c1af5d79d8
3
+ metadata.gz: 114c1f905e9873c1e6c8ae96badf29c0c795c9dc653a66584ec41415b5a504c3
4
+ data.tar.gz: 7993c632a1513ab6359a91063bc22ce8aaf6402be1353f0fb0f7c2a975f5e57d
5
5
  SHA512:
6
- metadata.gz: 6ca2f3e4cd54458cc4b4ee6399d79ba31e716640f1727aaee9f37d8916a3de13f5cdcb8e4a4849fa4c9d50b6bbe982ed8c728351b957fa4f5484ae96d96ba891
7
- data.tar.gz: 712cf52caa8edfeb978c879575f204d44c69f42f9867d1b2232337d6ce103a4407669136ad27619e721c35f0b2802b6530966662b0d0806bc45aad59810ed1b1
6
+ metadata.gz: 8220a5639d0c7b74b2a6376371ef495239178a49f29b836a6f902569c7f0491ab7df09fb6e049639ed7e6aeb21ee9c6fac145208cfff23095cc428cd1b12651b
7
+ data.tar.gz: 42c503acdc73e22ad85f346e56e47b7edc0d8b30c5887a5d8b2d2280e8e1edd288f19e09d8c1c294f422a559fb5970d8d6257e292aafb2045260fbd831ae5483
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/master)
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.2"
26
+ gem "couchbase", "3.4.4"
27
27
  ```
28
28
 
29
29
  And then execute:
@@ -28,7 +28,6 @@ module Couchbase
28
28
  def initialize(username, password)
29
29
  @username = username
30
30
  @password = password
31
- @allowed_sasl_mechanisms = DEFAULT_SASL_MECHANISMS
32
31
  end
33
32
 
34
33
  # Creates a LDAP compatible password authenticator which is INSECURE if not used with TLS.
@@ -124,7 +124,7 @@ module Couchbase
124
124
  metrics.warning_count = resp[:meta][:metrics][:warning_count]
125
125
  end
126
126
  end
127
- res[:warnings] = resp[:warnings].map { |warn| QueryWarning.new(warn[:code], warn[:message]) } if resp[:warnings]
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
@@ -386,8 +386,6 @@ module Couchbase
386
386
  raise ArgumentError, "missing connection_string" unless connection_string
387
387
  raise ArgumentError, "missing username" unless credentials[:username]
388
388
  raise ArgumentError, "missing password" unless credentials[:password]
389
-
390
- open_options[:allowed_sasl_mechanisms] = PasswordAuthenticator::DEFAULT_SASL_MECHANISMS
391
389
  else
392
390
  options = args.shift
393
391
  case options
@@ -396,8 +394,6 @@ module Couchbase
396
394
  credentials[:password] = args.shift
397
395
  raise ArgumentError, "missing username" unless credentials[:username]
398
396
  raise ArgumentError, "missing password" unless credentials[:password]
399
-
400
- open_options[:allowed_sasl_mechanisms] = PasswordAuthenticator::DEFAULT_SASL_MECHANISMS
401
397
  when Options::Cluster
402
398
  open_options = options&.to_backend || {}
403
399
  authenticator = options&.authenticator
@@ -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,6 +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)
170
+
171
+ raise field.error unless field.error.nil?
167
172
  raise Error::PathNotFound, "Path is not found: #{path_or_index}" unless field.exists
168
173
 
169
174
  transcoder.decode(field.value, :json)
@@ -186,6 +191,8 @@ module Couchbase
186
191
  end
187
192
  return false unless field
188
193
 
194
+ raise field.error unless field.error.nil?
195
+
189
196
  field.exists
190
197
  end
191
198
 
@@ -227,6 +234,18 @@ module Couchbase
227
234
  end
228
235
  end
229
236
 
237
+ class LookupInReplicaResult < LookupInResult
238
+ # @return [Boolean] true if the document was read from a replica node
239
+ attr_accessor :is_replica
240
+ alias replica? is_replica
241
+
242
+ # @yieldparam [LookupInReplicaResult] self
243
+ def initialize
244
+ super
245
+ yield self if block_given?
246
+ end
247
+ end
248
+
230
249
  class MutateInResult < MutationResult
231
250
  # Decodes the content at the given index
232
251
  #
@@ -291,10 +310,91 @@ module Couchbase
291
310
  # @return [String] path
292
311
  attr_accessor :path
293
312
 
313
+ # @return [CouchbaseError] error
314
+ attr_accessor :error
315
+
294
316
  # @yieldparam [SubDocumentField] self
295
317
  def initialize
296
318
  yield self if block_given?
297
319
  end
298
320
  end
321
+
322
+ class ScanResult
323
+ # @return [String] identifier of the document
324
+ attr_accessor :id
325
+
326
+ # @return [Boolean] whether only ids are returned from this scan
327
+ attr_accessor :id_only
328
+
329
+ # @return [Integer, nil] holds the CAS value of the fetched document
330
+ attr_accessor :cas
331
+
332
+ # @return [Integer, nil] the expiration if fetched and present
333
+ attr_accessor :expiry
334
+
335
+ # @return [JsonTranscoder, RawBinaryTranscoder, RawJsonTranscoder, RawStringTranscoder, #decode] The default
336
+ # transcoder which should be used
337
+ attr_accessor :transcoder
338
+
339
+ def initialize(id:, id_only:, cas: nil, expiry: nil, encoded: nil, flags: nil, transcoder: JsonTranscoder.new)
340
+ @id = id
341
+ @id_only = id_only
342
+ @cas = cas
343
+ @expiry = expiry
344
+ @encoded = encoded
345
+ @flags = flags
346
+ @transcoder = transcoder
347
+
348
+ yield self if block_given?
349
+ end
350
+
351
+ # Decodes the content of the document using given (or default transcoder)
352
+ #
353
+ # @param [JsonTranscoder, RawJsonTranscoder, RawBinaryTranscoder, RawStringTranscoder] transcoder custom transcoder
354
+ #
355
+ # @return [Object, nil]
356
+ def content(transcoder = self.transcoder)
357
+ return nil if @encoded.nil?
358
+
359
+ transcoder ? transcoder.decode(@encoded, @flags) : @encoded
360
+ end
361
+ end
362
+
363
+ class ScanResults
364
+ include Enumerable
365
+
366
+ def initialize(core_scan_result:, transcoder:)
367
+ @core_scan_result = core_scan_result
368
+ @transcoder = transcoder
369
+ end
370
+
371
+ def each
372
+ return enum_for(:each) unless block_given?
373
+
374
+ loop do
375
+ resp = @core_scan_result.next_item
376
+
377
+ break if resp.nil?
378
+
379
+ if resp[:id_only]
380
+ yield ScanResult.new(
381
+ id: resp[:id],
382
+ id_only: resp[:id_only],
383
+ transcoder: @transcoder
384
+ )
385
+ else
386
+ yield ScanResult.new(
387
+ id: resp[:id],
388
+ id_only: resp[:id_only],
389
+ cas: resp[:cas],
390
+ expiry: resp[:expiry],
391
+ encoded: resp[:encoded],
392
+ flags: resp[:flags],
393
+ transcoder: @transcoder
394
+ )
395
+ end
396
+ end
397
+ end
398
+ end
299
399
  end
300
400
  end
@@ -15,7 +15,7 @@
15
15
  module Couchbase
16
16
  module ConfigProfiles
17
17
  class Profiles
18
- attr :profiles
18
+ attr_reader :profiles
19
19
 
20
20
  def initialize
21
21
  @profiles = {}
@@ -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
@@ -14,18 +14,25 @@
14
14
 
15
15
  require "json"
16
16
 
17
+ require "couchbase/transcoder_flags"
18
+
17
19
  module Couchbase
18
20
  class JsonTranscoder
19
21
  # @param [Object] document
20
22
  # @return [Array<String, Integer>] pair of encoded document and flags
21
23
  def encode(document)
22
- [JSON.generate(document), (0x02 << 24) | 0x06]
24
+ raise Error::EncodingFailure, "The JsonTranscoder does not support binary data" if document.is_a?(String) && !document.valid_encoding?
25
+
26
+ [JSON.generate(document), TranscoderFlags.new(format: :json, lower_bits: 6).encode]
23
27
  end
24
28
 
25
- # @param [String, nil] blob string of bytes, containing encoded representation of the document
26
- # @param [Integer, :json] _flags bit field, describing how the data encoded
27
- # @return Object decoded document
28
- def decode(blob, _flags)
29
+ # @param [String] blob string of bytes, containing encoded representation of the document
30
+ # @param [Integer, :json] flags bit field, describing how the data encoded
31
+ # @return [Object] decoded document
32
+ def decode(blob, flags)
33
+ format = TranscoderFlags.decode(flags).format
34
+ raise Error::DecodingFailure, "Unable to decode #{format} with the JsonTranscoder" unless format == :json || format.nil?
35
+
29
36
  JSON.parse(blob) unless blob&.empty?
30
37
  end
31
38
  end
@@ -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
@@ -14,6 +14,7 @@
14
14
 
15
15
  require "couchbase/management/query_index_manager"
16
16
  require "couchbase/utils/time"
17
+ require "couchbase/errors"
17
18
 
18
19
  module Couchbase
19
20
  module Management
@@ -37,8 +38,18 @@ module Couchbase
37
38
  #
38
39
  # @return [Array<QueryIndex>]
39
40
  #
40
- # @raise [ArgumentError]
41
+ # @raise [Error::InvalidArgument]
41
42
  def get_all_indexes(options = Options::Query::GetAllIndexes.new)
43
+ unless options.scope_name.nil?
44
+ raise Error::InvalidArgument,
45
+ "Scope name cannot be set in the options when using the Query Index manager at the collection level"
46
+ end
47
+
48
+ unless options.collection_name.nil?
49
+ raise Error::InvalidArgument,
50
+ "Collection name cannot be set in the options when using the Query Index manager at the collection level"
51
+ end
52
+
42
53
  res = @backend.collection_query_index_get_all(@bucket_name, @scope_name, @collection_name, options.to_backend)
43
54
  res[:indexes].map do |idx|
44
55
  QueryIndex.new do |index|
@@ -64,15 +75,17 @@ module Couchbase
64
75
  #
65
76
  # @return void
66
77
  #
67
- # @raise [ArgumentError]
78
+ # @raise [Error::InvalidArgument]
68
79
  # @raise [Error::IndexExists]
69
80
  def create_index(index_name, fields, options = Options::Query::CreateIndex.new)
70
81
  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"
82
+ raise Error::InvalidArgument,
83
+ "Scope name cannot be set in the options when using the Query Index manager at the collection level"
72
84
  end
73
85
 
74
86
  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"
87
+ raise Error::InvalidArgument,
88
+ "Collection name cannot be set in the options when using the Query Index manager at the collection level"
76
89
  end
77
90
 
78
91
  @backend.collection_query_index_create(@bucket_name, @scope_name, @collection_name, index_name, fields, options.to_backend)
@@ -84,15 +97,17 @@ module Couchbase
84
97
  #
85
98
  # @return void
86
99
  #
87
- # @raise [ArgumentError]
100
+ # @raise [Error::InvalidArgument]
88
101
  # @raise [Error::IndexExists]
89
102
  def create_primary_index(options = Options::Query::CreatePrimaryIndex.new)
90
103
  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"
104
+ raise Error::InvalidArgument,
105
+ "Scope name cannot be set in the options when using the Query Index manager at the collection level"
92
106
  end
93
107
 
94
108
  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"
109
+ raise Error::InvalidArgument,
110
+ "Collection name cannot be set in the options when using the Query Index manager at the collection level"
96
111
  end
97
112
 
98
113
  @backend.collection_query_index_create_primary(@bucket_name, @scope_name, @collection_name, options.to_backend)
@@ -105,15 +120,17 @@ module Couchbase
105
120
  #
106
121
  # @return void
107
122
  #
108
- # @raise [ArgumentError]
123
+ # @raise [Error::InvalidArgument]
109
124
  # @raise [Error::IndexNotFound]
110
125
  def drop_index(index_name, options = Options::Query::DropIndex.new)
111
126
  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"
127
+ raise Error::InvalidArgument,
128
+ "Scope name cannot be set in the options when using the Query Index manager at the collection level"
113
129
  end
114
130
 
115
131
  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"
132
+ raise Error::InvalidArgument,
133
+ "Collection name cannot be set in the options when using the Query Index manager at the collection level"
117
134
  end
118
135
 
119
136
  @backend.collection_query_index_drop(@bucket_name, @scope_name, @collection_name, index_name, options.to_backend)
@@ -125,15 +142,17 @@ module Couchbase
125
142
  #
126
143
  # @return void
127
144
  #
128
- # @raise [ArgumentError]
145
+ # @raise [Error::InvalidArgument]
129
146
  # @raise [Error::IndexNotFound]
130
147
  def drop_primary_index(options = Options::Query::DropPrimaryIndex.new)
131
148
  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"
149
+ raise Error::InvalidArgument,
150
+ "Scope name cannot be set in the options when using the Query Index manager at the collection level"
133
151
  end
134
152
 
135
153
  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"
154
+ raise Error::InvalidArgument,
155
+ "Collection name cannot be set in the options when using the Query Index manager at the collection level"
137
156
  end
138
157
 
139
158
  @backend.collection_query_index_drop_primary(@bucket_name, @scope_name, @collection_name, options.to_backend)
@@ -145,8 +164,18 @@ module Couchbase
145
164
  #
146
165
  # @return void
147
166
  #
148
- # @raise [ArgumentError]
167
+ # @raise [Error::InvalidArgument]
149
168
  def build_deferred_indexes(options = Options::Query::BuildDeferredIndexes.new)
169
+ unless options.scope_name.nil?
170
+ raise Error::InvalidArgument,
171
+ "Scope name cannot be set in the options when using the Query Index manager at the collection level"
172
+ end
173
+
174
+ unless options.collection_name.nil?
175
+ raise Error::InvalidArgument,
176
+ "Collection name cannot be set in the options when using the Query Index manager at the collection level"
177
+ end
178
+
150
179
  @backend.collection_query_index_build_deferred(@bucket_name, @scope_name, @collection_name, options.to_backend)
151
180
  end
152
181
 
@@ -156,9 +185,19 @@ module Couchbase
156
185
  # @param [Integer, #in_milliseconds] timeout the time in milliseconds allowed for the operation to complete
157
186
  # @param [Options::Query::WatchIndexes] options
158
187
  #
159
- # @raise [ArgumentError]
188
+ # @raise [Error::InvalidArgument]
160
189
  # @raise [Error::IndexNotFound]
161
190
  def watch_indexes(index_names, timeout, options = Options::Query::WatchIndexes.new)
191
+ unless options.scope_name.nil?
192
+ raise Error::InvalidArgument,
193
+ "Scope name cannot be set in the options when using the Query Index manager at the collection level"
194
+ end
195
+
196
+ unless options.collection_name.nil?
197
+ raise Error::InvalidArgument,
198
+ "Collection name cannot be set in the options when using the Query Index manager at the collection level"
199
+ end
200
+
162
201
  index_names.append("#primary") if options.watch_primary
163
202
 
164
203
  interval_millis = 50