couchbase 3.4.3 → 3.4.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +2 -2
- data/ext/couchbase/CMakeLists.txt +22 -1
- data/ext/couchbase/core/bucket.cxx +183 -152
- data/ext/couchbase/core/bucket.hxx +17 -4
- data/ext/couchbase/core/cluster.hxx +41 -13
- data/ext/couchbase/core/cluster_options.hxx +3 -0
- data/ext/couchbase/core/crud_component.cxx +51 -22
- data/ext/couchbase/core/error_context/key_value.cxx +2 -1
- data/ext/couchbase/core/error_context/key_value.hxx +10 -12
- data/ext/couchbase/core/impl/build_deferred_query_indexes.cxx +115 -50
- data/ext/couchbase/core/impl/cluster.cxx +6 -0
- data/ext/couchbase/core/impl/create_bucket.cxx +158 -0
- data/ext/couchbase/core/impl/create_collection.cxx +83 -0
- data/ext/couchbase/core/impl/create_query_index.cxx +172 -59
- data/ext/couchbase/core/impl/create_scope.cxx +69 -0
- data/ext/couchbase/core/impl/dns_srv_tracker.cxx +2 -1
- data/ext/couchbase/core/impl/drop_bucket.cxx +66 -0
- data/ext/couchbase/core/impl/drop_collection.cxx +76 -0
- data/ext/couchbase/core/impl/drop_query_index.cxx +138 -59
- data/ext/couchbase/core/impl/drop_scope.cxx +68 -0
- data/ext/couchbase/core/impl/flush_bucket.cxx +66 -0
- data/ext/couchbase/core/impl/get_all_buckets.cxx +178 -0
- data/ext/couchbase/core/impl/get_all_query_indexes.cxx +67 -37
- data/ext/couchbase/core/impl/get_all_scopes.cxx +94 -0
- data/ext/couchbase/core/impl/get_bucket.cxx +168 -0
- data/ext/couchbase/core/impl/internal_manager_error_context.cxx +113 -0
- data/ext/couchbase/core/impl/internal_manager_error_context.hxx +60 -0
- data/ext/couchbase/core/impl/key_value_error_category.cxx +2 -4
- data/ext/couchbase/core/impl/key_value_error_context.cxx +98 -0
- data/ext/couchbase/core/impl/lookup_in.cxx +1 -0
- data/ext/couchbase/core/impl/lookup_in_all_replicas.cxx +178 -0
- data/ext/couchbase/core/impl/lookup_in_all_replicas.hxx +80 -0
- data/ext/couchbase/core/impl/lookup_in_any_replica.cxx +169 -0
- data/ext/couchbase/core/impl/lookup_in_any_replica.hxx +75 -0
- data/ext/couchbase/core/impl/lookup_in_replica.cxx +104 -0
- data/ext/couchbase/core/impl/lookup_in_replica.hxx +67 -0
- data/ext/couchbase/core/impl/manager_error_context.cxx +100 -0
- data/ext/couchbase/core/impl/query.cxx +1 -0
- data/ext/couchbase/core/impl/query_error_context.cxx +75 -0
- data/ext/couchbase/core/impl/update_bucket.cxx +133 -0
- data/ext/couchbase/core/impl/update_collection.cxx +83 -0
- data/ext/couchbase/core/impl/watch_query_indexes.cxx +53 -29
- data/ext/couchbase/core/io/dns_client.cxx +111 -40
- data/ext/couchbase/core/io/dns_config.cxx +5 -4
- data/ext/couchbase/core/io/http_session.hxx +24 -1
- data/ext/couchbase/core/io/mcbp_command.hxx +9 -2
- data/ext/couchbase/core/io/mcbp_session.cxx +80 -43
- data/ext/couchbase/core/io/mcbp_session.hxx +4 -3
- data/ext/couchbase/core/logger/custom_rotating_file_sink.cxx +1 -1
- data/ext/couchbase/core/logger/logger.cxx +80 -20
- data/ext/couchbase/core/logger/logger.hxx +31 -0
- data/ext/couchbase/core/management/bucket_settings.hxx +8 -5
- data/ext/couchbase/core/management/bucket_settings_json.hxx +12 -2
- data/ext/couchbase/core/meta/features.hxx +42 -0
- data/ext/couchbase/core/operations/document_lookup_in.cxx +8 -1
- data/ext/couchbase/core/operations/document_lookup_in_all_replicas.hxx +192 -0
- data/ext/couchbase/core/operations/document_lookup_in_any_replica.hxx +188 -0
- data/ext/couchbase/core/operations/document_query.cxx +11 -0
- data/ext/couchbase/core/operations/document_query.hxx +1 -0
- data/ext/couchbase/core/operations/management/CMakeLists.txt +1 -0
- data/ext/couchbase/core/operations/management/bucket_create.cxx +30 -9
- data/ext/couchbase/core/operations/management/bucket_update.cxx +27 -6
- data/ext/couchbase/core/operations/management/collection_create.cxx +5 -1
- data/ext/couchbase/core/operations/management/collection_create.hxx +1 -0
- data/ext/couchbase/core/operations/management/collection_update.cxx +87 -0
- data/ext/couchbase/core/operations/management/collection_update.hxx +54 -0
- data/ext/couchbase/core/operations/management/collections.hxx +1 -0
- data/ext/couchbase/core/operations.hxx +2 -0
- data/ext/couchbase/core/origin.cxx +270 -0
- data/ext/couchbase/core/origin.hxx +2 -0
- data/ext/couchbase/core/protocol/client_response.hxx +1 -0
- data/ext/couchbase/core/protocol/cmd_hello.hxx +1 -0
- data/ext/couchbase/core/protocol/cmd_lookup_in_replica.cxx +107 -0
- data/ext/couchbase/core/protocol/cmd_lookup_in_replica.hxx +137 -0
- data/ext/couchbase/core/protocol/hello_feature.hxx +6 -0
- data/ext/couchbase/core/protocol/hello_feature_fmt.hxx +3 -0
- data/ext/couchbase/core/protocol/status.cxx +2 -2
- data/ext/couchbase/core/range_scan_options.cxx +3 -27
- data/ext/couchbase/core/range_scan_options.hxx +13 -17
- data/ext/couchbase/core/range_scan_orchestrator.cxx +388 -170
- data/ext/couchbase/core/range_scan_orchestrator.hxx +13 -2
- data/ext/couchbase/core/range_scan_orchestrator_options.hxx +5 -3
- data/ext/couchbase/core/scan_options.hxx +0 -19
- data/ext/couchbase/core/scan_result.cxx +19 -5
- data/ext/couchbase/core/scan_result.hxx +5 -2
- data/ext/couchbase/core/timeout_defaults.hxx +3 -4
- data/ext/couchbase/core/topology/capabilities.hxx +4 -0
- data/ext/couchbase/core/topology/capabilities_fmt.hxx +11 -0
- data/ext/couchbase/core/topology/collections_manifest.hxx +2 -0
- data/ext/couchbase/core/topology/collections_manifest_fmt.hxx +1 -1
- data/ext/couchbase/core/topology/collections_manifest_json.hxx +3 -0
- data/ext/couchbase/core/topology/configuration.hxx +20 -0
- data/ext/couchbase/core/topology/configuration_json.hxx +8 -1
- data/ext/couchbase/core/utils/connection_string.cxx +62 -47
- data/ext/couchbase/core/utils/connection_string.hxx +1 -0
- data/ext/couchbase/couchbase/analytics_error_context.hxx +1 -1
- data/ext/couchbase/couchbase/behavior_options.hxx +19 -2
- data/ext/couchbase/couchbase/bucket.hxx +14 -0
- data/ext/couchbase/couchbase/bucket_manager.hxx +135 -0
- data/ext/couchbase/couchbase/build_query_index_options.hxx +0 -30
- data/ext/couchbase/couchbase/cluster.hxx +14 -0
- data/ext/couchbase/couchbase/collection.hxx +111 -0
- data/ext/couchbase/couchbase/collection_manager.hxx +160 -0
- data/ext/couchbase/couchbase/collection_query_index_manager.hxx +7 -48
- data/ext/couchbase/couchbase/create_bucket_options.hxx +41 -0
- data/ext/couchbase/couchbase/create_collection_options.hxx +44 -0
- data/ext/couchbase/couchbase/create_primary_query_index_options.hxx +0 -29
- data/ext/couchbase/couchbase/create_query_index_options.hxx +0 -33
- data/ext/couchbase/couchbase/create_scope_options.hxx +41 -0
- data/ext/couchbase/couchbase/drop_bucket_options.hxx +41 -0
- data/ext/couchbase/couchbase/drop_collection_options.hxx +41 -0
- data/ext/couchbase/couchbase/drop_primary_query_index_options.hxx +0 -30
- data/ext/couchbase/couchbase/drop_query_index_options.hxx +0 -31
- data/ext/couchbase/couchbase/drop_scope_options.hxx +41 -0
- data/ext/couchbase/couchbase/error_codes.hxx +1 -2
- data/ext/couchbase/couchbase/error_context.hxx +10 -2
- data/ext/couchbase/couchbase/flush_bucket_options.hxx +41 -0
- data/ext/couchbase/{core/topology/error_map_fmt.hxx → couchbase/fmt/key_value_error_map_attribute.hxx} +21 -21
- data/ext/couchbase/couchbase/get_all_buckets_options.hxx +44 -0
- data/ext/couchbase/couchbase/get_all_query_indexes_options.hxx +0 -30
- data/ext/couchbase/couchbase/get_all_scopes_options.hxx +44 -0
- data/ext/couchbase/couchbase/get_and_lock_options.hxx +2 -2
- data/ext/couchbase/couchbase/get_and_touch_options.hxx +2 -2
- data/ext/couchbase/couchbase/get_bucket_options.hxx +43 -0
- data/ext/couchbase/couchbase/get_options.hxx +2 -2
- data/ext/couchbase/couchbase/insert_options.hxx +3 -3
- data/ext/couchbase/couchbase/key_value_error_context.hxx +7 -2
- data/ext/couchbase/couchbase/lookup_in_all_replicas_options.hxx +109 -0
- data/ext/couchbase/couchbase/lookup_in_any_replica_options.hxx +101 -0
- data/ext/couchbase/couchbase/lookup_in_options.hxx +2 -2
- data/ext/couchbase/couchbase/lookup_in_replica_result.hxx +74 -0
- data/ext/couchbase/couchbase/lookup_in_result.hxx +26 -0
- data/ext/couchbase/couchbase/management/bucket_settings.hxx +119 -0
- data/ext/couchbase/couchbase/management/collection_spec.hxx +29 -0
- data/ext/couchbase/couchbase/management/scope_spec.hxx +29 -0
- data/ext/couchbase/couchbase/manager_error_context.hxx +29 -53
- data/ext/couchbase/couchbase/mutate_in_options.hxx +2 -2
- data/ext/couchbase/couchbase/query_error_context.hxx +3 -1
- data/ext/couchbase/couchbase/query_index_manager.hxx +16 -83
- data/ext/couchbase/couchbase/query_options.hxx +18 -0
- data/ext/couchbase/couchbase/remove_options.hxx +2 -2
- data/ext/couchbase/couchbase/replace_options.hxx +3 -3
- data/ext/couchbase/couchbase/security_options.hxx +15 -0
- data/ext/couchbase/couchbase/subdocument_error_context.hxx +4 -2
- data/ext/couchbase/couchbase/touch_options.hxx +2 -2
- data/ext/couchbase/couchbase/unlock_options.hxx +2 -2
- data/ext/couchbase/couchbase/update_bucket_options.hxx +41 -0
- data/ext/couchbase/couchbase/update_collection_options.hxx +44 -0
- data/ext/couchbase/couchbase/upsert_options.hxx +3 -3
- data/ext/couchbase/couchbase/watch_query_indexes_options.hxx +0 -31
- data/ext/couchbase/test/CMakeLists.txt +1 -0
- data/ext/couchbase/test/test_integration_collections.cxx +6 -0
- data/ext/couchbase/test/test_integration_crud.cxx +5 -0
- data/ext/couchbase/test/test_integration_examples.cxx +137 -1
- data/ext/couchbase/test/test_integration_management.cxx +1009 -309
- data/ext/couchbase/test/test_integration_query.cxx +19 -7
- data/ext/couchbase/test/test_integration_range_scan.cxx +351 -112
- data/ext/couchbase/test/test_integration_search.cxx +10 -1
- data/ext/couchbase/test/test_integration_subdoc.cxx +721 -7
- data/ext/couchbase/test/test_transaction_public_async_api.cxx +13 -12
- data/ext/couchbase/test/test_transaction_public_blocking_api.cxx +27 -21
- data/ext/couchbase/test/test_unit_connection_string.cxx +29 -0
- data/ext/couchbase/test/test_unit_query.cxx +75 -0
- data/ext/couchbase.cxx +735 -60
- data/ext/revisions.rb +3 -3
- 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/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 +59 -8
- data/ext/couchbase/core/impl/collection_query_index_manager.cxx +0 -93
data/ext/revisions.rb
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
cmake_flags << "-DEXT_GIT_REVISION=
|
|
2
|
-
cmake_flags << "-DCOUCHBASE_CXX_CLIENT_GIT_REVISION=
|
|
3
|
-
cmake_flags << "-DCOUCHBASE_CXX_CLIENT_GIT_DESCRIBE=1.0.0-dp.
|
|
1
|
+
cmake_flags << "-DEXT_GIT_REVISION=276c680f5d7d8c33d270470f473a42a9d91c11c7"
|
|
2
|
+
cmake_flags << "-DCOUCHBASE_CXX_CLIENT_GIT_REVISION=a873bb91aa487fab8acd3b619355b911b1588fc1"
|
|
3
|
+
cmake_flags << "-DCOUCHBASE_CXX_CLIENT_GIT_DESCRIBE=1.0.0-dp.9-0-ga873bb9"
|
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
|
|
@@ -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
|