mongo 2.11.4 → 2.12.3
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.tar.gz.sig +0 -0
- data/CONTRIBUTING.md +1 -1
- data/README.md +2 -1
- data/lib/mongo.rb +3 -0
- data/lib/mongo/address.rb +44 -19
- data/lib/mongo/auth.rb +1 -0
- data/lib/mongo/auth/credential_cache.rb +51 -0
- data/lib/mongo/auth/scram/conversation.rb +20 -16
- data/lib/mongo/auth/user.rb +0 -8
- data/lib/mongo/auth/user/view.rb +4 -4
- data/lib/mongo/background_thread.rb +1 -1
- data/lib/mongo/bulk_write.rb +5 -5
- data/lib/mongo/client.rb +143 -14
- data/lib/mongo/client_encryption.rb +103 -0
- data/lib/mongo/cluster.rb +8 -4
- data/lib/mongo/cluster/reapers/cursor_reaper.rb +18 -6
- data/lib/mongo/cluster/sdam_flow.rb +54 -58
- data/lib/mongo/collection.rb +3 -3
- data/lib/mongo/collection/view.rb +1 -1
- data/lib/mongo/collection/view/aggregation.rb +1 -1
- data/lib/mongo/collection/view/change_stream.rb +12 -3
- data/lib/mongo/collection/view/iterable.rb +14 -5
- data/lib/mongo/collection/view/map_reduce.rb +2 -2
- data/lib/mongo/collection/view/readable.rb +9 -7
- data/lib/mongo/collection/view/writable.rb +7 -7
- data/lib/mongo/crypt.rb +33 -0
- data/lib/mongo/crypt/auto_decryption_context.rb +40 -0
- data/lib/mongo/crypt/auto_encrypter.rb +179 -0
- data/lib/mongo/crypt/auto_encryption_context.rb +44 -0
- data/lib/mongo/crypt/binary.rb +155 -0
- data/lib/mongo/crypt/binding.rb +1229 -0
- data/lib/mongo/crypt/context.rb +135 -0
- data/lib/mongo/crypt/data_key_context.rb +162 -0
- data/lib/mongo/crypt/encryption_io.rb +289 -0
- data/lib/mongo/crypt/explicit_decryption_context.rb +40 -0
- data/lib/mongo/crypt/explicit_encrypter.rb +117 -0
- data/lib/mongo/crypt/explicit_encryption_context.rb +89 -0
- data/lib/mongo/crypt/handle.rb +315 -0
- data/lib/mongo/crypt/hooks.rb +90 -0
- data/lib/mongo/crypt/kms_context.rb +67 -0
- data/lib/mongo/crypt/status.rb +131 -0
- data/lib/mongo/cursor.rb +64 -32
- data/lib/mongo/database.rb +23 -6
- data/lib/mongo/database/view.rb +13 -4
- data/lib/mongo/dbref.rb +9 -2
- data/lib/mongo/error.rb +5 -1
- data/lib/mongo/error/bulk_write_error.rb +16 -14
- data/lib/mongo/error/crypt_error.rb +31 -0
- data/lib/mongo/error/{failed_stringprep_validation.rb → failed_string_prep_validation.rb} +0 -0
- data/lib/mongo/error/invalid_cursor_operation.rb +27 -0
- data/lib/mongo/error/kms_error.rb +22 -0
- data/lib/mongo/error/max_bson_size.rb +14 -3
- data/lib/mongo/error/mongocryptd_spawn_error.rb +22 -0
- data/lib/mongo/error/no_server_available.rb +8 -3
- data/lib/mongo/error/notable.rb +0 -15
- data/lib/mongo/error/operation_failure.rb +1 -0
- data/lib/mongo/error/parser.rb +1 -1
- data/lib/mongo/grid/file.rb +5 -0
- data/lib/mongo/grid/file/chunk.rb +2 -0
- data/lib/mongo/grid/file/info.rb +3 -2
- data/lib/mongo/grid/fs_bucket.rb +15 -13
- data/lib/mongo/grid/stream/write.rb +9 -3
- data/lib/mongo/index/view.rb +3 -3
- data/lib/mongo/monitoring/event/cmap/connection_check_out_failed.rb +1 -1
- data/lib/mongo/monitoring/event/command_started.rb +6 -1
- data/lib/mongo/operation/collections_info.rb +6 -3
- data/lib/mongo/operation/delete/op_msg.rb +1 -1
- data/lib/mongo/operation/find/op_msg.rb +4 -1
- data/lib/mongo/operation/get_more/op_msg.rb +4 -1
- data/lib/mongo/operation/insert/command.rb +3 -2
- data/lib/mongo/operation/insert/legacy.rb +3 -2
- data/lib/mongo/operation/insert/op_msg.rb +3 -3
- data/lib/mongo/operation/result.rb +36 -27
- data/lib/mongo/operation/shared/executable.rb +11 -9
- data/lib/mongo/operation/shared/executable_no_validate.rb +2 -2
- data/lib/mongo/operation/shared/op_msg_or_command.rb +2 -2
- data/lib/mongo/operation/shared/op_msg_or_find_command.rb +2 -2
- data/lib/mongo/operation/shared/op_msg_or_list_indexes_command.rb +2 -2
- data/lib/mongo/operation/shared/read_preference_supported.rb +68 -19
- data/lib/mongo/operation/shared/response_handling.rb +1 -1
- data/lib/mongo/operation/shared/sessions_supported.rb +44 -3
- data/lib/mongo/operation/shared/write.rb +17 -10
- data/lib/mongo/operation/update/op_msg.rb +1 -1
- data/lib/mongo/protocol/bit_vector.rb +2 -1
- data/lib/mongo/protocol/compressed.rb +6 -5
- data/lib/mongo/protocol/insert.rb +3 -1
- data/lib/mongo/protocol/message.rb +94 -15
- data/lib/mongo/protocol/msg.rb +207 -37
- data/lib/mongo/protocol/query.rb +7 -9
- data/lib/mongo/protocol/serializers.rb +43 -15
- data/lib/mongo/retryable.rb +1 -1
- data/lib/mongo/server.rb +10 -4
- data/lib/mongo/server/connection.rb +20 -9
- data/lib/mongo/server/connection_base.rb +118 -18
- data/lib/mongo/server/connection_common.rb +61 -0
- data/lib/mongo/server/connection_pool.rb +37 -1
- data/lib/mongo/server/connection_pool/populator.rb +1 -1
- data/lib/mongo/server/description.rb +9 -11
- data/lib/mongo/server/monitor.rb +2 -0
- data/lib/mongo/server/monitor/connection.rb +3 -18
- data/lib/mongo/server/pending_connection.rb +2 -1
- data/lib/mongo/session.rb +3 -3
- data/lib/mongo/session/session_pool.rb +8 -3
- data/lib/mongo/socket.rb +29 -16
- data/lib/mongo/socket/ssl.rb +23 -8
- data/lib/mongo/socket/tcp.rb +12 -3
- data/lib/mongo/srv/monitor.rb +73 -42
- data/lib/mongo/srv/result.rb +0 -1
- data/lib/mongo/timeout.rb +49 -0
- data/lib/mongo/uri.rb +30 -1
- data/lib/mongo/uri/srv_protocol.rb +1 -1
- data/lib/mongo/version.rb +1 -1
- data/mongo.gemspec +1 -3
- data/spec/README.md +228 -7
- data/spec/integration/auth_spec.rb +53 -0
- data/spec/integration/bulk_write_spec.rb +19 -0
- data/spec/integration/{client_options_spec.rb → client_authentication_options_spec.rb} +10 -10
- data/spec/integration/client_construction_spec.rb +100 -1
- data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +353 -0
- data/spec/integration/client_side_encryption/auto_encryption_command_monitoring_spec.rb +303 -0
- data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +72 -0
- data/spec/integration/client_side_encryption/auto_encryption_old_wire_version_spec.rb +79 -0
- data/spec/integration/client_side_encryption/auto_encryption_reconnect_spec.rb +221 -0
- data/spec/integration/client_side_encryption/auto_encryption_spec.rb +601 -0
- data/spec/integration/client_side_encryption/bson_size_limit_spec.rb +187 -0
- data/spec/integration/client_side_encryption/bypass_mongocryptd_spawn_spec.rb +78 -0
- data/spec/integration/client_side_encryption/client_close_spec.rb +63 -0
- data/spec/integration/client_side_encryption/corpus_spec.rb +233 -0
- data/spec/integration/client_side_encryption/custom_endpoint_spec.rb +132 -0
- data/spec/integration/client_side_encryption/data_key_spec.rb +165 -0
- data/spec/integration/client_side_encryption/explicit_encryption_spec.rb +114 -0
- data/spec/integration/client_side_encryption/external_key_vault_spec.rb +141 -0
- data/spec/integration/client_side_encryption/views_spec.rb +44 -0
- data/spec/integration/client_update_spec.rb +154 -0
- data/spec/integration/command_monitoring_spec.rb +3 -1
- data/spec/integration/command_spec.rb +44 -10
- data/spec/integration/connection_spec.rb +57 -0
- data/spec/integration/crud_spec.rb +89 -0
- data/spec/integration/grid_fs_bucket_spec.rb +48 -0
- data/spec/integration/read_preference_spec.rb +26 -0
- data/spec/integration/reconnect_spec.rb +7 -6
- data/spec/integration/size_limit_spec.rb +111 -0
- data/spec/integration/srv_monitoring_spec.rb +16 -8
- data/spec/integration/zlib_compression_spec.rb +25 -0
- data/spec/kerberos/kerberos_spec.rb +87 -0
- data/spec/lite_spec_helper.rb +34 -29
- data/spec/mongo/auth/cr_spec.rb +8 -0
- data/spec/mongo/auth/ldap_spec.rb +5 -1
- data/spec/mongo/auth/scram/conversation_spec.rb +5 -6
- data/spec/mongo/auth/scram/negotiation_spec.rb +74 -75
- data/spec/mongo/auth/scram_spec.rb +45 -35
- data/spec/mongo/auth/user/view_spec.rb +3 -6
- data/spec/mongo/auth/x509_spec.rb +5 -1
- data/spec/mongo/bulk_write/result_spec.rb +11 -7
- data/spec/mongo/client_construction_spec.rb +206 -2
- data/spec/mongo/client_encryption_spec.rb +405 -0
- data/spec/mongo/cluster/cursor_reaper_spec.rb +12 -8
- data/spec/mongo/cluster/socket_reaper_spec.rb +14 -3
- data/spec/mongo/collection/view/aggregation_spec.rb +0 -2
- data/spec/mongo/collection/view/change_stream_spec.rb +7 -7
- data/spec/mongo/collection/view/map_reduce_spec.rb +3 -3
- data/spec/mongo/collection/view_spec.rb +1 -1
- data/spec/mongo/collection_spec.rb +28 -9
- data/spec/mongo/crypt/auto_decryption_context_spec.rb +90 -0
- data/spec/mongo/crypt/auto_encrypter_spec.rb +187 -0
- data/spec/mongo/crypt/auto_encryption_context_spec.rb +107 -0
- data/spec/mongo/crypt/binary_spec.rb +115 -0
- data/spec/mongo/crypt/binding/binary_spec.rb +56 -0
- data/spec/mongo/crypt/binding/context_spec.rb +257 -0
- data/spec/mongo/crypt/binding/helpers_spec.rb +46 -0
- data/spec/mongo/crypt/binding/mongocrypt_spec.rb +144 -0
- data/spec/mongo/crypt/binding/status_spec.rb +99 -0
- data/spec/mongo/crypt/binding/version_spec.rb +22 -0
- data/spec/mongo/crypt/binding_unloaded_spec.rb +20 -0
- data/spec/mongo/crypt/data_key_context_spec.rb +213 -0
- data/spec/mongo/crypt/encryption_io_spec.rb +136 -0
- data/spec/mongo/crypt/explicit_decryption_context_spec.rb +72 -0
- data/spec/mongo/crypt/explicit_encryption_context_spec.rb +170 -0
- data/spec/mongo/crypt/handle_spec.rb +232 -0
- data/spec/mongo/crypt/helpers/mongo_crypt_spec_helper.rb +108 -0
- data/spec/mongo/crypt/status_spec.rb +152 -0
- data/spec/mongo/cursor_spec.rb +24 -4
- data/spec/mongo/database_spec.rb +20 -0
- data/spec/mongo/error/bulk_write_error_spec.rb +49 -0
- data/spec/mongo/error/crypt_error_spec.rb +26 -0
- data/spec/mongo/error/max_bson_size_spec.rb +35 -0
- data/spec/mongo/error/no_server_available_spec.rb +11 -1
- data/spec/mongo/error/notable_spec.rb +59 -0
- data/spec/mongo/error/operation_failure_spec.rb +6 -6
- data/spec/mongo/operation/aggregate_spec.rb +1 -1
- data/spec/mongo/operation/collections_info_spec.rb +1 -1
- data/spec/mongo/operation/command_spec.rb +3 -3
- data/spec/mongo/operation/create_index_spec.rb +3 -3
- data/spec/mongo/operation/create_user_spec.rb +3 -3
- data/spec/mongo/operation/delete/bulk_spec.rb +6 -6
- data/spec/mongo/operation/delete/op_msg_spec.rb +1 -6
- data/spec/mongo/operation/delete_spec.rb +7 -7
- data/spec/mongo/operation/drop_index_spec.rb +2 -2
- data/spec/mongo/operation/find/legacy_spec.rb +2 -1
- data/spec/mongo/operation/get_more_spec.rb +1 -1
- data/spec/mongo/operation/indexes_spec.rb +1 -1
- data/spec/mongo/operation/insert/bulk_spec.rb +7 -7
- data/spec/mongo/operation/insert/op_msg_spec.rb +3 -6
- data/spec/mongo/operation/insert_spec.rb +12 -12
- data/spec/mongo/operation/map_reduce_spec.rb +2 -2
- data/spec/mongo/operation/read_preference_legacy_spec.rb +351 -0
- data/spec/mongo/operation/read_preference_op_msg_spec.rb +194 -0
- data/spec/mongo/operation/remove_user_spec.rb +3 -3
- data/spec/mongo/operation/update/bulk_spec.rb +6 -6
- data/spec/mongo/operation/update/op_msg_spec.rb +3 -6
- data/spec/mongo/operation/update_spec.rb +7 -7
- data/spec/mongo/operation/update_user_spec.rb +1 -1
- data/spec/mongo/protocol/compressed_spec.rb +2 -3
- data/spec/mongo/protocol/delete_spec.rb +9 -8
- data/spec/mongo/protocol/get_more_spec.rb +9 -8
- data/spec/mongo/protocol/insert_spec.rb +9 -8
- data/spec/mongo/protocol/kill_cursors_spec.rb +6 -5
- data/spec/mongo/protocol/msg_spec.rb +57 -53
- data/spec/mongo/protocol/query_spec.rb +12 -12
- data/spec/mongo/protocol/registry_spec.rb +1 -1
- data/spec/mongo/protocol/reply_spec.rb +1 -1
- data/spec/mongo/protocol/update_spec.rb +10 -9
- data/spec/mongo/server/connection_pool_spec.rb +1 -1
- data/spec/mongo/server/connection_spec.rb +28 -7
- data/spec/mongo/socket_spec.rb +1 -1
- data/spec/mongo/srv/monitor_spec.rb +88 -69
- data/spec/mongo/timeout_spec.rb +85 -0
- data/spec/mongo/uri/srv_protocol_spec.rb +2 -2
- data/spec/mongo/uri_spec.rb +52 -5
- data/spec/mongo/write_concern_spec.rb +13 -1
- data/spec/{support → runners}/auth.rb +14 -1
- data/spec/{support → runners}/change_streams.rb +1 -1
- data/spec/{support → runners}/change_streams/operation.rb +0 -0
- data/spec/{support → runners}/cmap.rb +1 -1
- data/spec/{support → runners}/cmap/verifier.rb +0 -0
- data/spec/{support → runners}/command_monitoring.rb +0 -0
- data/spec/runners/connection_string.rb +358 -4
- data/spec/{support → runners}/crud.rb +9 -9
- data/spec/{support → runners}/crud/context.rb +0 -0
- data/spec/{support → runners}/crud/operation.rb +7 -3
- data/spec/{support → runners}/crud/outcome.rb +0 -0
- data/spec/{support → runners}/crud/requirement.rb +1 -1
- data/spec/{support → runners}/crud/spec.rb +12 -1
- data/spec/{support → runners}/crud/test.rb +0 -0
- data/spec/{support → runners}/crud/test_base.rb +0 -0
- data/spec/{support → runners}/crud/verifier.rb +10 -12
- data/spec/{support → runners}/gridfs.rb +0 -0
- data/spec/{support → runners}/sdam_monitoring.rb +0 -0
- data/spec/{support → runners}/server_discovery_and_monitoring.rb +0 -0
- data/spec/{support → runners}/server_selection.rb +0 -0
- data/spec/{support → runners}/server_selection_rtt.rb +0 -0
- data/spec/{support → runners}/transactions.rb +9 -11
- data/spec/{support → runners}/transactions/context.rb +0 -0
- data/spec/{support → runners}/transactions/operation.rb +0 -0
- data/spec/{support → runners}/transactions/spec.rb +0 -0
- data/spec/{support → runners}/transactions/test.rb +37 -5
- data/spec/spec_helper.rb +0 -5
- data/spec/spec_tests/auth_spec.rb +3 -3
- data/spec/spec_tests/client_side_encryption_spec.rb +8 -0
- data/spec/spec_tests/connection_string_spec.rb +1 -1
- data/spec/spec_tests/data/auth/connection-string.yml +13 -0
- data/spec/spec_tests/data/client_side_encryption/aggregate.yml +134 -0
- data/spec/spec_tests/data/client_side_encryption/badQueries.yml +526 -0
- data/spec/spec_tests/data/client_side_encryption/badSchema.yml +73 -0
- data/spec/spec_tests/data/client_side_encryption/basic.yml +116 -0
- data/spec/spec_tests/data/client_side_encryption/bulk.yml +88 -0
- data/spec/spec_tests/data/client_side_encryption/bypassAutoEncryption.yml +100 -0
- data/spec/spec_tests/data/client_side_encryption/bypassedCommand.yml +42 -0
- data/spec/spec_tests/data/client_side_encryption/count.yml +61 -0
- data/spec/spec_tests/data/client_side_encryption/countDocuments.yml +59 -0
- data/spec/spec_tests/data/client_side_encryption/delete.yml +105 -0
- data/spec/spec_tests/data/client_side_encryption/distinct.yml +73 -0
- data/spec/spec_tests/data/client_side_encryption/explain.yml +64 -0
- data/spec/spec_tests/data/client_side_encryption/find.yml +119 -0
- data/spec/spec_tests/data/client_side_encryption/findOneAndDelete.yml +57 -0
- data/spec/spec_tests/data/client_side_encryption/findOneAndReplace.yml +57 -0
- data/spec/spec_tests/data/client_side_encryption/findOneAndUpdate.yml +57 -0
- data/spec/spec_tests/data/client_side_encryption/getMore.yml +68 -0
- data/spec/spec_tests/data/client_side_encryption/insert.yml +102 -0
- data/spec/spec_tests/data/client_side_encryption/keyAltName.yml +71 -0
- data/spec/spec_tests/data/client_side_encryption/localKMS.yml +54 -0
- data/spec/spec_tests/data/client_side_encryption/localSchema.yml +72 -0
- data/spec/spec_tests/data/client_side_encryption/malformedCiphertext.yml +69 -0
- data/spec/spec_tests/data/client_side_encryption/maxWireVersion.yml +20 -0
- data/spec/spec_tests/data/client_side_encryption/missingKey.yml +49 -0
- data/spec/spec_tests/data/client_side_encryption/replaceOne.yml +64 -0
- data/spec/spec_tests/data/client_side_encryption/types.yml +527 -0
- data/spec/spec_tests/data/client_side_encryption/unsupportedCommand.yml +25 -0
- data/spec/spec_tests/data/client_side_encryption/updateMany.yml +77 -0
- data/spec/spec_tests/data/client_side_encryption/updateOne.yml +171 -0
- data/spec/spec_tests/data/read_write_concern/connection-string/write-concern.yml +1 -4
- data/spec/spec_tests/data/retryable_writes/insertOne-serverErrors.yml +21 -0
- data/spec/spec_tests/data/sdam/rs/incompatible_ghost.yml +2 -4
- data/spec/spec_tests/data/sdam/rs/incompatible_other.yml +1 -1
- data/spec/spec_tests/data/sdam/rs/primary_mismatched_me_not_removed.yml +73 -0
- data/spec/spec_tests/data/sdam/rs/primary_to_no_primary_mismatched_me.yml +1 -2
- data/spec/spec_tests/data/sdam/rs/repeated.yml +101 -0
- data/spec/spec_tests/data/sdam/rs/{primary_address_change.yml → ruby_primary_address_change.yml} +2 -0
- data/spec/spec_tests/data/sdam/rs/{secondary_wrong_set_name_with_primary_second.yml → ruby_secondary_wrong_set_name_with_primary_second.yml} +0 -0
- data/spec/spec_tests/data/sdam/sharded/ruby_discovered_single_mongos.yml +27 -0
- data/spec/spec_tests/data/sdam/sharded/{primary_address_change.yml → ruby_primary_different_address.yml} +1 -1
- data/spec/spec_tests/data/sdam/sharded/{primary_mismatched_me.yml → ruby_primary_mismatched_me.yml} +1 -1
- data/spec/spec_tests/data/sdam/single/{primary_address_change.yml → ruby_primary_different_address.yml} +1 -1
- data/spec/spec_tests/data/sdam/single/{primary_mismatched_me.yml → ruby_primary_mismatched_me.yml} +1 -1
- data/spec/spec_tests/data/sdam_monitoring/{replica_set_with_primary_change.yml → replica_set_primary_address_change.yml} +27 -5
- data/spec/spec_tests/data/sdam_monitoring/replica_set_with_me_mismatch.yml +26 -74
- data/spec/spec_tests/data/sdam_monitoring/replica_set_with_removal.yml +20 -16
- data/spec/spec_tests/data/sdam_monitoring/standalone_suppress_equal_description_changes.yml +73 -0
- data/spec/spec_tests/data/transactions/pin-mongos.yml +2 -3
- data/spec/spec_tests/data/uri_options/auth-options.yml +10 -0
- data/spec/spec_tests/data/uri_options/tls-options.yml +75 -4
- data/spec/spec_tests/read_write_concern_connection_string_spec.rb +1 -1
- data/spec/spec_tests/uri_options_spec.rb +6 -8
- data/spec/stress/connection_pool_timing_spec.rb +6 -3
- data/spec/support/certificates/README.md +4 -0
- data/spec/support/certificates/server-second-level-bundle.pem +77 -77
- data/spec/support/certificates/server-second-level.crt +52 -52
- data/spec/support/certificates/server-second-level.key +25 -25
- data/spec/support/certificates/server-second-level.pem +77 -77
- data/spec/support/client_registry.rb +19 -3
- data/spec/support/cluster_config.rb +9 -1
- data/spec/support/cluster_tools.rb +6 -1
- data/spec/support/common_shortcuts.rb +12 -0
- data/spec/support/constraints.rb +16 -0
- data/spec/support/crypt.rb +154 -0
- data/spec/support/crypt/corpus/corpus-key-aws.json +33 -0
- data/spec/support/crypt/corpus/corpus-key-local.json +31 -0
- data/spec/support/crypt/corpus/corpus-schema.json +2057 -0
- data/spec/support/crypt/corpus/corpus.json +3657 -0
- data/spec/support/crypt/corpus/corpus_encrypted.json +4152 -0
- data/spec/support/crypt/data_keys/key_document_aws.json +34 -0
- data/spec/support/crypt/data_keys/key_document_local.json +31 -0
- data/spec/support/crypt/external/external-key.json +31 -0
- data/spec/support/crypt/external/external-schema.json +19 -0
- data/spec/support/crypt/limits/limits-doc.json +102 -0
- data/spec/support/crypt/limits/limits-key.json +31 -0
- data/spec/support/crypt/limits/limits-schema.json +1405 -0
- data/spec/support/crypt/schema_maps/schema_map_aws.json +17 -0
- data/spec/support/crypt/schema_maps/schema_map_aws_key_alt_names.json +12 -0
- data/spec/support/crypt/schema_maps/schema_map_local.json +18 -0
- data/spec/support/crypt/schema_maps/schema_map_local_key_alt_names.json +12 -0
- data/spec/support/lite_constraints.rb +19 -1
- data/spec/support/matchers.rb +19 -0
- data/spec/support/shared/protocol.rb +2 -0
- data/spec/support/spec_config.rb +53 -13
- data/spec/support/utils.rb +140 -10
- metadata +894 -687
- metadata.gz.sig +0 -0
- data/lib/mongo/cluster/srv_monitor.rb +0 -127
- data/lib/mongo/srv/warning_result.rb +0 -35
- data/spec/enterprise_auth/kerberos_spec.rb +0 -58
- data/spec/mongo/cluster/srv_monitor_spec.rb +0 -214
- data/spec/mongo/operation/read_preference_spec.rb +0 -245
- data/spec/spec_tests/data/sdam/sharded/single_mongos.yml +0 -33
- data/spec/support/connection_string.rb +0 -354
data/lib/mongo/grid/fs_bucket.rb
CHANGED
@@ -177,7 +177,7 @@ module Mongo
|
|
177
177
|
#
|
178
178
|
# @since 2.0.0
|
179
179
|
def prefix
|
180
|
-
@options[:fs_name] || @options[:bucket_name]|| DEFAULT_ROOT
|
180
|
+
@options[:fs_name] || @options[:bucket_name] || DEFAULT_ROOT
|
181
181
|
end
|
182
182
|
|
183
183
|
# Remove a single file from the GridFS.
|
@@ -230,7 +230,8 @@ module Mongo
|
|
230
230
|
#
|
231
231
|
# @since 2.1.0
|
232
232
|
def open_download_stream(id, options = nil)
|
233
|
-
|
233
|
+
options = Hash[(options || {}).map { |k, v| [k.to_sym, v] }]
|
234
|
+
read_stream(id, **options).tap do |stream|
|
234
235
|
if block_given?
|
235
236
|
begin
|
236
237
|
yield stream
|
@@ -348,15 +349,15 @@ module Mongo
|
|
348
349
|
download_to_stream(open_download_stream_by_name(filename, opts).file_id, io)
|
349
350
|
end
|
350
351
|
|
351
|
-
# Opens an upload stream to GridFS to which the contents of a
|
352
|
+
# Opens an upload stream to GridFS to which the contents of a file or
|
353
|
+
# blob can be written.
|
352
354
|
#
|
353
|
-
# @
|
354
|
-
# fs.open_upload_stream('a-file.txt')
|
355
|
-
#
|
356
|
-
# @param [ String ] filename The filename of the file to upload.
|
355
|
+
# @param [ String ] filename The name of the file in GridFS.
|
357
356
|
# @param [ Hash ] opts The options for the write stream.
|
358
357
|
#
|
359
|
-
# @option opts [ Object ] :file_id An optional unique file id.
|
358
|
+
# @option opts [ Object ] :file_id An optional unique file id.
|
359
|
+
# A BSON::ObjectId is automatically generated if a file id is not
|
360
|
+
# provided.
|
360
361
|
# @option opts [ Integer ] :chunk_size Override the default chunk size.
|
361
362
|
# @option opts [ Hash ] :metadata User data for the 'metadata' field of the files
|
362
363
|
# collection document.
|
@@ -375,7 +376,8 @@ module Mongo
|
|
375
376
|
#
|
376
377
|
# @since 2.1.0
|
377
378
|
def open_upload_stream(filename, opts = {})
|
378
|
-
|
379
|
+
opts = Hash[opts.map { |k, v| [k.to_sym, v] }]
|
380
|
+
write_stream(filename, **opts).tap do |stream|
|
379
381
|
if block_given?
|
380
382
|
begin
|
381
383
|
yield stream
|
@@ -462,12 +464,12 @@ module Mongo
|
|
462
464
|
#
|
463
465
|
# @option opts [ BSON::Document ] :file_info_doc For internal
|
464
466
|
# driver use only. A BSON document to use as file information.
|
465
|
-
def read_stream(id, opts
|
466
|
-
Stream.get(self, Stream::READ_MODE, { file_id: id }.update(options).update(opts
|
467
|
+
def read_stream(id, **opts)
|
468
|
+
Stream.get(self, Stream::READ_MODE, { file_id: id }.update(options).update(opts))
|
467
469
|
end
|
468
470
|
|
469
|
-
def write_stream(filename, opts)
|
470
|
-
Stream.get(self, Stream::WRITE_MODE, { filename: filename }.
|
471
|
+
def write_stream(filename, **opts)
|
472
|
+
Stream.get(self, Stream::WRITE_MODE, { filename: filename }.update(options).update(opts))
|
471
473
|
end
|
472
474
|
|
473
475
|
def chunks_name
|
@@ -82,12 +82,12 @@ module Mongo
|
|
82
82
|
@open = true
|
83
83
|
end
|
84
84
|
|
85
|
-
# Write to the GridFS bucket from the source stream.
|
85
|
+
# Write to the GridFS bucket from the source stream or a string.
|
86
86
|
#
|
87
87
|
# @example Write to GridFS.
|
88
88
|
# stream.write(io)
|
89
89
|
#
|
90
|
-
# @param [ IO ] io The
|
90
|
+
# @param [ String | IO ] io The string or IO object to upload from.
|
91
91
|
#
|
92
92
|
# @return [ Stream::Write ] self The write stream itself.
|
93
93
|
#
|
@@ -95,7 +95,13 @@ module Mongo
|
|
95
95
|
def write(io)
|
96
96
|
ensure_open!
|
97
97
|
@indexes ||= ensure_indexes!
|
98
|
-
@length += io.
|
98
|
+
@length += if io.respond_to?(:bytesize)
|
99
|
+
# String objects
|
100
|
+
io.bytesize
|
101
|
+
else
|
102
|
+
# IO objects
|
103
|
+
io.size
|
104
|
+
end
|
99
105
|
chunks = File::Chunk.split(io, file_info, @n)
|
100
106
|
@n += chunks.size
|
101
107
|
chunks_collection.insert_many(chunks) unless chunks.empty?
|
data/lib/mongo/index/view.rb
CHANGED
@@ -158,7 +158,7 @@ module Mongo
|
|
158
158
|
session: session
|
159
159
|
}
|
160
160
|
spec[:write_concern] = write_concern if server.features.collation_enabled?
|
161
|
-
Operation::CreateIndex.new(spec).execute(server)
|
161
|
+
Operation::CreateIndex.new(spec).execute(server, client: client)
|
162
162
|
end
|
163
163
|
end
|
164
164
|
|
@@ -236,7 +236,7 @@ module Mongo
|
|
236
236
|
}
|
237
237
|
server = next_primary(nil, session)
|
238
238
|
spec[:write_concern] = write_concern if server.features.collation_enabled?
|
239
|
-
Operation::DropIndex.new(spec).execute(server)
|
239
|
+
Operation::DropIndex.new(spec).execute(server, client: client)
|
240
240
|
end
|
241
241
|
end
|
242
242
|
|
@@ -272,7 +272,7 @@ module Mongo
|
|
272
272
|
end
|
273
273
|
|
274
274
|
def send_initial_query(server, session)
|
275
|
-
initial_query_op(session).execute(server)
|
275
|
+
initial_query_op(session).execute(server, client: client)
|
276
276
|
end
|
277
277
|
|
278
278
|
def with_generated_names(models, server)
|
@@ -99,7 +99,12 @@ module Mongo
|
|
99
99
|
address,
|
100
100
|
payload[:request_id],
|
101
101
|
operation_id,
|
102
|
-
|
102
|
+
# All op_msg payloads have a $db field. Legacy payloads do not
|
103
|
+
# have a $db field. To emulate op_msg when publishing command
|
104
|
+
# monitoring events for legacy servers, add $db to the payload,
|
105
|
+
# copying the database name. Note that the database name is also
|
106
|
+
# available as a top-level attribute on the command started event.
|
107
|
+
payload[:command].merge('$db' => payload[:database_name]),
|
103
108
|
socket_object_id: socket_object_id,
|
104
109
|
connection_id: connection_id,
|
105
110
|
)
|
@@ -31,17 +31,20 @@ module Mongo
|
|
31
31
|
# Execute the operation.
|
32
32
|
#
|
33
33
|
# @example
|
34
|
-
# operation.execute(server)
|
34
|
+
# operation.execute(server, client: nil)
|
35
35
|
#
|
36
36
|
# @param [ Mongo::Server ] server The server to send the operation to.
|
37
|
+
# @param [ Mongo::Client ] client The client that will be used to
|
38
|
+
# perform auto-encryption if it is necessary to encrypt the command
|
39
|
+
# being executed (optional).
|
37
40
|
#
|
38
41
|
# @return [ Mongo::Operation::CollectionsInfo::Result,
|
39
42
|
# Mongo::Operation::ListCollections::Result ] The operation result.
|
40
43
|
#
|
41
44
|
# @since 2.0.0
|
42
|
-
def execute(server)
|
45
|
+
def execute(server, client:)
|
43
46
|
if server.features.list_collections_enabled?
|
44
|
-
return Operation::ListCollections.new(spec).execute(server)
|
47
|
+
return Operation::ListCollections.new(spec).execute(server, client: client)
|
45
48
|
end
|
46
49
|
|
47
50
|
super
|
@@ -36,7 +36,7 @@ module Mongo
|
|
36
36
|
end
|
37
37
|
|
38
38
|
def message(server)
|
39
|
-
section =
|
39
|
+
section = Protocol::Msg::Section1.new(IDENTIFIER, send(IDENTIFIER))
|
40
40
|
Protocol::Msg.new(flags, {}, command(server), section)
|
41
41
|
end
|
42
42
|
end
|
@@ -19,9 +19,12 @@ module Mongo
|
|
19
19
|
# Execute the operation.
|
20
20
|
#
|
21
21
|
# @example
|
22
|
-
# operation.execute(server)
|
22
|
+
# operation.execute(server, client: nil)
|
23
23
|
#
|
24
24
|
# @param [ Mongo::Server ] server The server to send the operation to.
|
25
|
+
# @param [ Mongo::Client ] client The client that will be used to
|
26
|
+
# perform auto-encryption if it is necessary to encrypt the command
|
27
|
+
# being executed (optional).
|
25
28
|
#
|
26
29
|
# @return [ Mongo::Operation::Find::Result ] The operation result.
|
27
30
|
#
|
@@ -19,9 +19,12 @@ module Mongo
|
|
19
19
|
# Execute the operation.
|
20
20
|
#
|
21
21
|
# @example
|
22
|
-
# operation.execute(server)
|
22
|
+
# operation.execute(server, client: nil)
|
23
23
|
#
|
24
24
|
# @param [ Mongo::Server ] server The server to send the operation to.
|
25
|
+
# @param [ Mongo::Client ] client The client that will be used to
|
26
|
+
# perform auto-encryption if it is necessary to encrypt the command
|
27
|
+
# being executed (optional).
|
25
28
|
#
|
26
29
|
# @return [ Mongo::Operation::GetMore::Result ] The operation result.
|
27
30
|
#
|
@@ -32,8 +32,9 @@ module Mongo
|
|
32
32
|
|
33
33
|
private
|
34
34
|
|
35
|
-
def get_result(server)
|
36
|
-
Result
|
35
|
+
def get_result(server, client, options = {})
|
36
|
+
# This is a Mongo::Operation::Insert::Result
|
37
|
+
Result.new(*dispatch_message(server, client), @ids)
|
37
38
|
end
|
38
39
|
|
39
40
|
def selector(server)
|
@@ -30,8 +30,9 @@ module Mongo
|
|
30
30
|
|
31
31
|
private
|
32
32
|
|
33
|
-
def get_result(server)
|
34
|
-
Result
|
33
|
+
def get_result(server, client, options = {})
|
34
|
+
# This is a Mongo::Operation::Insert::Result
|
35
|
+
Result.new(dispatch_message(server, client), @ids)
|
35
36
|
end
|
36
37
|
|
37
38
|
def selector
|
@@ -30,9 +30,9 @@ module Mongo
|
|
30
30
|
|
31
31
|
private
|
32
32
|
|
33
|
-
def get_result(server)
|
33
|
+
def get_result(server, client, options = {})
|
34
34
|
# This is a Mongo::Operation::Insert::Result
|
35
|
-
Result.new(dispatch_message(server), @ids)
|
35
|
+
Result.new(dispatch_message(server, client), @ids)
|
36
36
|
end
|
37
37
|
|
38
38
|
def selector(server)
|
@@ -42,7 +42,7 @@ module Mongo
|
|
42
42
|
end
|
43
43
|
|
44
44
|
def message(server)
|
45
|
-
section =
|
45
|
+
section = Protocol::Msg::Section1.new(IDENTIFIER, send(IDENTIFIER))
|
46
46
|
Protocol::Msg.new(flags, { validating_keys: true }, command(server), section)
|
47
47
|
end
|
48
48
|
end
|
@@ -18,7 +18,13 @@ require 'mongo/operation/shared/result/use_legacy_error_parser'
|
|
18
18
|
module Mongo
|
19
19
|
module Operation
|
20
20
|
|
21
|
-
# Result wrapper for
|
21
|
+
# Result wrapper for wire protocol replies.
|
22
|
+
#
|
23
|
+
# An operation has zero or one replies. The only operations producing zero
|
24
|
+
# replies are unacknowledged writes; all other operations produce one reply.
|
25
|
+
# This class provides an object that can be operated on (for example, to
|
26
|
+
# check whether an operation succeeded) even when the operation did not
|
27
|
+
# produce a reply (in which case it is assumed to have succeeded).
|
22
28
|
#
|
23
29
|
# @since 2.0.0
|
24
30
|
class Result
|
@@ -67,17 +73,33 @@ module Mongo
|
|
67
73
|
|
68
74
|
# Initialize a new result.
|
69
75
|
#
|
70
|
-
#
|
71
|
-
# Result.new(replies)
|
76
|
+
# For an unkacknowledged write, pass nil in replies.
|
72
77
|
#
|
73
|
-
#
|
78
|
+
# For all other operations, replies must be a Protocol::Message instance
|
79
|
+
# or an array containing a single Protocol::Message instance.
|
74
80
|
#
|
75
|
-
# @
|
81
|
+
# @param [ Protocol::Message | Array<Protocol::Message> | nil ] replies
|
82
|
+
# The wire protocol replies.
|
83
|
+
#
|
84
|
+
# @api private
|
76
85
|
def initialize(replies)
|
77
|
-
|
86
|
+
if replies
|
87
|
+
if replies.is_a?(Array)
|
88
|
+
if replies.length != 1
|
89
|
+
raise ArgumentError, "Only one (or zero) reply is supported, given #{replies.length}"
|
90
|
+
end
|
91
|
+
reply = replies.first
|
92
|
+
else
|
93
|
+
reply = replies
|
94
|
+
end
|
95
|
+
unless reply.is_a?(Protocol::Message)
|
96
|
+
raise ArgumentError, "Argument must be a Message instance, but is a #{reply.class}: #{reply.inspect}"
|
97
|
+
end
|
98
|
+
@replies = [ reply ]
|
99
|
+
end
|
78
100
|
end
|
79
101
|
|
80
|
-
# @return [ Array<Protocol::
|
102
|
+
# @return [ Array<Protocol::Message> ] replies The wrapped wire protocol replies.
|
81
103
|
attr_reader :replies
|
82
104
|
|
83
105
|
# @api private
|
@@ -99,19 +121,6 @@ module Mongo
|
|
99
121
|
!!@replies
|
100
122
|
end
|
101
123
|
|
102
|
-
# Determine if this result is a collection of multiple replies from the
|
103
|
-
# server.
|
104
|
-
#
|
105
|
-
# @example Is the result for multiple replies?
|
106
|
-
# result.multiple?
|
107
|
-
#
|
108
|
-
# @return [ true, false ] If the result is for multiple replies.
|
109
|
-
#
|
110
|
-
# @since 2.0.0
|
111
|
-
def multiple?
|
112
|
-
replies.size > 1
|
113
|
-
end
|
114
|
-
|
115
124
|
# Get the cursor id if the response is acknowledged.
|
116
125
|
#
|
117
126
|
# @note Cursor ids of 0 indicate there is no cursor on the server.
|
@@ -146,7 +155,7 @@ module Mongo
|
|
146
155
|
# @since 2.0.0
|
147
156
|
def documents
|
148
157
|
if acknowledged?
|
149
|
-
replies.flat_map
|
158
|
+
replies.flat_map(&:documents)
|
150
159
|
else
|
151
160
|
[]
|
152
161
|
end
|
@@ -180,12 +189,12 @@ module Mongo
|
|
180
189
|
"#<#{self.class.name}:0x#{object_id} documents=#{documents}>"
|
181
190
|
end
|
182
191
|
|
183
|
-
# Get the
|
192
|
+
# Get the reply from the result.
|
184
193
|
#
|
185
|
-
#
|
186
|
-
#
|
194
|
+
# Returns nil if there is no reply (i.e. the operation was an
|
195
|
+
# unacknowledged write).
|
187
196
|
#
|
188
|
-
# @return [ Protocol::
|
197
|
+
# @return [ Protocol::Message ] The first reply.
|
189
198
|
#
|
190
199
|
# @since 2.0.0
|
191
200
|
def reply
|
@@ -206,7 +215,7 @@ module Mongo
|
|
206
215
|
# @since 2.0.0
|
207
216
|
def returned_count
|
208
217
|
if acknowledged?
|
209
|
-
|
218
|
+
reply.number_returned
|
210
219
|
else
|
211
220
|
0
|
212
221
|
end
|
@@ -308,7 +317,7 @@ module Mongo
|
|
308
317
|
# @since 2.0.0
|
309
318
|
def written_count
|
310
319
|
if acknowledged?
|
311
|
-
|
320
|
+
first_document[N] || 0
|
312
321
|
else
|
313
322
|
0
|
314
323
|
end
|
@@ -22,11 +22,11 @@ module Mongo
|
|
22
22
|
|
23
23
|
include ResponseHandling
|
24
24
|
|
25
|
-
def do_execute(server)
|
25
|
+
def do_execute(server, client, options = {})
|
26
26
|
unpin_maybe(session) do
|
27
27
|
add_error_labels do
|
28
28
|
add_server_diagnostics(server) do
|
29
|
-
get_result(server).tap do |result|
|
29
|
+
get_result(server, client, options).tap do |result|
|
30
30
|
process_result(result, server)
|
31
31
|
end
|
32
32
|
end
|
@@ -34,8 +34,8 @@ module Mongo
|
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
|
-
def execute(server)
|
38
|
-
do_execute(server).tap do |result|
|
37
|
+
def execute(server, client:, options: {})
|
38
|
+
do_execute(server, client, options).tap do |result|
|
39
39
|
validate_result(result, server)
|
40
40
|
end
|
41
41
|
end
|
@@ -46,14 +46,16 @@ module Mongo
|
|
46
46
|
Result
|
47
47
|
end
|
48
48
|
|
49
|
-
def get_result(server)
|
50
|
-
result_class.new(dispatch_message(server))
|
49
|
+
def get_result(server, client, options = {})
|
50
|
+
result_class.new(dispatch_message(server, client, options))
|
51
51
|
end
|
52
52
|
|
53
|
-
# Returns a Protocol::Message or nil
|
54
|
-
def dispatch_message(server)
|
53
|
+
# Returns a Protocol::Message or nil as reply.
|
54
|
+
def dispatch_message(server, client, options = {})
|
55
55
|
server.with_connection do |connection|
|
56
|
-
|
56
|
+
message = build_message(server)
|
57
|
+
message = message.maybe_encrypt(server, client)
|
58
|
+
connection.dispatch([ message ], operation_id, client, options)
|
57
59
|
end
|
58
60
|
end
|
59
61
|
|
@@ -22,9 +22,9 @@ module Mongo
|
|
22
22
|
module OpMsgOrCommand
|
23
23
|
include PolymorphicLookup
|
24
24
|
|
25
|
-
def execute(server)
|
25
|
+
def execute(server, client:, options: {})
|
26
26
|
operation = final_operation(server)
|
27
|
-
operation.execute(server)
|
27
|
+
operation.execute(server, client: client, options: options)
|
28
28
|
end
|
29
29
|
|
30
30
|
private
|
@@ -23,9 +23,9 @@ module Mongo
|
|
23
23
|
module OpMsgOrFindCommand
|
24
24
|
include PolymorphicLookup
|
25
25
|
|
26
|
-
def execute(server)
|
26
|
+
def execute(server, client:)
|
27
27
|
operation = final_operation(server)
|
28
|
-
operation.execute(server)
|
28
|
+
operation.execute(server, client: client)
|
29
29
|
end
|
30
30
|
|
31
31
|
private
|