mongo 2.15.1 → 2.16.0.alpha1
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
- checksums.yaml.gz.sig +0 -0
- data/README.md +1 -1
- data/lib/mongo/bulk_write.rb +2 -2
- data/lib/mongo/client.rb +45 -5
- data/lib/mongo/cluster/periodic_executor.rb +4 -3
- data/lib/mongo/cluster/reapers/cursor_reaper.rb +76 -43
- data/lib/mongo/cluster/sdam_flow.rb +9 -3
- data/lib/mongo/cluster/topology/base.rb +13 -9
- data/lib/mongo/cluster/topology/load_balanced.rb +102 -0
- data/lib/mongo/cluster/topology.rb +28 -8
- data/lib/mongo/cluster.rb +136 -51
- data/lib/mongo/collection/view/aggregation.rb +5 -10
- data/lib/mongo/collection/view/builder/aggregation.rb +6 -5
- data/lib/mongo/collection/view/builder/map_reduce.rb +12 -49
- data/lib/mongo/collection/view/builder.rb +0 -4
- data/lib/mongo/collection/view/iterable.rb +42 -18
- data/lib/mongo/collection/view/map_reduce.rb +39 -15
- data/lib/mongo/collection/view/readable.rb +60 -51
- data/lib/mongo/collection/view/writable.rb +178 -175
- data/lib/mongo/collection/view.rb +15 -21
- data/lib/mongo/collection.rb +13 -13
- data/lib/mongo/cursor/kill_spec.rb +38 -0
- data/lib/mongo/cursor.rb +62 -31
- data/lib/mongo/database/view.rb +1 -1
- data/lib/mongo/error/bad_load_balancer_target.rb +26 -0
- data/lib/mongo/error/missing_service_id.rb +26 -0
- data/lib/mongo/error/no_service_connection_available.rb +49 -0
- data/lib/mongo/error/notable.rb +7 -0
- data/lib/mongo/error.rb +3 -0
- data/lib/mongo/grid/fs_bucket.rb +21 -2
- data/lib/mongo/id.rb +7 -5
- data/lib/mongo/index/view.rb +22 -41
- data/lib/mongo/monitoring/event/cmap/pool_cleared.rb +7 -4
- data/lib/mongo/monitoring/event/command_failed.rb +1 -1
- data/lib/mongo/monitoring/event/command_started.rb +2 -0
- data/lib/mongo/monitoring/publishable.rb +2 -2
- data/lib/mongo/operation/aggregate/command.rb +8 -0
- data/lib/mongo/operation/context.rb +19 -1
- data/lib/mongo/operation/count/command.rb +6 -0
- data/lib/mongo/operation/count/op_msg.rb +6 -0
- data/lib/mongo/operation/create/command.rb +7 -1
- data/lib/mongo/operation/create/op_msg.rb +7 -0
- data/lib/mongo/operation/create_index/command.rb +17 -1
- data/lib/mongo/operation/create_index/op_msg.rb +17 -4
- data/lib/mongo/operation/delete/command.rb +6 -3
- data/lib/mongo/operation/delete/legacy.rb +9 -2
- data/lib/mongo/operation/delete/op_msg.rb +8 -1
- data/lib/mongo/operation/distinct/command.rb +6 -0
- data/lib/mongo/operation/distinct/op_msg.rb +7 -0
- data/lib/mongo/operation/explain/command.rb +13 -1
- data/lib/mongo/operation/explain/legacy.rb +12 -5
- data/lib/mongo/operation/explain/op_msg.rb +9 -1
- data/lib/mongo/operation/find/builder/command.rb +110 -0
- data/lib/mongo/{collection/view → operation/find}/builder/flags.rb +10 -14
- data/lib/mongo/operation/find/builder/legacy.rb +123 -0
- data/lib/mongo/{collection/view → operation/find}/builder/modifiers.rb +31 -25
- data/lib/mongo/{cursor → operation/find}/builder.rb +4 -4
- data/lib/mongo/operation/find/command.rb +9 -0
- data/lib/mongo/operation/find/legacy.rb +10 -1
- data/lib/mongo/operation/find/op_msg.rb +12 -0
- data/lib/mongo/operation/find.rb +1 -0
- data/lib/mongo/operation/get_more/command.rb +1 -0
- data/lib/mongo/operation/get_more/command_builder.rb +38 -0
- data/lib/mongo/operation/get_more/op_msg.rb +1 -0
- data/lib/mongo/operation/get_more.rb +1 -0
- data/lib/mongo/operation/kill_cursors/command.rb +8 -0
- data/lib/mongo/operation/kill_cursors/command_builder.rb +35 -0
- data/lib/mongo/operation/kill_cursors/legacy.rb +2 -1
- data/lib/mongo/operation/kill_cursors/op_msg.rb +10 -0
- data/lib/mongo/operation/kill_cursors.rb +1 -0
- data/lib/mongo/operation/map_reduce/command.rb +8 -0
- data/lib/mongo/operation/map_reduce/op_msg.rb +1 -1
- data/lib/mongo/operation/shared/executable.rb +15 -1
- data/lib/mongo/operation/shared/polymorphic_operation.rb +1 -1
- data/lib/mongo/operation/shared/read_preference_supported.rb +3 -1
- data/lib/mongo/operation/shared/response_handling.rb +1 -0
- data/lib/mongo/operation/shared/sessions_supported.rb +12 -12
- data/lib/mongo/operation/shared/specifiable.rb +11 -29
- data/lib/mongo/operation/shared/validatable.rb +87 -0
- data/lib/mongo/operation/shared/write.rb +1 -1
- data/lib/mongo/operation/update/command.rb +6 -3
- data/lib/mongo/operation/update/legacy.rb +19 -11
- data/lib/mongo/operation/update/op_msg.rb +7 -4
- data/lib/mongo/operation/write_command/command.rb +51 -0
- data/lib/mongo/operation/write_command/op_msg.rb +43 -0
- data/lib/mongo/operation/write_command.rb +32 -0
- data/lib/mongo/operation.rb +10 -0
- data/lib/mongo/protocol/query.rb +35 -18
- data/lib/mongo/server/connection.rb +25 -3
- data/lib/mongo/server/connection_base.rb +12 -1
- data/lib/mongo/server/connection_common.rb +38 -1
- data/lib/mongo/server/connection_pool/generation_manager.rb +71 -0
- data/lib/mongo/server/connection_pool.rb +100 -27
- data/lib/mongo/server/description/features.rb +17 -16
- data/lib/mongo/server/description/load_balancer.rb +33 -0
- data/lib/mongo/server/description.rb +85 -6
- data/lib/mongo/server/monitor/connection.rb +5 -6
- data/lib/mongo/server/monitor.rb +2 -1
- data/lib/mongo/server/pending_connection.rb +47 -31
- data/lib/mongo/server.rb +73 -26
- data/lib/mongo/server_selector/base.rb +5 -1
- data/lib/mongo/session/session_pool.rb +11 -0
- data/lib/mongo/session.rb +21 -1
- data/lib/mongo/socket/ocsp_verifier.rb +6 -37
- data/lib/mongo/uri/options_mapper.rb +1 -0
- data/lib/mongo/uri/srv_protocol.rb +6 -8
- data/lib/mongo/uri.rb +18 -0
- data/lib/mongo/utils.rb +0 -7
- data/lib/mongo/version.rb +1 -1
- data/mongo.gemspec +1 -1
- data/spec/integration/auth_spec.rb +31 -1
- data/spec/integration/awaited_ismaster_spec.rb +1 -1
- data/spec/integration/bulk_write_spec.rb +1 -1
- data/spec/integration/change_stream_spec.rb +3 -3
- data/spec/integration/client_construction_spec.rb +54 -0
- data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +1 -1
- data/spec/integration/client_side_encryption/auto_encryption_command_monitoring_spec.rb +1 -1
- data/spec/integration/client_side_encryption/bson_size_limit_spec.rb +1 -1
- data/spec/integration/client_side_encryption/data_key_spec.rb +1 -1
- data/spec/integration/client_spec.rb +2 -0
- data/spec/integration/command_monitoring_spec.rb +1 -1
- data/spec/integration/command_spec.rb +1 -1
- data/spec/integration/connection_spec.rb +52 -35
- data/spec/integration/crud_spec.rb +174 -1
- data/spec/integration/cursor_pinning_spec.rb +121 -0
- data/spec/integration/cursor_reaping_spec.rb +8 -4
- data/spec/integration/fork_reconnect_spec.rb +1 -5
- data/spec/integration/get_more_spec.rb +1 -1
- data/spec/integration/heartbeat_events_spec.rb +1 -1
- data/spec/integration/map_reduce_spec.rb +77 -0
- data/spec/integration/query_cache_spec.rb +2 -2
- data/spec/integration/query_cache_transactions_spec.rb +1 -1
- data/spec/integration/read_concern_spec.rb +1 -1
- data/spec/integration/read_preference_spec.rb +1 -1
- data/spec/integration/reconnect_spec.rb +30 -12
- data/spec/integration/retryable_errors_spec.rb +1 -1
- data/spec/integration/retryable_writes/retryable_writes_36_and_older_spec.rb +1 -1
- data/spec/integration/retryable_writes/retryable_writes_40_and_newer_spec.rb +1 -1
- data/spec/integration/sdam_error_handling_spec.rb +5 -3
- data/spec/integration/sdam_events_spec.rb +35 -19
- data/spec/integration/sdam_prose_spec.rb +1 -1
- data/spec/integration/server_monitor_spec.rb +1 -0
- data/spec/integration/server_selector_spec.rb +22 -5
- data/spec/integration/server_spec.rb +2 -0
- data/spec/integration/srv_monitoring_spec.rb +1 -1
- data/spec/integration/step_down_spec.rb +1 -1
- data/spec/integration/transaction_pinning_spec.rb +120 -0
- data/spec/integration/versioned_api_examples_spec.rb +45 -0
- data/spec/integration/x509_auth_spec.rb +1 -1
- data/spec/lite_spec_helper.rb +1 -2
- data/spec/mongo/address/unix_spec.rb +1 -0
- data/spec/mongo/auth/cr_spec.rb +2 -3
- data/spec/mongo/auth/ldap_spec.rb +2 -3
- data/spec/mongo/auth/scram_spec.rb +2 -3
- data/spec/mongo/auth/user/view_spec.rb +1 -1
- data/spec/mongo/auth/x509_spec.rb +2 -3
- data/spec/mongo/bulk_write_spec.rb +3 -3
- data/spec/mongo/client_construction_spec.rb +259 -28
- data/spec/mongo/client_spec.rb +6 -4
- data/spec/mongo/cluster/cursor_reaper_spec.rb +36 -21
- data/spec/mongo/cluster/periodic_executor_spec.rb +3 -1
- data/spec/mongo/cluster_spec.rb +44 -3
- data/spec/mongo/collection/view/aggregation_spec.rb +1 -1
- data/spec/mongo/collection/view/builder/find_command_spec.rb +4 -0
- data/spec/mongo/collection/view/builder/op_query_spec.rb +4 -0
- data/spec/mongo/collection/view/map_reduce_spec.rb +1 -1
- data/spec/mongo/collection_crud_spec.rb +7 -2
- data/spec/mongo/collection_ddl_spec.rb +1 -1
- data/spec/mongo/collection_spec.rb +1 -1
- data/spec/mongo/cursor/builder/get_more_command_spec.rb +4 -0
- data/spec/mongo/cursor/builder/op_get_more_spec.rb +4 -0
- data/spec/mongo/cursor_spec.rb +15 -5
- data/spec/mongo/database_spec.rb +15 -15
- data/spec/mongo/error/operation_failure_heavy_spec.rb +1 -1
- data/spec/mongo/grid/fs_bucket_spec.rb +18 -12
- data/spec/mongo/grid/stream/write_spec.rb +3 -9
- data/spec/mongo/grid/stream_spec.rb +1 -1
- data/spec/mongo/index/view_spec.rb +2 -2
- data/spec/mongo/operation/delete/op_msg_spec.rb +1 -1
- data/spec/mongo/{collection/view → operation/find}/builder/flags_spec.rb +2 -2
- data/spec/mongo/{collection/view → operation/find}/builder/modifiers_spec.rb +2 -2
- data/spec/mongo/operation/find/legacy_spec.rb +1 -0
- data/spec/mongo/operation/insert/bulk_spec.rb +1 -1
- data/spec/mongo/operation/insert/op_msg_spec.rb +1 -1
- data/spec/mongo/operation/kill_cursors_spec.rb +4 -1
- data/spec/mongo/operation/read_preference_legacy_spec.rb +4 -0
- data/spec/mongo/operation/read_preference_op_msg_spec.rb +2 -0
- data/spec/mongo/operation/update/bulk_spec.rb +1 -1
- data/spec/mongo/operation/update/op_msg_spec.rb +1 -1
- data/spec/mongo/query_cache_spec.rb +6 -2
- data/spec/mongo/server/connection_common_spec.rb +62 -11
- data/spec/mongo/server/connection_pool_spec.rb +73 -7
- data/spec/mongo/server/connection_spec.rb +138 -43
- data/spec/mongo/server/description_spec.rb +1 -1
- data/spec/mongo/server/monitor_spec.rb +4 -3
- data/spec/mongo/session/session_pool_spec.rb +42 -10
- data/spec/mongo/session_transaction_spec.rb +15 -30
- data/spec/mongo/socket/unix_spec.rb +1 -0
- data/spec/mongo/uri_option_parsing_spec.rb +38 -5
- data/spec/runners/change_streams/test.rb +1 -1
- data/spec/runners/cmap.rb +1 -1
- data/spec/runners/connection_string.rb +7 -3
- data/spec/runners/crud/operation.rb +5 -3
- data/spec/runners/crud/requirement.rb +1 -0
- data/spec/runners/crud.rb +1 -1
- data/spec/runners/sdam.rb +2 -1
- data/spec/runners/transactions/test.rb +2 -2
- data/spec/runners/unified/assertions.rb +2 -3
- data/spec/runners/unified/event_subscriber.rb +2 -2
- data/spec/runners/unified/test.rb +3 -0
- data/spec/runners/unified.rb +1 -1
- data/spec/shared/lib/mrss/constraints.rb +11 -5
- data/spec/shared/lib/mrss/event_subscriber.rb +200 -0
- data/spec/shared/lib/mrss/server_version_registry.rb +17 -12
- data/spec/shared/share/Dockerfile.erb +2 -1
- data/spec/shared/shlib/server.sh +70 -20
- data/spec/spec_tests/change_streams_spec.rb +1 -1
- data/spec/spec_tests/cmap_spec.rb +4 -1
- data/spec/spec_tests/command_monitoring_spec.rb +2 -2
- data/spec/spec_tests/data/command_monitoring/find.yml +9 -9
- data/spec/spec_tests/data/crud/read/aggregate-collation.yml +2 -1
- data/spec/spec_tests/data/crud/read/aggregate-out.yml +1 -0
- data/spec/spec_tests/data/crud/read/count-collation.yml +2 -1
- data/spec/spec_tests/data/crud/read/distinct-collation.yml +2 -1
- data/spec/spec_tests/data/crud/read/find-collation.yml +2 -1
- data/spec/spec_tests/data/crud/write/bulkWrite-collation.yml +2 -1
- data/spec/spec_tests/data/crud/write/deleteMany-collation.yml +2 -1
- data/spec/spec_tests/data/crud/write/deleteOne-collation.yml +2 -1
- data/spec/spec_tests/data/crud/write/findOneAndDelete-collation.yml +3 -2
- data/spec/spec_tests/data/crud/write/findOneAndReplace-collation.yml +2 -1
- data/spec/spec_tests/data/crud/write/findOneAndUpdate-collation.yml +3 -2
- data/spec/spec_tests/data/crud/write/replaceOne-collation.yml +3 -2
- data/spec/spec_tests/data/crud/write/updateMany-collation.yml +2 -1
- data/spec/spec_tests/data/crud/write/updateOne-collation.yml +2 -1
- data/spec/spec_tests/data/load_balancers/event-monitoring.yml +99 -0
- data/spec/spec_tests/data/load_balancers/lb-connection-establishment.yml +36 -0
- data/spec/spec_tests/data/load_balancers/non-lb-connection-establishment.yml +56 -0
- data/spec/spec_tests/data/load_balancers/server-selection.yml +50 -0
- data/spec/spec_tests/data/retryable_reads/changeStreams-client.watch-serverErrors.yml +1 -1
- data/spec/spec_tests/data/retryable_reads/changeStreams-client.watch.yml +1 -1
- data/spec/spec_tests/data/retryable_reads/changeStreams-db.coll.watch-serverErrors.yml +1 -1
- data/spec/spec_tests/data/retryable_reads/changeStreams-db.coll.watch.yml +1 -1
- data/spec/spec_tests/data/retryable_reads/changeStreams-db.watch-serverErrors.yml +1 -1
- data/spec/spec_tests/data/retryable_reads/changeStreams-db.watch.yml +1 -1
- data/spec/spec_tests/data/retryable_reads/mapReduce.yml +3 -1
- data/spec/spec_tests/data/sdam/load-balanced/discover_load_balancer.yml +25 -0
- data/spec/spec_tests/data/sdam_integration/find-network-error.yml +2 -0
- data/spec/spec_tests/data/sdam_integration/find-shutdown-error.yml +2 -0
- data/spec/spec_tests/data/sdam_integration/hello-command-error.yml +3 -1
- data/spec/spec_tests/data/sdam_integration/hello-network-error.yml +3 -1
- data/spec/spec_tests/data/sdam_integration/hello-timeout.yml +2 -0
- data/spec/spec_tests/data/sdam_integration/insert-network-error.yml +2 -0
- data/spec/spec_tests/data/sdam_integration/insert-shutdown-error.yml +2 -0
- data/spec/spec_tests/data/sdam_monitoring/load_balancer.yml +65 -0
- data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-directConnection.yml +13 -0
- data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-replicaSet-errors.yml +6 -0
- data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-true-multiple-hosts.yml +5 -0
- data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-true-txt.yml +10 -0
- data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/direct-connection-false.yml +0 -0
- data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/direct-connection-true.yml +0 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/encoded-userinfo-and-db.yml +15 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/loadBalanced-false-txt.yml +10 -0
- data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/longer-parent-in-return.yml +0 -0
- data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/misformatted-option.yml +0 -0
- data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/no-results.yml +0 -0
- data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/not-enough-parts.yml +0 -0
- data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/one-result-default-port.yml +0 -0
- data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/one-txt-record-multiple-strings.yml +0 -0
- data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/one-txt-record.yml +0 -0
- data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch1.yml +0 -0
- data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch2.yml +0 -0
- data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch3.yml +0 -0
- data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch4.yml +0 -0
- data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch5.yml +0 -0
- data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/returned-parent-too-short.yml +0 -0
- data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/returned-parent-wrong.yml +0 -0
- data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/two-results-default-port.yml +0 -0
- data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/two-results-nonstandard-port.yml +0 -0
- data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/two-txt-records.yml +0 -0
- data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-not-allowed-option.yml +0 -0
- data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-with-overridden-ssl-option.yml +0 -0
- data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-with-overridden-uri-option.yml +0 -0
- data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-with-unallowed-option.yml +0 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/uri-with-admin-database.yml +13 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/uri-with-auth.yml +12 -0
- data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/uri-with-port.yml +0 -0
- data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/uri-with-two-hosts.yml +0 -0
- data/spec/spec_tests/data/transactions/retryable-abort-errorLabels.yml +2 -0
- data/spec/spec_tests/data/transactions/retryable-abort.yml +2 -0
- data/spec/spec_tests/data/transactions/retryable-commit-errorLabels.yml +2 -0
- data/spec/spec_tests/data/transactions/retryable-commit.yml +2 -0
- data/spec/spec_tests/data/transactions/retryable-writes.yml +2 -0
- data/spec/spec_tests/data/uri_options/connection-options.yml +60 -0
- data/spec/spec_tests/load_balancers_spec.rb +15 -0
- data/spec/spec_tests/retryable_reads_spec.rb +2 -2
- data/spec/spec_tests/retryable_writes_spec.rb +1 -1
- data/spec/spec_tests/sdam_integration_spec.rb +1 -1
- data/spec/spec_tests/sdam_monitoring_spec.rb +10 -5
- data/spec/spec_tests/sdam_spec.rb +1 -1
- data/spec/spec_tests/seed_list_discovery_spec.rb +118 -0
- data/spec/spec_tests/uri_options_spec.rb +4 -4
- data/spec/stress/fork_reconnect_stress_spec.rb +1 -5
- data/spec/support/certificates/atlas-ocsp-ca.crt +82 -90
- data/spec/support/certificates/atlas-ocsp.crt +127 -122
- data/spec/support/common_shortcuts.rb +2 -3
- data/spec/support/matchers.rb +13 -0
- data/spec/support/shared/auth_context.rb +16 -0
- data/spec/support/shared/session.rb +2 -2
- data/spec/support/spec_config.rb +9 -10
- data/spec/support/using_hash.rb +31 -0
- data/spec/support/utils.rb +1 -1
- data.tar.gz.sig +0 -0
- metadata +120 -76
- metadata.gz.sig +0 -0
- data/lib/mongo/collection/view/builder/find_command.rb +0 -173
- data/lib/mongo/collection/view/builder/op_query.rb +0 -94
- data/lib/mongo/cursor/builder/get_more_command.rb +0 -80
- data/lib/mongo/cursor/builder/kill_cursors_command.rb +0 -111
- data/lib/mongo/cursor/builder/op_get_more.rb +0 -64
- data/lib/mongo/cursor/builder/op_kill_cursors.rb +0 -106
- data/lib/mongo/server/context.rb +0 -72
- data/spec/mongo/cursor/builder/op_kill_cursors_spec.rb +0 -66
- data/spec/runners/unified/using_hash.rb +0 -34
- data/spec/spec_tests/dns_seedlist_discovery_spec.rb +0 -79
- data/spec/support/event_subscriber.rb +0 -221
@@ -16,64 +16,70 @@
|
|
16
16
|
# limitations under the License.
|
17
17
|
|
18
18
|
module Mongo
|
19
|
-
|
20
|
-
class
|
19
|
+
module Operation
|
20
|
+
class Find
|
21
21
|
module Builder
|
22
22
|
|
23
|
-
# Provides behavior for mapping
|
23
|
+
# Provides behavior for mapping Ruby options to legacy OP_QUERY
|
24
|
+
# find modifiers.
|
24
25
|
#
|
25
|
-
#
|
26
|
+
# This module is used in two ways:
|
27
|
+
# 1. When Collection#find is invoked with the legacy OP_QUERY
|
28
|
+
# syntax (:$query argument etc.), this module is used to map
|
29
|
+
# the legacy parameters into the Ruby options that normally
|
30
|
+
# are used by applications.
|
31
|
+
# 2. When sending a find operation using the OP_QUERY protocol,
|
32
|
+
# this module is used to map the Ruby find options to the
|
33
|
+
# modifiers in the wire protocol message.
|
34
|
+
#
|
35
|
+
# @api private
|
26
36
|
module Modifiers
|
27
|
-
extend self
|
28
37
|
|
29
|
-
# Mappings from
|
30
|
-
#
|
31
|
-
# @since 2.2.0
|
38
|
+
# Mappings from Ruby options to OP_QUERY modifiers.
|
32
39
|
DRIVER_MAPPINGS = BSON::Document.new(
|
33
|
-
sort: '$orderby',
|
34
|
-
hint: '$hint',
|
35
40
|
comment: '$comment',
|
36
|
-
|
41
|
+
explain: '$explain',
|
42
|
+
hint: '$hint',
|
37
43
|
max_scan: '$maxScan',
|
44
|
+
max_time_ms: '$maxTimeMS',
|
38
45
|
max_value: '$max',
|
39
46
|
min_value: '$min',
|
40
|
-
max_time_ms: '$maxTimeMS',
|
41
47
|
return_key: '$returnKey',
|
42
48
|
show_disk_loc: '$showDiskLoc',
|
43
|
-
|
49
|
+
snapshot: '$snapshot',
|
50
|
+
sort: '$orderby',
|
44
51
|
).freeze
|
45
52
|
|
46
|
-
# Mappings from
|
47
|
-
#
|
48
|
-
# @since 2.2.0
|
53
|
+
# Mappings from OP_QUERY modifiers to Ruby options.
|
49
54
|
SERVER_MAPPINGS = BSON::Document.new(DRIVER_MAPPINGS.invert).freeze
|
50
55
|
|
51
|
-
# Transform the provided
|
56
|
+
# Transform the provided OP_QUERY modifiers to Ruby options.
|
52
57
|
#
|
53
58
|
# @example Transform to driver options.
|
54
59
|
# Modifiers.map_driver_options(modifiers)
|
55
60
|
#
|
56
61
|
# @param [ Hash ] modifiers The modifiers.
|
57
62
|
#
|
58
|
-
# @return [ BSON::Document ] The
|
59
|
-
|
60
|
-
# @since 2.2.0
|
61
|
-
def self.map_driver_options(modifiers)
|
63
|
+
# @return [ BSON::Document ] The Ruby options.
|
64
|
+
module_function def map_driver_options(modifiers)
|
62
65
|
Options::Mapper.transform_documents(modifiers, SERVER_MAPPINGS)
|
63
66
|
end
|
64
67
|
|
65
|
-
# Transform the provided options into a document of
|
68
|
+
# Transform the provided Ruby options into a document of OP_QUERY
|
66
69
|
# modifiers.
|
67
70
|
#
|
71
|
+
# Accepts both string and symbol keys.
|
72
|
+
#
|
73
|
+
# The input mapping may contain additional keys that do not map to
|
74
|
+
# OP_QUERY modifiers, in which case the extra keys are ignored.
|
75
|
+
#
|
68
76
|
# @example Map the server modifiers.
|
69
77
|
# Modifiers.map_server_modifiers(options)
|
70
78
|
#
|
71
79
|
# @param [ Hash, BSON::Document ] options The options.
|
72
80
|
#
|
73
81
|
# @return [ BSON::Document ] The modifiers.
|
74
|
-
|
75
|
-
# @since 2.2.0
|
76
|
-
def self.map_server_modifiers(options)
|
82
|
+
module_function def map_server_modifiers(options)
|
77
83
|
Options::Mapper.transform_documents(options, DRIVER_MAPPINGS)
|
78
84
|
end
|
79
85
|
end
|
@@ -15,7 +15,7 @@
|
|
15
15
|
# See the License for the specific language governing permissions and
|
16
16
|
# limitations under the License.
|
17
17
|
|
18
|
-
require 'mongo/
|
19
|
-
require 'mongo/
|
20
|
-
require 'mongo/
|
21
|
-
require 'mongo/
|
18
|
+
require 'mongo/operation/find/builder/command'
|
19
|
+
require 'mongo/operation/find/builder/flags'
|
20
|
+
require 'mongo/operation/find/builder/legacy'
|
21
|
+
require 'mongo/operation/find/builder/modifiers'
|
@@ -33,6 +33,15 @@ module Mongo
|
|
33
33
|
|
34
34
|
private
|
35
35
|
|
36
|
+
def selector(connection)
|
37
|
+
# The mappings are BSON::Documents and as such store keys as
|
38
|
+
# strings, the spec here has symbol keys
|
39
|
+
spec = BSON::Document.new(self.spec)
|
40
|
+
{
|
41
|
+
find: coll_name,
|
42
|
+
}.update(Find::Builder::Command.selector(spec, connection))
|
43
|
+
end
|
44
|
+
|
36
45
|
def message(connection)
|
37
46
|
Protocol::Query.new(db_name, Database::COMMAND, command(connection), options(connection))
|
38
47
|
end
|
@@ -35,7 +35,16 @@ module Mongo
|
|
35
35
|
private
|
36
36
|
|
37
37
|
def message(connection)
|
38
|
-
|
38
|
+
selector = Find::Builder::Legacy.selector(spec, connection)
|
39
|
+
options = options(connection).update(
|
40
|
+
Find::Builder::Legacy.query_options(spec, connection),
|
41
|
+
)
|
42
|
+
Protocol::Query.new(
|
43
|
+
db_name,
|
44
|
+
coll_name,
|
45
|
+
selector,
|
46
|
+
options,
|
47
|
+
)
|
39
48
|
end
|
40
49
|
end
|
41
50
|
end
|
@@ -28,6 +28,18 @@ module Mongo
|
|
28
28
|
include CausalConsistencySupported
|
29
29
|
include ExecutableTransactionLabel
|
30
30
|
include PolymorphicResult
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def selector(connection)
|
35
|
+
# The mappings are BSON::Documents and as such store keys as
|
36
|
+
# strings, the spec here has symbol keys.
|
37
|
+
spec = BSON::Document.new(self.spec)
|
38
|
+
{
|
39
|
+
find: coll_name,
|
40
|
+
Protocol::Msg::DATABASE_IDENTIFIER => db_name,
|
41
|
+
}.update(Find::Builder::Command.selector(spec, connection))
|
42
|
+
end
|
31
43
|
end
|
32
44
|
end
|
33
45
|
end
|
data/lib/mongo/operation/find.rb
CHANGED
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# encoding: utf-8
|
3
|
+
|
4
|
+
# Copyright (C) 2021 MongoDB Inc.
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
|
18
|
+
module Mongo
|
19
|
+
module Operation
|
20
|
+
class GetMore
|
21
|
+
|
22
|
+
# @api private
|
23
|
+
module CommandBuilder
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def selector(connection)
|
28
|
+
{
|
29
|
+
getMore: BSON::Int64.new(spec.fetch(:cursor_id)),
|
30
|
+
collection: spec.fetch(:coll_name),
|
31
|
+
batchSize: spec[:batch_size],
|
32
|
+
maxTimeMS: spec[:max_time_ms],
|
33
|
+
}.compact
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -15,6 +15,7 @@
|
|
15
15
|
# See the License for the specific language governing permissions and
|
16
16
|
# limitations under the License.
|
17
17
|
|
18
|
+
require 'mongo/operation/get_more/command_builder'
|
18
19
|
require 'mongo/operation/get_more/command'
|
19
20
|
require 'mongo/operation/get_more/op_msg'
|
20
21
|
require 'mongo/operation/get_more/legacy'
|
@@ -28,9 +28,17 @@ module Mongo
|
|
28
28
|
include Specifiable
|
29
29
|
include Executable
|
30
30
|
include Limited
|
31
|
+
include CommandBuilder
|
31
32
|
|
32
33
|
private
|
33
34
|
|
35
|
+
def selector(connection)
|
36
|
+
{
|
37
|
+
killCursors: coll_name,
|
38
|
+
cursors: int64_cursor_ids,
|
39
|
+
}
|
40
|
+
end
|
41
|
+
|
34
42
|
def message(connection)
|
35
43
|
Protocol::Query.new(db_name, Database::COMMAND, selector(connection), options(connection))
|
36
44
|
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# encoding: utf-8
|
3
|
+
|
4
|
+
# Copyright (C) 2021 MongoDB Inc.
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
|
18
|
+
module Mongo
|
19
|
+
module Operation
|
20
|
+
class KillCursors
|
21
|
+
|
22
|
+
# @api private
|
23
|
+
module CommandBuilder
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def int64_cursor_ids
|
28
|
+
spec.fetch(:cursor_ids).map do |id|
|
29
|
+
BSON::Int64.new(id)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -27,11 +27,12 @@ module Mongo
|
|
27
27
|
class Legacy
|
28
28
|
include Specifiable
|
29
29
|
include Executable
|
30
|
+
include CommandBuilder
|
30
31
|
|
31
32
|
private
|
32
33
|
|
33
34
|
def message(connection)
|
34
|
-
Protocol::KillCursors.new(coll_name, db_name,
|
35
|
+
Protocol::KillCursors.new(coll_name, db_name, int64_cursor_ids)
|
35
36
|
end
|
36
37
|
end
|
37
38
|
end
|
@@ -26,6 +26,16 @@ module Mongo
|
|
26
26
|
# @since 2.5.2
|
27
27
|
class OpMsg < OpMsgBase
|
28
28
|
include ExecutableTransactionLabel
|
29
|
+
include CommandBuilder
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def selector(connection)
|
34
|
+
{
|
35
|
+
killCursors: coll_name,
|
36
|
+
cursors: int64_cursor_ids,
|
37
|
+
}
|
38
|
+
end
|
29
39
|
end
|
30
40
|
end
|
31
41
|
end
|
@@ -15,6 +15,7 @@
|
|
15
15
|
# See the License for the specific language governing permissions and
|
16
16
|
# limitations under the License.
|
17
17
|
|
18
|
+
require 'mongo/operation/kill_cursors/command_builder'
|
18
19
|
require 'mongo/operation/kill_cursors/command'
|
19
20
|
require 'mongo/operation/kill_cursors/op_msg'
|
20
21
|
require 'mongo/operation/kill_cursors/legacy'
|
@@ -34,6 +34,14 @@ module Mongo
|
|
34
34
|
|
35
35
|
private
|
36
36
|
|
37
|
+
def selector(connection)
|
38
|
+
super.tap do |selector|
|
39
|
+
if selector[:collation] && !connection.features.collation_enabled?
|
40
|
+
raise Error::UnsupportedCollation
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
37
45
|
def message(connection)
|
38
46
|
Protocol::Query.new(db_name, Database::COMMAND, command(connection), options(connection))
|
39
47
|
end
|
@@ -31,6 +31,19 @@ module Mongo
|
|
31
31
|
add_error_labels(connection, context) do
|
32
32
|
add_server_diagnostics(connection) do
|
33
33
|
get_result(connection, context, options).tap do |result|
|
34
|
+
if session
|
35
|
+
if session.in_transaction? &&
|
36
|
+
connection.description.load_balancer?
|
37
|
+
then
|
38
|
+
if session.pinned_service_id
|
39
|
+
unless session.pinned_service_id == connection.service_id
|
40
|
+
raise Error::InternalDriverError, "Expected operation to use service #{session.pinned_session_id} but it used #{connection.service_id}"
|
41
|
+
end
|
42
|
+
else
|
43
|
+
session.pin_to_service(connection.service_id)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
34
47
|
process_result(result, connection)
|
35
48
|
end
|
36
49
|
end
|
@@ -93,7 +106,7 @@ module Mongo
|
|
93
106
|
|
94
107
|
def process_result_for_sdam(result, connection)
|
95
108
|
if (result.not_master? || result.node_recovering?) &&
|
96
|
-
connection.generation >= connection.server.pool.generation
|
109
|
+
connection.generation >= connection.server.pool.generation(service_id: connection.service_id)
|
97
110
|
then
|
98
111
|
if result.node_shutting_down?
|
99
112
|
keep_pool = false
|
@@ -105,6 +118,7 @@ module Mongo
|
|
105
118
|
connection.server.unknown!(
|
106
119
|
keep_connection_pool: keep_pool,
|
107
120
|
generation: connection.generation,
|
121
|
+
service_id: connection.service_id,
|
108
122
|
topology_version: result.topology_version,
|
109
123
|
)
|
110
124
|
|
@@ -32,7 +32,7 @@ module Mongo
|
|
32
32
|
#
|
33
33
|
# @return [ Mongo::Operation::Result ] The operation result.
|
34
34
|
def execute(server, context:, options: {})
|
35
|
-
server.with_connection do |connection|
|
35
|
+
server.with_connection(service_id: context.service_id) do |connection|
|
36
36
|
operation = final_operation(connection)
|
37
37
|
operation.execute(connection, context: context, options: options)
|
38
38
|
end
|
@@ -96,7 +96,9 @@ module Mongo
|
|
96
96
|
#
|
97
97
|
# @return [ Hash ] New command document to send to the server.
|
98
98
|
def add_read_preference_legacy(sel, connection)
|
99
|
-
if read &&
|
99
|
+
if read && (
|
100
|
+
connection.description.mongos? || connection.description.load_balancer?
|
101
|
+
) && read_pref = read.to_mongos
|
100
102
|
# If the read preference contains only mode and mode is secondary
|
101
103
|
# preferred and we are sending to a pre-OP_MSG server, this read
|
102
104
|
# preference is indicated by the :secondary_ok wire protocol flag
|
@@ -133,7 +133,7 @@ module Mongo
|
|
133
133
|
end
|
134
134
|
end
|
135
135
|
|
136
|
-
sel = selector(connection)
|
136
|
+
sel = BSON::Document.new(selector(connection))
|
137
137
|
add_write_concern!(sel)
|
138
138
|
sel[Protocol::Msg::DATABASE_IDENTIFIER] = db_name
|
139
139
|
|
@@ -169,8 +169,11 @@ module Mongo
|
|
169
169
|
Lint.assert_type(connection, Server::Connection)
|
170
170
|
|
171
171
|
# https://github.com/mongodb/specifications/blob/master/source/server-selection/server-selection.rst#topology-type-single
|
172
|
-
if connection.description.standalone?
|
172
|
+
read_doc = if connection.description.standalone?
|
173
173
|
# Read preference is never sent to standalones.
|
174
|
+
nil
|
175
|
+
elsif connection.server.load_balancer?
|
176
|
+
read&.to_mongos
|
174
177
|
elsif connection.description.mongos?
|
175
178
|
# When server is a mongos:
|
176
179
|
# - $readPreference is never sent when mode is 'primary'
|
@@ -178,12 +181,7 @@ module Mongo
|
|
178
181
|
# When mode is 'secondaryPreferred' $readPreference is currently
|
179
182
|
# required to only be sent when a non-mode field (i.e. tag_sets)
|
180
183
|
# is present, but this causes wrong behavior (DRIVERS-1642).
|
181
|
-
|
182
|
-
doc = read.to_mongos
|
183
|
-
if doc
|
184
|
-
sel['$readPreference'] = doc
|
185
|
-
end
|
186
|
-
end
|
184
|
+
read&.to_mongos
|
187
185
|
elsif connection.server.cluster.single?
|
188
186
|
# In Single topology:
|
189
187
|
# - If no read preference is specified by the application, the driver
|
@@ -198,13 +196,15 @@ module Mongo
|
|
198
196
|
if [nil, 'primary'].include?(read_doc['mode'])
|
199
197
|
read_doc['mode'] = 'primaryPreferred'
|
200
198
|
end
|
201
|
-
|
199
|
+
read_doc
|
202
200
|
else
|
203
201
|
# In replica sets, read preference is passed to the server if one
|
204
202
|
# is specified by the application, and there is no default.
|
205
|
-
|
206
|
-
|
207
|
-
|
203
|
+
read&.to_doc
|
204
|
+
end
|
205
|
+
|
206
|
+
if read_doc
|
207
|
+
sel['$readPreference'] = read_doc
|
208
208
|
end
|
209
209
|
end
|
210
210
|
|
@@ -60,11 +60,6 @@ module Mongo
|
|
60
60
|
# @since 2.0.0
|
61
61
|
CURSOR_ID = :cursor_id.freeze
|
62
62
|
|
63
|
-
# The field for cursor ids.
|
64
|
-
#
|
65
|
-
# @since 2.0.0
|
66
|
-
CURSOR_IDS = :cursor_ids.freeze
|
67
|
-
|
68
63
|
# The field for an index.
|
69
64
|
#
|
70
65
|
# @since 2.0.0
|
@@ -238,7 +233,7 @@ module Mongo
|
|
238
233
|
#
|
239
234
|
# @since 2.0.0
|
240
235
|
def coll_name
|
241
|
-
spec
|
236
|
+
spec.fetch(COLL_NAME)
|
242
237
|
end
|
243
238
|
|
244
239
|
# The id of the cursor created on the server.
|
@@ -253,18 +248,6 @@ module Mongo
|
|
253
248
|
spec[CURSOR_ID]
|
254
249
|
end
|
255
250
|
|
256
|
-
# The ids of the cursors to kill from the spec.
|
257
|
-
#
|
258
|
-
# @example Get the cursor ids from the spec.
|
259
|
-
# specifiable.cursor_ids
|
260
|
-
#
|
261
|
-
# @return [ Array<Integer> ] The cursor ids.
|
262
|
-
#
|
263
|
-
# @since 2.0.0
|
264
|
-
def cursor_ids
|
265
|
-
spec[CURSOR_IDS]
|
266
|
-
end
|
267
|
-
|
268
251
|
# Get the index from the specification.
|
269
252
|
#
|
270
253
|
# @example Get the index specification.
|
@@ -536,17 +519,6 @@ module Mongo
|
|
536
519
|
@spec[:txn_num]
|
537
520
|
end
|
538
521
|
|
539
|
-
# For createIndexes operations, the number of votes that a primary must
|
540
|
-
# wait for before commiting an index. Potential values are:
|
541
|
-
# - an integer from 0 to the number of members of the replica set
|
542
|
-
# - "majority" indicating that a majority of data bearing nodes must vote
|
543
|
-
# - "votingMembers" which means that all voting data bearing nodes must vote
|
544
|
-
#
|
545
|
-
# @return [ nil | Integer | String ] The commitQuorum value of the operation.
|
546
|
-
def commit_quorum
|
547
|
-
@spec[:commit_quorum]
|
548
|
-
end
|
549
|
-
|
550
522
|
# The command.
|
551
523
|
#
|
552
524
|
# @return [ Hash ] The command.
|
@@ -580,6 +552,16 @@ module Mongo
|
|
580
552
|
def acknowledged_write?
|
581
553
|
write_concern.nil? || write_concern.acknowledged?
|
582
554
|
end
|
555
|
+
|
556
|
+
def apply_collation(selector, connection, collation)
|
557
|
+
if collation
|
558
|
+
unless connection.features.collation_enabled?
|
559
|
+
raise Error::UnsupportedCollation
|
560
|
+
end
|
561
|
+
selector = selector.merge(collation: collation)
|
562
|
+
end
|
563
|
+
selector
|
564
|
+
end
|
583
565
|
end
|
584
566
|
end
|
585
567
|
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# encoding: utf-8
|
3
|
+
|
4
|
+
# Copyright (C) 2021 MongoDB Inc.
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
|
18
|
+
module Mongo
|
19
|
+
module Operation
|
20
|
+
|
21
|
+
# @api private
|
22
|
+
module Validatable
|
23
|
+
|
24
|
+
def validate_find_options(connection, selector)
|
25
|
+
if selector.key?(:hint) &&
|
26
|
+
!connection.features.find_and_modify_option_validation_enabled?
|
27
|
+
then
|
28
|
+
raise Error::UnsupportedOption.hint_error
|
29
|
+
end
|
30
|
+
|
31
|
+
if selector.key?(:arrayFilters) &&
|
32
|
+
!connection.features.array_filters_enabled?
|
33
|
+
then
|
34
|
+
raise Error::UnsupportedArrayFilters
|
35
|
+
end
|
36
|
+
|
37
|
+
if selector.key?(:collation) &&
|
38
|
+
!connection.features.collation_enabled?
|
39
|
+
then
|
40
|
+
raise Error::UnsupportedCollation
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
# selector_or_item here is either:
|
45
|
+
# - The selector as used in a findAndModify command, or
|
46
|
+
# - One of the array elements in the updates array in an update command.
|
47
|
+
def validate_hint_on_update(connection, selector_or_item)
|
48
|
+
if selector_or_item.key?(:hint) &&
|
49
|
+
!connection.features.update_delete_option_validation_enabled?
|
50
|
+
then
|
51
|
+
raise Error::UnsupportedOption.hint_error
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
# selector_or_item here is either:
|
56
|
+
# - The selector as used in a findAndModify command, or
|
57
|
+
# - One of the array elements in the updates array in an update command.
|
58
|
+
def validate_array_filters(connection, selector_or_item)
|
59
|
+
if selector_or_item.key?(:arrayFilters) &&
|
60
|
+
!connection.features.array_filters_enabled?
|
61
|
+
then
|
62
|
+
raise Error::UnsupportedArrayFilters
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
# selector_or_item here is either:
|
67
|
+
# - The selector as used in a findAndModify command, or
|
68
|
+
# - One of the array elements in the updates array in an update command.
|
69
|
+
def validate_collation(connection, selector_or_item)
|
70
|
+
if selector_or_item.key?(:collation) &&
|
71
|
+
!connection.features.collation_enabled?
|
72
|
+
then
|
73
|
+
raise Error::UnsupportedCollation
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def validate_updates(connection, updates)
|
78
|
+
updates.each do |update|
|
79
|
+
validate_array_filters(connection, update)
|
80
|
+
validate_collation(connection, update)
|
81
|
+
validate_hint_on_update(connection, update)
|
82
|
+
end
|
83
|
+
updates
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -35,7 +35,7 @@ module Mongo
|
|
35
35
|
#
|
36
36
|
# @since 2.5.2
|
37
37
|
def execute(server, context:)
|
38
|
-
server.with_connection do |connection|
|
38
|
+
server.with_connection(service_id: context.service_id) do |connection|
|
39
39
|
validate!(connection)
|
40
40
|
op = if connection.features.op_msg_enabled?
|
41
41
|
self.class::OpMsg.new(spec)
|