mongo 1.12.5 → 2.0.0.beta
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 +64 -0
- data/LICENSE +1 -1
- data/README.md +23 -125
- data/Rakefile +26 -21
- data/bin/mongo_console +6 -38
- data/lib/mongo.rb +23 -82
- data/lib/mongo/address.rb +111 -0
- 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/auth.rb +108 -0
- data/lib/mongo/auth/cr.rb +44 -0
- data/lib/mongo/auth/cr/conversation.rb +119 -0
- data/lib/mongo/auth/executable.rb +52 -0
- data/lib/mongo/auth/ldap.rb +48 -0
- data/lib/mongo/auth/ldap/conversation.rb +92 -0
- data/lib/mongo/auth/roles.rb +104 -0
- data/lib/mongo/auth/scram.rb +53 -0
- data/lib/mongo/auth/scram/conversation.rb +450 -0
- data/lib/mongo/auth/user.rb +159 -0
- data/lib/mongo/auth/user/view.rb +102 -0
- data/lib/mongo/auth/x509.rb +48 -0
- data/lib/mongo/auth/x509/conversation.rb +92 -0
- data/lib/mongo/{gridfs.rb → bulk.rb} +2 -5
- data/lib/mongo/bulk/bulk_write.rb +307 -0
- data/lib/mongo/client.rb +233 -0
- data/lib/mongo/cluster.rb +203 -0
- data/lib/mongo/cluster/topology.rb +60 -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/collection.rb +130 -1101
- data/lib/mongo/collection/view.rb +169 -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 +169 -0
- data/lib/mongo/cursor.rb +79 -680
- data/lib/mongo/database.rb +224 -0
- data/lib/mongo/database/view.rb +101 -0
- data/lib/mongo/error.rb +81 -0
- data/lib/mongo/error/bulk_write_failure.rb +41 -0
- data/lib/mongo/{utils/thread_local_variable_manager.rb → error/empty_batch.rb} +22 -8
- data/{test/functional/db_connection_test.rb → lib/mongo/error/invalid_bulk_operation.rb} +19 -8
- 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/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/event.rb +40 -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/grid.rb +16 -0
- data/lib/mongo/grid/file.rb +94 -0
- data/lib/mongo/grid/file/chunk.rb +184 -0
- data/lib/mongo/grid/file/metadata.rb +223 -0
- data/lib/mongo/grid/fs.rb +149 -0
- data/lib/mongo/index.rb +64 -0
- data/lib/mongo/index/view.rb +205 -0
- data/lib/mongo/loggable.rb +126 -0
- data/lib/mongo/logger.rb +132 -0
- data/lib/mongo/operation.rb +26 -0
- data/lib/mongo/operation/aggregate.rb +100 -0
- data/lib/mongo/operation/aggregate/result.rb +84 -0
- data/lib/mongo/operation/batchable.rb +103 -0
- data/lib/mongo/operation/bulk_delete/result.rb +197 -0
- data/lib/mongo/operation/bulk_insert/result.rb +195 -0
- data/lib/mongo/operation/bulk_update/result.rb +295 -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 +116 -0
- data/lib/mongo/operation/list_indexes/result.rb +118 -0
- data/lib/mongo/operation/map_reduce.rb +96 -0
- data/lib/mongo/operation/map_reduce/result.rb +122 -0
- data/lib/mongo/{functional.rb → operation/read.rb} +7 -7
- 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/operation/read_preferrable.rb +34 -0
- data/lib/mongo/operation/result.rb +259 -0
- data/lib/mongo/operation/specifiable.rb +380 -0
- data/lib/mongo/operation/write.rb +25 -0
- data/lib/mongo/operation/write/bulk_delete.rb +158 -0
- data/lib/mongo/operation/write/bulk_insert.rb +160 -0
- data/lib/mongo/operation/write/bulk_update.rb +167 -0
- data/lib/mongo/{connection/socket/socket_util.rb → operation/write/command.rb} +9 -24
- 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/ensure_index.rb +55 -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/create_index.rb +84 -0
- data/lib/mongo/operation/write/create_user.rb +75 -0
- data/lib/mongo/operation/write/delete.rb +91 -0
- data/lib/mongo/operation/write/drop_index.rb +62 -0
- data/lib/mongo/operation/write/insert.rb +88 -0
- data/lib/mongo/operation/write/remove_user.rb +70 -0
- data/lib/mongo/operation/write/update.rb +98 -0
- data/lib/mongo/protocol.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/server.rb +163 -0
- data/lib/mongo/server/connectable.rb +99 -0
- data/lib/mongo/server/connection.rb +133 -0
- data/lib/mongo/server/connection_pool.rb +141 -0
- data/lib/mongo/server/connection_pool/queue.rb +182 -0
- data/lib/mongo/server/context.rb +66 -0
- data/lib/mongo/server/description.rb +450 -0
- data/lib/mongo/server/description/features.rb +85 -0
- data/lib/mongo/server/description/inspector.rb +79 -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/monitor.rb +160 -0
- data/lib/mongo/server/monitor/connection.rb +88 -0
- data/lib/mongo/server_selector.rb +81 -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/socket.rb +179 -0
- data/lib/mongo/socket/ssl.rb +108 -0
- data/lib/mongo/socket/tcp.rb +69 -0
- data/lib/mongo/socket/unix.rb +66 -0
- data/lib/mongo/uri.rb +504 -0
- data/lib/mongo/version.rb +21 -0
- data/lib/mongo/write_concern.rb +99 -0
- data/lib/mongo/write_concern/acknowledged.rb +38 -0
- data/lib/mongo/write_concern/normalizable.rb +73 -0
- data/lib/mongo/write_concern/unacknowledged.rb +43 -0
- data/mongo.gemspec +17 -14
- 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 +175 -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 +135 -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 +504 -0
- data/spec/mongo/collection/view_spec.rb +521 -0
- data/spec/mongo/collection_spec.rb +362 -0
- data/spec/mongo/cursor_spec.rb +295 -0
- data/spec/mongo/database_spec.rb +306 -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 +69 -0
- data/spec/mongo/grid/file_spec.rb +138 -0
- data/spec/mongo/grid/fs_spec.rb +129 -0
- data/spec/mongo/index/view_spec.rb +226 -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 +135 -0
- data/spec/mongo/operation/command_spec.rb +106 -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 +473 -0
- data/spec/mongo/operation/write/bulk_insert_spec.rb +466 -0
- data/spec/mongo/operation/write/bulk_update_spec.rb +524 -0
- data/spec/mongo/operation/write/command/delete_spec.rb +116 -0
- data/spec/mongo/operation/write/command/insert_spec.rb +117 -0
- data/spec/mongo/operation/write/command/update_spec.rb +123 -0
- data/spec/mongo/operation/write/create_user_spec.rb +44 -0
- data/spec/mongo/operation/write/delete_spec.rb +178 -0
- data/spec/mongo/operation/write/drop_index_spec.rb +51 -0
- data/spec/mongo/operation/write/ensure_index_spec.rb +81 -0
- data/spec/mongo/operation/write/insert_spec.rb +231 -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 +177 -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 +289 -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 +130 -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/mongo_orchestration_spec.rb +70 -0
- data/spec/spec_helper.rb +148 -0
- data/spec/support/authorization.rb +245 -0
- data/spec/support/helpers.rb +140 -0
- data/spec/support/matchers.rb +37 -0
- data/spec/support/mongo_orchestration.rb +61 -0
- data/spec/support/mongo_orchestration/requestable.rb +109 -0
- data/spec/support/mongo_orchestration/standalone.rb +57 -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.rb +140 -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 +32 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest_non_matching.yml +27 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Primary.yml +23 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred.yml +32 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred_non_matching.yml +27 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary.yml +32 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred.yml +32 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred_non_matching.yml +27 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary_non_matching.yml +27 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest.yml +41 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest_non_matching.yml +34 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Primary.yml +33 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred.yml +39 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred_non_matching.yml +36 -0
- data/spec/support/server_selection/selection/Sharded/read/SecondaryPreferred.yml +32 -0
- data/spec/support/server_selection/selection/Single/read/SecondaryPreferred.yml +23 -0
- data/spec/support/server_selection/selection/Unknown/read/SecondaryPreferred.yml +13 -0
- data/spec/support/server_selection_rtt.rb +41 -0
- data/spec/support/shared/bulk_write.rb +498 -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
- metadata +523 -189
- 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
data/lib/mongo/client.rb
ADDED
|
@@ -0,0 +1,233 @@
|
|
|
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
|
|
102
|
+
# @option options [ Integer ] :server_selection_timeout
|
|
103
|
+
# @option options [ String ] :password The user's password.
|
|
104
|
+
# @option options [ Integer ] :max_pool_size The maximum size of the
|
|
105
|
+
# connection pool.
|
|
106
|
+
# @option options [ Integer ] :min_pool_size The minimum size of the
|
|
107
|
+
# connection pool.
|
|
108
|
+
# @option options [ Float ] :wait_queue_timeout The time to wait, in
|
|
109
|
+
# seconds, in the connection pool for a connection to be checked in.
|
|
110
|
+
# @option options [ Float ] :connect_timeout The timeout, in seconds, to
|
|
111
|
+
# attempt a connection.
|
|
112
|
+
# @option options [ Symbol ] :read The read preference options. :mode can
|
|
113
|
+
# be one of :secondary, :secondary_preferred, :primary,
|
|
114
|
+
# :primary_preferred, :nearest.
|
|
115
|
+
# @option options [ Array<Hash, String> ] :roles The list of roles for the
|
|
116
|
+
# user.
|
|
117
|
+
# @option options [ Symbol ] :replica_set The name of the replica set to
|
|
118
|
+
# connect to. Servers not in this replica set will be ignored.
|
|
119
|
+
# @option options [ true, false ] :ssl Whether to use SSL.
|
|
120
|
+
# @option options [ Float ] :socket_timeout The timeout, in seconds, to
|
|
121
|
+
# execute operations on a socket.
|
|
122
|
+
# @option options [ String ] :user The user name.
|
|
123
|
+
# @option options [ Hash ] :write The write concern options. Can be :w =>
|
|
124
|
+
# Integer, :fsync => Boolean, :j => Boolean.
|
|
125
|
+
#
|
|
126
|
+
# @since 2.0.0
|
|
127
|
+
def initialize(addresses_or_uri, options = {})
|
|
128
|
+
if addresses_or_uri.is_a?(::String)
|
|
129
|
+
create_from_uri(addresses_or_uri, options)
|
|
130
|
+
else
|
|
131
|
+
create_from_addresses(addresses_or_uri, options)
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
# Get an inspection of the client as a string.
|
|
136
|
+
#
|
|
137
|
+
# @example Inspect the client.
|
|
138
|
+
# client.inspect
|
|
139
|
+
#
|
|
140
|
+
# @return [ String ] The inspection string.
|
|
141
|
+
#
|
|
142
|
+
# @since 2.0.0
|
|
143
|
+
def inspect
|
|
144
|
+
"<Mongo::Client:0x#{object_id} cluster=#{cluster.addresses.join(', ')}>"
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
# Get the read preference from the options passed to the client.
|
|
148
|
+
#
|
|
149
|
+
# @example Get the read preference.
|
|
150
|
+
# client.read_preference
|
|
151
|
+
#
|
|
152
|
+
# @return [ Object ] The appropriate read preference or primary if none
|
|
153
|
+
# was provided to the client.
|
|
154
|
+
#
|
|
155
|
+
# @since 2.0.0
|
|
156
|
+
def read_preference
|
|
157
|
+
@read_preference ||= ServerSelector.get(options[:read] || {}, options)
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
# Use the database with the provided name. This will switch the current
|
|
161
|
+
# database the client is operating on.
|
|
162
|
+
#
|
|
163
|
+
# @example Use the provided database.
|
|
164
|
+
# client.use(:users)
|
|
165
|
+
#
|
|
166
|
+
# @param [ String, Symbol ] name The name of the database to use.
|
|
167
|
+
#
|
|
168
|
+
# @return [ Mongo::Client ] The new client with new database.
|
|
169
|
+
#
|
|
170
|
+
# @since 2.0.0
|
|
171
|
+
def use(name)
|
|
172
|
+
with(database: name)
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
# Provides a new client with the passed options merged over the existing
|
|
176
|
+
# options of this client. Useful for one-offs to change specific options
|
|
177
|
+
# without altering the original client.
|
|
178
|
+
#
|
|
179
|
+
# @example Get a client with changed options.
|
|
180
|
+
# client.with(:read => { :mode => :primary_preferred })
|
|
181
|
+
#
|
|
182
|
+
# @param [ Hash ] new_options The new options to use.
|
|
183
|
+
#
|
|
184
|
+
# @return [ Mongo::Client ] A new client instance.
|
|
185
|
+
#
|
|
186
|
+
# @since 2.0.0
|
|
187
|
+
def with(new_options = {})
|
|
188
|
+
clone.tap do |client|
|
|
189
|
+
client.options.update(new_options)
|
|
190
|
+
Database.create(client)
|
|
191
|
+
# We can't use the same cluster if authentication details have changed.
|
|
192
|
+
if new_options[:user] || new_options[:password]
|
|
193
|
+
Cluster.create(client)
|
|
194
|
+
end
|
|
195
|
+
end
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
# Get the write concern for this client. If no option was provided, then a
|
|
199
|
+
# default single server acknowledgement will be used.
|
|
200
|
+
#
|
|
201
|
+
# @example Get the client write concern.
|
|
202
|
+
# client.write_concern
|
|
203
|
+
#
|
|
204
|
+
# @return [ Mongo::WriteConcern ] The write concern.
|
|
205
|
+
#
|
|
206
|
+
# @since 2.0.0
|
|
207
|
+
def write_concern
|
|
208
|
+
@write_concern ||= WriteConcern.get(options[:write])
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
private
|
|
212
|
+
|
|
213
|
+
def create_from_addresses(addresses, opts = {})
|
|
214
|
+
@options = Database::DEFAULT_OPTIONS.merge(opts).freeze
|
|
215
|
+
@cluster = Cluster.new(addresses, options)
|
|
216
|
+
@database = Database.new(self, options[:database], options)
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
def create_from_uri(connection_string, opts = {})
|
|
220
|
+
uri = URI.new(connection_string)
|
|
221
|
+
@options = Database::DEFAULT_OPTIONS.merge(uri.client_options.merge(opts)).freeze
|
|
222
|
+
@cluster = Cluster.new(uri.servers, options)
|
|
223
|
+
@database = Database.new(self, options[:database], options)
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
def initialize_copy(original)
|
|
227
|
+
@options = original.options.dup
|
|
228
|
+
@database = nil
|
|
229
|
+
@read_preference = nil
|
|
230
|
+
@write_concern = nil
|
|
231
|
+
end
|
|
232
|
+
end
|
|
233
|
+
end
|
|
@@ -0,0 +1,203 @@
|
|
|
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/cluster/topology'
|
|
16
|
+
|
|
17
|
+
module Mongo
|
|
18
|
+
|
|
19
|
+
# Represents a group of servers on the server side, either as a single server, a
|
|
20
|
+
# replica set, or a single or multiple mongos.
|
|
21
|
+
#
|
|
22
|
+
# @since 2.0.0
|
|
23
|
+
class Cluster
|
|
24
|
+
extend Forwardable
|
|
25
|
+
include Event::Subscriber
|
|
26
|
+
include Loggable
|
|
27
|
+
|
|
28
|
+
# @return [ Array<String> ] The provided seed addresses.
|
|
29
|
+
attr_reader :addresses
|
|
30
|
+
|
|
31
|
+
# @return [ Hash ] The options hash.
|
|
32
|
+
attr_reader :options
|
|
33
|
+
|
|
34
|
+
# @return [ Object ] The cluster topology.
|
|
35
|
+
attr_reader :topology
|
|
36
|
+
|
|
37
|
+
def_delegators :topology, :replica_set?, :replica_set_name, :sharded?, :standalone?, :unknown?
|
|
38
|
+
|
|
39
|
+
# Determine if this cluster of servers is equal to another object. Checks the
|
|
40
|
+
# servers currently in the cluster, not what was configured.
|
|
41
|
+
#
|
|
42
|
+
# @example Is the cluster equal to the object?
|
|
43
|
+
# cluster == other
|
|
44
|
+
#
|
|
45
|
+
# @param [ Object ] other The object to compare to.
|
|
46
|
+
#
|
|
47
|
+
# @return [ true, false ] If the objects are equal.
|
|
48
|
+
#
|
|
49
|
+
# @since 2.0.0
|
|
50
|
+
def ==(other)
|
|
51
|
+
return false unless other.is_a?(Cluster)
|
|
52
|
+
addresses == other.addresses && options == other.options
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Add a server to the cluster with the provided address. Useful in
|
|
56
|
+
# auto-discovery of new servers when an existing server executes an ismaster
|
|
57
|
+
# and potentially non-configured servers were included.
|
|
58
|
+
#
|
|
59
|
+
# @example Add the server for the address to the cluster.
|
|
60
|
+
# cluster.add('127.0.0.1:27018')
|
|
61
|
+
#
|
|
62
|
+
# @param [ String ] host The address of the server to add.
|
|
63
|
+
#
|
|
64
|
+
# @return [ Server ] The newly added server, if not present already.
|
|
65
|
+
#
|
|
66
|
+
# @since 2.0.0
|
|
67
|
+
def add(host)
|
|
68
|
+
address = Address.new(host)
|
|
69
|
+
unless addresses.include?(address)
|
|
70
|
+
log_debug([ "Adding #{address.to_s} to the cluster." ])
|
|
71
|
+
addresses.push(address)
|
|
72
|
+
server = Server.new(address, event_listeners, options)
|
|
73
|
+
@servers.push(server)
|
|
74
|
+
server
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# Instantiate the new cluster.
|
|
79
|
+
#
|
|
80
|
+
# @example Instantiate the cluster.
|
|
81
|
+
# Mongo::Cluster.new(["127.0.0.1:27017"])
|
|
82
|
+
#
|
|
83
|
+
# @param [ Array<String> ] seeds The addresses of the configured servers.
|
|
84
|
+
# @param [ Hash ] options The options.
|
|
85
|
+
#
|
|
86
|
+
# @since 2.0.0
|
|
87
|
+
def initialize(seeds, options = {})
|
|
88
|
+
@addresses = []
|
|
89
|
+
@servers = []
|
|
90
|
+
@event_listeners = Event::Listeners.new
|
|
91
|
+
@options = options.freeze
|
|
92
|
+
@topology = Topology.initial(seeds, options)
|
|
93
|
+
|
|
94
|
+
subscribe_to(Event::SERVER_ADDED, Event::ServerAdded.new(self))
|
|
95
|
+
subscribe_to(Event::SERVER_REMOVED, Event::ServerRemoved.new(self))
|
|
96
|
+
subscribe_to(Event::PRIMARY_ELECTED, Event::PrimaryElected.new(self))
|
|
97
|
+
|
|
98
|
+
seeds.each{ |seed| add(seed) }
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
# Get the nicer formatted string for use in inspection.
|
|
102
|
+
#
|
|
103
|
+
# @example Inspect the cluster.
|
|
104
|
+
# cluster.inspect
|
|
105
|
+
#
|
|
106
|
+
# @return [ String ] The cluster inspection.
|
|
107
|
+
#
|
|
108
|
+
# @since 2.0.0
|
|
109
|
+
def inspect
|
|
110
|
+
"#<Mongo::Cluster:0x#{object_id} servers=#{servers} topology=#{topology.display_name}>"
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
# Get the next primary server we can send an operation to.
|
|
114
|
+
#
|
|
115
|
+
# @example Get the next primary server.
|
|
116
|
+
# cluster.next_primary
|
|
117
|
+
#
|
|
118
|
+
# @return [ Mongo::Server ] A primary server.
|
|
119
|
+
#
|
|
120
|
+
# @since 2.0.0
|
|
121
|
+
def next_primary
|
|
122
|
+
ServerSelector.get({ mode: :primary }, options).select_server(self)
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
# Elect a primary server from the description that has just changed to a
|
|
126
|
+
# primary.
|
|
127
|
+
#
|
|
128
|
+
# @example Elect a primary server.
|
|
129
|
+
# cluster.elect_primary!(description)
|
|
130
|
+
#
|
|
131
|
+
# @param [ Server::Description ] description The newly elected primary.
|
|
132
|
+
#
|
|
133
|
+
# @return [ Topology ] The cluster topology.
|
|
134
|
+
#
|
|
135
|
+
# @since 2.0.0
|
|
136
|
+
def elect_primary!(description)
|
|
137
|
+
@topology = topology.elect_primary(description, @servers)
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
# Removed the server from the cluster for the provided address, if it
|
|
141
|
+
# exists.
|
|
142
|
+
#
|
|
143
|
+
# @example Remove the server from the cluster.
|
|
144
|
+
# server.remove('127.0.0.1:27017')
|
|
145
|
+
#
|
|
146
|
+
# @param [ String ] host The host/port or socket address.
|
|
147
|
+
#
|
|
148
|
+
# @since 2.0.0
|
|
149
|
+
def remove(host)
|
|
150
|
+
log_debug([ "#{host} being removed from the cluster." ])
|
|
151
|
+
address = Address.new(host)
|
|
152
|
+
removed_servers = @servers.reject!{ |server| server.address == address }
|
|
153
|
+
removed_servers.each{ |server| server.disconnect! } if removed_servers
|
|
154
|
+
addresses.reject!{ |addr| addr == address }
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
# Force a scan of all known servers in the cluster.
|
|
158
|
+
#
|
|
159
|
+
# @example Force a full cluster scan.
|
|
160
|
+
# cluster.scan!
|
|
161
|
+
#
|
|
162
|
+
# @note This operation is done synchronously. If servers in the cluster are
|
|
163
|
+
# down or slow to respond this can potentially be a slow operation.
|
|
164
|
+
#
|
|
165
|
+
# @return [ true ] Always true.
|
|
166
|
+
#
|
|
167
|
+
# @since 2.0.0
|
|
168
|
+
def scan!
|
|
169
|
+
@servers.each{ |server| server.scan! } and true
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
# Get a list of server candidates from the cluster that can have operations
|
|
173
|
+
# executed on them.
|
|
174
|
+
#
|
|
175
|
+
# @example Get the server candidates for an operation.
|
|
176
|
+
# cluster.servers
|
|
177
|
+
#
|
|
178
|
+
# @return [ Array<Server> ] The candidate servers.
|
|
179
|
+
#
|
|
180
|
+
# @since 2.0.0
|
|
181
|
+
def servers
|
|
182
|
+
topology.servers(@servers)
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
# Create a cluster for the provided client, for use when we don't want the
|
|
186
|
+
# client's original cluster instance to be the same.
|
|
187
|
+
#
|
|
188
|
+
# @api private
|
|
189
|
+
#
|
|
190
|
+
# @example Create a cluster for the client.
|
|
191
|
+
# Cluster.create(client)
|
|
192
|
+
#
|
|
193
|
+
# @param [ Client ] client The client to create on.
|
|
194
|
+
#
|
|
195
|
+
# @return [ Cluster ] The cluster.
|
|
196
|
+
#
|
|
197
|
+
# @since 2.0.0
|
|
198
|
+
def self.create(client)
|
|
199
|
+
cluster = Cluster.new(client.cluster.addresses.map(&:to_s), client.options)
|
|
200
|
+
client.instance_variable_set(:@cluster, cluster)
|
|
201
|
+
end
|
|
202
|
+
end
|
|
203
|
+
end
|
|
@@ -0,0 +1,60 @@
|
|
|
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/cluster/topology/replica_set'
|
|
16
|
+
require 'mongo/cluster/topology/sharded'
|
|
17
|
+
require 'mongo/cluster/topology/standalone'
|
|
18
|
+
require 'mongo/cluster/topology/unknown'
|
|
19
|
+
|
|
20
|
+
module Mongo
|
|
21
|
+
class Cluster
|
|
22
|
+
|
|
23
|
+
# Defines behaviour for getting servers.
|
|
24
|
+
#
|
|
25
|
+
# @since 2.0.0
|
|
26
|
+
module Topology
|
|
27
|
+
extend self
|
|
28
|
+
|
|
29
|
+
# The 2 various topologies for server selection.
|
|
30
|
+
#
|
|
31
|
+
# @since 2.0.0
|
|
32
|
+
OPTIONS = {
|
|
33
|
+
replica_set: ReplicaSet,
|
|
34
|
+
sharded: Sharded,
|
|
35
|
+
direct: Standalone
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
# Get the initial cluster topology for the provided options.
|
|
39
|
+
#
|
|
40
|
+
# @example Get the initial cluster topology.
|
|
41
|
+
# Topology.initial(topology: :replica_set)
|
|
42
|
+
#
|
|
43
|
+
# @param [ Hash ] options The cluster options.
|
|
44
|
+
#
|
|
45
|
+
# @return [ ReplicaSet, Sharded, Standalone ] The topology.
|
|
46
|
+
#
|
|
47
|
+
# @since 2.0.0
|
|
48
|
+
def initial(seeds, options)
|
|
49
|
+
if options.has_key?(:connect)
|
|
50
|
+
return OPTIONS.fetch(options[:connect]).new(options)
|
|
51
|
+
end
|
|
52
|
+
if options.has_key?(:replica_set)
|
|
53
|
+
ReplicaSet.new(options)
|
|
54
|
+
else
|
|
55
|
+
seeds.size > 1 ? Unknown.new(options) : Standalone.new(options)
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|