mongo 2.15.0 → 2.17.0
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/auth/aws/request.rb +0 -1
- data/lib/mongo/bulk_write.rb +2 -2
- data/lib/mongo/client.rb +49 -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 +63 -23
- data/lib/mongo/collection/view/builder/aggregation.rb +16 -17
- 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/change_stream.rb +7 -3
- data/lib/mongo/collection/view/iterable.rb +60 -27
- data/lib/mongo/collection/view/map_reduce.rb +41 -15
- data/lib/mongo/collection/view/readable.rb +84 -52
- data/lib/mongo/collection/view/writable.rb +201 -175
- data/lib/mongo/collection/view.rb +15 -21
- data/lib/mongo/collection.rb +34 -14
- data/lib/mongo/cursor/kill_spec.rb +38 -0
- data/lib/mongo/cursor.rb +72 -31
- data/lib/mongo/database/view.rb +5 -3
- data/lib/mongo/database.rb +6 -6
- 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/snapshot_session_invalid_server_version.rb +31 -0
- data/lib/mongo/error/snapshot_session_transaction_prohibited.rb +30 -0
- data/lib/mongo/error.rb +5 -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 +9 -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 +111 -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/result.rb +6 -0
- data/lib/mongo/operation/shared/executable.rb +19 -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 +28 -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 +8 -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 +20 -17
- 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/push_monitor.rb +10 -1
- data/lib/mongo/server.rb +73 -26
- data/lib/mongo/server_selector/base.rb +31 -5
- data/lib/mongo/session/session_pool.rb +11 -0
- data/lib/mongo/session.rb +40 -1
- data/lib/mongo/socket/ocsp_cache.rb +2 -3
- data/lib/mongo/socket/ocsp_verifier.rb +6 -37
- data/lib/mongo/socket.rb +1 -5
- 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 -13
- 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 +47 -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 +17 -13
- 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 +72 -96
- 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/change_stream_spec.rb +1 -1
- data/spec/mongo/collection/view/map_reduce_spec.rb +15 -2
- 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 +26 -1
- 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/connection_spec.rb +22 -0
- data/spec/mongo/server/monitor_spec.rb +4 -3
- data/spec/mongo/server/push_monitor_spec.rb +101 -0
- data/spec/mongo/server_selector_spec.rb +136 -15
- data/spec/mongo/session/session_pool_spec.rb +42 -10
- data/spec/mongo/session_transaction_spec.rb +15 -30
- data/spec/mongo/socket/ssl_spec.rb +26 -58
- data/spec/mongo/socket/unix_spec.rb +1 -0
- data/spec/mongo/uri_option_parsing_spec.rb +38 -5
- data/spec/mongo/utils_spec.rb +0 -14
- 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/verifier.rb +1 -2
- 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 +5 -4
- data/spec/runners/unified/crud_operations.rb +77 -23
- data/spec/runners/unified/ddl_operations.rb +29 -1
- data/spec/runners/unified/entity_map.rb +3 -3
- data/spec/runners/unified/event_subscriber.rb +2 -2
- data/spec/runners/unified/support_operations.rb +16 -3
- data/spec/runners/unified/test.rb +18 -3
- data/spec/runners/unified.rb +1 -1
- data/spec/shared/lib/mrss/cluster_config.rb +6 -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 +5 -4
- 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/crud_unified/aggregate-let.yml +138 -0
- data/spec/spec_tests/data/crud_unified/aggregate-write-readPreference.yml +155 -0
- data/spec/spec_tests/data/crud_unified/db-aggregate-write-readPreference.yml +151 -0
- data/spec/spec_tests/data/crud_unified/deleteMany-let.yml +91 -0
- data/spec/spec_tests/data/crud_unified/deleteOne-let.yml +89 -0
- data/spec/spec_tests/data/crud_unified/find-let.yml +71 -0
- data/spec/spec_tests/data/crud_unified/findOneAndDelete-let.yml +88 -0
- data/spec/spec_tests/data/crud_unified/findOneAndReplace-let.yml +94 -0
- data/spec/spec_tests/data/crud_unified/findOneAndUpdate-let.yml +96 -0
- data/spec/spec_tests/data/crud_unified/updateMany-let.yml +103 -0
- data/spec/spec_tests/data/crud_unified/updateOne-let.yml +98 -0
- 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/max_staleness/ReplicaSetNoPrimary/DefaultNoMaxStaleness.yml +2 -2
- data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/LastUpdateTime.yml +3 -3
- data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/Nearest.yml +3 -3
- data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/Nearest2.yml +3 -3
- data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/PrimaryPreferred.yml +2 -2
- data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/PrimaryPreferred_tags.yml +2 -2
- data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/Secondary.yml +4 -4
- data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/SecondaryPreferred.yml +2 -2
- data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/SecondaryPreferred_tags.yml +4 -4
- data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/ZeroMaxStaleness.yml +2 -2
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/DefaultNoMaxStaleness.yml +2 -2
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/LastUpdateTime.yml +3 -3
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/LongHeartbeat.yml +2 -2
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/LongHeartbeat2.yml +2 -2
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/MaxStalenessTooSmall.yml +2 -2
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/MaxStalenessWithModePrimary.yml +2 -2
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Nearest.yml +3 -3
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Nearest2.yml +3 -3
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Nearest_tags.yml +2 -2
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/PrimaryPreferred.yml +2 -2
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred.yml +2 -2
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred_tags.yml +5 -5
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred_tags2.yml +3 -3
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Secondary_tags.yml +5 -5
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Secondary_tags2.yml +3 -3
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/ZeroMaxStaleness.yml +2 -2
- data/spec/spec_tests/data/max_staleness/Sharded/SmallMaxStaleness.yml +2 -2
- data/spec/spec_tests/data/max_staleness/Single/SmallMaxStaleness.yml +1 -1
- data/spec/spec_tests/data/max_staleness/Unknown/SmallMaxStaleness.yml +1 -1
- 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/sessions_unified/snapshot-sessions-not-supported-client-error.yml +69 -0
- data/spec/spec_tests/data/sessions_unified/snapshot-sessions-not-supported-server-error.yml +102 -0
- data/spec/spec_tests/data/sessions_unified/snapshot-sessions-unsupported-ops.yml +258 -0
- data/spec/spec_tests/data/sessions_unified/snapshot-sessions.yml +482 -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/sessions_unified_spec.rb +13 -0
- data/spec/spec_tests/uri_options_spec.rb +4 -4
- data/spec/stress/fork_reconnect_stress_spec.rb +1 -5
- data/spec/stress/push_monitor_close_spec.rb +44 -0
- 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 +10 -11
- data/spec/support/using_hash.rb +31 -0
- data/spec/support/utils.rb +1 -1
- data.tar.gz.sig +3 -4
- metadata +1111 -1029
- metadata.gz.sig +2 -3
- 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
data/lib/mongo/id.rb
CHANGED
@@ -16,9 +16,10 @@
|
|
16
16
|
# limitations under the License.
|
17
17
|
|
18
18
|
module Mongo
|
19
|
-
# This module abstracts the functionality for generating sequential
|
20
|
-
# instances of the class. It defines the method
|
21
|
-
#
|
19
|
+
# This module abstracts the functionality for generating sequential
|
20
|
+
# unique integer IDs for instances of the class. It defines the method
|
21
|
+
# #next_id on the class that includes it. The implementation ensures that
|
22
|
+
# the IDs will be unique even when called from multiple threads.
|
22
23
|
#
|
23
24
|
# @example Include the Id module.
|
24
25
|
# class Foo
|
@@ -29,8 +30,9 @@ module Mongo
|
|
29
30
|
# foo.next_id # => 1
|
30
31
|
# foo.next_id # => 2
|
31
32
|
#
|
32
|
-
# Classes which include Id should _not_ access `@@id` or `@@id_lock`
|
33
|
-
# should call `#next_id` in `#initialize` and save
|
33
|
+
# Classes which include Id should _not_ access `@@id` or `@@id_lock`
|
34
|
+
# directly; instead, they should call `#next_id` in `#initialize` and save
|
35
|
+
# the result in the instance being created.
|
34
36
|
#
|
35
37
|
# @example Save the ID in the instance of the including class.
|
36
38
|
# class Bar
|
data/lib/mongo/index/view.rb
CHANGED
@@ -129,7 +129,10 @@ module Mongo
|
|
129
129
|
# @option options [ String | Integer ] :commit_quorum Specify how many
|
130
130
|
# data-bearing members of a replica set, including the primary, must
|
131
131
|
# complete the index builds successfully before the primary marks
|
132
|
-
# the indexes as ready.
|
132
|
+
# the indexes as ready. Potential values are:
|
133
|
+
# - an integer from 0 to the number of members of the replica set
|
134
|
+
# - "majority" indicating that a majority of data bearing nodes must vote
|
135
|
+
# - "votingMembers" which means that all voting data bearing nodes must vote
|
133
136
|
# @option options [ Session ] :session The session to use for the operation.
|
134
137
|
#
|
135
138
|
# @note Note that the options listed may be subset of those available.
|
@@ -177,7 +180,10 @@ module Mongo
|
|
177
180
|
# The following options are accepted:
|
178
181
|
# - commit_quorum: Specify how many data-bearing members of a replica set,
|
179
182
|
# including the primary, must complete the index builds successfully
|
180
|
-
# before the primary marks the indexes as ready.
|
183
|
+
# before the primary marks the indexes as ready. Potential values are:
|
184
|
+
# - an integer from 0 to the number of members of the replica set
|
185
|
+
# - "majority" indicating that a majority of data bearing nodes must vote
|
186
|
+
# - "votingMembers" which means that all voting data bearing nodes must vote
|
181
187
|
# - session: The session to use.
|
182
188
|
#
|
183
189
|
# @return [ Result ] The result of the command.
|
@@ -193,17 +199,6 @@ module Mongo
|
|
193
199
|
client.send(:with_session, @options.merge(options)) do |session|
|
194
200
|
server = next_primary(nil, session)
|
195
201
|
|
196
|
-
# While server versions 3.4 and newer generally perform option
|
197
|
-
# validation, there was a bug on server versions 4.2.0 - 4.2.5 where
|
198
|
-
# the server would accept the commitQuorum option and use it internally
|
199
|
-
# (see SERVER-47193). As a result, the drivers specifications require
|
200
|
-
# drivers to perform validation and raise an error when the commitQuorum
|
201
|
-
# option is passed to servers that don't support it.
|
202
|
-
description = server.with_connection { |connection| connection.description }
|
203
|
-
if description.max_wire_version < 9 && options[:commit_quorum]
|
204
|
-
raise Error::UnsupportedOption.commit_quorum_error
|
205
|
-
end
|
206
|
-
|
207
202
|
indexes = normalize_models(models, server)
|
208
203
|
indexes.each do |index|
|
209
204
|
if index[:bucketSize] || index['bucketSize']
|
@@ -216,10 +211,9 @@ module Mongo
|
|
216
211
|
db_name: database.name,
|
217
212
|
coll_name: collection.name,
|
218
213
|
session: session,
|
219
|
-
commit_quorum: options[:commit_quorum]
|
220
|
-
|
221
|
-
|
222
|
-
spec[:write_concern] = write_concern if description.features.collation_enabled?
|
214
|
+
commit_quorum: options[:commit_quorum],
|
215
|
+
write_concern: write_concern,
|
216
|
+
}
|
223
217
|
|
224
218
|
Operation::CreateIndex.new(spec).execute(server, context: Operation::Context.new(client: client, session: session))
|
225
219
|
end
|
@@ -292,13 +286,13 @@ module Mongo
|
|
292
286
|
def drop_by_name(name)
|
293
287
|
client.send(:with_session, @options) do |session|
|
294
288
|
spec = {
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
289
|
+
db_name: database.name,
|
290
|
+
coll_name: collection.name,
|
291
|
+
index_name: name,
|
292
|
+
session: session,
|
293
|
+
write_concern: write_concern,
|
294
|
+
}
|
300
295
|
server = next_primary(nil, session)
|
301
|
-
spec[:write_concern] = write_concern if server.with_connection { |connection| connection.features }.collation_enabled?
|
302
296
|
Operation::DropIndex.new(spec).execute(server, context: Operation::Context.new(client: client, session: session))
|
303
297
|
end
|
304
298
|
end
|
@@ -329,30 +323,17 @@ module Mongo
|
|
329
323
|
end
|
330
324
|
|
331
325
|
def normalize_models(models, server)
|
332
|
-
|
333
|
-
|
326
|
+
models.map do |model|
|
327
|
+
# Transform options first which gives us a mutable hash
|
328
|
+
Options::Mapper.transform(model, OPTIONS).tap do |model|
|
329
|
+
model[:name] ||= index_name(model.fetch(:key))
|
330
|
+
end
|
334
331
|
end
|
335
332
|
end
|
336
333
|
|
337
334
|
def send_initial_query(server, session)
|
338
335
|
initial_query_op(session).execute(server, context: Operation::Context.new(client: client, session: session))
|
339
336
|
end
|
340
|
-
|
341
|
-
def with_generated_names(models, server)
|
342
|
-
models.dup.each do |model|
|
343
|
-
validate_collation!(model, server)
|
344
|
-
unless model[:name]
|
345
|
-
model[:name] = index_name(model[:key])
|
346
|
-
end
|
347
|
-
end
|
348
|
-
end
|
349
|
-
|
350
|
-
def validate_collation!(model, server)
|
351
|
-
if (model[:collation] || model[Operation::COLLATION]) &&
|
352
|
-
!server.with_connection { |connection| connection.features }.collation_enabled?
|
353
|
-
raise Error::UnsupportedCollation.new
|
354
|
-
end
|
355
|
-
end
|
356
337
|
end
|
357
338
|
end
|
358
339
|
end
|
@@ -31,15 +31,18 @@ module Mongo
|
|
31
31
|
# @since 2.9.0
|
32
32
|
attr_reader :address
|
33
33
|
|
34
|
+
# @return [ nil | Object ] The service id, if any.
|
35
|
+
attr_reader :service_id
|
36
|
+
|
34
37
|
# Create the event.
|
35
38
|
#
|
36
|
-
# @
|
37
|
-
#
|
39
|
+
# @param [ Address ] address
|
40
|
+
# @param [ Object ] service_id The service id, if any.
|
38
41
|
#
|
39
|
-
# @since 2.9.0
|
40
42
|
# @api private
|
41
|
-
def initialize(address)
|
43
|
+
def initialize(address, service_id: nil)
|
42
44
|
@address = address
|
45
|
+
@service_id = service_id
|
43
46
|
end
|
44
47
|
|
45
48
|
# Returns a concise yet useful summary of the event.
|
@@ -88,11 +88,11 @@ module Mongo
|
|
88
88
|
@address = address
|
89
89
|
@request_id = request_id
|
90
90
|
@operation_id = operation_id
|
91
|
+
@service_id = service_id
|
91
92
|
@message = message
|
92
93
|
@started_event = started_event
|
93
94
|
@failure = redacted(command_name, failure)
|
94
95
|
@duration = duration
|
95
|
-
@service_id = service_id
|
96
96
|
end
|
97
97
|
|
98
98
|
# Returns a concise yet useful summary of the event.
|
@@ -78,6 +78,7 @@ module Mongo
|
|
78
78
|
# @param [ Integer ] request_id The request id.
|
79
79
|
# @param [ Integer ] operation_id The operation id.
|
80
80
|
# @param [ BSON::Document ] command The command arguments.
|
81
|
+
# @param [ Object ] service_id The service id, if any.
|
81
82
|
#
|
82
83
|
# @since 2.1.0
|
83
84
|
# @api private
|
@@ -140,6 +141,7 @@ module Mongo
|
|
140
141
|
# @param [ Server::Address ] address The server address.
|
141
142
|
# @param [ Integer ] operation_id The operation id.
|
142
143
|
# @param [ Hash ] payload The message payload.
|
144
|
+
# @param [ Object ] service_id The service id, if any.
|
143
145
|
#
|
144
146
|
# @return [ CommandStarted ] The event.
|
145
147
|
#
|
@@ -35,7 +35,6 @@ module Mongo
|
|
35
35
|
def publish_sdam_event(topic, event)
|
36
36
|
return unless monitoring?
|
37
37
|
|
38
|
-
#log_debug("EVENT: #{event.summary}")
|
39
38
|
monitoring.succeeded(topic, event)
|
40
39
|
end
|
41
40
|
|
@@ -49,12 +48,13 @@ module Mongo
|
|
49
48
|
|
50
49
|
def command_started(address, operation_id, payload,
|
51
50
|
socket_object_id: nil, connection_id: nil, connection_generation: nil,
|
52
|
-
server_connection_id: nil
|
51
|
+
server_connection_id: nil, service_id: nil
|
53
52
|
)
|
54
53
|
event = Event::CommandStarted.generate(address, operation_id, payload,
|
55
54
|
socket_object_id: socket_object_id, connection_id: connection_id,
|
56
55
|
connection_generation: connection_generation,
|
57
56
|
server_connection_id: server_connection_id,
|
57
|
+
service_id: service_id,
|
58
58
|
)
|
59
59
|
monitoring.started(
|
60
60
|
Monitoring::COMMAND,
|
@@ -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 write_concern_supported?(connection)
|
38
46
|
connection.features.collation_enabled?
|
39
47
|
end
|
@@ -24,9 +24,18 @@ module Mongo
|
|
24
24
|
# in a single container, and provides facade methods for the contained
|
25
25
|
# objects.
|
26
26
|
#
|
27
|
+
# The context contains parameters for operations, and as such while an
|
28
|
+
# operation is being prepared nothing in the context should change.
|
29
|
+
# When the result of the operation is being processed, the data
|
30
|
+
# returned by the context may change (for example, because a transaction
|
31
|
+
# is aborted), but at that point the operation should no longer read
|
32
|
+
# anything from the context. Because context data may change during
|
33
|
+
# operation execution, context objects should not be reused for multiple
|
34
|
+
# operations.
|
35
|
+
#
|
27
36
|
# @api private
|
28
37
|
class Context
|
29
|
-
def initialize(client: nil, session: nil, options: nil)
|
38
|
+
def initialize(client: nil, session: nil, service_id: nil, options: nil)
|
30
39
|
if options
|
31
40
|
if client
|
32
41
|
raise ArgumentError, 'Client and options cannot both be specified'
|
@@ -37,8 +46,13 @@ module Mongo
|
|
37
46
|
end
|
38
47
|
end
|
39
48
|
|
49
|
+
if service_id && session&.pinned_service_id
|
50
|
+
raise ArgumentError, 'Trying to pin context to a service when the session is already pinned to a service'
|
51
|
+
end
|
52
|
+
|
40
53
|
@client = client
|
41
54
|
@session = session
|
55
|
+
@service_id = service_id
|
42
56
|
@options = options
|
43
57
|
end
|
44
58
|
|
@@ -46,6 +60,10 @@ module Mongo
|
|
46
60
|
attr_reader :session
|
47
61
|
attr_reader :options
|
48
62
|
|
63
|
+
def service_id
|
64
|
+
@service_id || session&.pinned_service_id
|
65
|
+
end
|
66
|
+
|
49
67
|
def in_transaction?
|
50
68
|
session&.in_transaction? || false
|
51
69
|
end
|
@@ -32,6 +32,12 @@ module Mongo
|
|
32
32
|
|
33
33
|
private
|
34
34
|
|
35
|
+
def selector(connection)
|
36
|
+
selector = spec[:selector]
|
37
|
+
selector = apply_collation(selector, connection, spec[:collation])
|
38
|
+
selector
|
39
|
+
end
|
40
|
+
|
35
41
|
def message(connection)
|
36
42
|
Protocol::Query.new(db_name, Database::COMMAND, command(connection), options(connection))
|
37
43
|
end
|
@@ -19,7 +19,7 @@ module Mongo
|
|
19
19
|
module Operation
|
20
20
|
class Create
|
21
21
|
|
22
|
-
# A MongoDB
|
22
|
+
# A MongoDB create collection operation sent as a command message.
|
23
23
|
#
|
24
24
|
# @api private
|
25
25
|
#
|
@@ -32,6 +32,12 @@ module Mongo
|
|
32
32
|
|
33
33
|
private
|
34
34
|
|
35
|
+
def selector(connection)
|
36
|
+
selector = spec[:selector]
|
37
|
+
selector = apply_collation(selector, connection, spec[:collation])
|
38
|
+
selector
|
39
|
+
end
|
40
|
+
|
35
41
|
def message(connection)
|
36
42
|
Protocol::Query.new(db_name, Database::COMMAND, command(connection), options(connection))
|
37
43
|
end
|
@@ -26,6 +26,13 @@ module Mongo
|
|
26
26
|
# @since 2.5.2
|
27
27
|
class OpMsg < OpMsgBase
|
28
28
|
include ExecutableTransactionLabel
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def selector(connection)
|
33
|
+
# Collation is always supported on 3.6+ servers that would use OP_MSG.
|
34
|
+
spec[:selector].merge(collation: spec[:collation]).compact
|
35
|
+
end
|
29
36
|
end
|
30
37
|
end
|
31
38
|
end
|
@@ -33,7 +33,23 @@ module Mongo
|
|
33
33
|
private
|
34
34
|
|
35
35
|
def selector(connection)
|
36
|
-
|
36
|
+
indexes.each do |index|
|
37
|
+
if index[:collation] && !connection.features.collation_enabled?
|
38
|
+
raise Error::UnsupportedCollation
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
{
|
43
|
+
createIndexes: coll_name,
|
44
|
+
indexes: indexes,
|
45
|
+
}.tap do |selector|
|
46
|
+
if commit_quorum = spec[:commit_quorum]
|
47
|
+
unless connection.features.commit_quorum_enabled?
|
48
|
+
raise Error::UnsupportedOption.commit_quorum_error
|
49
|
+
end
|
50
|
+
selector[:commitQuorum] = commit_quorum
|
51
|
+
end
|
52
|
+
end
|
37
53
|
end
|
38
54
|
|
39
55
|
def message(connection)
|
@@ -30,10 +30,23 @@ module Mongo
|
|
30
30
|
private
|
31
31
|
|
32
32
|
def selector(connection)
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
selector
|
33
|
+
{
|
34
|
+
createIndexes: coll_name,
|
35
|
+
indexes: indexes,
|
36
|
+
}.tap do |selector|
|
37
|
+
if commit_quorum = spec[:commit_quorum]
|
38
|
+
# While server versions 3.4 and newer generally perform option
|
39
|
+
# validation, there was a bug on server versions 4.2.0 - 4.2.5 where
|
40
|
+
# the server would accept the commitQuorum option and use it internally
|
41
|
+
# (see SERVER-47193). As a result, the drivers specifications require
|
42
|
+
# drivers to perform validation and raise an error when the commitQuorum
|
43
|
+
# option is passed to servers that don't support it.
|
44
|
+
unless connection.features.commit_quorum_enabled?
|
45
|
+
raise Error::UnsupportedOption.commit_quorum_error
|
46
|
+
end
|
47
|
+
selector[:commitQuorum] = commit_quorum
|
48
|
+
end
|
49
|
+
end
|
37
50
|
end
|
38
51
|
end
|
39
52
|
end
|
@@ -31,13 +31,16 @@ module Mongo
|
|
31
31
|
include WriteConcernSupported
|
32
32
|
include ExecutableNoValidate
|
33
33
|
include PolymorphicResult
|
34
|
+
include Validatable
|
34
35
|
|
35
36
|
private
|
36
37
|
|
37
38
|
def selector(connection)
|
38
|
-
{
|
39
|
-
|
40
|
-
|
39
|
+
{
|
40
|
+
delete: coll_name,
|
41
|
+
deletes: validate_updates(connection, send(IDENTIFIER)),
|
42
|
+
ordered: ordered?,
|
43
|
+
}
|
41
44
|
end
|
42
45
|
|
43
46
|
def message(connection)
|
@@ -28,14 +28,21 @@ module Mongo
|
|
28
28
|
include Specifiable
|
29
29
|
include Executable
|
30
30
|
include PolymorphicResult
|
31
|
+
include Validatable
|
31
32
|
|
32
33
|
private
|
33
34
|
|
34
|
-
def selector
|
35
|
-
|
35
|
+
def selector(connection)
|
36
|
+
# This returns the first delete.
|
37
|
+
# The driver only puts one delete into the list normally, so this
|
38
|
+
# doesn't discard operations.
|
39
|
+
send(IDENTIFIER).first.tap do |selector|
|
40
|
+
validate_find_options(connection, selector)
|
41
|
+
end
|
36
42
|
end
|
37
43
|
|
38
44
|
def message(connection)
|
45
|
+
selector = selector(connection)
|
39
46
|
opts = (selector[Operation::LIMIT] || 0) <= 0 ? {} : { :flags => [ :single_remove ] }
|
40
47
|
Protocol::Delete.new(db_name, coll_name, selector[Operation::Q], opts)
|
41
48
|
end
|
@@ -29,13 +29,21 @@ module Mongo
|
|
29
29
|
include ExecutableNoValidate
|
30
30
|
include ExecutableTransactionLabel
|
31
31
|
include PolymorphicResult
|
32
|
+
include Validatable
|
32
33
|
|
33
34
|
private
|
34
35
|
|
35
36
|
def selector(connection)
|
36
37
|
{ delete: coll_name,
|
37
38
|
Protocol::Msg::DATABASE_IDENTIFIER => db_name,
|
38
|
-
ordered: ordered
|
39
|
+
ordered: ordered?,
|
40
|
+
let: spec[:let],
|
41
|
+
}.compact.tap do |selector|
|
42
|
+
if hint = spec[:hint]
|
43
|
+
validate_hint_on_update(connection, selector)
|
44
|
+
selector[:hint] = hint
|
45
|
+
end
|
46
|
+
end
|
39
47
|
end
|
40
48
|
|
41
49
|
def message(connection)
|
@@ -32,6 +32,12 @@ module Mongo
|
|
32
32
|
|
33
33
|
private
|
34
34
|
|
35
|
+
def selector(connection)
|
36
|
+
selector = spec[:selector]
|
37
|
+
selector = apply_collation(selector, connection, spec[:collation])
|
38
|
+
selector
|
39
|
+
end
|
40
|
+
|
35
41
|
def message(connection)
|
36
42
|
Protocol::Query.new(db_name, Database::COMMAND, command(connection), options(connection))
|
37
43
|
end
|
@@ -27,6 +27,13 @@ module Mongo
|
|
27
27
|
class OpMsg < OpMsgBase
|
28
28
|
include CausalConsistencySupported
|
29
29
|
include ExecutableTransactionLabel
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def selector(connection)
|
34
|
+
# Collation is always supported on 3.6+ servers that would use OP_MSG.
|
35
|
+
spec[:selector].merge(collation: spec[:collation]).compact
|
36
|
+
end
|
30
37
|
end
|
31
38
|
end
|
32
39
|
end
|
@@ -34,7 +34,19 @@ module Mongo
|
|
34
34
|
private
|
35
35
|
|
36
36
|
def selector(connection)
|
37
|
-
|
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
|
+
if spec[:collation] && !connection.features.collation_enabled?
|
42
|
+
raise Error::UnsupportedCollation
|
43
|
+
end
|
44
|
+
|
45
|
+
{
|
46
|
+
explain: {
|
47
|
+
find: coll_name,
|
48
|
+
}.update(Find::Builder::Command.selector(spec, connection)),
|
49
|
+
}.update(spec[:explain] || {})
|
38
50
|
end
|
39
51
|
|
40
52
|
def message(connection)
|
@@ -32,12 +32,19 @@ module Mongo
|
|
32
32
|
|
33
33
|
private
|
34
34
|
|
35
|
-
def selector(connection)
|
36
|
-
super.merge(spec[:explain])
|
37
|
-
end
|
38
|
-
|
39
35
|
def message(connection)
|
40
|
-
|
36
|
+
if spec[:collation] && !connection.features.collation_enabled?
|
37
|
+
raise Error::UnsupportedCollation
|
38
|
+
end
|
39
|
+
|
40
|
+
Protocol::Query.new(
|
41
|
+
db_name,
|
42
|
+
coll_name,
|
43
|
+
Find::Builder::Legacy.selector(spec, connection),
|
44
|
+
options(connection).update(
|
45
|
+
Find::Builder::Legacy.query_options(spec, connection),
|
46
|
+
),
|
47
|
+
)
|
41
48
|
end
|
42
49
|
end
|
43
50
|
end
|
@@ -32,7 +32,15 @@ module Mongo
|
|
32
32
|
private
|
33
33
|
|
34
34
|
def selector(connection)
|
35
|
-
|
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
|
+
explain: {
|
40
|
+
find: coll_name,
|
41
|
+
}.update(Find::Builder::Command.selector(spec, connection)),
|
42
|
+
Protocol::Msg::DATABASE_IDENTIFIER => db_name,
|
43
|
+
}.update(spec[:explain] || {})
|
36
44
|
end
|
37
45
|
end
|
38
46
|
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# encoding: utf-8
|
3
|
+
|
4
|
+
# Copyright (C) 2015-2020 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 Find
|
21
|
+
module Builder
|
22
|
+
|
23
|
+
# Builds a find command specification from options.
|
24
|
+
#
|
25
|
+
# @api private
|
26
|
+
module Command
|
27
|
+
|
28
|
+
# The mappings from ruby options to the find command.
|
29
|
+
OPTION_MAPPINGS = BSON::Document.new(
|
30
|
+
allow_disk_use: 'allowDiskUse',
|
31
|
+
allow_partial_results: 'allowPartialResults',
|
32
|
+
await_data: 'awaitData',
|
33
|
+
batch_size: 'batchSize',
|
34
|
+
collation: 'collation',
|
35
|
+
comment: 'comment',
|
36
|
+
filter: 'filter',
|
37
|
+
hint: 'hint',
|
38
|
+
let: 'let',
|
39
|
+
limit: 'limit',
|
40
|
+
max_scan: 'maxScan',
|
41
|
+
max_time_ms: 'maxTimeMS',
|
42
|
+
max_value: 'max',
|
43
|
+
min_value: 'min',
|
44
|
+
no_cursor_timeout: 'noCursorTimeout',
|
45
|
+
oplog_replay: 'oplogReplay',
|
46
|
+
projection: 'projection',
|
47
|
+
read_concern: 'readConcern',
|
48
|
+
return_key: 'returnKey',
|
49
|
+
show_disk_loc: 'showRecordId',
|
50
|
+
single_batch: 'singleBatch',
|
51
|
+
skip: 'skip',
|
52
|
+
snapshot: 'snapshot',
|
53
|
+
sort: 'sort',
|
54
|
+
tailable: 'tailable',
|
55
|
+
tailable_cursor: 'tailable',
|
56
|
+
).freeze
|
57
|
+
|
58
|
+
module_function def selector(spec, connection)
|
59
|
+
if spec[:collation] && !connection.features.collation_enabled?
|
60
|
+
raise Error::UnsupportedCollation
|
61
|
+
end
|
62
|
+
|
63
|
+
BSON::Document.new.tap do |selector|
|
64
|
+
OPTION_MAPPINGS.each do |k, server_k|
|
65
|
+
unless (value = spec[k]).nil?
|
66
|
+
selector[server_k] = value
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
if rc = selector[:readConcern]
|
71
|
+
selector[:readConcern] = Options::Mapper.transform_values_to_strings(rc)
|
72
|
+
end
|
73
|
+
|
74
|
+
convert_limit_and_batch_size!(selector)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
private
|
79
|
+
|
80
|
+
# Converts negative limit and batchSize parameters in the
|
81
|
+
# find command to positive ones. Removes the parameters if their
|
82
|
+
# values are zero.
|
83
|
+
#
|
84
|
+
# This is only used for find commmand, not for OP_QUERY path.
|
85
|
+
#
|
86
|
+
# The +command+ parameter is mutated by this method.
|
87
|
+
module_function def convert_limit_and_batch_size!(command)
|
88
|
+
if command[:limit] && command[:limit] < 0 &&
|
89
|
+
command[:batchSize] && command[:batchSize] < 0
|
90
|
+
then
|
91
|
+
command[:limit] = command[:limit].abs
|
92
|
+
command[:batchSize] = command[:limit].abs
|
93
|
+
command[:singleBatch] = true
|
94
|
+
else
|
95
|
+
[:limit, :batchSize].each do |opt|
|
96
|
+
if command[opt]
|
97
|
+
if command[opt] < 0
|
98
|
+
command[opt] = command[opt].abs
|
99
|
+
command[:singleBatch] = true
|
100
|
+
elsif command[opt] == 0
|
101
|
+
command.delete(opt)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|