mongo 2.17.3 → 2.18.0.beta1
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 +108 -28
- data/lib/mongo/client.rb +114 -12
- data/lib/mongo/client_encryption.rb +30 -9
- data/lib/mongo/cluster/reapers/cursor_reaper.rb +11 -1
- data/lib/mongo/cluster.rb +20 -24
- data/lib/mongo/collection/helpers.rb +43 -0
- data/lib/mongo/collection/queryable_encryption.rb +122 -0
- data/lib/mongo/collection/view/aggregation.rb +19 -16
- data/lib/mongo/collection/view/change_stream.rb +56 -23
- data/lib/mongo/collection/view/explainable.rb +1 -1
- data/lib/mongo/collection/view/iterable.rb +2 -3
- data/lib/mongo/collection/view/map_reduce.rb +18 -9
- data/lib/mongo/collection/view/readable.rb +19 -23
- data/lib/mongo/collection/view/writable.rb +133 -40
- data/lib/mongo/collection.rb +108 -48
- data/lib/mongo/config/options.rb +62 -0
- data/lib/mongo/config/validators/option.rb +26 -0
- data/lib/mongo/config.rb +31 -0
- data/lib/mongo/crypt/auto_encrypter.rb +79 -6
- data/lib/mongo/crypt/binding.rb +395 -143
- data/lib/mongo/crypt/context.rb +5 -2
- data/lib/mongo/crypt/data_key_context.rb +7 -104
- data/lib/mongo/crypt/encryption_io.rb +28 -60
- data/lib/mongo/crypt/explicit_encrypter.rb +27 -25
- data/lib/mongo/crypt/explicit_encryption_context.rb +31 -3
- data/lib/mongo/crypt/handle.rb +102 -79
- data/lib/mongo/crypt/hooks.rb +25 -2
- data/lib/mongo/crypt/kms/aws.rb +128 -0
- data/lib/mongo/crypt/kms/azure.rb +136 -0
- data/lib/mongo/crypt/kms/credentials.rb +81 -0
- data/lib/mongo/crypt/kms/gcp.rb +182 -0
- data/lib/mongo/crypt/kms/kmip.rb +110 -0
- data/lib/mongo/crypt/kms/local.rb +74 -0
- data/lib/mongo/crypt/kms/master_key_document.rb +65 -0
- data/lib/mongo/crypt/kms.rb +117 -0
- data/lib/mongo/crypt.rb +1 -0
- data/lib/mongo/cursor/kill_spec.rb +27 -6
- data/lib/mongo/cursor.rb +21 -16
- data/lib/mongo/database/view.rb +6 -3
- data/lib/mongo/database.rb +73 -12
- 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/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/index/view.rb +22 -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 +16 -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/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 +3 -7
- 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 +37 -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 +69 -42
- data/lib/mongo/server/description/features.rb +3 -1
- data/lib/mongo/server/description.rb +7 -2
- data/lib/mongo/server/monitor/connection.rb +5 -10
- data/lib/mongo/server/monitor.rb +21 -13
- data/lib/mongo/server/push_monitor.rb +9 -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 +20 -0
- data/mongo.gemspec +10 -4
- data/spec/README.md +5 -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 +0 -16
- data/spec/integration/change_stream_spec.rb +6 -5
- data/spec/integration/client_construction_spec.rb +1 -1
- 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 +18 -19
- 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/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 +394 -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/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 +1 -0
- data/spec/integration/query_cache_spec.rb +34 -30
- data/spec/integration/retryable_writes/retryable_writes_36_and_older_spec.rb +1 -1
- data/spec/integration/sdam_events_spec.rb +0 -40
- 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 +37 -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 +14 -5
- 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 +128 -20
- data/spec/mongo/client_construction_spec.rb +141 -7
- data/spec/mongo/client_encryption_spec.rb +11 -11
- 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 +2 -2
- data/spec/mongo/collection/view/change_stream_spec.rb +2 -2
- data/spec/mongo/collection/view/readable_spec.rb +35 -56
- data/spec/mongo/collection/view/writable_spec.rb +144 -32
- data/spec/mongo/collection_crud_spec.rb +63 -13
- 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 +106 -0
- data/spec/mongo/crypt/auto_encryption_context_spec.rb +17 -1
- data/spec/mongo/crypt/binding/context_spec.rb +99 -17
- data/spec/mongo/crypt/binding/mongocrypt_spec.rb +17 -46
- data/spec/mongo/crypt/binding/version_spec.rb +25 -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 +89 -1
- data/spec/mongo/crypt/handle_spec.rb +47 -169
- data/spec/mongo/crypt/hooks_spec.rb +30 -0
- data/spec/mongo/crypt/kms/credentials_spec.rb +404 -0
- data/spec/mongo/crypt/kms_spec.rb +59 -0
- data/spec/mongo/cursor_spec.rb +37 -51
- 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 +69 -0
- data/spec/mongo/operation/create/op_msg_spec.rb +286 -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 +94 -49
- 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 +15 -4
- 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 +3 -3
- data/spec/runners/crud/spec.rb +5 -0
- data/spec/runners/crud/verifier.rb +6 -0
- data/spec/runners/transactions/test.rb +33 -14
- data/spec/runners/transactions.rb +9 -6
- data/spec/runners/unified/assertions.rb +59 -10
- data/spec/runners/unified/change_stream_operations.rb +9 -0
- data/spec/runners/unified/crud_operations.rb +50 -2
- data/spec/runners/unified/ddl_operations.rb +20 -0
- data/spec/runners/unified/error.rb +2 -1
- data/spec/runners/unified/support_operations.rb +5 -2
- data/spec/runners/unified/test.rb +19 -4
- data/spec/runners/unified.rb +9 -2
- data/spec/shared/lib/mrss/constraints.rb +10 -17
- data/spec/shared/lib/mrss/docker_runner.rb +21 -3
- data/spec/shared/lib/mrss/lite_constraints.rb +32 -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 +40 -5
- data/spec/spec_helper.rb +0 -1
- 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 +1068 -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/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/updateMany.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/updateOne.yml +1 -8
- 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/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/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/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/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/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/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/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 +2 -1
- data/spec/stress/fork_reconnect_stress_spec.rb +3 -2
- data/spec/support/authorization.rb +1 -1
- data/spec/support/certificates/atlas-ocsp-ca.crt +47 -40
- data/spec/support/certificates/atlas-ocsp.crt +106 -101
- 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 +207 -6
- data/spec/support/macros.rb +18 -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 +82 -1
- data/spec/support/utils.rb +25 -4
- data.tar.gz.sig +0 -0
- metadata +1468 -1214
- 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/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/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
data/lib/mongo/session.rb
CHANGED
@@ -35,12 +35,23 @@ module Mongo
|
|
35
35
|
|
36
36
|
# Initialize a Session.
|
37
37
|
#
|
38
|
-
#
|
38
|
+
# A session can be explicit or implicit. Lifetime of explicit sessions is
|
39
|
+
# managed by the application - applications explicitry create such sessions
|
40
|
+
# and explicitly end them. Implicit sessions are created automatically by
|
41
|
+
# the driver when sending operations to servers that support sessions
|
42
|
+
# (3.6+), and their lifetime is managed by the driver.
|
43
|
+
#
|
44
|
+
# When an implicit session is created, it cannot have a server session
|
45
|
+
# associated with it. The server session will be checked out of the
|
46
|
+
# session pool when an operation using this session is actually executed.
|
47
|
+
# When an explicit session is created, it must reference a server session
|
48
|
+
# that is already allocated.
|
39
49
|
#
|
40
|
-
# @
|
41
|
-
#
|
50
|
+
# @note Applications should use Client#start_session to begin a session.
|
51
|
+
# This constructor is for internal driver use only.
|
42
52
|
#
|
43
|
-
# @param [ ServerSession ] server_session The server session this session is associated with.
|
53
|
+
# @param [ ServerSession | nil ] server_session The server session this session is associated with.
|
54
|
+
# If the :implicit option is true, this must be nil.
|
44
55
|
# @param [ Client ] client The client through which this session is created.
|
45
56
|
# @param [ Hash ] options The options for this session.
|
46
57
|
#
|
@@ -50,7 +61,9 @@ module Mongo
|
|
50
61
|
# to start_transaction by default, can contain any of the options that
|
51
62
|
# start_transaction accepts.
|
52
63
|
# @option options [ true|false ] :implicit For internal driver use only -
|
53
|
-
# specifies whether the session is implicit.
|
64
|
+
# specifies whether the session is implicit. If this is true, the server_session
|
65
|
+
# will be nil. This is done so that the server session is only checked
|
66
|
+
# out after the connection is checked out.
|
54
67
|
# @option options [ Hash ] :read_preference The read preference options hash,
|
55
68
|
# with the following optional keys:
|
56
69
|
# - *:mode* -- the read preference as a string or symbol; valid values are
|
@@ -66,11 +79,21 @@ module Mongo
|
|
66
79
|
raise ArgumentError, ':causal_consistency and :snapshot options cannot be both set on a session'
|
67
80
|
end
|
68
81
|
|
82
|
+
if options[:implicit]
|
83
|
+
unless server_session.nil?
|
84
|
+
raise ArgumentError, 'Implicit session cannot reference server session during construction'
|
85
|
+
end
|
86
|
+
else
|
87
|
+
if server_session.nil?
|
88
|
+
raise ArgumentError, 'Explicit session must reference server session during construction'
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
69
92
|
@server_session = server_session
|
70
93
|
options = options.dup
|
71
94
|
|
72
95
|
@client = client.use(:admin)
|
73
|
-
@options = options.freeze
|
96
|
+
@options = options.dup.freeze
|
74
97
|
@cluster_time = nil
|
75
98
|
@state = NO_TRANSACTION_STATE
|
76
99
|
end
|
@@ -160,11 +183,11 @@ module Mongo
|
|
160
183
|
# @return [ true, false ] If writes will be retried.
|
161
184
|
#
|
162
185
|
# @note Retryable writes are only available on server versions at least 3.6
|
163
|
-
# and with sharded clusters or
|
186
|
+
# and with sharded clusters, replica sets, or load-balanced topologies.
|
164
187
|
#
|
165
188
|
# @since 2.5.0
|
166
189
|
def retry_writes?
|
167
|
-
!!client.options[:retry_writes] && (cluster.replica_set? || cluster.sharded?)
|
190
|
+
!!client.options[:retry_writes] && (cluster.replica_set? || cluster.sharded? || cluster.load_balanced?)
|
168
191
|
end
|
169
192
|
|
170
193
|
# Get the read preference the session will use in the currently
|
@@ -194,23 +217,33 @@ module Mongo
|
|
194
217
|
#
|
195
218
|
# @since 2.5.0
|
196
219
|
def ended?
|
197
|
-
|
220
|
+
!!@ended
|
198
221
|
end
|
199
222
|
|
200
|
-
# Get the server session id of this session, if the session
|
201
|
-
# If the session
|
202
|
-
#
|
203
|
-
# @example Get the session id.
|
204
|
-
# session.session_id
|
223
|
+
# Get the server session id of this session, if the session has not been
|
224
|
+
# ended. If the session had been ended, raises Error::SessionEnded.
|
205
225
|
#
|
206
226
|
# @return [ BSON::Document ] The server session id.
|
207
227
|
#
|
228
|
+
# @raise [ Error::SessionEnded ] If the session had been ended.
|
229
|
+
#
|
208
230
|
# @since 2.5.0
|
209
231
|
def session_id
|
210
232
|
if ended?
|
211
233
|
raise Error::SessionEnded
|
212
234
|
end
|
213
235
|
|
236
|
+
# An explicit session will always have a session_id, because during
|
237
|
+
# construction a server session must be provided. An implicit session
|
238
|
+
# will not have a session_id until materialized, thus calls to
|
239
|
+
# session_id might fail. An application should not have an opportunity
|
240
|
+
# to experience this failure because an implicit session shouldn't be
|
241
|
+
# accessible to applications due to its lifetime being constrained to
|
242
|
+
# operation execution, which is done entirely by the driver.
|
243
|
+
unless materialized?
|
244
|
+
raise Error::SessionNotMaterialized
|
245
|
+
end
|
246
|
+
|
214
247
|
@server_session.session_id
|
215
248
|
end
|
216
249
|
|
@@ -220,11 +253,11 @@ module Mongo
|
|
220
253
|
# @api private
|
221
254
|
attr_reader :pinned_server
|
222
255
|
|
223
|
-
# @return [
|
256
|
+
# @return [ Integer | nil ] The connection global id that this session is pinned to,
|
224
257
|
# if any.
|
225
258
|
#
|
226
259
|
# @api private
|
227
|
-
attr_reader :
|
260
|
+
attr_reader :pinned_connection_global_id
|
228
261
|
|
229
262
|
# @return [ BSON::Document | nil ] Recovery token for the sharded
|
230
263
|
# transaction being executed on this session, if any.
|
@@ -325,10 +358,13 @@ module Mongo
|
|
325
358
|
rescue Mongo::Error, Error::AuthError
|
326
359
|
end
|
327
360
|
end
|
328
|
-
@
|
361
|
+
if @server_session
|
362
|
+
@client.cluster.session_pool.checkin(@server_session)
|
363
|
+
end
|
329
364
|
end
|
330
365
|
ensure
|
331
366
|
@server_session = nil
|
367
|
+
@ended = true
|
332
368
|
end
|
333
369
|
|
334
370
|
# Executes the provided block in a transaction, retrying as necessary.
|
@@ -591,8 +627,12 @@ module Mongo
|
|
591
627
|
if write_concern && !write_concern.is_a?(WriteConcern::Base)
|
592
628
|
write_concern = WriteConcern.get(write_concern)
|
593
629
|
end
|
594
|
-
|
595
|
-
|
630
|
+
|
631
|
+
context = Operation::Context.new(client: @client, session: self)
|
632
|
+
write_with_retry(write_concern, ending_transaction: true,
|
633
|
+
context: context,
|
634
|
+
) do |connection, txn_num, context|
|
635
|
+
if context.retry?
|
596
636
|
if write_concern
|
597
637
|
wco = write_concern.options.merge(w: :majority)
|
598
638
|
wco[:wtimeout] ||= 10000
|
@@ -608,7 +648,7 @@ module Mongo
|
|
608
648
|
txn_num: txn_num,
|
609
649
|
write_concern: write_concern,
|
610
650
|
}
|
611
|
-
Operation::Command.new(spec).
|
651
|
+
Operation::Command.new(spec).execute_with_connection(connection, context: context)
|
612
652
|
end
|
613
653
|
end
|
614
654
|
ensure
|
@@ -649,14 +689,17 @@ module Mongo
|
|
649
689
|
begin
|
650
690
|
unless starting_transaction?
|
651
691
|
@aborting_transaction = true
|
652
|
-
|
692
|
+
context = Operation::Context.new(client: @client, session: self)
|
693
|
+
write_with_retry(txn_options[:write_concern],
|
694
|
+
ending_transaction: true, context: context,
|
695
|
+
) do |connection, txn_num, context|
|
653
696
|
begin
|
654
697
|
Operation::Command.new(
|
655
698
|
selector: { abortTransaction: 1 },
|
656
699
|
db_name: 'admin',
|
657
700
|
session: self,
|
658
701
|
txn_num: txn_num
|
659
|
-
).
|
702
|
+
).execute_with_connection(connection, context: context)
|
660
703
|
ensure
|
661
704
|
unpin
|
662
705
|
end
|
@@ -730,27 +773,32 @@ module Mongo
|
|
730
773
|
@pinned_server = server
|
731
774
|
end
|
732
775
|
|
733
|
-
# Pins this session to the specified
|
776
|
+
# Pins this session to the specified connection.
|
734
777
|
#
|
735
|
-
# @param [
|
778
|
+
# @param [ Integer ] connection_global_id The global id of connection to pin
|
779
|
+
# this session to.
|
736
780
|
#
|
737
781
|
# @api private
|
738
|
-
def
|
739
|
-
if
|
740
|
-
raise ArgumentError, 'Cannot pin to a nil
|
782
|
+
def pin_to_connection(connection_global_id)
|
783
|
+
if connection_global_id.nil?
|
784
|
+
raise ArgumentError, 'Cannot pin to a nil connection id'
|
741
785
|
end
|
742
|
-
@
|
786
|
+
@pinned_connection_global_id = connection_global_id
|
743
787
|
end
|
744
788
|
|
745
|
-
# Unpins this session from the pinned server
|
789
|
+
# Unpins this session from the pinned server or connection,
|
790
|
+
# if the session was pinned.
|
791
|
+
#
|
792
|
+
# @param [ Connection | nil ] connection Connection to unpin from.
|
746
793
|
#
|
747
794
|
# @api private
|
748
|
-
def unpin
|
795
|
+
def unpin(connection = nil)
|
749
796
|
@pinned_server = nil
|
750
|
-
@
|
797
|
+
@pinned_connection_global_id = nil
|
798
|
+
connection.unpin unless connection.nil?
|
751
799
|
end
|
752
800
|
|
753
|
-
# Unpins this session from the pinned server, if the session was pinned
|
801
|
+
# Unpins this session from the pinned server or connection, if the session was pinned
|
754
802
|
# and the specified exception instance and the session's transaction state
|
755
803
|
# require it to be unpinned.
|
756
804
|
#
|
@@ -758,19 +806,20 @@ module Mongo
|
|
758
806
|
# (both client- and server-side generated ones).
|
759
807
|
#
|
760
808
|
# @param [ Error ] error The exception instance to process.
|
809
|
+
# @param [ Connection | nil ] connection Connection to unpin from.
|
761
810
|
#
|
762
811
|
# @api private
|
763
|
-
def unpin_maybe(error)
|
812
|
+
def unpin_maybe(error, connection = nil)
|
764
813
|
if !within_states?(Session::NO_TRANSACTION_STATE) &&
|
765
814
|
error.label?('TransientTransactionError')
|
766
815
|
then
|
767
|
-
unpin
|
816
|
+
unpin(connection)
|
768
817
|
end
|
769
818
|
|
770
819
|
if committing_transaction? &&
|
771
820
|
error.label?('UnknownTransactionCommitResult')
|
772
821
|
then
|
773
|
-
unpin
|
822
|
+
unpin(connection)
|
774
823
|
end
|
775
824
|
end
|
776
825
|
|
@@ -1007,6 +1056,33 @@ module Mongo
|
|
1007
1056
|
end
|
1008
1057
|
end
|
1009
1058
|
|
1059
|
+
# If not already set, populate a session objects's server_session by
|
1060
|
+
# checking out a session from the session pool.
|
1061
|
+
#
|
1062
|
+
# @return [ Session ] Self.
|
1063
|
+
#
|
1064
|
+
# @api private
|
1065
|
+
def materialize_if_needed
|
1066
|
+
if ended?
|
1067
|
+
raise Error::SessionEnded
|
1068
|
+
end
|
1069
|
+
|
1070
|
+
return unless implicit? && !@server_session
|
1071
|
+
|
1072
|
+
@server_session = cluster.session_pool.checkout
|
1073
|
+
|
1074
|
+
self
|
1075
|
+
end
|
1076
|
+
|
1077
|
+
# @api private
|
1078
|
+
def materialized?
|
1079
|
+
if ended?
|
1080
|
+
raise Error::SessionEnded
|
1081
|
+
end
|
1082
|
+
|
1083
|
+
!@server_session.nil?
|
1084
|
+
end
|
1085
|
+
|
1010
1086
|
# Increment and return the next transaction number.
|
1011
1087
|
#
|
1012
1088
|
# @example Get the next transaction number.
|
@@ -238,6 +238,10 @@ module Mongo
|
|
238
238
|
end
|
239
239
|
|
240
240
|
resp = resp.find_response(cert_id)
|
241
|
+
unless resp
|
242
|
+
@resp_errors << "OCSP response from #{report_uri(original_uri, uri)} did not include information about the requested certificate"
|
243
|
+
return false
|
244
|
+
end
|
241
245
|
# TODO make a new class instead of patching the stdlib one?
|
242
246
|
resp.instance_variable_set('@uri', uri)
|
243
247
|
resp.instance_variable_set('@original_uri', original_uri)
|
@@ -245,11 +249,6 @@ module Mongo
|
|
245
249
|
attr_reader :uri, :original_uri
|
246
250
|
end
|
247
251
|
|
248
|
-
unless resp
|
249
|
-
@resp_errors << "OCSP response from #{report_uri(original_uri, uri)} did not include information about the requested certificate"
|
250
|
-
return false
|
251
|
-
end
|
252
|
-
|
253
252
|
unless resp.check_validity
|
254
253
|
@resp_errors << "OCSP response from #{report_uri(original_uri, uri)} was invalid: this_update was in the future or next_update time has passed"
|
255
254
|
return false
|
data/lib/mongo/socket/tcp.rb
CHANGED
@@ -46,6 +46,9 @@ module Mongo
|
|
46
46
|
# @since 2.0.0
|
47
47
|
# @api private
|
48
48
|
def initialize(host, port, timeout, family, options = {})
|
49
|
+
if family.nil?
|
50
|
+
raise ArgumentError, 'family must be specified'
|
51
|
+
end
|
49
52
|
super(timeout, options)
|
50
53
|
@host, @port = host, port
|
51
54
|
@family = family
|
data/lib/mongo/srv/resolver.rb
CHANGED
@@ -29,6 +29,16 @@ module Mongo
|
|
29
29
|
# before querying SRV records.
|
30
30
|
RECORD_PREFIX = '_mongodb._tcp.'.freeze
|
31
31
|
|
32
|
+
# Generates the record prefix with a custom SRV service name if it is
|
33
|
+
# provided.
|
34
|
+
#
|
35
|
+
# @option srv_service_name [ String | nil ] The SRV service name to use
|
36
|
+
# in the record prefix.
|
37
|
+
# @return [ String ] The generated record prefix.
|
38
|
+
def record_prefix(srv_service_name=nil)
|
39
|
+
return srv_service_name ? "_#{srv_service_name}._tcp." : RECORD_PREFIX
|
40
|
+
end
|
41
|
+
|
32
42
|
# Creates a new Resolver.
|
33
43
|
#
|
34
44
|
# @option opts [ Float ] :timeout The timeout, in seconds, to use for
|
@@ -51,13 +61,18 @@ module Mongo
|
|
51
61
|
options[:timeout] || Monitor::DEFAULT_TIMEOUT
|
52
62
|
end
|
53
63
|
|
54
|
-
# Obtains all of the SRV records for a given hostname.
|
64
|
+
# Obtains all of the SRV records for a given hostname. If a srv_max_hosts
|
65
|
+
# is specified and it is greater than 0, return maximum srv_max_hosts records.
|
55
66
|
#
|
56
67
|
# In the event that a record with a mismatched domain is found or no
|
57
68
|
# records are found, if the :raise_on_invalid option is true,
|
58
69
|
# an exception will be raised, otherwise a warning will be logged.
|
59
70
|
#
|
60
71
|
# @param [ String ] hostname The hostname whose records should be obtained.
|
72
|
+
# @param [ String | nil ] srv_service_name The SRV service name for the DNS query.
|
73
|
+
# If nil, 'mongodb' is used.
|
74
|
+
# @param [ Integer | nil ] srv_max_hosts The maximum number of records to return.
|
75
|
+
# If this value is nil, return all of the records.
|
61
76
|
#
|
62
77
|
# @raise [ Mongo::Error::MismatchedDomain ] If the :raise_in_invalid
|
63
78
|
# Resolver option is true and a record with a domain name that does
|
@@ -66,8 +81,8 @@ module Mongo
|
|
66
81
|
# option is true and no records are found.
|
67
82
|
#
|
68
83
|
# @return [ Mongo::Srv::Result ] SRV lookup result.
|
69
|
-
def get_records(hostname)
|
70
|
-
query_name =
|
84
|
+
def get_records(hostname, srv_service_name=nil, srv_max_hosts=nil)
|
85
|
+
query_name = record_prefix(srv_service_name) + hostname
|
71
86
|
resources = @resolver.getresources(query_name, Resolv::DNS::Resource::IN::SRV)
|
72
87
|
|
73
88
|
# Collect all of the records into a Result object, raising an error
|
@@ -97,6 +112,12 @@ module Mongo
|
|
97
112
|
end
|
98
113
|
end
|
99
114
|
|
115
|
+
# if srv_max_hosts is in [1, #addresses)
|
116
|
+
if (1...result.address_strs.length).include? srv_max_hosts
|
117
|
+
sampled_records = resources.shuffle.first(srv_max_hosts)
|
118
|
+
result = Srv::Result.new(hostname)
|
119
|
+
sampled_records.each { |record| result.add_record(record) }
|
120
|
+
end
|
100
121
|
result
|
101
122
|
end
|
102
123
|
|
@@ -269,6 +269,8 @@ module Mongo
|
|
269
269
|
uri_option 'directConnection', :direct_connection, type: :bool
|
270
270
|
uri_option 'connect', :connect, type: :symbol
|
271
271
|
uri_option 'loadBalanced', :load_balanced, type: :bool
|
272
|
+
uri_option 'srvMaxHosts', :srv_max_hosts, type: :integer
|
273
|
+
uri_option 'srvServiceName', :srv_service_name
|
272
274
|
|
273
275
|
# Auth Options
|
274
276
|
uri_option 'authSource', :auth_source
|
@@ -147,7 +147,7 @@ module Mongo
|
|
147
147
|
validate_srv_hostname(hostname)
|
148
148
|
@query_hostname = hostname
|
149
149
|
|
150
|
-
@srv_result = resolver.get_records(hostname)
|
150
|
+
@srv_result = resolver.get_records(hostname, uri_options[:srv_service_name], uri_options[:srv_max_hosts])
|
151
151
|
if srv_result.empty?
|
152
152
|
raise Error::NoSRVRecords.new(NO_SRV_RECORDS % hostname)
|
153
153
|
end
|
data/lib/mongo/uri.rb
CHANGED
@@ -538,6 +538,26 @@ module Mongo
|
|
538
538
|
raise_invalid_error_no_fmt!("loadBalanced=true cannot be used with replicaSet option")
|
539
539
|
end
|
540
540
|
end
|
541
|
+
|
542
|
+
unless self.is_a?(URI::SRVProtocol)
|
543
|
+
if uri_options[:srv_max_hosts]
|
544
|
+
raise_invalid_error_no_fmt!("srvMaxHosts cannot be used on non-SRV URI")
|
545
|
+
end
|
546
|
+
|
547
|
+
if uri_options[:srv_service_name]
|
548
|
+
raise_invalid_error_no_fmt!("srvServiceName cannot be used on non-SRV URI")
|
549
|
+
end
|
550
|
+
end
|
551
|
+
|
552
|
+
if uri_options[:srv_max_hosts] && uri_options[:srv_max_hosts] > 0
|
553
|
+
if uri_options[:replica_set]
|
554
|
+
raise_invalid_error_no_fmt!("srvMaxHosts > 0 cannot be used with replicaSet option")
|
555
|
+
end
|
556
|
+
|
557
|
+
if options[:load_balanced]
|
558
|
+
raise_invalid_error_no_fmt!("srvMaxHosts > 0 cannot be used with loadBalanced=true")
|
559
|
+
end
|
560
|
+
end
|
541
561
|
end
|
542
562
|
end
|
543
563
|
end
|
data/lib/mongo/version.rb
CHANGED
data/lib/mongo.rb
CHANGED
@@ -75,8 +75,28 @@ require 'mongo/uri'
|
|
75
75
|
require 'mongo/version'
|
76
76
|
require 'mongo/write_concern'
|
77
77
|
require 'mongo/utils'
|
78
|
+
require 'mongo/config'
|
78
79
|
|
79
80
|
module Mongo
|
81
|
+
|
82
|
+
class << self
|
83
|
+
extend Forwardable
|
84
|
+
|
85
|
+
# Delegate the given option along with its = and ? methods to the given
|
86
|
+
# object.
|
87
|
+
#
|
88
|
+
# @param [ Object ] obj The object to delegate to.
|
89
|
+
# @param [ Symbol ] opt The method to delegate.
|
90
|
+
def self.delegate_option(obj, opt)
|
91
|
+
def_delegators obj, opt, "#{opt}=", "#{opt}?"
|
92
|
+
end
|
93
|
+
|
94
|
+
# Take all the public instance methods from the Config singleton and allow
|
95
|
+
# them to be accessed through the Mongo module directly.
|
96
|
+
def_delegators Config, :options=
|
97
|
+
delegate_option Config, :validate_update_replace
|
98
|
+
end
|
99
|
+
|
80
100
|
# Clears the driver's OCSP response cache.
|
81
101
|
module_function def clear_ocsp_cache
|
82
102
|
Socket::OcspCache.clear
|
data/mongo.gemspec
CHANGED
@@ -8,7 +8,7 @@ Gem::Specification.new do |s|
|
|
8
8
|
s.platform = Gem::Platform::RUBY
|
9
9
|
|
10
10
|
s.authors = ['Tyler Brock', 'Emily Stolfo', 'Durran Jordan']
|
11
|
-
s.homepage = 'https://
|
11
|
+
s.homepage = 'https://mongodb.com/docs/ruby-driver/'
|
12
12
|
s.summary = 'Ruby driver for MongoDB'
|
13
13
|
s.description = 'A Ruby driver for MongoDB'
|
14
14
|
s.license = 'Apache-2.0'
|
@@ -16,8 +16,8 @@ Gem::Specification.new do |s|
|
|
16
16
|
s.metadata = {
|
17
17
|
'bug_tracker_uri' => 'https://jira.mongodb.org/projects/RUBY',
|
18
18
|
'changelog_uri' => 'https://github.com/mongodb/mongo-ruby-driver/releases',
|
19
|
-
'documentation_uri' => 'https://
|
20
|
-
'homepage_uri' => 'https://
|
19
|
+
'documentation_uri' => 'https://mongodb.com/docs/ruby-driver/',
|
20
|
+
'homepage_uri' => 'https://mongodb.com/docs/ruby-driver/',
|
21
21
|
'source_code_uri' => 'https://github.com/mongodb/mongo-ruby-driver',
|
22
22
|
}
|
23
23
|
|
@@ -38,5 +38,11 @@ Gem::Specification.new do |s|
|
|
38
38
|
|
39
39
|
s.required_ruby_version = ">= 2.5"
|
40
40
|
|
41
|
-
|
41
|
+
# For testing driver against bson master we need to depend on bson < 6.0.0
|
42
|
+
# but in release version we want to depend on bson < 5.0.0.
|
43
|
+
if %w(1 yes true).include?(ENV['MONGO_RUBY_DRIVER_BSON_MASTER'])
|
44
|
+
s.add_dependency 'bson', '>=4.13.0', '<6.0.0'
|
45
|
+
else
|
46
|
+
s.add_dependency 'bson', '>=4.14.1', '<5.0.0'
|
47
|
+
end
|
42
48
|
end
|
data/spec/README.md
CHANGED
@@ -408,7 +408,7 @@ The client-side encryption tests require the mongocryptd binary to be in the
|
|
408
408
|
system path.
|
409
409
|
|
410
410
|
Download enterprise versions of MongoDB here: https://www.mongodb.com/download-center/enterprise
|
411
|
-
Read more about installing mongocryptd here: https://
|
411
|
+
Read more about installing mongocryptd here: https://mongodb.com/docs/manual/reference/security-client-side-encryption-appendix/#mongocryptd
|
412
412
|
|
413
413
|
Install libmongocrypt on your machine:
|
414
414
|
|
@@ -513,9 +513,9 @@ To test compression, set the `compressors` URI option:
|
|
513
513
|
MONGODB_URI="mongodb://localhost:27017/?compressors=zlib" rake
|
514
514
|
|
515
515
|
Note that as of this writing, the driver supports
|
516
|
-
[ztsd](https://
|
517
|
-
[snappy](https://
|
518
|
-
and [zlib](https://
|
516
|
+
[ztsd](https://mongodb.com/docs/manual/reference/glossary/#term-zstd),
|
517
|
+
[snappy](https://mongodb.com/docs/manual/reference/glossary/#term-snappy)
|
518
|
+
and [zlib](https://mongodb.com/docs/manual/reference/glossary/#term-zlib)
|
519
519
|
compression.
|
520
520
|
|
521
521
|
Servers 4.2+ enable zlib by default; to test older servers, explicitly enable
|
@@ -530,7 +530,7 @@ To specify server API parameters, use the `SERVER_API` environment variable.
|
|
530
530
|
The server API parameters cannot be specified via URI options.
|
531
531
|
|
532
532
|
Both YAML and JSON syntaxes are accepted:
|
533
|
-
|
533
|
+
|
534
534
|
SERVER_API='{version: "1", strict: true}' rake
|
535
535
|
|
536
536
|
SERVER_API='{"version":"1","strict":true}' rake
|
@@ -0,0 +1,68 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# encoding: utf-8
|
3
|
+
|
4
|
+
require "spec_helper"
|
5
|
+
|
6
|
+
describe "AWS Lambda examples in Ruby" do
|
7
|
+
|
8
|
+
it "shares the client" do
|
9
|
+
# Start AWS Lambda Example 1
|
10
|
+
|
11
|
+
# Require the driver library.
|
12
|
+
require "mongo"
|
13
|
+
|
14
|
+
# Create a Mongo::Client instance.
|
15
|
+
# CRITICAL: You must create the client instance outside the handler
|
16
|
+
# so that the client can be reused across function invocations.
|
17
|
+
client = Mongo::Client.new(ENV.fetch("MONGODB_URI"))
|
18
|
+
|
19
|
+
def lambda_handler(event:, context:)
|
20
|
+
# Use the client to return the name of the configured database.
|
21
|
+
client.database.name
|
22
|
+
end
|
23
|
+
|
24
|
+
# End AWS Lambda Example 1
|
25
|
+
|
26
|
+
client.close
|
27
|
+
end
|
28
|
+
|
29
|
+
context "when using AWS IAM authentication" do
|
30
|
+
require_auth 'aws-assume-role'
|
31
|
+
|
32
|
+
it "connects to the deployment" do
|
33
|
+
allow(ENV).to receive(:fetch).and_call_original
|
34
|
+
allow(ENV).to receive(:fetch).with("MONGODB_HOST").and_return(SpecConfig.instance.addresses.first)
|
35
|
+
allow(ENV).to receive(:fetch).with("AWS_ACCESS_KEY_ID").and_return(ENV.fetch("MONGO_RUBY_DRIVER_AWS_AUTH_ACCESS_KEY_ID"))
|
36
|
+
allow(ENV).to receive(:fetch).with("AWS_SECRET_ACCESS_KEY").and_return(ENV.fetch("MONGO_RUBY_DRIVER_AWS_AUTH_SECRET_ACCESS_KEY"))
|
37
|
+
allow(ENV).to receive(:fetch).with("AWS_SESSION_TOKEN").and_return(ENV.fetch("MONGO_RUBY_DRIVER_AWS_AUTH_SESSION_TOKEN"))
|
38
|
+
allow(ENV).to receive(:fetch).with("MONGODB_DATABASE").and_return("test")
|
39
|
+
|
40
|
+
# Start AWS Lambda Example 2
|
41
|
+
|
42
|
+
# Require the driver library.
|
43
|
+
require "mongo"
|
44
|
+
|
45
|
+
# Create a Mongo::Client instance using AWS IAM authentication.
|
46
|
+
# CRITICAL: You must create the client instance outside the handler
|
47
|
+
# so that the client can be reused across function invocations.
|
48
|
+
client = Mongo::Client.new([ENV.fetch("MONGODB_HOST")],
|
49
|
+
auth_mech: :aws,
|
50
|
+
user: ENV.fetch("AWS_ACCESS_KEY_ID"),
|
51
|
+
password: ENV.fetch("AWS_SECRET_ACCESS_KEY"),
|
52
|
+
auth_mech_properties: {
|
53
|
+
aws_session_token: ENV.fetch("AWS_SESSION_TOKEN"),
|
54
|
+
},
|
55
|
+
database: ENV.fetch("MONGODB_DATABASE"))
|
56
|
+
|
57
|
+
def lambda_handler(event:, context:)
|
58
|
+
# Use the client to return the name of the configured database.
|
59
|
+
client.database.name
|
60
|
+
end
|
61
|
+
|
62
|
+
# End AWS Lambda Example 2
|
63
|
+
|
64
|
+
client.close
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
@@ -38,4 +38,36 @@ describe 'BulkWriteError message' do
|
|
38
38
|
end
|
39
39
|
end
|
40
40
|
end
|
41
|
+
|
42
|
+
context 'a bulk write with validation errors' do
|
43
|
+
|
44
|
+
let(:collection_name) { 'bulk_write_error_validation_message_spec' }
|
45
|
+
|
46
|
+
let(:collection) do
|
47
|
+
client[:collection_name].drop
|
48
|
+
client[:collection_name,
|
49
|
+
{
|
50
|
+
'validator' => {
|
51
|
+
'x' => { '$type' => 'string' },
|
52
|
+
}
|
53
|
+
}].create
|
54
|
+
client[:collection_name]
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'reports code name, code, message, and details' do
|
58
|
+
begin
|
59
|
+
collection.insert_one({_id:1, x:"1"})
|
60
|
+
collection.insert_many([
|
61
|
+
{_id: 1, x:"1"},
|
62
|
+
{_id: 2, x:1},
|
63
|
+
], ordered: false)
|
64
|
+
fail('Should have raised')
|
65
|
+
rescue Mongo::Error::BulkWriteError => e
|
66
|
+
e.message.should =~ %r,\AMultiple errors: \[11000\]: (insertDocument :: caused by :: 11000 )?E11000 duplicate key error (collection|index):.*\; \[121\]: Document failed validation( -- .*)?,
|
67
|
+
# The duplicate key error should not print details because it's not a
|
68
|
+
# WriteError or a WriteConcernError
|
69
|
+
e.message.scan(/ -- /).length.should be <= 1
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
41
73
|
end
|
@@ -18,22 +18,6 @@ describe 'Bulk writes' do
|
|
18
18
|
authorized_collection.bulk_write(operations)
|
19
19
|
end.not_to raise_error
|
20
20
|
end
|
21
|
-
|
22
|
-
context 'in transaction' do
|
23
|
-
require_transaction_support
|
24
|
-
min_server_version "4.4"
|
25
|
-
|
26
|
-
it 'succeeds' do
|
27
|
-
authorized_collection.create
|
28
|
-
expect do
|
29
|
-
authorized_collection.client.start_session do |session|
|
30
|
-
session.with_transaction do
|
31
|
-
authorized_collection.bulk_write(operations, { session: session })
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end.not_to raise_error
|
35
|
-
end
|
36
|
-
end
|
37
21
|
end
|
38
22
|
|
39
23
|
context 'when bulk write needs to be split' do
|