mongo 2.17.2 → 2.18.1
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 +21 -37
- data/lib/mongo/auth/base.rb +8 -1
- data/lib/mongo/auth.rb +12 -1
- data/lib/mongo/bulk_write/result.rb +10 -1
- data/lib/mongo/bulk_write/result_combiner.rb +2 -4
- data/lib/mongo/bulk_write.rb +115 -29
- data/lib/mongo/client.rb +133 -17
- data/lib/mongo/client_encryption.rb +113 -10
- data/lib/mongo/cluster/reapers/cursor_reaper.rb +11 -1
- data/lib/mongo/cluster.rb +26 -28
- data/lib/mongo/collection/helpers.rb +43 -0
- data/lib/mongo/collection/queryable_encryption.rb +122 -0
- data/lib/mongo/collection/view/aggregation.rb +22 -16
- data/lib/mongo/collection/view/change_stream.rb +65 -23
- data/lib/mongo/collection/view/explainable.rb +1 -1
- data/lib/mongo/collection/view/iterable.rb +2 -2
- data/lib/mongo/collection/view/map_reduce.rb +18 -9
- data/lib/mongo/collection/view/readable.rb +29 -25
- data/lib/mongo/collection/view/writable.rb +133 -40
- data/lib/mongo/collection.rb +117 -49
- data/lib/mongo/config/options.rb +62 -0
- data/lib/mongo/config/validators/option.rb +26 -0
- data/lib/mongo/config.rb +42 -0
- data/lib/mongo/crypt/auto_encrypter.rb +136 -14
- data/lib/mongo/crypt/binding.rb +513 -144
- data/lib/mongo/crypt/context.rb +5 -2
- data/lib/mongo/crypt/data_key_context.rb +12 -104
- data/lib/mongo/crypt/encryption_io.rb +94 -60
- data/lib/mongo/crypt/explicit_encrypter.rb +143 -26
- data/lib/mongo/crypt/explicit_encryption_context.rb +25 -2
- data/lib/mongo/crypt/handle.rb +160 -86
- data/lib/mongo/crypt/hooks.rb +25 -2
- data/lib/mongo/crypt/kms/aws.rb +136 -0
- data/lib/mongo/crypt/kms/azure.rb +144 -0
- data/lib/mongo/crypt/kms/credentials.rb +81 -0
- data/lib/mongo/crypt/kms/gcp.rb +189 -0
- data/lib/mongo/crypt/kms/kmip.rb +116 -0
- data/lib/mongo/crypt/kms/local.rb +82 -0
- data/lib/mongo/crypt/kms/master_key_document.rb +65 -0
- data/lib/mongo/crypt/kms.rb +117 -0
- data/lib/mongo/crypt/rewrap_many_data_key_context.rb +46 -0
- data/lib/mongo/crypt/rewrap_many_data_key_result.rb +37 -0
- data/lib/mongo/crypt/status.rb +8 -2
- data/lib/mongo/crypt.rb +3 -0
- data/lib/mongo/cursor/kill_spec.rb +27 -6
- data/lib/mongo/cursor.rb +26 -11
- data/lib/mongo/database/view.rb +6 -3
- data/lib/mongo/database.rb +57 -13
- data/lib/mongo/dbref.rb +1 -105
- data/lib/mongo/error/bulk_write_error.rb +31 -4
- data/lib/mongo/error/invalid_config_option.rb +20 -0
- data/lib/mongo/error/invalid_replacement_document.rb +27 -9
- data/lib/mongo/error/invalid_update_document.rb +27 -7
- data/lib/mongo/error/labelable.rb +72 -0
- data/lib/mongo/error/missing_connection.rb +25 -0
- data/lib/mongo/error/missing_file_chunk.rb +8 -2
- data/lib/mongo/error/notable.rb +7 -0
- data/lib/mongo/error/operation_failure.rb +34 -86
- data/lib/mongo/error/read_write_retryable.rb +108 -0
- data/lib/mongo/{operation/kill_cursors/legacy.rb → error/session_not_materialized.rb} +7 -19
- data/lib/mongo/error.rb +5 -37
- data/lib/mongo/grid/stream/read.rb +6 -0
- data/lib/mongo/index/view.rb +23 -7
- data/lib/mongo/monitoring/event/command_failed.rb +8 -2
- data/lib/mongo/monitoring/event/command_started.rb +1 -1
- data/lib/mongo/monitoring/event/command_succeeded.rb +9 -2
- data/lib/mongo/monitoring/publishable.rb +9 -5
- data/lib/mongo/operation/collections_info/result.rb +5 -2
- data/lib/mongo/operation/command/op_msg.rb +6 -0
- data/lib/mongo/operation/context.rb +24 -6
- data/lib/mongo/operation/count/op_msg.rb +4 -1
- data/lib/mongo/operation/create/op_msg.rb +4 -1
- data/lib/mongo/operation/create_index/op_msg.rb +2 -1
- data/lib/mongo/operation/delete/op_msg.rb +1 -0
- data/lib/mongo/operation/delete.rb +0 -1
- data/lib/mongo/operation/distinct/op_msg.rb +4 -1
- data/lib/mongo/operation/drop_index/op_msg.rb +5 -1
- data/lib/mongo/operation/get_more/command_builder.rb +5 -1
- data/lib/mongo/operation/insert/bulk_result.rb +5 -1
- data/lib/mongo/operation/insert/command.rb +0 -4
- data/lib/mongo/operation/insert/op_msg.rb +6 -3
- data/lib/mongo/operation/insert/result.rb +6 -3
- data/lib/mongo/operation/insert.rb +0 -1
- data/lib/mongo/operation/kill_cursors.rb +0 -1
- data/lib/mongo/operation/list_collections/op_msg.rb +4 -1
- data/lib/mongo/operation/map_reduce/result.rb +16 -0
- data/lib/mongo/operation/result.rb +21 -5
- data/lib/mongo/operation/shared/executable.rb +21 -6
- data/lib/mongo/operation/shared/polymorphic_operation.rb +15 -3
- data/lib/mongo/operation/shared/response_handling.rb +6 -5
- data/lib/mongo/operation/shared/sessions_supported.rb +7 -3
- data/lib/mongo/operation/shared/write.rb +18 -12
- data/lib/mongo/operation/update/op_msg.rb +2 -1
- data/lib/mongo/operation/update.rb +0 -1
- data/lib/mongo/protocol/caching_hash.rb +69 -0
- data/lib/mongo/protocol/msg.rb +21 -1
- data/lib/mongo/protocol.rb +1 -0
- data/lib/mongo/query_cache.rb +15 -0
- data/lib/mongo/retryable.rb +78 -30
- data/lib/mongo/server/connection.rb +33 -0
- data/lib/mongo/server/connection_base.rb +2 -0
- data/lib/mongo/server/connection_common.rb +4 -1
- data/lib/mongo/server/connection_pool.rb +74 -46
- data/lib/mongo/server/description/features.rb +3 -1
- data/lib/mongo/server/description.rb +7 -2
- data/lib/mongo/server/monitor/connection.rb +1 -0
- data/lib/mongo/server/monitor.rb +25 -13
- data/lib/mongo/server/push_monitor.rb +13 -3
- data/lib/mongo/server.rb +9 -5
- data/lib/mongo/session/session_pool.rb +8 -0
- data/lib/mongo/session.rb +111 -35
- data/lib/mongo/socket/ocsp_verifier.rb +4 -5
- data/lib/mongo/socket/tcp.rb +3 -0
- data/lib/mongo/srv/resolver.rb +24 -3
- data/lib/mongo/uri/options_mapper.rb +2 -0
- data/lib/mongo/uri/srv_protocol.rb +1 -1
- data/lib/mongo/uri.rb +20 -0
- data/lib/mongo/version.rb +1 -1
- data/lib/mongo.rb +22 -0
- data/mongo.gemspec +10 -4
- data/spec/README.md +23 -5
- data/spec/integration/aws_lambda_examples_spec.rb +68 -0
- data/spec/integration/bulk_write_error_message_spec.rb +32 -0
- data/spec/integration/bulk_write_spec.rb +16 -0
- data/spec/integration/change_stream_spec.rb +6 -5
- data/spec/integration/client_construction_spec.rb +74 -8
- data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +9 -9
- data/spec/integration/client_side_encryption/auto_encryption_command_monitoring_spec.rb +168 -168
- data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +0 -1
- data/spec/integration/client_side_encryption/auto_encryption_reconnect_spec.rb +31 -0
- data/spec/integration/client_side_encryption/auto_encryption_spec.rb +108 -1
- data/spec/integration/client_side_encryption/bson_size_limit_spec.rb +2 -2
- data/spec/integration/client_side_encryption/bypass_mongocryptd_spawn_spec.rb +2 -2
- data/spec/integration/client_side_encryption/client_close_spec.rb +1 -1
- data/spec/integration/client_side_encryption/corpus_spec.rb +64 -35
- data/spec/integration/client_side_encryption/custom_endpoint_spec.rb +39 -42
- data/spec/integration/client_side_encryption/data_key_spec.rb +97 -7
- data/spec/integration/client_side_encryption/decryption_events_prose_spec.rb +158 -0
- data/spec/integration/client_side_encryption/explicit_encryption_spec.rb +59 -0
- data/spec/integration/client_side_encryption/explicit_queryable_encryption_spec.rb +147 -0
- data/spec/integration/client_side_encryption/external_key_vault_spec.rb +6 -6
- data/spec/integration/client_side_encryption/kms_tls_options_spec.rb +436 -0
- data/spec/integration/client_side_encryption/kms_tls_spec.rb +92 -0
- data/spec/integration/client_side_encryption/queryable_encryption_examples_spec.rb +111 -0
- data/spec/integration/client_side_encryption/unique_index_on_key_alt_names_prose_spec.rb +85 -0
- data/spec/integration/client_side_encryption/views_spec.rb +1 -1
- data/spec/integration/client_update_spec.rb +2 -2
- data/spec/integration/crud_spec.rb +12 -0
- data/spec/integration/cursor_pinning_spec.rb +3 -3
- data/spec/integration/fork_reconnect_spec.rb +15 -8
- data/spec/integration/grid_fs_bucket_spec.rb +3 -3
- data/spec/integration/ocsp_verifier_spec.rb +3 -0
- data/spec/integration/query_cache_spec.rb +34 -30
- data/spec/integration/reconnect_spec.rb +2 -0
- data/spec/integration/retryable_writes/retryable_writes_36_and_older_spec.rb +1 -1
- data/spec/integration/server_monitor_spec.rb +2 -1
- data/spec/integration/size_limit_spec.rb +4 -1
- data/spec/integration/snapshot_query_examples_spec.rb +127 -0
- data/spec/integration/srv_monitoring_spec.rb +38 -0
- data/spec/integration/srv_spec.rb +1 -0
- data/spec/integration/step_down_spec.rb +20 -4
- data/spec/integration/transaction_pinning_spec.rb +2 -2
- data/spec/integration/versioned_api_examples_spec.rb +37 -31
- data/spec/lite_spec_helper.rb +19 -9
- data/spec/mongo/address/ipv6_spec.rb +7 -0
- data/spec/mongo/address_spec.rb +7 -0
- data/spec/mongo/auth/scram/conversation_spec.rb +23 -23
- data/spec/mongo/auth/scram256/conversation_spec.rb +20 -20
- data/spec/mongo/auth/scram_negotiation_spec.rb +1 -0
- data/spec/mongo/bulk_write/result_spec.rb +15 -1
- data/spec/mongo/bulk_write_spec.rb +141 -20
- data/spec/mongo/client_construction_spec.rb +186 -9
- data/spec/mongo/client_encryption_spec.rb +10 -22
- data/spec/mongo/client_spec.rb +297 -1
- data/spec/mongo/cluster/cursor_reaper_spec.rb +21 -3
- data/spec/mongo/cluster_spec.rb +0 -44
- data/spec/mongo/collection/view/aggregation_spec.rb +121 -2
- data/spec/mongo/collection/view/change_stream_spec.rb +2 -2
- data/spec/mongo/collection/view/readable_spec.rb +605 -1
- data/spec/mongo/collection/view/writable_spec.rb +144 -32
- data/spec/mongo/collection_crud_spec.rb +63 -13
- data/spec/mongo/collection_spec.rb +32 -0
- data/spec/mongo/config/options_spec.rb +75 -0
- data/spec/mongo/config_spec.rb +73 -0
- data/spec/mongo/crypt/auto_decryption_context_spec.rb +17 -1
- data/spec/mongo/crypt/auto_encrypter_spec.rb +256 -5
- data/spec/mongo/crypt/auto_encryption_context_spec.rb +17 -1
- data/spec/mongo/crypt/binding/context_spec.rb +67 -17
- data/spec/mongo/crypt/binding/mongocrypt_spec.rb +17 -46
- data/spec/mongo/crypt/binding/version_spec.rb +33 -0
- data/spec/mongo/crypt/binding_unloaded_spec.rb +14 -0
- data/spec/mongo/crypt/data_key_context_spec.rb +42 -114
- data/spec/mongo/crypt/encryption_io_spec.rb +2 -0
- data/spec/mongo/crypt/explicit_decryption_context_spec.rb +32 -1
- data/spec/mongo/crypt/explicit_encryption_context_spec.rb +94 -1
- data/spec/mongo/crypt/handle_spec.rb +172 -156
- data/spec/mongo/crypt/hooks_spec.rb +30 -0
- data/spec/mongo/crypt/kms/credentials_spec.rb +357 -0
- data/spec/mongo/crypt/kms_spec.rb +59 -0
- data/spec/mongo/cursor_spec.rb +87 -1
- data/spec/mongo/database_spec.rb +66 -1
- data/spec/mongo/error/operation_failure_heavy_spec.rb +49 -0
- data/spec/mongo/index/view_spec.rb +125 -0
- data/spec/mongo/operation/create/op_msg_spec.rb +244 -0
- data/spec/mongo/operation/delete/op_msg_spec.rb +13 -4
- data/spec/mongo/operation/delete_spec.rb +0 -30
- data/spec/mongo/operation/insert/op_msg_spec.rb +18 -10
- data/spec/mongo/operation/insert_spec.rb +0 -32
- data/spec/mongo/operation/result_spec.rb +20 -0
- data/spec/mongo/operation/update/op_msg_spec.rb +13 -4
- data/spec/mongo/operation/update_spec.rb +0 -29
- data/spec/mongo/protocol/caching_hash_spec.rb +82 -0
- data/spec/mongo/protocol/msg_spec.rb +41 -0
- data/spec/mongo/query_cache_spec.rb +1 -0
- data/spec/mongo/retryable_spec.rb +32 -3
- data/spec/mongo/server/connection_auth_spec.rb +3 -1
- data/spec/mongo/server/connection_common_spec.rb +13 -1
- data/spec/mongo/server/connection_pool_spec.rb +120 -53
- data/spec/mongo/server/connection_spec.rb +50 -159
- data/spec/mongo/server/description/features_spec.rb +24 -0
- data/spec/mongo/server/push_monitor_spec.rb +2 -8
- data/spec/mongo/session_spec.rb +26 -6
- data/spec/mongo/session_transaction_spec.rb +2 -1
- data/spec/mongo/socket/ssl_spec.rb +18 -7
- data/spec/mongo/uri/srv_protocol_spec.rb +101 -2
- data/spec/mongo/uri_spec.rb +25 -0
- data/spec/runners/connection_string.rb +8 -0
- data/spec/runners/crud/operation.rb +12 -3
- data/spec/runners/crud/requirement.rb +9 -4
- data/spec/runners/crud/spec.rb +5 -0
- data/spec/runners/crud/test.rb +1 -1
- data/spec/runners/crud/verifier.rb +6 -0
- data/spec/runners/transactions/spec.rb +2 -2
- data/spec/runners/transactions/test.rb +19 -16
- data/spec/runners/transactions.rb +11 -8
- data/spec/runners/unified/assertions.rb +90 -11
- data/spec/runners/unified/change_stream_operations.rb +12 -0
- data/spec/runners/unified/client_side_encryption_operations.rb +83 -0
- data/spec/runners/unified/crud_operations.rb +67 -4
- data/spec/runners/unified/ddl_operations.rb +45 -0
- data/spec/runners/unified/error.rb +2 -1
- data/spec/runners/unified/grid_fs_operations.rb +21 -0
- data/spec/runners/unified/support_operations.rb +5 -2
- data/spec/runners/unified/test.rb +78 -5
- data/spec/runners/unified.rb +9 -2
- data/spec/shared/lib/mrss/constraints.rb +10 -17
- data/spec/shared/lib/mrss/docker_runner.rb +23 -3
- data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
- data/spec/shared/lib/mrss/event_subscriber.rb +15 -5
- data/spec/shared/lib/mrss/lite_constraints.rb +40 -1
- data/spec/shared/lib/mrss/session_registry.rb +69 -0
- data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
- data/spec/shared/share/Dockerfile.erb +56 -54
- data/spec/shared/shlib/config.sh +27 -0
- data/spec/shared/shlib/distro.sh +2 -1
- data/spec/shared/shlib/server.sh +46 -21
- data/spec/shared/shlib/set_env.sh +43 -5
- data/spec/solo/clean_exit_spec.rb +5 -0
- data/spec/spec_helper.rb +0 -1
- data/spec/spec_tests/client_side_encryption_spec.rb +1 -1
- data/spec/spec_tests/client_side_encryption_unified_spec.rb +16 -0
- data/spec/spec_tests/crud_spec.rb +0 -10
- data/spec/spec_tests/data/change_streams_unified/change-streams-errors.yml +124 -0
- data/spec/spec_tests/data/change_streams_unified/change-streams-pre_and_post_images.yml +351 -0
- data/spec/spec_tests/data/change_streams_unified/change-streams-resume-allowlist.yml +1171 -0
- data/spec/spec_tests/data/change_streams_unified/change-streams-resume-errorLabels.yml +1071 -0
- data/spec/spec_tests/data/change_streams_unified/change-streams-showExpandedEvents.yml +298 -0
- data/spec/spec_tests/data/change_streams_unified/change-streams.yml +859 -4
- data/spec/spec_tests/data/client_side_encryption/aggregate.yml +3 -17
- data/spec/spec_tests/data/client_side_encryption/azureKMS.yml +46 -0
- data/spec/spec_tests/data/client_side_encryption/badQueries.yml +12 -2
- data/spec/spec_tests/data/client_side_encryption/basic.yml +3 -17
- data/spec/spec_tests/data/client_side_encryption/bulk.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/bypassAutoEncryption.yml +2 -2
- data/spec/spec_tests/data/client_side_encryption/count.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/countDocuments.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/create-and-createIndexes.yml +58 -0
- data/spec/spec_tests/data/client_side_encryption/delete.yml +2 -16
- data/spec/spec_tests/data/client_side_encryption/distinct.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/explain.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/find.yml +2 -16
- data/spec/spec_tests/data/client_side_encryption/findOneAndDelete.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/findOneAndReplace.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/findOneAndUpdate.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/fle2-BypassQueryAnalysis.yml +101 -0
- data/spec/spec_tests/data/client_side_encryption/fle2-Compact.yml +80 -0
- data/spec/spec_tests/data/client_side_encryption/fle2-CreateCollection.yml +1263 -0
- data/spec/spec_tests/data/client_side_encryption/fle2-DecryptExistingData.yml +64 -0
- data/spec/spec_tests/data/client_side_encryption/fle2-Delete.yml +107 -0
- data/spec/spec_tests/data/client_side_encryption/fle2-EncryptedFields-vs-EncryptedFieldsMap.yml +80 -0
- data/spec/spec_tests/data/client_side_encryption/fle2-EncryptedFields-vs-jsonSchema.yml +90 -0
- data/spec/spec_tests/data/client_side_encryption/fle2-EncryptedFieldsMap-defaults.yml +57 -0
- data/spec/spec_tests/data/client_side_encryption/fle2-FindOneAndUpdate.yml +213 -0
- data/spec/spec_tests/data/client_side_encryption/fle2-InsertFind-Indexed.yml +86 -0
- data/spec/spec_tests/data/client_side_encryption/fle2-InsertFind-Unindexed.yml +83 -0
- data/spec/spec_tests/data/client_side_encryption/fle2-MissingKey.yml +41 -0
- data/spec/spec_tests/data/client_side_encryption/fle2-NoEncryption.yml +42 -0
- data/spec/spec_tests/data/client_side_encryption/fle2-Update.yml +221 -0
- data/spec/spec_tests/data/client_side_encryption/fle2-validatorAndPartialFieldExpression.yml +168 -0
- data/spec/spec_tests/data/client_side_encryption/gcpKMS.yml +46 -0
- data/spec/spec_tests/data/client_side_encryption/getMore.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/insert.yml +2 -16
- data/spec/spec_tests/data/client_side_encryption/keyAltName.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/localKMS.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/localSchema.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/maxWireVersion.yml +2 -0
- data/spec/spec_tests/data/client_side_encryption/missingKey.yml +2 -9
- data/spec/spec_tests/data/client_side_encryption/noSchema.yml +39 -0
- data/spec/spec_tests/data/client_side_encryption/replaceOne.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/types.yml +44 -70
- data/spec/spec_tests/data/client_side_encryption/unified/addKeyAltName.yml +194 -0
- data/spec/spec_tests/data/client_side_encryption/unified/createDataKey-kms_providers-invalid.yml +67 -0
- data/spec/spec_tests/data/client_side_encryption/unified/createDataKey.yml +309 -0
- data/spec/spec_tests/data/client_side_encryption/unified/deleteKey.yml +159 -0
- data/spec/spec_tests/data/client_side_encryption/unified/getKey.yml +105 -0
- data/spec/spec_tests/data/client_side_encryption/unified/getKeyByAltName.yml +104 -0
- data/spec/spec_tests/data/client_side_encryption/unified/getKeys.yml +122 -0
- data/spec/spec_tests/data/client_side_encryption/unified/removeKeyAltName.yml +157 -0
- data/spec/spec_tests/data/client_side_encryption/unified/rewrapManyDataKey-decrypt_failure.yml +69 -0
- data/spec/spec_tests/data/client_side_encryption/unified/rewrapManyDataKey-encrypt_failure.yml +122 -0
- data/spec/spec_tests/data/client_side_encryption/unified/rewrapManyDataKey.yml +432 -0
- data/spec/spec_tests/data/client_side_encryption/updateMany.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/updateOne.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/validatorAndPartialFieldExpression.yml +166 -0
- data/spec/spec_tests/data/collection_management/clustered-indexes.yml +135 -0
- data/spec/spec_tests/data/collection_management/createCollection-pre_and_post_images.yml +50 -0
- data/spec/spec_tests/data/collection_management/modifyCollection-pre_and_post_images.yml +58 -0
- data/spec/spec_tests/data/command_monitoring_unified/bulkWrite.yml +68 -0
- data/spec/spec_tests/data/command_monitoring_unified/command.yml +50 -0
- data/spec/spec_tests/data/command_monitoring_unified/deleteMany.yml +79 -0
- data/spec/spec_tests/data/command_monitoring_unified/deleteOne.yml +79 -0
- data/spec/spec_tests/data/command_monitoring_unified/find.yml +254 -0
- data/spec/spec_tests/data/command_monitoring_unified/insertMany.yml +79 -0
- data/spec/spec_tests/data/command_monitoring_unified/insertOne.yml +77 -0
- data/spec/spec_tests/data/command_monitoring_unified/pre-42-server-connection-id.yml +56 -0
- data/spec/spec_tests/data/command_monitoring_unified/server-connection-id.yml +56 -0
- data/spec/spec_tests/data/command_monitoring_unified/unacknowledgedBulkWrite.yml +55 -0
- data/spec/spec_tests/data/command_monitoring_unified/updateMany.yml +87 -0
- data/spec/spec_tests/data/command_monitoring_unified/updateOne.yml +118 -0
- data/spec/spec_tests/data/crud/read/aggregate-collation.yml +1 -1
- data/spec/spec_tests/data/crud/read/count-collation.yml +1 -1
- data/spec/spec_tests/data/crud/read/distinct-collation.yml +1 -1
- data/spec/spec_tests/data/crud/read/find-collation.yml +1 -1
- data/spec/spec_tests/data/crud/write/bulkWrite-collation.yml +1 -1
- data/spec/spec_tests/data/crud/write/deleteMany-collation.yml +1 -1
- data/spec/spec_tests/data/crud/write/deleteOne-collation.yml +1 -1
- data/spec/spec_tests/data/crud/write/findOneAndDelete-collation.yml +1 -1
- data/spec/spec_tests/data/crud/write/findOneAndReplace-collation.yml +1 -1
- data/spec/spec_tests/data/crud/write/findOneAndUpdate-collation.yml +1 -1
- data/spec/spec_tests/data/crud/write/replaceOne-collation.yml +1 -1
- data/spec/spec_tests/data/crud/write/updateMany-collation.yml +1 -1
- data/spec/spec_tests/data/crud/write/updateOne-collation.yml +1 -1
- data/spec/spec_tests/data/crud_unified/aggregate-allowdiskuse.yml +75 -0
- data/spec/spec_tests/data/crud_unified/aggregate-merge.yml +185 -0
- data/spec/spec_tests/data/crud_unified/aggregate-out-readConcern.yml +171 -0
- data/spec/spec_tests/data/crud_unified/aggregate.yml +215 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-arrayFilters-clientError.yml +98 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-arrayFilters.yml +174 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-comment.yml +189 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-delete-hint-clientError.yml +113 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-delete-hint-serverError.yml +142 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-delete-hint.yml +154 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-deleteMany-hint-unacknowledged.yml +98 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-deleteMany-let.yml +86 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-deleteOne-hint-unacknowledged.yml +97 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-deleteOne-let.yml +86 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-insertOne-dots_and_dollars.yml +138 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-replaceOne-dots_and_dollars.yml +165 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-replaceOne-hint-unacknowledged.yml +103 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-replaceOne-let.yml +93 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-update-hint-clientError.yml +148 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-update-hint-serverError.yml +239 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-update-hint.yml +256 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-update-validation.yml +73 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-updateMany-dots_and_dollars.yml +150 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-updateMany-hint-unacknowledged.yml +104 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-updateMany-let.yml +96 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-updateOne-dots_and_dollars.yml +150 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-updateOne-hint-unacknowledged.yml +103 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-updateOne-let.yml +95 -0
- data/spec/spec_tests/data/crud_unified/countDocuments-comment.yml +92 -0
- data/spec/spec_tests/data/crud_unified/db-aggregate.yml +73 -0
- data/spec/spec_tests/data/crud_unified/deleteMany-comment.yml +97 -0
- data/spec/spec_tests/data/crud_unified/deleteMany-hint-clientError.yml +87 -0
- data/spec/spec_tests/data/crud_unified/deleteMany-hint-serverError.yml +107 -0
- data/spec/spec_tests/data/crud_unified/deleteMany-hint-unacknowledged.yml +90 -0
- data/spec/spec_tests/data/crud_unified/deleteMany-hint.yml +99 -0
- data/spec/spec_tests/data/crud_unified/deleteMany-let.yml +2 -0
- data/spec/spec_tests/data/crud_unified/deleteOne-comment.yml +98 -0
- data/spec/spec_tests/data/crud_unified/deleteOne-hint-clientError.yml +80 -0
- data/spec/spec_tests/data/crud_unified/deleteOne-hint-serverError.yml +100 -0
- data/spec/spec_tests/data/crud_unified/deleteOne-hint-unacknowledged.yml +89 -0
- data/spec/spec_tests/data/crud_unified/deleteOne-hint.yml +95 -0
- data/spec/spec_tests/data/crud_unified/deleteOne-let.yml +2 -0
- data/spec/spec_tests/data/crud_unified/distinct-comment.yml +98 -0
- data/spec/spec_tests/data/crud_unified/estimatedDocumentCount-comment.yml +95 -0
- data/spec/spec_tests/data/crud_unified/estimatedDocumentCount.yml +5 -135
- data/spec/spec_tests/data/crud_unified/find-allowdiskuse-clientError.yml +55 -0
- data/spec/spec_tests/data/crud_unified/find-allowdiskuse-serverError.yml +68 -0
- data/spec/spec_tests/data/crud_unified/find-allowdiskuse.yml +79 -0
- data/spec/spec_tests/data/crud_unified/find-comment.yml +166 -0
- data/spec/spec_tests/data/crud_unified/find.yml +68 -0
- data/spec/spec_tests/data/crud_unified/findOneAndDelete-comment.yml +96 -0
- data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint-clientError.yml +91 -0
- data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint-serverError.yml +107 -0
- data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint-unacknowledged.yml +88 -0
- data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint.yml +102 -0
- data/spec/spec_tests/data/crud_unified/findOneAndDelete-let.yml +2 -4
- data/spec/spec_tests/data/crud_unified/findOneAndReplace-comment.yml +101 -0
- data/spec/spec_tests/data/crud_unified/findOneAndReplace-dots_and_dollars.yml +140 -0
- data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint-clientError.yml +83 -0
- data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint-serverError.yml +99 -0
- data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint-unacknowledged.yml +96 -0
- data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint.yml +98 -0
- data/spec/spec_tests/data/crud_unified/findOneAndUpdate-comment.yml +95 -0
- data/spec/spec_tests/data/crud_unified/findOneAndUpdate-dots_and_dollars.yml +127 -0
- data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint-clientError.yml +84 -0
- data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint-serverError.yml +100 -0
- data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint-unacknowledged.yml +92 -0
- data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint.yml +99 -0
- data/spec/spec_tests/data/crud_unified/insertMany-comment.yml +93 -0
- data/spec/spec_tests/data/crud_unified/insertMany-dots_and_dollars.yml +128 -0
- data/spec/spec_tests/data/crud_unified/insertOne-comment.yml +91 -0
- data/spec/spec_tests/data/crud_unified/insertOne-dots_and_dollars.yml +238 -0
- data/spec/spec_tests/data/crud_unified/replaceOne-comment.yml +105 -0
- data/spec/spec_tests/data/crud_unified/replaceOne-dots_and_dollars.yml +180 -0
- data/spec/spec_tests/data/crud_unified/replaceOne-hint-unacknowledged.yml +95 -0
- data/spec/spec_tests/data/crud_unified/replaceOne-hint.yml +108 -0
- data/spec/spec_tests/data/crud_unified/replaceOne-let.yml +98 -0
- data/spec/spec_tests/data/crud_unified/replaceOne-validation.yml +37 -0
- data/spec/spec_tests/data/crud_unified/updateMany-comment.yml +104 -0
- data/spec/spec_tests/data/crud_unified/updateMany-dots_and_dollars.yml +138 -0
- data/spec/spec_tests/data/crud_unified/updateMany-hint-clientError.yml +91 -0
- data/spec/spec_tests/data/crud_unified/updateMany-hint-serverError.yml +115 -0
- data/spec/spec_tests/data/crud_unified/updateMany-hint-unacknowledged.yml +96 -0
- data/spec/spec_tests/data/crud_unified/updateMany-hint.yml +115 -0
- data/spec/spec_tests/data/crud_unified/updateMany-let.yml +5 -1
- data/spec/spec_tests/data/crud_unified/updateMany-validation.yml +39 -0
- data/spec/spec_tests/data/crud_unified/updateOne-comment.yml +104 -0
- data/spec/spec_tests/data/crud_unified/updateOne-dots_and_dollars.yml +138 -0
- data/spec/spec_tests/data/crud_unified/updateOne-hint-clientError.yml +85 -0
- data/spec/spec_tests/data/crud_unified/updateOne-hint-serverError.yml +109 -0
- data/spec/spec_tests/data/crud_unified/updateOne-hint-unacknowledged.yml +95 -0
- data/spec/spec_tests/data/crud_unified/updateOne-hint.yml +109 -0
- data/spec/spec_tests/data/crud_unified/updateOne-let.yml +5 -1
- data/spec/spec_tests/data/crud_unified/updateOne-validation.yml +37 -0
- data/spec/spec_tests/data/crud_unified/updateWithPipelines.yml +8 -14
- data/spec/spec_tests/data/gridfs_unified/delete.yml +198 -0
- data/spec/spec_tests/data/gridfs_unified/download.yml +241 -0
- data/spec/spec_tests/data/gridfs_unified/downloadByName.yml +159 -0
- data/spec/spec_tests/data/gridfs_unified/upload-disableMD5.yml +92 -0
- data/spec/spec_tests/data/gridfs_unified/upload.yml +288 -0
- data/spec/spec_tests/data/retryable_reads/{aggregate-merge.yml → legacy/aggregate-merge.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{aggregate-serverErrors.yml → legacy/aggregate-serverErrors.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{aggregate.yml → legacy/aggregate.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{changeStreams-client.watch-serverErrors.yml → legacy/changeStreams-client.watch-serverErrors.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{changeStreams-client.watch.yml → legacy/changeStreams-client.watch.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{changeStreams-db.coll.watch-serverErrors.yml → legacy/changeStreams-db.coll.watch-serverErrors.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{changeStreams-db.coll.watch.yml → legacy/changeStreams-db.coll.watch.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{changeStreams-db.watch-serverErrors.yml → legacy/changeStreams-db.watch-serverErrors.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{changeStreams-db.watch.yml → legacy/changeStreams-db.watch.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{count-serverErrors.yml → legacy/count-serverErrors.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{count.yml → legacy/count.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{countDocuments-serverErrors.yml → legacy/countDocuments-serverErrors.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{countDocuments.yml → legacy/countDocuments.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{distinct-serverErrors.yml → legacy/distinct-serverErrors.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{distinct.yml → legacy/distinct.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount-serverErrors-pre4.9.yml → legacy/estimatedDocumentCount-serverErrors.yml} +0 -2
- data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount-pre4.9.yml → legacy/estimatedDocumentCount.yml} +0 -2
- data/spec/spec_tests/data/retryable_reads/{find-serverErrors.yml → legacy/find-serverErrors.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{find.yml → legacy/find.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{findOne-serverErrors.yml → legacy/findOne-serverErrors.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{findOne.yml → legacy/findOne.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{gridfs-download-serverErrors.yml → legacy/gridfs-download-serverErrors.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{gridfs-download.yml → legacy/gridfs-download.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{gridfs-downloadByName-serverErrors.yml → legacy/gridfs-downloadByName-serverErrors.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{gridfs-downloadByName.yml → legacy/gridfs-downloadByName.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{listCollectionNames-serverErrors.yml → legacy/listCollectionNames-serverErrors.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{listCollectionNames.yml → legacy/listCollectionNames.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{listCollectionObjects-serverErrors.yml → legacy/listCollectionObjects-serverErrors.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{listCollectionObjects.yml → legacy/listCollectionObjects.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{listCollections-serverErrors.yml → legacy/listCollections-serverErrors.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{listCollections.yml → legacy/listCollections.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{listDatabaseNames-serverErrors.yml → legacy/listDatabaseNames-serverErrors.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{listDatabaseNames.yml → legacy/listDatabaseNames.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{listDatabaseObjects-serverErrors.yml → legacy/listDatabaseObjects-serverErrors.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{listDatabaseObjects.yml → legacy/listDatabaseObjects.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{listDatabases-serverErrors.yml → legacy/listDatabases-serverErrors.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{listDatabases.yml → legacy/listDatabases.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{listIndexNames-serverErrors.yml → legacy/listIndexNames-serverErrors.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{listIndexNames.yml → legacy/listIndexNames.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{listIndexes-serverErrors.yml → legacy/listIndexes-serverErrors.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{listIndexes.yml → legacy/listIndexes.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{mapReduce.yml → legacy/mapReduce.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/unified/handshakeError.yml +129 -0
- data/spec/spec_tests/data/retryable_writes/{bulkWrite-errorLabels.yml → legacy/bulkWrite-errorLabels.yml} +0 -0
- data/spec/spec_tests/data/retryable_writes/{bulkWrite-serverErrors.yml → legacy/bulkWrite-serverErrors.yml} +1 -1
- data/spec/spec_tests/data/retryable_writes/{bulkWrite.yml → legacy/bulkWrite.yml} +0 -0
- data/spec/spec_tests/data/retryable_writes/{deleteMany.yml → legacy/deleteMany.yml} +0 -0
- data/spec/spec_tests/data/retryable_writes/{deleteOne-errorLabels.yml → legacy/deleteOne-errorLabels.yml} +0 -0
- data/spec/spec_tests/data/retryable_writes/{deleteOne-serverErrors.yml → legacy/deleteOne-serverErrors.yml} +1 -1
- data/spec/spec_tests/data/retryable_writes/{deleteOne.yml → legacy/deleteOne.yml} +0 -0
- data/spec/spec_tests/data/retryable_writes/{findOneAndDelete-errorLabels.yml → legacy/findOneAndDelete-errorLabels.yml} +0 -0
- data/spec/spec_tests/data/retryable_writes/{findOneAndDelete-serverErrors.yml → legacy/findOneAndDelete-serverErrors.yml} +1 -1
- data/spec/spec_tests/data/retryable_writes/{findOneAndDelete.yml → legacy/findOneAndDelete.yml} +0 -0
- data/spec/spec_tests/data/retryable_writes/{findOneAndReplace-errorLabels.yml → legacy/findOneAndReplace-errorLabels.yml} +0 -0
- data/spec/spec_tests/data/retryable_writes/{findOneAndReplace-serverErrors.yml → legacy/findOneAndReplace-serverErrors.yml} +1 -1
- data/spec/spec_tests/data/retryable_writes/{findOneAndReplace.yml → legacy/findOneAndReplace.yml} +0 -0
- data/spec/spec_tests/data/retryable_writes/{findOneAndUpdate-errorLabels.yml → legacy/findOneAndUpdate-errorLabels.yml} +0 -0
- data/spec/spec_tests/data/retryable_writes/{findOneAndUpdate-serverErrors.yml → legacy/findOneAndUpdate-serverErrors.yml} +1 -1
- data/spec/spec_tests/data/retryable_writes/{findOneAndUpdate.yml → legacy/findOneAndUpdate.yml} +0 -0
- data/spec/spec_tests/data/retryable_writes/{insertMany-errorLabels.yml → legacy/insertMany-errorLabels.yml} +0 -0
- data/spec/spec_tests/data/retryable_writes/{insertMany-serverErrors.yml → legacy/insertMany-serverErrors.yml} +1 -1
- data/spec/spec_tests/data/retryable_writes/{insertMany.yml → legacy/insertMany.yml} +0 -0
- data/spec/spec_tests/data/retryable_writes/{insertOne-errorLabels.yml → legacy/insertOne-errorLabels.yml} +0 -0
- data/spec/spec_tests/data/retryable_writes/{insertOne-serverErrors.yml → legacy/insertOne-serverErrors.yml} +5 -5
- data/spec/spec_tests/data/retryable_writes/{insertOne.yml → legacy/insertOne.yml} +0 -0
- data/spec/spec_tests/data/retryable_writes/{replaceOne-errorLabels.yml → legacy/replaceOne-errorLabels.yml} +0 -0
- data/spec/spec_tests/data/retryable_writes/{replaceOne-serverErrors.yml → legacy/replaceOne-serverErrors.yml} +1 -1
- data/spec/spec_tests/data/retryable_writes/{replaceOne.yml → legacy/replaceOne.yml} +0 -0
- data/spec/spec_tests/data/retryable_writes/{updateMany.yml → legacy/updateMany.yml} +0 -0
- data/spec/spec_tests/data/retryable_writes/{updateOne-errorLabels.yml → legacy/updateOne-errorLabels.yml} +0 -0
- data/spec/spec_tests/data/retryable_writes/{updateOne-serverErrors.yml → legacy/updateOne-serverErrors.yml} +1 -1
- data/spec/spec_tests/data/retryable_writes/{updateOne.yml → legacy/updateOne.yml} +0 -0
- data/spec/spec_tests/data/retryable_writes/unified/bulkWrite-serverErrors.yml +96 -0
- data/spec/spec_tests/data/retryable_writes/unified/handshakeError.yml +137 -0
- data/spec/spec_tests/data/retryable_writes/unified/insertOne-serverErrors.yml +78 -0
- data/spec/spec_tests/data/sdam/errors/prefer-error-code.yml +2 -2
- data/spec/spec_tests/data/sdam_integration/hello-command-error.yml +6 -14
- data/spec/spec_tests/data/sdam_integration/hello-network-error.yml +4 -14
- data/spec/spec_tests/data/sdam_integration/hello-timeout.yml +8 -14
- data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-no-results.yml +5 -0
- data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-conflicts_with_loadBalanced-true-txt.yml +5 -0
- data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-conflicts_with_loadBalanced-true.yml +5 -0
- data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-zero-txt.yml +10 -0
- data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-zero.yml +10 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/srv-service-name.yml +11 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-conflicts_with_replicaSet-txt.yml +5 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-conflicts_with_replicaSet.yml +5 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-equal_to_srv_records.yml +16 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-greater_than_srv_records.yml +15 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-less_than_srv_records.yml +15 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-zero-txt.yml +15 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-zero.yml +15 -0
- data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-equal_to_srv_records.yml +13 -0
- data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-greater_than_srv_records.yml +12 -0
- data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-less_than_srv_records.yml +10 -0
- data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-zero.yml +11 -0
- data/spec/spec_tests/data/server_selection/Unknown/read/ghost.yml +11 -0
- data/spec/spec_tests/data/server_selection/Unknown/write/ghost.yml +11 -0
- data/spec/spec_tests/data/sessions_unified/driver-sessions-server-support.yml +123 -0
- data/spec/spec_tests/data/sessions_unified/snapshot-sessions-not-supported-client-error.yml +9 -3
- data/spec/spec_tests/data/transactions/error-labels.yml +1 -1
- data/spec/spec_tests/data/transactions/errors-client.yml +8 -9
- data/spec/spec_tests/data/transactions/mongos-recovery-token.yml +1 -1
- data/spec/spec_tests/data/transactions/retryable-abort-errorLabels.yml +0 -2
- data/spec/spec_tests/data/transactions/retryable-abort.yml +7 -9
- data/spec/spec_tests/data/transactions/retryable-commit-errorLabels.yml +0 -2
- data/spec/spec_tests/data/transactions/retryable-commit.yml +7 -9
- data/spec/spec_tests/data/transactions/retryable-writes.yml +0 -2
- data/spec/spec_tests/data/transactions_unified/do-not-retry-read-in-transaction.yml +64 -0
- data/spec/spec_tests/data/transactions_unified/retryable-abort-handshake.yml +118 -0
- data/spec/spec_tests/data/transactions_unified/retryable-commit-handshake.yml +118 -0
- data/spec/spec_tests/data/unified/invalid/expectedEventsForClient-ignoreExtraEvents-type.yml +15 -0
- data/spec/spec_tests/data/unified/valid-fail/operation-unsupported.yml +13 -0
- data/spec/spec_tests/data/unified/valid-pass/expectedEventsForClient-ignoreExtraEvents.yml +78 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-change-streams.yml +4 -1
- data/spec/spec_tests/data/unified/valid-pass/poc-command-monitoring.yml +3 -3
- data/spec/spec_tests/data/unified/valid-pass/poc-transactions.yml +3 -2
- data/spec/spec_tests/data/uri_options/srv-options.yml +96 -0
- data/spec/spec_tests/data/versioned_api/crud-api-version-1-strict.yml +6 -4
- data/spec/spec_tests/data/versioned_api/crud-api-version-1.yml +7 -5
- data/spec/spec_tests/gridfs_unified_spec.rb +13 -0
- data/spec/spec_tests/retryable_reads_spec.rb +4 -1
- data/spec/spec_tests/retryable_reads_unified_spec.rb +22 -0
- data/spec/spec_tests/retryable_writes_spec.rb +4 -1
- data/spec/spec_tests/retryable_writes_unified_spec.rb +21 -0
- data/spec/spec_tests/seed_list_discovery_spec.rb +10 -1
- data/spec/spec_tests/unified_spec.rb +6 -1
- data/spec/stress/connection_pool_timing_spec.rb +3 -2
- data/spec/stress/fork_reconnect_stress_spec.rb +3 -2
- data/spec/support/authorization.rb +1 -1
- data/spec/support/background_thread_registry.rb +3 -13
- data/spec/support/certificates/retrieve-atlas-cert +38 -0
- data/spec/support/cluster_tools.rb +1 -1
- data/spec/support/common_shortcuts.rb +22 -0
- data/spec/support/crypt/corpus/corpus-encrypted.json +9515 -0
- data/spec/support/crypt/corpus/corpus-key-aws.json +32 -32
- data/spec/support/crypt/corpus/corpus-key-azure.json +33 -0
- data/spec/support/crypt/corpus/corpus-key-gcp.json +35 -0
- data/spec/support/crypt/corpus/corpus-key-kmip.json +32 -0
- data/spec/support/crypt/corpus/corpus-key-local.json +30 -30
- data/spec/support/crypt/corpus/corpus-schema.json +4399 -121
- data/spec/support/crypt/corpus/corpus.json +4999 -37
- data/spec/support/crypt/data_keys/key_document_azure.json +33 -0
- data/spec/support/crypt/data_keys/key_document_gcp.json +37 -0
- data/spec/support/crypt/data_keys/key_document_kmip.json +32 -0
- data/spec/support/crypt/encryptedFields.json +33 -0
- data/spec/support/crypt/keys/key1-document.json +30 -0
- data/spec/support/crypt/schema_maps/schema_map_azure.json +17 -0
- data/spec/support/crypt/schema_maps/schema_map_azure_key_alt_names.json +12 -0
- data/spec/support/crypt/schema_maps/schema_map_gcp.json +17 -0
- data/spec/support/crypt/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
- data/spec/support/crypt/schema_maps/schema_map_kmip.json +17 -0
- data/spec/support/crypt/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
- data/spec/support/crypt.rb +258 -13
- data/spec/support/macros.rb +28 -0
- data/spec/support/mongos_macros.rb +17 -0
- data/spec/support/shared/scram_conversation.rb +2 -1
- data/spec/support/shared/session.rb +13 -7
- data/spec/support/spec_config.rb +90 -1
- data/spec/support/utils.rb +25 -4
- data.tar.gz.sig +0 -0
- metadata +604 -290
- metadata.gz.sig +0 -0
- data/lib/mongo/operation/delete/legacy.rb +0 -64
- data/lib/mongo/operation/insert/legacy.rb +0 -68
- data/lib/mongo/operation/update/legacy/result.rb +0 -112
- data/lib/mongo/operation/update/legacy.rb +0 -76
- data/spec/mongo/dbref_spec.rb +0 -152
- data/spec/mongo/operation/kill_cursors_spec.rb +0 -47
- data/spec/spec_tests/change_streams_spec.rb +0 -93
- data/spec/spec_tests/command_monitoring_spec.rb +0 -71
- data/spec/spec_tests/data/change_streams/change-streams-errors.yml +0 -101
- data/spec/spec_tests/data/change_streams/change-streams-resume-allowlist.yml +0 -1173
- data/spec/spec_tests/data/change_streams/change-streams-resume-errorLabels.yml +0 -1105
- data/spec/spec_tests/data/change_streams/change-streams.yml +0 -535
- data/spec/spec_tests/data/command_monitoring/bulkWrite.yml +0 -49
- data/spec/spec_tests/data/command_monitoring/command.yml +0 -61
- data/spec/spec_tests/data/command_monitoring/deleteMany.yml +0 -55
- data/spec/spec_tests/data/command_monitoring/deleteOne.yml +0 -55
- data/spec/spec_tests/data/command_monitoring/find.yml +0 -266
- data/spec/spec_tests/data/command_monitoring/insertMany.yml +0 -75
- data/spec/spec_tests/data/command_monitoring/insertOne.yml +0 -51
- data/spec/spec_tests/data/command_monitoring/unacknowledgedBulkWrite.yml +0 -34
- data/spec/spec_tests/data/command_monitoring/updateMany.yml +0 -65
- data/spec/spec_tests/data/command_monitoring/updateOne.yml +0 -90
- data/spec/spec_tests/data/crud_v2/aggregate-merge.yml +0 -103
- data/spec/spec_tests/data/crud_v2/aggregate-out-readConcern.yml +0 -111
- data/spec/spec_tests/data/crud_v2/bulkWrite-arrayFilters.yml +0 -103
- data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint-clientError.yml +0 -63
- data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint-serverError.yml +0 -92
- data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint.yml +0 -103
- data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint-clientError.yml +0 -90
- data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint-serverError.yml +0 -147
- data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint.yml +0 -164
- data/spec/spec_tests/data/crud_v2/db-aggregate.yml +0 -39
- data/spec/spec_tests/data/crud_v2/deleteMany-hint-clientError.yml +0 -43
- data/spec/spec_tests/data/crud_v2/deleteMany-hint-serverError.yml +0 -62
- data/spec/spec_tests/data/crud_v2/deleteMany-hint.yml +0 -58
- data/spec/spec_tests/data/crud_v2/deleteOne-hint-clientError.yml +0 -41
- data/spec/spec_tests/data/crud_v2/deleteOne-hint-serverError.yml +0 -60
- data/spec/spec_tests/data/crud_v2/deleteOne-hint.yml +0 -57
- data/spec/spec_tests/data/crud_v2/find-allowdiskuse-clientError.yml +0 -28
- data/spec/spec_tests/data/crud_v2/find-allowdiskuse-serverError.yml +0 -44
- data/spec/spec_tests/data/crud_v2/find-allowdiskuse.yml +0 -50
- data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint-clientError.yml +0 -45
- data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint-serverError.yml +0 -60
- data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint.yml +0 -56
- data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint-clientError.yml +0 -40
- data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint-serverError.yml +0 -59
- data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint.yml +0 -55
- data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint-clientError.yml +0 -40
- data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint-serverError.yml +0 -58
- data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint.yml +0 -55
- data/spec/spec_tests/data/crud_v2/replaceOne-hint.yml +0 -61
- data/spec/spec_tests/data/crud_v2/unacknowledged-bulkWrite-delete-hint-clientError.yml +0 -60
- data/spec/spec_tests/data/crud_v2/unacknowledged-bulkWrite-update-hint-clientError.yml +0 -88
- data/spec/spec_tests/data/crud_v2/unacknowledged-deleteMany-hint-clientError.yml +0 -40
- data/spec/spec_tests/data/crud_v2/unacknowledged-deleteOne-hint-clientError.yml +0 -38
- data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndDelete-hint-clientError.yml +0 -42
- data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndReplace-hint-clientError.yml +0 -40
- data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndUpdate-hint-clientError.yml +0 -40
- data/spec/spec_tests/data/crud_v2/unacknowledged-replaceOne-hint-clientError.yml +0 -40
- data/spec/spec_tests/data/crud_v2/unacknowledged-updateMany-hint-clientError.yml +0 -43
- data/spec/spec_tests/data/crud_v2/unacknowledged-updateOne-hint-clientError.yml +0 -40
- data/spec/spec_tests/data/crud_v2/updateMany-hint-clientError.yml +0 -45
- data/spec/spec_tests/data/crud_v2/updateMany-hint-serverError.yml +0 -66
- data/spec/spec_tests/data/crud_v2/updateMany-hint.yml +0 -65
- data/spec/spec_tests/data/crud_v2/updateOne-hint-clientError.yml +0 -43
- data/spec/spec_tests/data/crud_v2/updateOne-hint-serverError.yml +0 -62
- data/spec/spec_tests/data/crud_v2/updateOne-hint.yml +0 -61
- data/spec/spec_tests/data/crud_v2/updateWithPipelines.yml +0 -157
- data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-4.9.yml +0 -60
- data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-serverErrors-4.9.yml +0 -146
- data/spec/support/crypt/corpus/corpus_encrypted.json +0 -4152
- data/spec/support/session_registry.rb +0 -55
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
# encoding: utf-8
|
|
3
|
+
|
|
4
|
+
# Copyright (C) 2014-2022 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
|
+
class Collection
|
|
20
|
+
# This module contains methods for creating and dropping auxiliary collections
|
|
21
|
+
# for queryable encryption.
|
|
22
|
+
#
|
|
23
|
+
# @api private
|
|
24
|
+
module QueryableEncryption
|
|
25
|
+
|
|
26
|
+
# Creates auxiliary collections and indices for queryable encryption if necessary.
|
|
27
|
+
#
|
|
28
|
+
# @param [ Hash | nil ] encrypted_fields Encrypted fields hash that was
|
|
29
|
+
# provided to `create` collection helper.
|
|
30
|
+
# @param [ Client ] client Mongo client to be used to create auxiliary collections.
|
|
31
|
+
# @param [ Session ] session Session to be used to create auxiliary collections.
|
|
32
|
+
#
|
|
33
|
+
# @return [ Result ] The result of provided block.
|
|
34
|
+
def maybe_create_qe_collections(encrypted_fields, client, session)
|
|
35
|
+
encrypted_fields = if encrypted_fields
|
|
36
|
+
encrypted_fields
|
|
37
|
+
elsif encrypted_fields_map
|
|
38
|
+
encrypted_fields_map[namespace] || {}
|
|
39
|
+
else
|
|
40
|
+
{}
|
|
41
|
+
end
|
|
42
|
+
if encrypted_fields.empty?
|
|
43
|
+
return yield
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
emm_collections(encrypted_fields).each do |coll|
|
|
47
|
+
context = Operation::Context.new(client: client, session: session)
|
|
48
|
+
Operation::Create.new(
|
|
49
|
+
selector: {
|
|
50
|
+
create: coll,
|
|
51
|
+
clusteredIndex: {
|
|
52
|
+
key: {
|
|
53
|
+
_id: 1
|
|
54
|
+
},
|
|
55
|
+
unique: true
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
db_name: database.name,
|
|
59
|
+
).execute(next_primary(nil, session), context: context)
|
|
60
|
+
end
|
|
61
|
+
yield(encrypted_fields).tap do |result|
|
|
62
|
+
indexes.create_one(__safeContent__: 1) if result
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# Drops auxiliary collections and indices for queryable encryption if necessary.
|
|
67
|
+
#
|
|
68
|
+
# @param [ Hash | nil ] encrypted_fields Encrypted fields hash that was
|
|
69
|
+
# provided to `create` collection helper.
|
|
70
|
+
# @param [ Client ] client Mongo client to be used to drop auxiliary collections.
|
|
71
|
+
# @param [ Session ] session Session to be used to drop auxiliary collections.
|
|
72
|
+
#
|
|
73
|
+
# @return [ Result ] The result of provided block.
|
|
74
|
+
def maybe_drop_emm_collections(encrypted_fields, client, session)
|
|
75
|
+
encrypted_fields = if encrypted_fields
|
|
76
|
+
encrypted_fields
|
|
77
|
+
elsif encrypted_fields_map
|
|
78
|
+
if encrypted_fields_map[namespace]
|
|
79
|
+
encrypted_fields_map[namespace]
|
|
80
|
+
else
|
|
81
|
+
database.list_collections(filter: { name: name })
|
|
82
|
+
.first
|
|
83
|
+
&.fetch(:options, {})
|
|
84
|
+
&.fetch(:encryptedFields, {}) || {}
|
|
85
|
+
end
|
|
86
|
+
else
|
|
87
|
+
{}
|
|
88
|
+
end
|
|
89
|
+
if encrypted_fields.empty?
|
|
90
|
+
return yield
|
|
91
|
+
end
|
|
92
|
+
emm_collections(encrypted_fields).each do |coll|
|
|
93
|
+
context = Operation::Context.new(client: client, session: session)
|
|
94
|
+
operation = Operation::Drop.new(
|
|
95
|
+
selector: { drop: coll },
|
|
96
|
+
db_name: database.name,
|
|
97
|
+
session: session,
|
|
98
|
+
)
|
|
99
|
+
do_drop(operation, session, context)
|
|
100
|
+
end
|
|
101
|
+
yield
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
private
|
|
105
|
+
|
|
106
|
+
# Checks if names for auxiliary collections are set and returns them,
|
|
107
|
+
# otherwise returns default names.
|
|
108
|
+
#
|
|
109
|
+
# @param [ Hash ] encrypted_fields Encrypted fields hash.
|
|
110
|
+
#
|
|
111
|
+
# @return [ Array <String> ] Array of auxiliary collections names.
|
|
112
|
+
def emm_collections(encrypted_fields)
|
|
113
|
+
[
|
|
114
|
+
encrypted_fields['escCollection'] || "enxcol_.#{name}.esc",
|
|
115
|
+
encrypted_fields['eccCollection'] || "enxcol_.#{name}.ecc",
|
|
116
|
+
encrypted_fields['ecocCollection'] || "enxcol_.#{name}.ecoc",
|
|
117
|
+
]
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
end
|
|
@@ -80,7 +80,8 @@ module Mongo
|
|
|
80
80
|
# @option options [ true, false ] :bypass_document_validation Whether or
|
|
81
81
|
# not to skip document level validation.
|
|
82
82
|
# @option options [ Hash ] :collation The collation to use.
|
|
83
|
-
# @option options [
|
|
83
|
+
# @option options [ Object ] :comment A user-provided
|
|
84
|
+
# comment to attach to this command.
|
|
84
85
|
# @option options [ String ] :hint The index to use for the aggregation.
|
|
85
86
|
# @option options [ Hash ] :let Mapping of variables to use in the pipeline.
|
|
86
87
|
# See the server documentation for details.
|
|
@@ -96,6 +97,9 @@ module Mongo
|
|
|
96
97
|
def initialize(view, pipeline, options = {})
|
|
97
98
|
@view = view
|
|
98
99
|
@pipeline = pipeline.dup
|
|
100
|
+
unless Mongo.broken_view_aggregate || view.filter.empty?
|
|
101
|
+
@pipeline.unshift(:$match => view.filter)
|
|
102
|
+
end
|
|
99
103
|
@options = BSON::Document.new(options).freeze
|
|
100
104
|
end
|
|
101
105
|
|
|
@@ -127,7 +131,7 @@ module Mongo
|
|
|
127
131
|
@view.send(:server_selector)
|
|
128
132
|
end
|
|
129
133
|
|
|
130
|
-
def aggregate_spec(
|
|
134
|
+
def aggregate_spec(session, read_preference)
|
|
131
135
|
Builder::Aggregation.new(
|
|
132
136
|
pipeline,
|
|
133
137
|
view,
|
|
@@ -139,34 +143,35 @@ module Mongo
|
|
|
139
143
|
Aggregation.new(view, pipeline, options)
|
|
140
144
|
end
|
|
141
145
|
|
|
142
|
-
def initial_query_op(
|
|
143
|
-
Operation::Aggregate.new(aggregate_spec(
|
|
146
|
+
def initial_query_op(session, read_preference)
|
|
147
|
+
Operation::Aggregate.new(aggregate_spec(session, read_preference))
|
|
144
148
|
end
|
|
145
149
|
|
|
146
150
|
# Return effective read preference for the operation.
|
|
147
151
|
#
|
|
148
152
|
# If the pipeline contains $merge or $out, and read preference specified
|
|
149
|
-
# by user is secondary or secondary_preferred, and
|
|
153
|
+
# by user is secondary or secondary_preferred, and target server is below
|
|
150
154
|
# 5.0, than this method returns primary read preference, because the
|
|
151
155
|
# aggregation will be routed to primary. Otherwise return the original
|
|
152
156
|
# read preference.
|
|
153
157
|
#
|
|
154
158
|
# See https://github.com/mongodb/specifications/blob/master/source/crud/crud.rst#read-preferences-and-server-selection
|
|
155
159
|
#
|
|
156
|
-
# @param [ Server ]
|
|
157
|
-
#
|
|
160
|
+
# @param [ Server::Connection ] connection The connection which
|
|
161
|
+
# will be used for the operation.
|
|
158
162
|
# @return [ Hash | nil ] read preference hash that should be sent with
|
|
159
163
|
# this command.
|
|
160
|
-
def effective_read_preference(
|
|
164
|
+
def effective_read_preference(connection)
|
|
161
165
|
return unless view.read_preference
|
|
162
166
|
return view.read_preference unless write?
|
|
163
167
|
return view.read_preference unless [:secondary, :secondary_preferred].include?(view.read_preference[:mode])
|
|
164
168
|
|
|
165
169
|
primary_read_preference = {mode: :primary}
|
|
166
|
-
|
|
170
|
+
description = connection.description
|
|
171
|
+
if description.primary?
|
|
167
172
|
log_warn("Routing the Aggregation operation to the primary server")
|
|
168
173
|
primary_read_preference
|
|
169
|
-
elsif
|
|
174
|
+
elsif description.mongos? && !description.features.merge_out_on_secondary_enabled?
|
|
170
175
|
log_warn("Routing the Aggregation operation to the primary server")
|
|
171
176
|
primary_read_preference
|
|
172
177
|
else
|
|
@@ -176,14 +181,15 @@ module Mongo
|
|
|
176
181
|
end
|
|
177
182
|
|
|
178
183
|
def send_initial_query(server, session)
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
184
|
+
server.with_connection do |connection|
|
|
185
|
+
initial_query_op(
|
|
186
|
+
session,
|
|
187
|
+
effective_read_preference(connection)
|
|
188
|
+
).execute_with_connection(
|
|
189
|
+
connection,
|
|
185
190
|
context: Operation::Context.new(client: client, session: session)
|
|
186
191
|
)
|
|
192
|
+
end
|
|
187
193
|
end
|
|
188
194
|
|
|
189
195
|
# Skip, sort, limit, projection are specified as pipeline stages
|
|
@@ -70,10 +70,35 @@ module Mongo
|
|
|
70
70
|
# @param [ Array<Hash> ] pipeline The pipeline of operators to filter the change notifications.
|
|
71
71
|
# @param [ Hash ] options The change stream options.
|
|
72
72
|
#
|
|
73
|
-
# @option options [ String ] :full_document Allowed values:
|
|
74
|
-
#
|
|
75
|
-
#
|
|
76
|
-
#
|
|
73
|
+
# @option options [ String ] :full_document Allowed values: nil, 'default',
|
|
74
|
+
# 'updateLookup', 'whenAvailable', 'required'.
|
|
75
|
+
#
|
|
76
|
+
# The default is to not send a value (i.e. nil), which is equivalent to
|
|
77
|
+
# 'default'. By default, the change notification for partial updates will
|
|
78
|
+
# include a delta describing the changes to the document.
|
|
79
|
+
#
|
|
80
|
+
# When set to 'updateLookup', the change notification for partial updates
|
|
81
|
+
# will include both a delta describing the changes to the document as well
|
|
82
|
+
# as a copy of the entire document that was changed from some time after
|
|
83
|
+
# the change occurred.
|
|
84
|
+
#
|
|
85
|
+
# When set to 'whenAvailable', configures the change stream to return the
|
|
86
|
+
# post-image of the modified document for replace and update change events
|
|
87
|
+
# if the post-image for this event is available.
|
|
88
|
+
#
|
|
89
|
+
# When set to 'required', the same behavior as 'whenAvailable' except that
|
|
90
|
+
# an error is raised if the post-image is not available.
|
|
91
|
+
# @option options [ String ] :full_document_before_change Allowed values: nil,
|
|
92
|
+
# 'whenAvailable', 'required', 'off'.
|
|
93
|
+
#
|
|
94
|
+
# The default is to not send a value (i.e. nil), which is equivalent to 'off'.
|
|
95
|
+
#
|
|
96
|
+
# When set to 'whenAvailable', configures the change stream to return the
|
|
97
|
+
# pre-image of the modified document for replace, update, and delete change
|
|
98
|
+
# events if it is available.
|
|
99
|
+
#
|
|
100
|
+
# When set to 'required', the same behavior as 'whenAvailable' except that
|
|
101
|
+
# an error is raised if the pre-image is not available.
|
|
77
102
|
# @option options [ BSON::Document, Hash ] :resume_after Specifies the logical starting point for the
|
|
78
103
|
# new change stream.
|
|
79
104
|
# @option options [ Integer ] :max_await_time_ms The maximum amount of time for the server to wait
|
|
@@ -88,6 +113,13 @@ module Mongo
|
|
|
88
113
|
# option takes a resume token and starts a new change stream returning the first
|
|
89
114
|
# notification after the token. This will allow users to watch collections that have been
|
|
90
115
|
# dropped and recreated or newly renamed collections without missing any notifications.
|
|
116
|
+
# @option options [ Object ] :comment A user-provided
|
|
117
|
+
# comment to attach to this command.
|
|
118
|
+
# @option options [ Boolean ] :show_expanded_events Enables the server to
|
|
119
|
+
# send the 'expanded' list of change stream events. The list of additional
|
|
120
|
+
# events included with this flag set are: createIndexes, dropIndexes,
|
|
121
|
+
# modify, create, shardCollection, reshardCollection,
|
|
122
|
+
# refineCollectionShardKey.
|
|
91
123
|
#
|
|
92
124
|
# The server will report an error if `startAfter` and `resumeAfter` are both specified.
|
|
93
125
|
#
|
|
@@ -275,20 +307,22 @@ module Mongo
|
|
|
275
307
|
start_at_operation_time = nil
|
|
276
308
|
start_at_operation_time_supported = nil
|
|
277
309
|
@cursor = read_with_retry_cursor(session, server_selector, view) do |server|
|
|
278
|
-
|
|
310
|
+
server.with_connection do |connection|
|
|
311
|
+
start_at_operation_time_supported = connection.description.server_version_gte?('4.0')
|
|
279
312
|
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
313
|
+
result = send_initial_query(connection, session)
|
|
314
|
+
if doc = result.replies.first && result.replies.first.documents.first
|
|
315
|
+
start_at_operation_time = doc['operationTime']
|
|
316
|
+
else
|
|
317
|
+
# The above may set @start_at_operation_time to nil
|
|
318
|
+
# if it was not in the document for some reason,
|
|
319
|
+
# for consistency set it to nil here as well.
|
|
320
|
+
# NB: since this block may be executed more than once, each
|
|
321
|
+
# execution must write to start_at_operation_time either way.
|
|
322
|
+
start_at_operation_time = nil
|
|
323
|
+
end
|
|
324
|
+
result
|
|
290
325
|
end
|
|
291
|
-
result
|
|
292
326
|
end
|
|
293
327
|
@start_at_operation_time = start_at_operation_time
|
|
294
328
|
@start_at_operation_time_supported = start_at_operation_time_supported
|
|
@@ -298,8 +332,8 @@ module Mongo
|
|
|
298
332
|
[{ '$changeStream' => change_doc }] + @change_stream_filters
|
|
299
333
|
end
|
|
300
334
|
|
|
301
|
-
def aggregate_spec(
|
|
302
|
-
super(
|
|
335
|
+
def aggregate_spec(session, read_preference)
|
|
336
|
+
super(session, read_preference).tap do |spec|
|
|
303
337
|
spec[:selector][:aggregate] = 1 unless for_collection?
|
|
304
338
|
end
|
|
305
339
|
end
|
|
@@ -310,6 +344,14 @@ module Mongo
|
|
|
310
344
|
doc[:fullDocument] = @options[:full_document]
|
|
311
345
|
end
|
|
312
346
|
|
|
347
|
+
if @options[:full_document_before_change]
|
|
348
|
+
doc[:fullDocumentBeforeChange] = @options[:full_document_before_change]
|
|
349
|
+
end
|
|
350
|
+
|
|
351
|
+
if @options.key?(:show_expanded_events)
|
|
352
|
+
doc[:showExpandedEvents] = @options[:show_expanded_events]
|
|
353
|
+
end
|
|
354
|
+
|
|
313
355
|
if resuming?
|
|
314
356
|
# We have a resume token once we retrieved any documents.
|
|
315
357
|
# However, if the first getMore fails and the user didn't pass
|
|
@@ -348,11 +390,11 @@ module Mongo
|
|
|
348
390
|
end
|
|
349
391
|
end
|
|
350
392
|
|
|
351
|
-
def send_initial_query(
|
|
352
|
-
initial_query_op(
|
|
353
|
-
.
|
|
354
|
-
|
|
355
|
-
context: Operation::Context.new(client: client, session: session)
|
|
393
|
+
def send_initial_query(connection, session)
|
|
394
|
+
initial_query_op(session, view.read_preference)
|
|
395
|
+
.execute_with_connection(
|
|
396
|
+
connection,
|
|
397
|
+
context: Operation::Context.new(client: client, session: session),
|
|
356
398
|
)
|
|
357
399
|
end
|
|
358
400
|
|
|
@@ -53,7 +53,7 @@ module Mongo
|
|
|
53
53
|
#
|
|
54
54
|
# @return [ Hash ] A single document with the query plan.
|
|
55
55
|
#
|
|
56
|
-
# @see https://
|
|
56
|
+
# @see https://mongodb.com/docs/manual/reference/method/db.collection.explain/#db.collection.explain
|
|
57
57
|
#
|
|
58
58
|
# @since 2.0.0
|
|
59
59
|
def explain(**opts)
|
|
@@ -149,7 +149,7 @@ module Mongo
|
|
|
149
149
|
}
|
|
150
150
|
end
|
|
151
151
|
|
|
152
|
-
def initial_query_op(
|
|
152
|
+
def initial_query_op(session)
|
|
153
153
|
spec = {
|
|
154
154
|
coll_name: collection.name,
|
|
155
155
|
filter: filter,
|
|
@@ -194,7 +194,7 @@ module Mongo
|
|
|
194
194
|
end
|
|
195
195
|
|
|
196
196
|
def send_initial_query(server, session = nil)
|
|
197
|
-
initial_query_op(
|
|
197
|
+
initial_query_op(session).execute(server, context: Operation::Context.new(client: client, session: session))
|
|
198
198
|
end
|
|
199
199
|
|
|
200
200
|
def use_query_cache?
|
|
@@ -72,7 +72,7 @@ module Mongo
|
|
|
72
72
|
@cursor = nil
|
|
73
73
|
session = client.send(:get_session, @options)
|
|
74
74
|
server = cluster.next_primary(nil, session)
|
|
75
|
-
result = send_initial_query(server, session)
|
|
75
|
+
result = send_initial_query(server, session, context: Operation::Context.new(client: client, session: session))
|
|
76
76
|
result = send_fetch_query(server, session) unless inline?
|
|
77
77
|
@cursor = Cursor.new(view, result, server, session: session)
|
|
78
78
|
if block_given?
|
|
@@ -223,8 +223,9 @@ module Mongo
|
|
|
223
223
|
def execute
|
|
224
224
|
view.send(:with_session, @options) do |session|
|
|
225
225
|
write_concern = view.write_concern_with_session(session)
|
|
226
|
-
|
|
227
|
-
|
|
226
|
+
context = Operation::Context.new(client: client, session: session)
|
|
227
|
+
nro_write_with_retry(write_concern, context: context) do |connection, txn_num, context|
|
|
228
|
+
send_initial_query_with_connection(connection, session, context: context)
|
|
228
229
|
end
|
|
229
230
|
end
|
|
230
231
|
end
|
|
@@ -266,11 +267,10 @@ module Mongo
|
|
|
266
267
|
Operation::MapReduce.new(spec)
|
|
267
268
|
end
|
|
268
269
|
|
|
269
|
-
def valid_server?(
|
|
270
|
+
def valid_server?(description)
|
|
270
271
|
if secondary_ok?
|
|
271
272
|
true
|
|
272
273
|
else
|
|
273
|
-
description = server.description
|
|
274
274
|
description.standalone? || description.mongos? || description.primary? || description.load_balancer?
|
|
275
275
|
end
|
|
276
276
|
end
|
|
@@ -279,13 +279,22 @@ module Mongo
|
|
|
279
279
|
out.respond_to?(:keys) && out.keys.first.to_s.downcase == INLINE
|
|
280
280
|
end
|
|
281
281
|
|
|
282
|
-
def send_initial_query(server, session)
|
|
283
|
-
|
|
284
|
-
|
|
282
|
+
def send_initial_query(server, session, context:)
|
|
283
|
+
server.with_connection do |connection|
|
|
284
|
+
send_initial_query_with_connection(connection, session, context: context)
|
|
285
|
+
end
|
|
286
|
+
end
|
|
287
|
+
|
|
288
|
+
def send_initial_query_with_connection(connection, session, context:)
|
|
289
|
+
op = initial_query_op(session)
|
|
290
|
+
if valid_server?(connection.description)
|
|
291
|
+
op.execute_with_connection(connection, context: context)
|
|
292
|
+
else
|
|
293
|
+
msg = "Rerouting the MapReduce operation to the primary server - #{connection.address} is not suitable because it is not currently the primray"
|
|
285
294
|
log_warn(msg)
|
|
286
295
|
server = cluster.next_primary(nil, session)
|
|
296
|
+
op.execute(server, context: context)
|
|
287
297
|
end
|
|
288
|
-
initial_query_op(session).execute(server, context: Operation::Context.new(client: client, session: session))
|
|
289
298
|
end
|
|
290
299
|
|
|
291
300
|
def fetch_query_spec
|
|
@@ -41,7 +41,8 @@ module Mongo
|
|
|
41
41
|
# @option options [ true, false ] :bypass_document_validation Whether or
|
|
42
42
|
# not to skip document level validation.
|
|
43
43
|
# @option options [ Hash ] :collation The collation to use.
|
|
44
|
-
# @option options [
|
|
44
|
+
# @option options [ Object ] :comment A user-provided
|
|
45
|
+
# comment to attach to this command.
|
|
45
46
|
# @option options [ String ] :hint The index to use for the aggregation.
|
|
46
47
|
# @option options [ Hash ] :let Mapping of variables to use in the pipeline.
|
|
47
48
|
# See the server documentation for details.
|
|
@@ -57,6 +58,7 @@ module Mongo
|
|
|
57
58
|
#
|
|
58
59
|
# @since 2.0.0
|
|
59
60
|
def aggregate(pipeline, options = {})
|
|
61
|
+
options = @options.merge(options) unless Mongo.broken_view_options
|
|
60
62
|
aggregation = Aggregation.new(self, pipeline, options)
|
|
61
63
|
|
|
62
64
|
# Because the $merge and $out pipeline stages write documents to the
|
|
@@ -127,7 +129,7 @@ module Mongo
|
|
|
127
129
|
# @note Set profilingLevel to 2 and the comment will be logged in the profile
|
|
128
130
|
# collection along with the query.
|
|
129
131
|
#
|
|
130
|
-
# @param [
|
|
132
|
+
# @param [ Object ] comment The comment to be associated with the query.
|
|
131
133
|
#
|
|
132
134
|
# @return [ String, View ] Either the comment or a
|
|
133
135
|
# new +View+.
|
|
@@ -153,6 +155,8 @@ module Mongo
|
|
|
153
155
|
# @option opts [ Hash ] :read The read preference options.
|
|
154
156
|
# @option opts [ Hash ] :collation The collation to use.
|
|
155
157
|
# @option opts [ Mongo::Session ] :session The session to use for the operation.
|
|
158
|
+
# @option opts [ Object ] :comment A user-provided
|
|
159
|
+
# comment to attach to this command.
|
|
156
160
|
#
|
|
157
161
|
# @return [ Integer ] The document count.
|
|
158
162
|
#
|
|
@@ -164,6 +168,7 @@ module Mongo
|
|
|
164
168
|
# * $near should be replaced with $geoWithin with $center
|
|
165
169
|
# * $nearSphere should be replaced with $geoWithin with $centerSphere
|
|
166
170
|
def count(opts = {})
|
|
171
|
+
opts = @options.merge(opts) unless Mongo.broken_view_options
|
|
167
172
|
cmd = { :count => collection.name, :query => filter }
|
|
168
173
|
cmd[:skip] = opts[:skip] if opts[:skip]
|
|
169
174
|
cmd[:hint] = opts[:hint] if opts[:hint]
|
|
@@ -187,6 +192,7 @@ module Mongo
|
|
|
187
192
|
# For some reason collation was historically accepted as a
|
|
188
193
|
# string key. Note that this isn't documented as valid usage.
|
|
189
194
|
collation: opts[:collation] || opts['collation'] || collation,
|
|
195
|
+
comment: opts[:comment],
|
|
190
196
|
).execute(server, context: Operation::Context.new(client: client, session: session))
|
|
191
197
|
end.n.to_i
|
|
192
198
|
end
|
|
@@ -207,17 +213,21 @@ module Mongo
|
|
|
207
213
|
# command to run.
|
|
208
214
|
# @option opts [ Hash ] :read The read preference options.
|
|
209
215
|
# @option opts [ Hash ] :collation The collation to use.
|
|
216
|
+
# @option opts [ Mongo::Session ] :session The session to use for the operation.
|
|
217
|
+
# @option ops [ Object ] :comment A user-provided
|
|
218
|
+
# comment to attach to this command.
|
|
210
219
|
#
|
|
211
220
|
# @return [ Integer ] The document count.
|
|
212
221
|
#
|
|
213
222
|
# @since 2.6.0
|
|
214
223
|
def count_documents(opts = {})
|
|
224
|
+
opts = @options.merge(opts) unless Mongo.broken_view_options
|
|
215
225
|
pipeline = [:'$match' => filter]
|
|
216
226
|
pipeline << { :'$skip' => opts[:skip] } if opts[:skip]
|
|
217
227
|
pipeline << { :'$limit' => opts[:limit] } if opts[:limit]
|
|
218
228
|
pipeline << { :'$group' => { _id: 1, n: { :'$sum' => 1 } } }
|
|
219
229
|
|
|
220
|
-
opts = opts.
|
|
230
|
+
opts = opts.slice(:hint, :max_time_ms, :read, :collation, :session, :comment)
|
|
221
231
|
opts[:collation] ||= collation
|
|
222
232
|
|
|
223
233
|
first = aggregate(pipeline, opts).first
|
|
@@ -235,6 +245,8 @@ module Mongo
|
|
|
235
245
|
# @option opts :max_time_ms [ Integer ] The maximum amount of time to allow the command to
|
|
236
246
|
# run.
|
|
237
247
|
# @option opts [ Hash ] :read The read preference options.
|
|
248
|
+
# @option opts [ Object ] :comment A user-provided
|
|
249
|
+
# comment to attach to this command.
|
|
238
250
|
#
|
|
239
251
|
# @return [ Integer ] The document count.
|
|
240
252
|
#
|
|
@@ -245,46 +257,34 @@ module Mongo
|
|
|
245
257
|
end
|
|
246
258
|
|
|
247
259
|
%i[limit skip].each do |opt|
|
|
248
|
-
if
|
|
260
|
+
if options.key?(opt) || opts.key?(opt)
|
|
249
261
|
raise ArgumentError, "Cannot call estimated_document_count when querying with #{opt}"
|
|
250
262
|
end
|
|
251
263
|
end
|
|
252
264
|
|
|
265
|
+
opts = @options.merge(opts) unless Mongo.broken_view_options
|
|
253
266
|
Mongo::Lint.validate_underscore_read_preference(opts[:read])
|
|
254
267
|
read_pref = opts[:read] || read_preference
|
|
255
268
|
selector = ServerSelector.get(read_pref || server_selector)
|
|
256
269
|
with_session(opts) do |session|
|
|
257
270
|
read_with_retry(session, selector) do |server|
|
|
258
271
|
context = Operation::Context.new(client: client, session: session)
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
spec = Builder::Aggregation.new(
|
|
265
|
-
pipeline,
|
|
266
|
-
self,
|
|
267
|
-
options.merge(session: session)
|
|
268
|
-
).specification
|
|
269
|
-
result = Operation::Aggregate.new(spec).execute(server, context: context)
|
|
270
|
-
result.documents.first.fetch('n')
|
|
271
|
-
else
|
|
272
|
-
cmd = { count: collection.name }
|
|
273
|
-
cmd[:maxTimeMS] = opts[:max_time_ms] if opts[:max_time_ms]
|
|
274
|
-
if read_concern
|
|
275
|
-
cmd[:readConcern] = Options::Mapper.transform_values_to_strings(
|
|
276
|
-
read_concern)
|
|
272
|
+
cmd = { count: collection.name }
|
|
273
|
+
cmd[:maxTimeMS] = opts[:max_time_ms] if opts[:max_time_ms]
|
|
274
|
+
if read_concern
|
|
275
|
+
cmd[:readConcern] = Options::Mapper.transform_values_to_strings(
|
|
276
|
+
read_concern)
|
|
277
277
|
end
|
|
278
278
|
result = Operation::Count.new(
|
|
279
279
|
selector: cmd,
|
|
280
280
|
db_name: database.name,
|
|
281
281
|
read: read_pref,
|
|
282
282
|
session: session,
|
|
283
|
+
comment: opts[:comment],
|
|
283
284
|
).execute(server, context: context)
|
|
284
285
|
result.n.to_i
|
|
285
286
|
end
|
|
286
287
|
end
|
|
287
|
-
end
|
|
288
288
|
rescue Error::OperationFailure => exc
|
|
289
289
|
if exc.code == 26
|
|
290
290
|
# NamespaceNotFound
|
|
@@ -309,6 +309,8 @@ module Mongo
|
|
|
309
309
|
# command to run.
|
|
310
310
|
# @option opts [ Hash ] :read The read preference options.
|
|
311
311
|
# @option opts [ Hash ] :collation The collation to use.
|
|
312
|
+
# @option options [ Object ] :comment A user-provided
|
|
313
|
+
# comment to attach to this command.
|
|
312
314
|
#
|
|
313
315
|
# @return [ Array<Object> ] The list of distinct values.
|
|
314
316
|
#
|
|
@@ -317,9 +319,10 @@ module Mongo
|
|
|
317
319
|
if field_name.nil?
|
|
318
320
|
raise ArgumentError, 'Field name for distinct operation must be not nil'
|
|
319
321
|
end
|
|
322
|
+
opts = @options.merge(opts) unless Mongo.broken_view_options
|
|
320
323
|
cmd = { :distinct => collection.name,
|
|
321
324
|
:key => field_name.to_s,
|
|
322
|
-
:query => filter }
|
|
325
|
+
:query => filter, }
|
|
323
326
|
cmd[:maxTimeMS] = opts[:max_time_ms] if opts[:max_time_ms]
|
|
324
327
|
if read_concern
|
|
325
328
|
cmd[:readConcern] = Options::Mapper.transform_values_to_strings(
|
|
@@ -336,6 +339,7 @@ module Mongo
|
|
|
336
339
|
options: {:limit => -1},
|
|
337
340
|
read: read_pref,
|
|
338
341
|
session: session,
|
|
342
|
+
comment: opts[:comment],
|
|
339
343
|
# For some reason collation was historically accepted as a
|
|
340
344
|
# string key. Note that this isn't documented as valid usage.
|
|
341
345
|
collation: opts[:collation] || opts['collation'] || collation,
|
|
@@ -702,7 +706,7 @@ module Mongo
|
|
|
702
706
|
context = Operation::Context.new(
|
|
703
707
|
client: client,
|
|
704
708
|
session: session,
|
|
705
|
-
|
|
709
|
+
connection_global_id: result.connection_global_id,
|
|
706
710
|
)
|
|
707
711
|
result = op.execute(server, context: context)
|
|
708
712
|
Cursor.new(self, result, server, session: session)
|