mongo 1.12.5 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CONTRIBUTING.md +64 -0
- data/LICENSE +1 -1
- data/README.md +21 -126
- data/Rakefile +39 -21
- data/bin/mongo_console +6 -38
- data/lib/mongo/address/ipv4.rb +85 -0
- data/lib/mongo/address/ipv6.rb +85 -0
- data/lib/mongo/address/unix.rb +76 -0
- data/lib/mongo/address.rb +111 -0
- data/lib/mongo/auth/cr/conversation.rb +119 -0
- data/lib/mongo/auth/cr.rb +44 -0
- data/lib/mongo/auth/executable.rb +52 -0
- data/lib/mongo/auth/ldap/conversation.rb +92 -0
- data/lib/mongo/auth/ldap.rb +48 -0
- data/lib/mongo/auth/roles.rb +104 -0
- data/lib/mongo/auth/scram/conversation.rb +450 -0
- data/lib/mongo/auth/scram.rb +53 -0
- data/lib/mongo/auth/user/view.rb +102 -0
- data/lib/mongo/auth/user.rb +159 -0
- data/lib/mongo/auth/x509/conversation.rb +92 -0
- data/lib/mongo/auth/x509.rb +48 -0
- data/lib/mongo/auth.rb +108 -0
- data/lib/mongo/bulk_write/bulk_writable.rb +191 -0
- data/lib/mongo/bulk_write/deletable.rb +60 -0
- data/lib/mongo/bulk_write/insertable.rb +52 -0
- data/lib/mongo/bulk_write/ordered_bulk_write.rb +48 -0
- data/lib/mongo/bulk_write/replacable.rb +57 -0
- data/lib/mongo/bulk_write/unordered_bulk_write.rb +46 -0
- data/lib/mongo/bulk_write/updatable.rb +68 -0
- data/lib/mongo/bulk_write.rb +52 -0
- data/lib/mongo/client.rb +246 -0
- data/lib/mongo/cluster/topology/replica_set.rb +160 -0
- data/lib/mongo/cluster/topology/sharded.rb +132 -0
- data/lib/mongo/cluster/topology/standalone.rb +132 -0
- data/lib/mongo/cluster/topology/unknown.rb +155 -0
- data/lib/mongo/cluster/topology.rb +60 -0
- data/lib/mongo/cluster.rb +203 -0
- data/lib/mongo/collection/view/aggregation.rb +108 -0
- data/lib/mongo/collection/view/explainable.rb +49 -0
- data/lib/mongo/collection/view/immutable.rb +43 -0
- data/lib/mongo/collection/view/iterable.rb +48 -0
- data/lib/mongo/collection/view/map_reduce.rb +191 -0
- data/lib/mongo/collection/view/readable.rb +363 -0
- data/lib/mongo/collection/view/writable.rb +185 -0
- data/lib/mongo/collection/view.rb +169 -0
- data/lib/mongo/collection.rb +130 -1101
- data/lib/mongo/cursor.rb +78 -681
- data/lib/mongo/database/view.rb +101 -0
- data/lib/mongo/database.rb +224 -0
- data/lib/mongo/error/bulk_write_error.rb +41 -0
- data/lib/mongo/error/invalid_bulk_operation.rb +36 -0
- data/lib/mongo/error/invalid_bulk_operation_type.rb +36 -0
- data/lib/mongo/error/invalid_collection_name.rb +39 -0
- data/lib/mongo/error/invalid_database_name.rb +39 -0
- data/{test/replica_set/ssl_test.rb → lib/mongo/error/invalid_document.rb} +21 -14
- data/lib/mongo/error/invalid_file.rb +38 -0
- data/lib/mongo/error/invalid_nonce.rb +46 -0
- data/lib/mongo/error/invalid_replacement_document.rb +39 -0
- data/lib/mongo/error/invalid_signature.rb +47 -0
- data/{test/functional/ssl_test.rb → lib/mongo/error/invalid_update_document.rb} +22 -12
- data/lib/mongo/error/max_bson_size.rb +40 -0
- data/lib/mongo/error/max_message_size.rb +42 -0
- data/{test/functional/db_connection_test.rb → lib/mongo/error/multi_index_drop.rb} +17 -8
- data/lib/mongo/{utils.rb → error/need_primary_server.rb} +10 -6
- data/lib/mongo/{connection.rb → error/operation_failure.rb} +10 -6
- data/lib/mongo/error/parser.rb +77 -0
- data/lib/mongo/{connection/socket.rb → error/socket_error.rb} +10 -5
- data/lib/mongo/error/socket_timeout_error.rb +23 -0
- data/lib/mongo/error/unsupported_features.rb +43 -0
- data/lib/mongo/error.rb +82 -0
- data/lib/mongo/event/listeners.rb +63 -0
- data/lib/mongo/event/primary_elected.rb +53 -0
- data/lib/mongo/event/publisher.rb +42 -0
- data/lib/mongo/event/server_added.rb +53 -0
- data/lib/mongo/event/server_removed.rb +53 -0
- data/lib/mongo/event/subscriber.rb +41 -0
- data/lib/mongo/event.rb +40 -0
- data/lib/mongo/grid/file/chunk.rb +184 -0
- data/lib/mongo/grid/file/metadata.rb +229 -0
- data/lib/mongo/grid/file.rb +106 -0
- data/lib/mongo/grid/fs.rb +149 -0
- data/lib/mongo/{gridfs.rb → grid.rb} +3 -5
- data/lib/mongo/index/view.rb +261 -0
- data/lib/mongo/index.rb +64 -0
- data/lib/mongo/loggable.rb +126 -0
- data/lib/mongo/logger.rb +132 -0
- data/lib/mongo/operation/aggregate/result.rb +88 -0
- data/lib/mongo/operation/aggregate.rb +100 -0
- data/lib/mongo/operation/command.rb +62 -0
- data/lib/mongo/operation/executable.rb +105 -0
- data/lib/mongo/operation/kill_cursors.rb +39 -0
- data/lib/mongo/operation/limited.rb +37 -0
- data/lib/mongo/operation/list_collections/result.rb +114 -0
- data/lib/mongo/operation/list_indexes/result.rb +118 -0
- data/lib/mongo/operation/map_reduce/result.rb +122 -0
- data/lib/mongo/operation/map_reduce.rb +96 -0
- data/lib/mongo/operation/read/collections_info.rb +67 -0
- data/lib/mongo/operation/read/get_more.rb +71 -0
- data/lib/mongo/operation/read/indexes.rb +68 -0
- data/lib/mongo/operation/read/list_collections.rb +75 -0
- data/lib/mongo/operation/read/list_indexes.rb +77 -0
- data/lib/mongo/operation/read/query.rb +71 -0
- data/lib/mongo/{functional.rb → operation/read.rb} +7 -7
- data/lib/mongo/operation/read_preferrable.rb +34 -0
- data/lib/mongo/operation/result.rb +259 -0
- data/lib/mongo/operation/specifiable.rb +397 -0
- data/lib/mongo/operation/write/bulk/bulk_delete/result.rb +75 -0
- data/lib/mongo/operation/write/bulk/bulk_delete.rb +144 -0
- data/lib/mongo/operation/write/bulk/bulk_insert/result.rb +68 -0
- data/lib/mongo/operation/write/bulk/bulk_insert.rb +129 -0
- data/lib/mongo/operation/write/bulk/bulk_mergable.rb +67 -0
- data/lib/mongo/operation/write/bulk/bulk_update/result.rb +162 -0
- data/lib/mongo/operation/write/bulk/bulk_update.rb +153 -0
- data/lib/mongo/operation/write/bulk/legacy_bulk_mergable.rb +83 -0
- data/lib/mongo/operation/write/bulk.rb +17 -0
- data/lib/mongo/operation/write/command/create_index.rb +50 -0
- data/lib/mongo/operation/write/command/create_user.rb +43 -0
- data/lib/mongo/operation/write/command/delete.rb +56 -0
- data/lib/mongo/operation/write/command/drop_index.rb +51 -0
- data/lib/mongo/operation/write/command/insert.rb +55 -0
- data/lib/mongo/operation/write/command/remove_user.rb +42 -0
- data/lib/mongo/operation/write/command/update.rb +60 -0
- data/lib/mongo/operation/write/command/writable.rb +61 -0
- data/lib/mongo/operation/write/command.rb +22 -0
- data/lib/mongo/operation/write/create_index.rb +89 -0
- data/lib/mongo/operation/write/create_user.rb +75 -0
- data/lib/mongo/operation/write/delete/result.rb +40 -0
- data/lib/mongo/operation/write/delete.rb +93 -0
- data/lib/mongo/operation/write/drop_index.rb +62 -0
- data/lib/mongo/{utils/thread_local_variable_manager.rb → operation/write/insert/result.rb} +15 -8
- data/lib/mongo/operation/write/insert.rb +90 -0
- data/lib/mongo/operation/write/remove_user.rb +70 -0
- data/lib/mongo/operation/write/update/result.rb +160 -0
- data/lib/mongo/operation/write/update.rb +103 -0
- data/lib/mongo/{connection/socket/socket_util.rb → operation/write.rb} +10 -24
- data/lib/mongo/operation.rb +25 -0
- data/lib/mongo/options/mapper.rb +78 -0
- data/lib/mongo/options.rb +15 -0
- data/lib/mongo/protocol/bit_vector.rb +61 -0
- data/lib/mongo/protocol/delete.rb +94 -0
- data/lib/mongo/protocol/get_more.rb +99 -0
- data/lib/mongo/protocol/insert.rb +99 -0
- data/lib/mongo/protocol/kill_cursors.rb +74 -0
- data/lib/mongo/protocol/message.rb +252 -0
- data/lib/mongo/protocol/query.rb +147 -0
- data/lib/mongo/protocol/reply.rb +72 -0
- data/lib/mongo/protocol/serializers.rb +180 -0
- data/lib/mongo/protocol/update.rb +111 -0
- data/lib/mongo/protocol.rb +15 -0
- data/lib/mongo/server/connectable.rb +110 -0
- data/lib/mongo/server/connection.rb +134 -0
- data/lib/mongo/server/connection_pool/queue.rb +182 -0
- data/lib/mongo/server/connection_pool.rb +141 -0
- data/lib/mongo/server/context.rb +66 -0
- data/lib/mongo/server/description/features.rb +85 -0
- data/lib/mongo/server/description/inspector/primary_elected.rb +58 -0
- data/lib/mongo/server/description/inspector/server_added.rb +59 -0
- data/lib/mongo/server/description/inspector/server_removed.rb +59 -0
- data/lib/mongo/server/description/inspector.rb +79 -0
- data/lib/mongo/server/description.rb +450 -0
- data/lib/mongo/server/monitor/connection.rb +89 -0
- data/lib/mongo/server/monitor.rb +176 -0
- data/lib/mongo/server.rb +163 -0
- data/lib/mongo/server_selector/nearest.rb +94 -0
- data/lib/mongo/server_selector/primary.rb +88 -0
- data/lib/mongo/server_selector/primary_preferred.rb +94 -0
- data/lib/mongo/server_selector/secondary.rb +91 -0
- data/lib/mongo/server_selector/secondary_preferred.rb +96 -0
- data/lib/mongo/server_selector/selectable.rb +209 -0
- data/lib/mongo/server_selector.rb +81 -0
- data/lib/mongo/socket/ssl.rb +130 -0
- data/lib/mongo/socket/tcp.rb +69 -0
- data/lib/mongo/socket/unix.rb +64 -0
- data/lib/mongo/socket.rb +179 -0
- data/lib/mongo/uri.rb +504 -0
- data/lib/mongo/version.rb +21 -0
- data/lib/mongo/write_concern/acknowledged.rb +52 -0
- data/lib/mongo/write_concern/normalizable.rb +51 -0
- data/lib/mongo/write_concern/unacknowledged.rb +55 -0
- data/lib/mongo/write_concern.rb +99 -0
- data/lib/mongo.rb +24 -82
- data/mongo.gemspec +17 -14
- data/spec/certificates/ca.pem +17 -0
- data/spec/certificates/client.pem +101 -0
- data/spec/certificates/crl.pem +10 -0
- data/spec/certificates/crl_client_revoked.pem +12 -0
- data/spec/certificates/password_protected.pem +51 -0
- data/spec/certificates/server.pem +34 -0
- data/spec/mongo/address/ipv4_spec.rb +74 -0
- data/spec/mongo/address/ipv6_spec.rb +74 -0
- data/spec/mongo/address/unix_spec.rb +30 -0
- data/spec/mongo/address_spec.rb +206 -0
- data/spec/mongo/auth/cr_spec.rb +59 -0
- data/spec/mongo/auth/ldap_spec.rb +40 -0
- data/spec/mongo/auth/scram/conversation_spec.rb +197 -0
- data/spec/mongo/auth/scram_spec.rb +55 -0
- data/spec/mongo/auth/user/view_spec.rb +76 -0
- data/spec/mongo/auth/user_spec.rb +190 -0
- data/spec/mongo/auth/x509_spec.rb +40 -0
- data/spec/mongo/auth_spec.rb +65 -0
- data/spec/mongo/bulk/bulk_write_spec.rb +262 -0
- data/spec/mongo/client_spec.rb +564 -0
- data/spec/mongo/cluster/topology/replica_set_spec.rb +101 -0
- data/spec/mongo/cluster/topology/sharded_spec.rb +74 -0
- data/spec/mongo/cluster/topology/standalone_spec.rb +79 -0
- data/spec/mongo/cluster/topology_spec.rb +65 -0
- data/spec/mongo/cluster_spec.rb +129 -0
- data/spec/mongo/collection/view/aggregation_spec.rb +148 -0
- data/spec/mongo/collection/view/explainable_spec.rb +32 -0
- data/spec/mongo/collection/view/map_reduce_spec.rb +242 -0
- data/spec/mongo/collection/view/readable_spec.rb +603 -0
- data/spec/mongo/collection/view/writable_spec.rb +679 -0
- data/spec/mongo/collection/view_spec.rb +530 -0
- data/spec/mongo/collection_spec.rb +362 -0
- data/spec/mongo/crud_spec.rb +42 -0
- data/spec/mongo/cursor_spec.rb +295 -0
- data/spec/mongo/database_spec.rb +302 -0
- data/spec/mongo/error/parser_spec.rb +119 -0
- data/spec/mongo/event/publisher_spec.rb +50 -0
- data/spec/mongo/event/subscriber_spec.rb +34 -0
- data/spec/mongo/grid/file/chunk_spec.rb +226 -0
- data/spec/mongo/grid/file/metadata_spec.rb +92 -0
- data/spec/mongo/grid/file_spec.rb +172 -0
- data/spec/mongo/grid/fs_spec.rb +129 -0
- data/spec/mongo/index/view_spec.rb +330 -0
- data/spec/mongo/loggable_spec.rb +62 -0
- data/spec/mongo/logger_spec.rb +97 -0
- data/spec/mongo/operation/aggregate/result_spec.rb +80 -0
- data/spec/mongo/operation/aggregate_spec.rb +127 -0
- data/spec/mongo/operation/command_spec.rb +98 -0
- data/spec/mongo/operation/kill_cursors_spec.rb +66 -0
- data/spec/mongo/operation/limited_spec.rb +50 -0
- data/spec/mongo/operation/map_reduce_spec.rb +143 -0
- data/spec/mongo/operation/read/collections_info_spec.rb +40 -0
- data/spec/mongo/operation/read/get_more_spec.rb +81 -0
- data/spec/mongo/operation/read/indexes_spec.rb +31 -0
- data/spec/mongo/operation/read/query_spec.rb +84 -0
- data/spec/mongo/operation/result_spec.rb +275 -0
- data/spec/mongo/operation/specifiable_spec.rb +53 -0
- data/spec/mongo/operation/write/bulk_delete_spec.rb +235 -0
- data/spec/mongo/operation/write/bulk_insert_spec.rb +235 -0
- data/spec/mongo/operation/write/bulk_update_spec.rb +236 -0
- data/spec/mongo/operation/write/command/delete_spec.rb +103 -0
- data/spec/mongo/operation/write/command/insert_spec.rb +103 -0
- data/spec/mongo/operation/write/command/update_spec.rb +109 -0
- data/spec/mongo/operation/write/create_index_spec.rb +63 -0
- data/spec/mongo/operation/write/create_user_spec.rb +44 -0
- data/spec/mongo/operation/write/delete_spec.rb +186 -0
- data/spec/mongo/operation/write/drop_index_spec.rb +51 -0
- data/spec/mongo/operation/write/insert_spec.rb +244 -0
- data/spec/mongo/operation/write/remove_user_spec.rb +46 -0
- data/spec/mongo/operation/write/response_spec.rb +85 -0
- data/spec/mongo/operation/write/update_spec.rb +228 -0
- data/spec/mongo/protocol/delete_spec.rb +167 -0
- data/spec/mongo/protocol/get_more_spec.rb +146 -0
- data/spec/mongo/protocol/insert_spec.rb +161 -0
- data/spec/mongo/protocol/kill_cursors_spec.rb +101 -0
- data/spec/mongo/protocol/query_spec.rb +285 -0
- data/spec/mongo/protocol/reply_spec.rb +157 -0
- data/spec/mongo/protocol/update_spec.rb +186 -0
- data/spec/mongo/server/connection_pool/queue_spec.rb +170 -0
- data/spec/mongo/server/connection_pool_spec.rb +120 -0
- data/spec/mongo/server/connection_spec.rb +312 -0
- data/spec/mongo/server/description/features_spec.rb +138 -0
- data/spec/mongo/server/description/inspector/primary_elected_spec.rb +94 -0
- data/spec/mongo/server/description/inspector/server_added_spec.rb +92 -0
- data/spec/mongo/server/description/inspector/server_removed_spec.rb +95 -0
- data/spec/mongo/server/description_spec.rb +510 -0
- data/spec/mongo/server/monitor_spec.rb +144 -0
- data/spec/mongo/server_discovery_and_monitoring_spec.rb +103 -0
- data/spec/mongo/server_selection_rtt_spec.rb +104 -0
- data/spec/mongo/server_selection_spec.rb +89 -0
- data/spec/mongo/server_selector/nearest_spec.rb +250 -0
- data/spec/mongo/server_selector/primary_preferred_spec.rb +290 -0
- data/spec/mongo/server_selector/primary_spec.rb +114 -0
- data/spec/mongo/server_selector/secondary_preferred_spec.rb +252 -0
- data/spec/mongo/server_selector/secondary_spec.rb +196 -0
- data/spec/mongo/server_selector_spec.rb +101 -0
- data/spec/mongo/server_spec.rb +131 -0
- data/spec/mongo/uri_spec.rb +517 -0
- data/spec/mongo/write_concern/acknowledged_spec.rb +44 -0
- data/spec/mongo/write_concern/unacknowledged_spec.rb +15 -0
- data/spec/spec_helper.rb +133 -0
- data/spec/support/authorization.rb +247 -0
- data/spec/support/crud/read.rb +144 -0
- data/spec/support/crud/write.rb +214 -0
- data/spec/support/crud.rb +203 -0
- data/spec/support/crud_tests/read/aggregate.yml +43 -0
- data/spec/support/crud_tests/read/count.yml +37 -0
- data/spec/support/crud_tests/read/distinct.yml +33 -0
- data/spec/support/crud_tests/read/find.yml +50 -0
- data/spec/support/crud_tests/write/deleteMany.yml +36 -0
- data/spec/support/crud_tests/write/deleteOne.yml +49 -0
- data/spec/support/crud_tests/write/findOneAndDelete.yml +54 -0
- data/spec/support/crud_tests/write/findOneAndReplace.yml +153 -0
- data/spec/support/crud_tests/write/findOneAndUpdate.yml +161 -0
- data/spec/support/crud_tests/write/insertMany.yml +24 -0
- data/spec/support/crud_tests/write/insertOne.yml +19 -0
- data/spec/support/crud_tests/write/replaceOne.yml +96 -0
- data/spec/support/crud_tests/write/updateMany.yml +83 -0
- data/spec/support/crud_tests/write/updateOne.yml +80 -0
- data/spec/support/helpers.rb +140 -0
- data/spec/support/matchers.rb +37 -0
- data/spec/support/sdam/rs/discover_arbiters.yml +41 -0
- data/spec/support/sdam/rs/discover_passives.yml +41 -0
- data/spec/support/sdam/rs/discover_primary.yml +40 -0
- data/spec/support/sdam/rs/discover_secondary.yml +41 -0
- data/spec/support/sdam/rs/discovery.yml +195 -0
- data/spec/support/sdam/rs/ghost_discovered.yml +39 -0
- data/spec/support/sdam/rs/hosts_differ_from_seeds.yml +34 -0
- data/spec/support/sdam/rs/member_reconfig.yml +68 -0
- data/spec/support/sdam/rs/member_standalone.yml +60 -0
- data/spec/support/sdam/rs/new_primary.yml +74 -0
- data/spec/support/sdam/rs/new_primary_wrong_set_name.yml +71 -0
- data/spec/support/sdam/rs/non_rs_member.yml +31 -0
- data/spec/support/sdam/rs/normalize_case.yml +49 -0
- data/spec/support/sdam/rs/primary_becomes_standalone.yml +52 -0
- data/spec/support/sdam/rs/primary_changes_set_name.yml +57 -0
- data/spec/support/sdam/rs/primary_disconnect.yml +56 -0
- data/spec/support/sdam/rs/primary_wrong_set_name.yml +27 -0
- data/spec/support/sdam/rs/response_from_removed.yml +63 -0
- data/spec/support/sdam/rs/rsother_discovered.yml +41 -0
- data/spec/support/sdam/rs/sec_not_auth.yml +49 -0
- data/spec/support/sdam/rs/secondary_wrong_set_name.yml +28 -0
- data/spec/support/sdam/rs/secondary_wrong_set_name_with_primary.yml +69 -0
- data/spec/support/sdam/rs/unexpected_mongos.yml +26 -0
- data/spec/support/sdam/rs/wrong_set_name.yml +35 -0
- data/spec/support/sdam/sharded/multiple_mongoses.yml +46 -0
- data/spec/support/sdam/sharded/non_mongos_removed.yml +41 -0
- data/spec/support/sdam/sharded/normalize_uri_case.yml +32 -0
- data/spec/support/sdam/single/direct_connection_external_ip.yml +34 -0
- data/spec/support/sdam/single/direct_connection_mongos.yml +33 -0
- data/spec/support/sdam/single/direct_connection_rsarbiter.yml +35 -0
- data/spec/support/sdam/single/direct_connection_rsprimary.yml +34 -0
- data/spec/support/sdam/single/direct_connection_rssecondary.yml +35 -0
- data/spec/support/sdam/single/direct_connection_slave.yml +32 -0
- data/spec/support/sdam/single/direct_connection_standalone.yml +32 -0
- data/spec/support/sdam/single/not_ok_response.yml +39 -0
- data/spec/support/sdam/single/standalone_removed.yml +32 -0
- data/spec/support/sdam/single/unavailable_seed.yml +28 -0
- data/spec/support/server_discovery_and_monitoring.rb +167 -0
- data/spec/support/server_selection/rtt/first_value.yml +4 -0
- data/spec/support/server_selection/rtt/first_value_zero.yml +4 -0
- data/spec/support/server_selection/rtt/value_test_1.yml +4 -0
- data/spec/support/server_selection/rtt/value_test_2.yml +4 -0
- data/spec/support/server_selection/rtt/value_test_3.yml +4 -0
- data/spec/support/server_selection/rtt/value_test_4.yml +4 -0
- data/spec/support/server_selection/rtt/value_test_5.yml +4 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest.yml +26 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest_non_matching.yml +21 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Primary.yml +21 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred.yml +26 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred_non_matching.yml +21 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary.yml +26 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred.yml +26 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred_non_matching.yml +21 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary_non_matching.yml +21 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest.yml +33 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest_non_matching.yml +26 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Primary.yml +29 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred.yml +29 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred_non_matching.yml +29 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Secondary.yml +31 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/SecondaryPreferred.yml +31 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/SecondaryPreferred_non_matching.yml +29 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Secondary_non_matching.yml +26 -0
- data/spec/support/server_selection/selection/Sharded/read/SecondaryPreferred.yml +26 -0
- data/spec/support/server_selection/selection/Single/read/SecondaryPreferred.yml +19 -0
- data/spec/support/server_selection/selection/Unknown/read/SecondaryPreferred.yml +11 -0
- data/spec/support/server_selection.rb +157 -0
- data/spec/support/server_selection_rtt.rb +41 -0
- data/spec/support/shared/bulk_write.rb +535 -0
- data/spec/support/shared/cursor.rb +38 -0
- data/spec/support/shared/operation.rb +77 -0
- data/spec/support/shared/protocol.rb +31 -0
- data/spec/support/shared/server_selector.rb +111 -0
- data/spec/support/shared/socket.rb +82 -0
- data/spec/support/travis.rb +14 -0
- data.tar.gz.sig +2 -3
- metadata +583 -186
- metadata.gz.sig +0 -0
- data/VERSION +0 -1
- data/lib/mongo/bulk_write_collection_view.rb +0 -387
- data/lib/mongo/collection_writer.rb +0 -364
- data/lib/mongo/connection/node.rb +0 -249
- data/lib/mongo/connection/pool.rb +0 -340
- data/lib/mongo/connection/pool_manager.rb +0 -320
- data/lib/mongo/connection/sharding_pool_manager.rb +0 -67
- data/lib/mongo/connection/socket/ssl_socket.rb +0 -95
- data/lib/mongo/connection/socket/tcp_socket.rb +0 -87
- data/lib/mongo/connection/socket/unix_socket.rb +0 -39
- data/lib/mongo/db.rb +0 -808
- data/lib/mongo/exception.rb +0 -145
- data/lib/mongo/functional/authentication.rb +0 -455
- data/lib/mongo/functional/logging.rb +0 -85
- data/lib/mongo/functional/read_preference.rb +0 -183
- data/lib/mongo/functional/scram.rb +0 -556
- data/lib/mongo/functional/uri_parser.rb +0 -409
- data/lib/mongo/functional/write_concern.rb +0 -66
- data/lib/mongo/gridfs/grid.rb +0 -112
- data/lib/mongo/gridfs/grid_ext.rb +0 -53
- data/lib/mongo/gridfs/grid_file_system.rb +0 -163
- data/lib/mongo/gridfs/grid_io.rb +0 -484
- data/lib/mongo/legacy.rb +0 -140
- data/lib/mongo/mongo_client.rb +0 -697
- data/lib/mongo/mongo_replica_set_client.rb +0 -535
- data/lib/mongo/mongo_sharded_client.rb +0 -159
- data/lib/mongo/networking.rb +0 -372
- data/lib/mongo/utils/conversions.rb +0 -110
- data/lib/mongo/utils/core_ext.rb +0 -70
- data/lib/mongo/utils/server_version.rb +0 -69
- data/lib/mongo/utils/support.rb +0 -80
- data/test/functional/authentication_test.rb +0 -39
- data/test/functional/bulk_api_stress_test.rb +0 -133
- data/test/functional/bulk_write_collection_view_test.rb +0 -1198
- data/test/functional/client_test.rb +0 -627
- data/test/functional/collection_test.rb +0 -2175
- data/test/functional/collection_writer_test.rb +0 -83
- data/test/functional/conversions_test.rb +0 -163
- data/test/functional/cursor_fail_test.rb +0 -57
- data/test/functional/cursor_message_test.rb +0 -56
- data/test/functional/cursor_test.rb +0 -683
- data/test/functional/db_api_test.rb +0 -835
- data/test/functional/db_test.rb +0 -348
- data/test/functional/grid_file_system_test.rb +0 -285
- data/test/functional/grid_io_test.rb +0 -252
- data/test/functional/grid_test.rb +0 -273
- data/test/functional/pool_test.rb +0 -136
- data/test/functional/safe_test.rb +0 -98
- data/test/functional/support_test.rb +0 -62
- data/test/functional/timeout_test.rb +0 -60
- data/test/functional/uri_test.rb +0 -446
- data/test/functional/write_concern_test.rb +0 -118
- data/test/helpers/general.rb +0 -50
- data/test/helpers/test_unit.rb +0 -476
- data/test/replica_set/authentication_test.rb +0 -37
- data/test/replica_set/basic_test.rb +0 -189
- data/test/replica_set/client_test.rb +0 -393
- data/test/replica_set/connection_test.rb +0 -138
- data/test/replica_set/count_test.rb +0 -66
- data/test/replica_set/cursor_test.rb +0 -220
- data/test/replica_set/insert_test.rb +0 -157
- data/test/replica_set/max_values_test.rb +0 -151
- data/test/replica_set/pinning_test.rb +0 -105
- data/test/replica_set/query_test.rb +0 -73
- data/test/replica_set/read_preference_test.rb +0 -219
- data/test/replica_set/refresh_test.rb +0 -211
- data/test/replica_set/replication_ack_test.rb +0 -95
- data/test/sharded_cluster/basic_test.rb +0 -203
- data/test/shared/authentication/basic_auth_shared.rb +0 -260
- data/test/shared/authentication/bulk_api_auth_shared.rb +0 -249
- data/test/shared/authentication/gssapi_shared.rb +0 -176
- data/test/shared/authentication/sasl_plain_shared.rb +0 -96
- data/test/shared/authentication/scram_shared.rb +0 -92
- data/test/shared/ssl_shared.rb +0 -235
- data/test/test_helper.rb +0 -61
- data/test/threading/basic_test.rb +0 -120
- data/test/tools/mongo_config.rb +0 -708
- data/test/tools/mongo_config_test.rb +0 -160
- data/test/unit/client_test.rb +0 -381
- data/test/unit/collection_test.rb +0 -166
- data/test/unit/connection_test.rb +0 -335
- data/test/unit/cursor_test.rb +0 -307
- data/test/unit/db_test.rb +0 -136
- data/test/unit/grid_test.rb +0 -76
- data/test/unit/mongo_sharded_client_test.rb +0 -48
- data/test/unit/node_test.rb +0 -93
- data/test/unit/pool_manager_test.rb +0 -111
- data/test/unit/read_pref_test.rb +0 -406
- data/test/unit/read_test.rb +0 -159
- data/test/unit/safe_test.rb +0 -158
- data/test/unit/sharding_pool_manager_test.rb +0 -84
- data/test/unit/write_concern_test.rb +0 -175
@@ -0,0 +1,48 @@
|
|
1
|
+
# Copyright (C) 2014-2015 MongoDB, Inc.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
module Mongo
|
16
|
+
|
17
|
+
module BulkWrite
|
18
|
+
|
19
|
+
class OrderedBulkWrite
|
20
|
+
|
21
|
+
include BulkWritable
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def ordered?
|
26
|
+
true
|
27
|
+
end
|
28
|
+
|
29
|
+
def merged_ops
|
30
|
+
merge_consecutive_ops(@operations)
|
31
|
+
end
|
32
|
+
|
33
|
+
def process(result, indexes)
|
34
|
+
combine_results(result, indexes)
|
35
|
+
raise Error::BulkWriteError.new(@results) if stop?
|
36
|
+
end
|
37
|
+
|
38
|
+
def stop?
|
39
|
+
@results.keys.include?(:write_errors)
|
40
|
+
end
|
41
|
+
|
42
|
+
def finalize
|
43
|
+
raise Error::BulkWriteError.new(@results) if @results[:write_concern_errors]
|
44
|
+
@results
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# Copyright (C) 2014-2015 MongoDB, Inc.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
module Mongo
|
16
|
+
module BulkWrite
|
17
|
+
|
18
|
+
# Defines behavior for validating and combining replace bulk write operations.
|
19
|
+
#
|
20
|
+
# @since 2.0.0.
|
21
|
+
module Replacable
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def replacement_doc?(doc)
|
26
|
+
doc.respond_to?(:keys) && doc.keys.all?{|key| key !~ /^\$/}
|
27
|
+
end
|
28
|
+
|
29
|
+
def validate_replace_op!(r, type)
|
30
|
+
unless r[:find] && r[:replacement] && replacement_doc?(r[:replacement])
|
31
|
+
raise Error::InvalidBulkOperation.new(type, r)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def replace_ops(ops, type)
|
36
|
+
ops.collect do |r|
|
37
|
+
validate_replace_op!(r, type)
|
38
|
+
{ q: r[:find],
|
39
|
+
u: r[:replacement],
|
40
|
+
multi: false,
|
41
|
+
upsert: r.fetch(:upsert, false)
|
42
|
+
}
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def replace_one(op, server)
|
47
|
+
Operation::Write::BulkUpdate.new(
|
48
|
+
:updates => replace_ops(op[:replace_one], __method__),
|
49
|
+
:db_name => database.name,
|
50
|
+
:coll_name => @collection.name,
|
51
|
+
:write_concern => write_concern,
|
52
|
+
:ordered => ordered?
|
53
|
+
).execute(server.context)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# Copyright (C) 2014-2015 MongoDB, Inc.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
module Mongo
|
16
|
+
|
17
|
+
module BulkWrite
|
18
|
+
|
19
|
+
class UnorderedBulkWrite
|
20
|
+
|
21
|
+
include BulkWritable
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def ordered?
|
26
|
+
false
|
27
|
+
end
|
28
|
+
|
29
|
+
def merged_ops
|
30
|
+
merge_consecutive_ops(merge_ops_by_type)
|
31
|
+
end
|
32
|
+
|
33
|
+
def process(result, indexes)
|
34
|
+
combine_results(result, indexes)
|
35
|
+
end
|
36
|
+
|
37
|
+
def finalize
|
38
|
+
@results.tap do |results|
|
39
|
+
if results[:write_errors] || results[:write_concern_errors]
|
40
|
+
raise Error::BulkWriteError.new(results)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
# Copyright (C) 2014-2015 MongoDB, Inc.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
module Mongo
|
16
|
+
module BulkWrite
|
17
|
+
|
18
|
+
# Defines behavior for validating and combining update bulk write operations.
|
19
|
+
#
|
20
|
+
# @since 2.0.0.
|
21
|
+
module Updatable
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def update_doc?(doc)
|
26
|
+
!doc.empty? &&
|
27
|
+
doc.respond_to?(:keys) &&
|
28
|
+
doc.keys.first.to_s =~ /^\$/
|
29
|
+
end
|
30
|
+
|
31
|
+
def validate_update_op!(type, u)
|
32
|
+
unless u[:find] && u[:update] && update_doc?(u[:update])
|
33
|
+
raise Error::InvalidBulkOperation.new(type, u)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def updates(ops, type)
|
38
|
+
multi = type == :update_many
|
39
|
+
ops.collect do |u|
|
40
|
+
validate_update_op!(type, u)
|
41
|
+
{ q: u[:find],
|
42
|
+
u: u[:update],
|
43
|
+
multi: multi,
|
44
|
+
upsert: u.fetch(:upsert, false)
|
45
|
+
}
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def update(ops, type, server)
|
50
|
+
Operation::Write::BulkUpdate.new(
|
51
|
+
:updates => updates(ops, type),
|
52
|
+
:db_name => database.name,
|
53
|
+
:coll_name => @collection.name,
|
54
|
+
:write_concern => write_concern,
|
55
|
+
:ordered => ordered?
|
56
|
+
).execute(server.context)
|
57
|
+
end
|
58
|
+
|
59
|
+
def update_one(op, server)
|
60
|
+
update(op[:update_one], __method__, server)
|
61
|
+
end
|
62
|
+
|
63
|
+
def update_many(op, server)
|
64
|
+
update(op[:update_many], __method__, server)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# Copyright (C) 2014-2015 MongoDB, Inc.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
require 'mongo/bulk_write/bulk_writable'
|
16
|
+
require 'mongo/bulk_write/ordered_bulk_write'
|
17
|
+
require 'mongo/bulk_write/unordered_bulk_write'
|
18
|
+
|
19
|
+
module Mongo
|
20
|
+
module BulkWrite
|
21
|
+
extend self
|
22
|
+
|
23
|
+
# Get a bulk write object either of type ordered or unordered.
|
24
|
+
#
|
25
|
+
# @example Get a bulk write object.
|
26
|
+
# Mongo::BulkWrite.get(collection, operations, ordered: true)
|
27
|
+
#
|
28
|
+
# @param [ Collection ] collection The collection on which the operations
|
29
|
+
# will be executed.
|
30
|
+
#
|
31
|
+
# @param [ Array<Hash> ] operations The operations to execute.
|
32
|
+
#
|
33
|
+
# @param [ Hash ] options The options for the bulk write object.
|
34
|
+
#
|
35
|
+
# @option options [ true, false ] :ordered Whether the operations
|
36
|
+
# should be executed in order.
|
37
|
+
# @option options [ Hash ] :write_concern The write concern options.
|
38
|
+
# Can be :w => Integer, :fsync => Boolean, :j => Boolean.
|
39
|
+
#
|
40
|
+
# @return [ OrderedBulkWrite, UnorderedBulkWrite ] The appropriate bulk
|
41
|
+
# write object.
|
42
|
+
#
|
43
|
+
# @since 2.0.0
|
44
|
+
def get(collection, operations, options)
|
45
|
+
if options.fetch(:ordered, true)
|
46
|
+
OrderedBulkWrite.new(collection, operations, options)
|
47
|
+
else
|
48
|
+
UnorderedBulkWrite.new(collection, operations, options)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
data/lib/mongo/client.rb
ADDED
@@ -0,0 +1,246 @@
|
|
1
|
+
# Copyright (C) 2014-2015 MongoDB, Inc.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the 'License');
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an 'AS IS' BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
module Mongo
|
16
|
+
|
17
|
+
# The client is the entry point to the driver and is the main object that
|
18
|
+
# will be interacted with.
|
19
|
+
#
|
20
|
+
# @since 2.0.0
|
21
|
+
class Client
|
22
|
+
extend Forwardable
|
23
|
+
|
24
|
+
# @return [ Mongo::Cluster ] cluster The cluster of servers for the client.
|
25
|
+
attr_reader :cluster
|
26
|
+
|
27
|
+
# @return [ Mongo::Database ] database The database the client is operating on.
|
28
|
+
attr_reader :database
|
29
|
+
|
30
|
+
# @return [ Hash ] options The configuration options.
|
31
|
+
attr_reader :options
|
32
|
+
|
33
|
+
# Delegate command execution to the current database.
|
34
|
+
def_delegators :@database, :command
|
35
|
+
|
36
|
+
# Determine if this client is equivalent to another object.
|
37
|
+
#
|
38
|
+
# @example Check client equality.
|
39
|
+
# client == other
|
40
|
+
#
|
41
|
+
# @param [ Object ] other The object to compare to.
|
42
|
+
#
|
43
|
+
# @return [ true, false ] If the objects are equal.
|
44
|
+
#
|
45
|
+
# @since 2.0.0
|
46
|
+
def ==(other)
|
47
|
+
return false unless other.is_a?(Client)
|
48
|
+
cluster == other.cluster && options == other.options
|
49
|
+
end
|
50
|
+
alias_method :eql?, :==
|
51
|
+
|
52
|
+
# Get a collection object for the provided collection name.
|
53
|
+
#
|
54
|
+
# @example Get the collection.
|
55
|
+
# client[:users]
|
56
|
+
#
|
57
|
+
# @param [ String, Symbol ] collection_name The name of the collection.
|
58
|
+
# @param [ Hash ] options The options to the collection.
|
59
|
+
#
|
60
|
+
# @return [ Mongo::Collection ] The collection.
|
61
|
+
#
|
62
|
+
# @since 2.0.0
|
63
|
+
def [](collection_name, options = {})
|
64
|
+
database[collection_name, options]
|
65
|
+
end
|
66
|
+
|
67
|
+
# Get the hash value of the client.
|
68
|
+
#
|
69
|
+
# @example Get the client hash value.
|
70
|
+
# client.hash
|
71
|
+
#
|
72
|
+
# @return [ Integer ] The client hash value.
|
73
|
+
#
|
74
|
+
# @since 2.0.0
|
75
|
+
def hash
|
76
|
+
[cluster, options].hash
|
77
|
+
end
|
78
|
+
|
79
|
+
# Instantiate a new driver client.
|
80
|
+
#
|
81
|
+
# @example Instantiate a single server or mongos client.
|
82
|
+
# Mongo::Client.new([ '127.0.0.1:27017' ])
|
83
|
+
#
|
84
|
+
# @example Instantiate a client for a replica set.
|
85
|
+
# Mongo::Client.new([ '127.0.0.1:27017', '127.0.0.1:27021' ])
|
86
|
+
#
|
87
|
+
# @param [ Array<String>, String ] addresses_or_uri The array of server addresses in the
|
88
|
+
# form of host:port or a MongoDB URI connection string.
|
89
|
+
# @param [ Hash ] options The options to be used by the client.
|
90
|
+
#
|
91
|
+
# @option options [ Symbol ] :auth_mech The authentication mechanism to
|
92
|
+
# use. One of :mongodb_cr, :mongodb_x509, :plain, :scram
|
93
|
+
# @option options [ String ] :auth_source The source to authenticate from.
|
94
|
+
# @option options [ Symbol ] :connect The connection method to use. This
|
95
|
+
# forces the cluster to behave in the specified way instead of
|
96
|
+
# auto-discovering. One of :direct, :replica_set, :sharded
|
97
|
+
# @option options [ String ] :database The database to connect to.
|
98
|
+
# @option options [ Hash ] :auth_mech_properties
|
99
|
+
# @option options [ Float ] :heartbeat_frequency The number of seconds for
|
100
|
+
# the server monitor to refresh it's description via ismaster.
|
101
|
+
# @option options [ Integer ] :local_threshold The local threshold boundary
|
102
|
+
# in seconds for selecting a near server for an operation.
|
103
|
+
# @option options [ Integer ] :server_selection_timeout The timeout in seconds
|
104
|
+
# for selecting a server for an operation.
|
105
|
+
# @option options [ String ] :password The user's password.
|
106
|
+
# @option options [ Integer ] :max_pool_size The maximum size of the
|
107
|
+
# connection pool.
|
108
|
+
# @option options [ Integer ] :min_pool_size The minimum size of the
|
109
|
+
# connection pool.
|
110
|
+
# @option options [ Float ] :wait_queue_timeout The time to wait, in
|
111
|
+
# seconds, in the connection pool for a connection to be checked in.
|
112
|
+
# @option options [ Float ] :connect_timeout The timeout, in seconds, to
|
113
|
+
# attempt a connection.
|
114
|
+
# @option options [ Symbol ] :read The read preference options. :mode can
|
115
|
+
# be one of :secondary, :secondary_preferred, :primary,
|
116
|
+
# :primary_preferred, :nearest.
|
117
|
+
# @option options [ Array<Hash, String> ] :roles The list of roles for the
|
118
|
+
# user.
|
119
|
+
# @option options [ Symbol ] :replica_set The name of the replica set to
|
120
|
+
# connect to. Servers not in this replica set will be ignored.
|
121
|
+
# @option options [ true, false ] :ssl Whether to use SSL.
|
122
|
+
# @option options [ String ] :ssl_cert The certificate file used to identify
|
123
|
+
# the connection against MongoDB.
|
124
|
+
# @option options [ String ] :ssl_key The private keyfile used to identify the
|
125
|
+
# connection against MongoDB. Note that even if the key is stored in the same
|
126
|
+
# file as the certificate, both need to be explicitly specified.
|
127
|
+
# @option options [ String ] :ssl_key_pass_phrase A passphrase for the private key.
|
128
|
+
# @option options [ true, false ] :ssl_verify Whether or not to do peer certification
|
129
|
+
# validation.
|
130
|
+
# @option options [ String ] :ssl_ca_cert The file containing a set of concatenated
|
131
|
+
# certification authority certifications used to validate certs passed from the
|
132
|
+
# other end of the connection. Required for :ssl_verify.
|
133
|
+
# @option options [ Float ] :socket_timeout The timeout, in seconds, to
|
134
|
+
# execute operations on a socket.
|
135
|
+
# @option options [ String ] :user The user name.
|
136
|
+
# @option options [ Hash ] :write The write concern options. Can be :w =>
|
137
|
+
# Integer, :fsync => Boolean, :j => Boolean.
|
138
|
+
#
|
139
|
+
# @since 2.0.0
|
140
|
+
def initialize(addresses_or_uri, options = {})
|
141
|
+
if addresses_or_uri.is_a?(::String)
|
142
|
+
create_from_uri(addresses_or_uri, options)
|
143
|
+
else
|
144
|
+
create_from_addresses(addresses_or_uri, options)
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
# Get an inspection of the client as a string.
|
149
|
+
#
|
150
|
+
# @example Inspect the client.
|
151
|
+
# client.inspect
|
152
|
+
#
|
153
|
+
# @return [ String ] The inspection string.
|
154
|
+
#
|
155
|
+
# @since 2.0.0
|
156
|
+
def inspect
|
157
|
+
"#<Mongo::Client:0x#{object_id} cluster=#{cluster.addresses.join(', ')}>"
|
158
|
+
end
|
159
|
+
|
160
|
+
# Get the read preference from the options passed to the client.
|
161
|
+
#
|
162
|
+
# @example Get the read preference.
|
163
|
+
# client.read_preference
|
164
|
+
#
|
165
|
+
# @return [ Object ] The appropriate read preference or primary if none
|
166
|
+
# was provided to the client.
|
167
|
+
#
|
168
|
+
# @since 2.0.0
|
169
|
+
def read_preference
|
170
|
+
@read_preference ||= ServerSelector.get(options[:read] || {}, options)
|
171
|
+
end
|
172
|
+
|
173
|
+
# Use the database with the provided name. This will switch the current
|
174
|
+
# database the client is operating on.
|
175
|
+
#
|
176
|
+
# @example Use the provided database.
|
177
|
+
# client.use(:users)
|
178
|
+
#
|
179
|
+
# @param [ String, Symbol ] name The name of the database to use.
|
180
|
+
#
|
181
|
+
# @return [ Mongo::Client ] The new client with new database.
|
182
|
+
#
|
183
|
+
# @since 2.0.0
|
184
|
+
def use(name)
|
185
|
+
with(database: name)
|
186
|
+
end
|
187
|
+
|
188
|
+
# Provides a new client with the passed options merged over the existing
|
189
|
+
# options of this client. Useful for one-offs to change specific options
|
190
|
+
# without altering the original client.
|
191
|
+
#
|
192
|
+
# @example Get a client with changed options.
|
193
|
+
# client.with(:read => { :mode => :primary_preferred })
|
194
|
+
#
|
195
|
+
# @param [ Hash ] new_options The new options to use.
|
196
|
+
#
|
197
|
+
# @return [ Mongo::Client ] A new client instance.
|
198
|
+
#
|
199
|
+
# @since 2.0.0
|
200
|
+
def with(new_options = {})
|
201
|
+
clone.tap do |client|
|
202
|
+
client.options.update(new_options)
|
203
|
+
Database.create(client)
|
204
|
+
# We can't use the same cluster if authentication details have changed.
|
205
|
+
if new_options[:user] || new_options[:password]
|
206
|
+
Cluster.create(client)
|
207
|
+
end
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
# Get the write concern for this client. If no option was provided, then a
|
212
|
+
# default single server acknowledgement will be used.
|
213
|
+
#
|
214
|
+
# @example Get the client write concern.
|
215
|
+
# client.write_concern
|
216
|
+
#
|
217
|
+
# @return [ Mongo::WriteConcern ] The write concern.
|
218
|
+
#
|
219
|
+
# @since 2.0.0
|
220
|
+
def write_concern
|
221
|
+
@write_concern ||= WriteConcern.get(options[:write])
|
222
|
+
end
|
223
|
+
|
224
|
+
private
|
225
|
+
|
226
|
+
def create_from_addresses(addresses, opts = {})
|
227
|
+
@options = Database::DEFAULT_OPTIONS.merge(opts).freeze
|
228
|
+
@cluster = Cluster.new(addresses, options)
|
229
|
+
@database = Database.new(self, options[:database], options)
|
230
|
+
end
|
231
|
+
|
232
|
+
def create_from_uri(connection_string, opts = {})
|
233
|
+
uri = URI.new(connection_string)
|
234
|
+
@options = Database::DEFAULT_OPTIONS.merge(uri.client_options.merge(opts)).freeze
|
235
|
+
@cluster = Cluster.new(uri.servers, options)
|
236
|
+
@database = Database.new(self, options[:database], options)
|
237
|
+
end
|
238
|
+
|
239
|
+
def initialize_copy(original)
|
240
|
+
@options = original.options.dup
|
241
|
+
@database = nil
|
242
|
+
@read_preference = nil
|
243
|
+
@write_concern = nil
|
244
|
+
end
|
245
|
+
end
|
246
|
+
end
|
@@ -0,0 +1,160 @@
|
|
1
|
+
# Copyright (C) 2014-2015 MongoDB, Inc.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
module Mongo
|
16
|
+
class Cluster
|
17
|
+
module Topology
|
18
|
+
|
19
|
+
# Defines behaviour when a cluster is in replica set topology.
|
20
|
+
#
|
21
|
+
# @since 2.0.0
|
22
|
+
class ReplicaSet
|
23
|
+
include Loggable
|
24
|
+
|
25
|
+
# Constant for the replica set name configuration option.
|
26
|
+
#
|
27
|
+
# @since 2.0.0
|
28
|
+
REPLICA_SET_NAME = :replica_set.freeze
|
29
|
+
|
30
|
+
# @return [ Hash ] options The options.
|
31
|
+
attr_reader :options
|
32
|
+
|
33
|
+
# The display name for the topology.
|
34
|
+
#
|
35
|
+
# @since 2.0.0
|
36
|
+
NAME = 'Replica Set'.freeze
|
37
|
+
|
38
|
+
# Get the display name.
|
39
|
+
#
|
40
|
+
# @example Get the display name.
|
41
|
+
# ReplicaSet.display_name
|
42
|
+
#
|
43
|
+
# @return [ String ] The display name.
|
44
|
+
#
|
45
|
+
# @since 2.0.0
|
46
|
+
def display_name
|
47
|
+
NAME
|
48
|
+
end
|
49
|
+
|
50
|
+
# Elect a primary server within this topology.
|
51
|
+
#
|
52
|
+
# @example Elect a primary server.
|
53
|
+
# topology.elect_primary(description, servers)
|
54
|
+
#
|
55
|
+
# @param [ Server::Description ] description The description of the
|
56
|
+
# elected primary.
|
57
|
+
# @param [ Array<Server> ] servers The list of known servers to the
|
58
|
+
# cluster.
|
59
|
+
#
|
60
|
+
# @return [ ReplicaSet ] The topology.
|
61
|
+
def elect_primary(description, servers)
|
62
|
+
if description.replica_set_name == replica_set_name
|
63
|
+
log_debug([ "Server #{description.address.to_s} elected as primary in #{replica_set_name}." ])
|
64
|
+
servers.each do |server|
|
65
|
+
if server.primary? && server.address != description.address
|
66
|
+
server.description.unknown!
|
67
|
+
end
|
68
|
+
end
|
69
|
+
else
|
70
|
+
log_warn([
|
71
|
+
"Server #{description.address.to_s} in incorrect replica set: #{description.replica_set_name}."
|
72
|
+
])
|
73
|
+
end
|
74
|
+
self
|
75
|
+
end
|
76
|
+
|
77
|
+
# Initialize the topology with the options.
|
78
|
+
#
|
79
|
+
# @example Initialize the topology.
|
80
|
+
# ReplicaSet.new(options)
|
81
|
+
#
|
82
|
+
# @param [ Hash ] options The options.
|
83
|
+
#
|
84
|
+
# @since 2.0.0
|
85
|
+
def initialize(options)
|
86
|
+
@options = options
|
87
|
+
end
|
88
|
+
|
89
|
+
# A replica set topology is a replica set.
|
90
|
+
#
|
91
|
+
# @example Is the topology a replica set?
|
92
|
+
# ReplicaSet.replica_set?
|
93
|
+
#
|
94
|
+
# @return [ true ] Always true.
|
95
|
+
#
|
96
|
+
# @since 2.0.0
|
97
|
+
def replica_set?; true; end
|
98
|
+
|
99
|
+
# Get the replica set name configured for this topology.
|
100
|
+
#
|
101
|
+
# @example Get the replica set name.
|
102
|
+
# topology.replica_set_name
|
103
|
+
#
|
104
|
+
# @return [ String ] The name of the configured replica set.
|
105
|
+
#
|
106
|
+
# @since 2.0.0
|
107
|
+
def replica_set_name
|
108
|
+
@replica_set_name ||= options[REPLICA_SET_NAME]
|
109
|
+
end
|
110
|
+
|
111
|
+
# Select appropriate servers for this topology.
|
112
|
+
#
|
113
|
+
# @example Select the servers.
|
114
|
+
# ReplicaSet.servers(servers)
|
115
|
+
#
|
116
|
+
# @param [ Array<Server> ] servers The known servers.
|
117
|
+
#
|
118
|
+
# @return [ Array<Server> ] The servers in the replica set.
|
119
|
+
#
|
120
|
+
# @since 2.0.0
|
121
|
+
def servers(servers)
|
122
|
+
servers.select do |server|
|
123
|
+
(replica_set_name.nil? || server.replica_set_name == replica_set_name) &&
|
124
|
+
server.primary? || server.secondary?
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
# A replica set topology is not sharded.
|
129
|
+
#
|
130
|
+
# @example Is the topology sharded?
|
131
|
+
# ReplicaSet.sharded?
|
132
|
+
#
|
133
|
+
# @return [ false ] Always false.
|
134
|
+
#
|
135
|
+
# @since 2.0.0
|
136
|
+
def sharded?; false; end
|
137
|
+
|
138
|
+
# A replica set topology is not standalone.
|
139
|
+
#
|
140
|
+
# @example Is the topology standalone?
|
141
|
+
# ReplicaSet.standalone?
|
142
|
+
#
|
143
|
+
# @return [ false ] Always false.
|
144
|
+
#
|
145
|
+
# @since 2.0.0
|
146
|
+
def standalone?; false; end
|
147
|
+
|
148
|
+
# A replica set topology is not unknown.
|
149
|
+
#
|
150
|
+
# @example Is the topology unknown?
|
151
|
+
# ReplicaSet.unknown?
|
152
|
+
#
|
153
|
+
# @return [ false ] Always false.
|
154
|
+
#
|
155
|
+
# @since 2.0.0
|
156
|
+
def unknown?; false; end
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|