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
@@ -1,409 +0,0 @@
|
|
1
|
-
# Copyright (C) 2009-2013 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 'cgi'
|
16
|
-
require 'uri'
|
17
|
-
|
18
|
-
module Mongo
|
19
|
-
class URIParser
|
20
|
-
|
21
|
-
AUTH_REGEX = /((.+)@)?/
|
22
|
-
|
23
|
-
HOST_REGEX = /([-.\w]+)|(\[[^\]]+\])/
|
24
|
-
PORT_REGEX = /(?::(\w+))?/
|
25
|
-
UNIX_SOCK_REGEX = /([\S]+.sock)/
|
26
|
-
NODE_REGEX = /((#{HOST_REGEX}#{PORT_REGEX},?)+|#{UNIX_SOCK_REGEX}{1})/
|
27
|
-
|
28
|
-
PATH_REGEX = /(?:\/([-\w]+))?/
|
29
|
-
|
30
|
-
MONGODB_URI_MATCHER = /#{AUTH_REGEX}#{NODE_REGEX}#{PATH_REGEX}/
|
31
|
-
MONGODB_URI_SPEC = "mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]"
|
32
|
-
|
33
|
-
SPEC_ATTRS = [:nodes, :auths]
|
34
|
-
|
35
|
-
READ_PREFERENCES = {
|
36
|
-
'primary' => :primary,
|
37
|
-
'primarypreferred' => :primary_preferred,
|
38
|
-
'secondary' => :secondary,
|
39
|
-
'secondarypreferred' => :secondary_preferred,
|
40
|
-
'nearest' => :nearest
|
41
|
-
}
|
42
|
-
|
43
|
-
OPT_ATTRS = [
|
44
|
-
:authmechanism,
|
45
|
-
:authmechanismproperties,
|
46
|
-
:authsource,
|
47
|
-
:connect,
|
48
|
-
:connecttimeoutms,
|
49
|
-
:fsync,
|
50
|
-
:journal,
|
51
|
-
:pool_size,
|
52
|
-
:readpreference,
|
53
|
-
:readpreferencetags,
|
54
|
-
:replicaset,
|
55
|
-
:safe,
|
56
|
-
:slaveok,
|
57
|
-
:sockettimeoutms,
|
58
|
-
:ssl,
|
59
|
-
:w,
|
60
|
-
:wtimeout,
|
61
|
-
:wtimeoutms
|
62
|
-
]
|
63
|
-
|
64
|
-
OPT_VALID = {
|
65
|
-
:authmechanism => lambda { |arg| Mongo::Authentication.validate_mechanism(arg) },
|
66
|
-
:authmechanismproperties => lambda { |arg| arg.length > 0 },
|
67
|
-
:authsource => lambda { |arg| arg.length > 0 },
|
68
|
-
:connect => lambda { |arg| [ 'direct', 'replicaset', 'true', 'false', true, false ].include?(arg) },
|
69
|
-
:connecttimeoutms => lambda { |arg| arg =~ /^\d+$/ },
|
70
|
-
:fsync => lambda { |arg| ['true', 'false'].include?(arg) },
|
71
|
-
:journal => lambda { |arg| ['true', 'false'].include?(arg) },
|
72
|
-
:pool_size => lambda { |arg| arg.to_i > 0 },
|
73
|
-
:readpreference => lambda { |arg| READ_PREFERENCES.keys.include?(arg) },
|
74
|
-
:readpreferencetags => lambda { |arg| arg.none? { |tags| tags.scan(/(\w+:\w+),?/).empty? } },
|
75
|
-
:replicaset => lambda { |arg| arg.length > 0 },
|
76
|
-
:safe => lambda { |arg| ['true', 'false'].include?(arg) },
|
77
|
-
:slaveok => lambda { |arg| ['true', 'false'].include?(arg) },
|
78
|
-
:sockettimeoutms => lambda { |arg| arg =~ /^\d+$/ },
|
79
|
-
:ssl => lambda { |arg| ['true', 'false'].include?(arg) },
|
80
|
-
:w => lambda { |arg| arg =~ /^\w+$/ },
|
81
|
-
:wtimeout => lambda { |arg| arg =~ /^\d+$/ },
|
82
|
-
:wtimeoutms => lambda { |arg| arg =~ /^\d+$/ }
|
83
|
-
}
|
84
|
-
|
85
|
-
OPT_ERR = {
|
86
|
-
:authmechanism => Mongo::Authentication::MECHANISM_ERROR,
|
87
|
-
:authmechanismproperties => "must meet the format requirements of the authentication mechanism's properties",
|
88
|
-
:authsource => "must be a string containing the name of the database being used for authentication",
|
89
|
-
:connect => "must be 'direct', 'replicaset', 'true', or 'false'",
|
90
|
-
:connecttimeoutms => "must be an integer specifying milliseconds",
|
91
|
-
:fsync => "must be 'true' or 'false'",
|
92
|
-
:journal => "must be 'true' or 'false'",
|
93
|
-
:pool_size => "must be an integer greater than zero",
|
94
|
-
:readpreference => "must be one of #{READ_PREFERENCES.keys.map(&:inspect).join(",")}",
|
95
|
-
:readpreferencetags => "must be a comma-separated list of one or more key:value pairs",
|
96
|
-
:replicaset => "must be a string containing the name of the replica set to connect to",
|
97
|
-
:safe => "must be 'true' or 'false'",
|
98
|
-
:slaveok => "must be 'true' or 'false'",
|
99
|
-
:settimeoutms => "must be an integer specifying milliseconds",
|
100
|
-
:ssl => "must be 'true' or 'false'",
|
101
|
-
:w => "must be an integer indicating number of nodes to replicate to or a string " +
|
102
|
-
"specifying that replication is required to the majority or nodes with a " +
|
103
|
-
"particilar getLastErrorMode.",
|
104
|
-
:wtimeout => "must be an integer specifying milliseconds",
|
105
|
-
:wtimeoutms => "must be an integer specifying milliseconds"
|
106
|
-
}
|
107
|
-
|
108
|
-
OPT_CONV = {
|
109
|
-
:authmechanism => lambda { |arg| arg.upcase },
|
110
|
-
:authmechanismproperties => lambda { |arg| arg },
|
111
|
-
:authsource => lambda { |arg| arg },
|
112
|
-
:connect => lambda { |arg| arg == 'false' ? false : arg }, # convert 'false' to FalseClass
|
113
|
-
:connecttimeoutms => lambda { |arg| arg.to_f / 1000 }, # stored as seconds
|
114
|
-
:fsync => lambda { |arg| arg == 'true' ? true : false },
|
115
|
-
:journal => lambda { |arg| arg == 'true' ? true : false },
|
116
|
-
:pool_size => lambda { |arg| arg.to_i },
|
117
|
-
:readpreference => lambda { |arg| READ_PREFERENCES[arg] },
|
118
|
-
:readpreferencetags => lambda { |arg| arg.map do |tags|
|
119
|
-
tags.scan(/(\w+:\w+),?/).reduce({}) do |tags, pair|
|
120
|
-
key, value = pair.first.split(":")
|
121
|
-
tags.merge!(key => value)
|
122
|
-
end
|
123
|
-
end },
|
124
|
-
:replicaset => lambda { |arg| arg },
|
125
|
-
:safe => lambda { |arg| arg == 'true' ? true : false },
|
126
|
-
:slaveok => lambda { |arg| arg == 'true' ? true : false },
|
127
|
-
:sockettimeoutms => lambda { |arg| arg.to_f / 1000 }, # stored as seconds
|
128
|
-
:ssl => lambda { |arg| arg == 'true' ? true : false },
|
129
|
-
:w => lambda { |arg| Mongo::Support.is_i?(arg) ? arg.to_i : arg.to_sym },
|
130
|
-
:wtimeout => lambda { |arg| arg.to_i },
|
131
|
-
:wtimeoutms => lambda { |arg| arg.to_i }
|
132
|
-
}
|
133
|
-
|
134
|
-
OPT_CASE_SENSITIVE = [ :authsource,
|
135
|
-
:authmechanismproperties,
|
136
|
-
:replicaset,
|
137
|
-
:w
|
138
|
-
]
|
139
|
-
|
140
|
-
OPT_NOT_STRING = [ :readpreferencetags ]
|
141
|
-
|
142
|
-
attr_reader :auths,
|
143
|
-
:authmechanism,
|
144
|
-
:authmechanismproperties,
|
145
|
-
:authsource,
|
146
|
-
:connect,
|
147
|
-
:connecttimeoutms,
|
148
|
-
:db_name,
|
149
|
-
:fsync,
|
150
|
-
:journal,
|
151
|
-
:nodes,
|
152
|
-
:pool_size,
|
153
|
-
:readpreference,
|
154
|
-
:readpreferencetags,
|
155
|
-
:replicaset,
|
156
|
-
:safe,
|
157
|
-
:slaveok,
|
158
|
-
:sockettimeoutms,
|
159
|
-
:ssl,
|
160
|
-
:w,
|
161
|
-
:wtimeout,
|
162
|
-
:wtimeoutms
|
163
|
-
|
164
|
-
# Parse a MongoDB URI. This method is used by MongoClient.from_uri.
|
165
|
-
# Returns an array of nodes and an array of db authorizations, if applicable.
|
166
|
-
#
|
167
|
-
# @note Passwords can contain any character except for ','
|
168
|
-
#
|
169
|
-
# @param [String] uri The MongoDB URI string.
|
170
|
-
def initialize(uri)
|
171
|
-
if uri.start_with?('mongodb://')
|
172
|
-
uri = uri[10..-1]
|
173
|
-
else
|
174
|
-
raise MongoArgumentError, "MongoDB URI must match this spec: #{MONGODB_URI_SPEC}"
|
175
|
-
end
|
176
|
-
|
177
|
-
hosts, opts = uri.split('?')
|
178
|
-
parse_options(opts)
|
179
|
-
parse_hosts(hosts)
|
180
|
-
validate_connect
|
181
|
-
end
|
182
|
-
|
183
|
-
# Create a Mongo::MongoClient or a Mongo::MongoReplicaSetClient based on the URI.
|
184
|
-
#
|
185
|
-
# @note Don't confuse this with attribute getter method #connect.
|
186
|
-
#
|
187
|
-
# @return [MongoClient,MongoReplicaSetClient]
|
188
|
-
def connection(extra_opts={}, legacy = false, sharded = false)
|
189
|
-
opts = connection_options.merge!(extra_opts)
|
190
|
-
if(legacy)
|
191
|
-
if replicaset?
|
192
|
-
ReplSetConnection.new(node_strings, opts)
|
193
|
-
else
|
194
|
-
Connection.new(host, port, opts)
|
195
|
-
end
|
196
|
-
else
|
197
|
-
if sharded
|
198
|
-
MongoShardedClient.new(node_strings, opts)
|
199
|
-
elsif replicaset?
|
200
|
-
MongoReplicaSetClient.new(node_strings, opts)
|
201
|
-
else
|
202
|
-
MongoClient.new(host, port, opts)
|
203
|
-
end
|
204
|
-
end
|
205
|
-
end
|
206
|
-
|
207
|
-
# Whether this represents a replica set.
|
208
|
-
# @return [true,false]
|
209
|
-
def replicaset?
|
210
|
-
replicaset.is_a?(String) || nodes.length > 1
|
211
|
-
end
|
212
|
-
|
213
|
-
# Whether to immediately connect to the MongoDB node[s]. Defaults to true.
|
214
|
-
# @return [true, false]
|
215
|
-
def connect?
|
216
|
-
connect != false
|
217
|
-
end
|
218
|
-
|
219
|
-
# Whether this represents a direct connection.
|
220
|
-
#
|
221
|
-
# @note Specifying :connect => 'direct' has no effect... other than to raise an exception if other variables suggest a replicaset.
|
222
|
-
#
|
223
|
-
# @return [true,false]
|
224
|
-
def direct?
|
225
|
-
!replicaset?
|
226
|
-
end
|
227
|
-
|
228
|
-
# For direct connections, the host of the (only) node.
|
229
|
-
# @return [String]
|
230
|
-
def host
|
231
|
-
nodes[0][0]
|
232
|
-
end
|
233
|
-
|
234
|
-
# For direct connections, the port of the (only) node.
|
235
|
-
# @return [Integer]
|
236
|
-
def port
|
237
|
-
nodes[0][1].to_i
|
238
|
-
end
|
239
|
-
|
240
|
-
# Options that can be passed to MongoClient.new or MongoReplicaSetClient.new
|
241
|
-
# @return [Hash]
|
242
|
-
def connection_options
|
243
|
-
opts = {}
|
244
|
-
|
245
|
-
if @wtimeout
|
246
|
-
warn "Using wtimeout in a URI is deprecated, please use wtimeoutMS. It will be removed in v2.0."
|
247
|
-
opts[:wtimeout] = @wtimeout
|
248
|
-
end
|
249
|
-
opts[:wtimeout] = @wtimeoutms if @wtimeoutms
|
250
|
-
|
251
|
-
opts[:w] = 1 if @safe
|
252
|
-
opts[:w] = @w if @w
|
253
|
-
opts[:j] = @journal if @journal
|
254
|
-
opts[:fsync] = @fsync if @fsync
|
255
|
-
|
256
|
-
opts[:connect_timeout] = @connecttimeoutms if @connecttimeoutms
|
257
|
-
opts[:op_timeout] = @sockettimeoutms if @sockettimeoutms
|
258
|
-
opts[:pool_size] = @pool_size if @pool_size
|
259
|
-
opts[:read] = @readpreference if @readpreference
|
260
|
-
opts[:tag_sets] = @readpreferencetags if @readpreferencetags
|
261
|
-
|
262
|
-
if @slaveok && !@readpreference
|
263
|
-
unless replicaset?
|
264
|
-
opts[:slave_ok] = true
|
265
|
-
else
|
266
|
-
opts[:read] = :secondary_preferred
|
267
|
-
end
|
268
|
-
end
|
269
|
-
|
270
|
-
if replicaset.is_a?(String)
|
271
|
-
opts[:name] = replicaset
|
272
|
-
end
|
273
|
-
|
274
|
-
opts[:db_name] = @db_name if @db_name
|
275
|
-
opts[:auths] = @auths if @auths
|
276
|
-
opts[:ssl] = @ssl if @ssl
|
277
|
-
opts[:connect] = connect?
|
278
|
-
|
279
|
-
opts
|
280
|
-
end
|
281
|
-
|
282
|
-
def node_strings
|
283
|
-
nodes.map { |node| node.join(':') }
|
284
|
-
end
|
285
|
-
|
286
|
-
private
|
287
|
-
|
288
|
-
def parse_hosts(uri_without_protocol)
|
289
|
-
@nodes = []
|
290
|
-
@auths = Set.new
|
291
|
-
|
292
|
-
unless matches = MONGODB_URI_MATCHER.match(uri_without_protocol)
|
293
|
-
raise MongoArgumentError,
|
294
|
-
"MongoDB URI must match this spec: #{MONGODB_URI_SPEC}"
|
295
|
-
end
|
296
|
-
|
297
|
-
user_info = matches[2].split(':') if matches[2]
|
298
|
-
host_info = matches[3].split(',')
|
299
|
-
@db_name = matches[9]
|
300
|
-
|
301
|
-
if host_info.first.end_with?('.sock')
|
302
|
-
@nodes << [ host_info.first ]
|
303
|
-
else
|
304
|
-
host_info.each do |host|
|
305
|
-
if host[0,1] == '['
|
306
|
-
host, port = host.split(']:') << MongoClient::DEFAULT_PORT
|
307
|
-
host = host.end_with?(']') ? host[1...-1] : host[1..-1]
|
308
|
-
else
|
309
|
-
host, port = host.split(':') << MongoClient::DEFAULT_PORT
|
310
|
-
end
|
311
|
-
unless port.to_s =~ /^\d+$/
|
312
|
-
raise MongoArgumentError,
|
313
|
-
"Invalid port #{port}; port must be specified as digits."
|
314
|
-
end
|
315
|
-
@nodes << [host, port.to_i]
|
316
|
-
end
|
317
|
-
end
|
318
|
-
|
319
|
-
if @nodes.empty?
|
320
|
-
raise MongoArgumentError,
|
321
|
-
"No nodes specified. Please ensure that you've provided at " +
|
322
|
-
"least one node."
|
323
|
-
end
|
324
|
-
|
325
|
-
# no user info to parse, exit here
|
326
|
-
return unless user_info
|
327
|
-
|
328
|
-
# check for url encoding for username and password
|
329
|
-
username, password = user_info
|
330
|
-
if user_info.size > 2 ||
|
331
|
-
(username && username.include?('@')) ||
|
332
|
-
(password && password.include?('@'))
|
333
|
-
|
334
|
-
raise MongoArgumentError,
|
335
|
-
"The characters ':' and '@' in a username or password " +
|
336
|
-
"must be escaped (RFC 2396)."
|
337
|
-
end
|
338
|
-
|
339
|
-
# if username exists, proceed adding to auth set
|
340
|
-
unless username.nil? || username.empty?
|
341
|
-
auth = Authentication.validate_credentials({
|
342
|
-
:db_name => @db_name,
|
343
|
-
:username => URI.unescape(username),
|
344
|
-
:password => password ? URI.unescape(password) : nil,
|
345
|
-
:source => @authsource,
|
346
|
-
:mechanism => @authmechanism,
|
347
|
-
:extra => @authmechanismproperties || {}
|
348
|
-
})
|
349
|
-
|
350
|
-
@auths << auth
|
351
|
-
end
|
352
|
-
end
|
353
|
-
|
354
|
-
# This method uses the lambdas defined in OPT_VALID and OPT_CONV to validate
|
355
|
-
# and convert the given options.
|
356
|
-
def parse_options(string_opts)
|
357
|
-
# initialize instance variables for available options
|
358
|
-
OPT_VALID.keys.each { |k| instance_variable_set("@#{k}", nil) }
|
359
|
-
|
360
|
-
string_opts ||= ''
|
361
|
-
|
362
|
-
return if string_opts.empty?
|
363
|
-
|
364
|
-
if string_opts.include?(';') and string_opts.include?('&')
|
365
|
-
raise MongoArgumentError, 'must not mix URL separators ; and &'
|
366
|
-
end
|
367
|
-
|
368
|
-
opts = CGI.parse(string_opts).inject({}) do |memo, (key, value)|
|
369
|
-
key_sym = key.downcase.to_sym
|
370
|
-
if OPT_NOT_STRING.include?(key_sym)
|
371
|
-
memo[key_sym] = value
|
372
|
-
else
|
373
|
-
value = value.first
|
374
|
-
memo[key_sym] = OPT_CASE_SENSITIVE.include?(key_sym) ? value.strip : value.strip.downcase
|
375
|
-
end
|
376
|
-
memo
|
377
|
-
end
|
378
|
-
|
379
|
-
opts.each do |key, value|
|
380
|
-
if !OPT_ATTRS.include?(key)
|
381
|
-
raise MongoArgumentError, "Invalid Mongo URI option #{key}"
|
382
|
-
end
|
383
|
-
if OPT_VALID[key].call(value)
|
384
|
-
instance_variable_set("@#{key}", OPT_CONV[key].call(value))
|
385
|
-
else
|
386
|
-
raise MongoArgumentError, "Invalid value #{value.inspect} for #{key}: #{OPT_ERR[key]}"
|
387
|
-
end
|
388
|
-
end
|
389
|
-
|
390
|
-
if @authmechanismproperties
|
391
|
-
@authmechanismproperties = @authmechanismproperties.split(',').reduce({}) do |prop, pair|
|
392
|
-
key, value = pair.split(':')
|
393
|
-
if ["true", "false"].include?(value.downcase)
|
394
|
-
value = value.downcase == "true"
|
395
|
-
end
|
396
|
-
prop[key.downcase.to_sym] = value
|
397
|
-
prop
|
398
|
-
end
|
399
|
-
end
|
400
|
-
end
|
401
|
-
|
402
|
-
def validate_connect
|
403
|
-
if replicaset? and @connect == 'direct'
|
404
|
-
# Make sure the user doesn't specify something contradictory
|
405
|
-
raise MongoArgumentError, "connect=direct conflicts with setting a replicaset name"
|
406
|
-
end
|
407
|
-
end
|
408
|
-
end
|
409
|
-
end
|
@@ -1,66 +0,0 @@
|
|
1
|
-
# Copyright (C) 2009-2013 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 WriteConcern
|
17
|
-
VALID_KEYS = [:w, :j, :fsync, :wtimeout]
|
18
|
-
DEFAULT_WRITE_CONCERN = {:w => 1}
|
19
|
-
|
20
|
-
attr_reader :legacy_write_concern
|
21
|
-
|
22
|
-
@@safe_warn = nil
|
23
|
-
def write_concern_from_legacy(opts)
|
24
|
-
# Warn if 'safe' parameter is being used,
|
25
|
-
if opts.key?(:safe) && !@@safe_warn && !ENV['TEST_MODE']
|
26
|
-
warn "[DEPRECATED] The 'safe' write concern option has been deprecated in favor of 'w'."
|
27
|
-
@@safe_warn = true
|
28
|
-
end
|
29
|
-
|
30
|
-
# nil: set :w => 0
|
31
|
-
# false: set :w => 0
|
32
|
-
# true: set :w => 1
|
33
|
-
# hash: set :w => 0 and merge with opts
|
34
|
-
|
35
|
-
unless opts.has_key?(:w)
|
36
|
-
opts[:w] = 0 # legacy default, unacknowledged
|
37
|
-
safe = opts.delete(:safe)
|
38
|
-
if(safe && safe.is_a?(Hash))
|
39
|
-
opts.merge!(safe)
|
40
|
-
elsif(safe == true)
|
41
|
-
opts[:w] = 1
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
# todo: throw exception for conflicting write concern options
|
47
|
-
def get_write_concern(opts, parent=nil)
|
48
|
-
write_concern_from_legacy(opts) if opts.key?(:safe) || legacy_write_concern
|
49
|
-
write_concern = DEFAULT_WRITE_CONCERN.dup
|
50
|
-
write_concern.merge!(parent.write_concern) if parent
|
51
|
-
write_concern.merge!(opts.reject {|k,v| !VALID_KEYS.include?(k)})
|
52
|
-
write_concern[:w] = write_concern[:w].to_s if write_concern[:w].is_a?(Symbol)
|
53
|
-
write_concern
|
54
|
-
end
|
55
|
-
|
56
|
-
def self.gle?(write_concern)
|
57
|
-
(write_concern[:w].is_a? Symbol) ||
|
58
|
-
(write_concern[:w].is_a? String) ||
|
59
|
-
write_concern[:w] > 0 ||
|
60
|
-
write_concern[:j] ||
|
61
|
-
write_concern[:fsync] ||
|
62
|
-
write_concern[:wtimeout]
|
63
|
-
end
|
64
|
-
|
65
|
-
end
|
66
|
-
end
|
data/lib/mongo/gridfs/grid.rb
DELETED
@@ -1,112 +0,0 @@
|
|
1
|
-
# Copyright (C) 2009-2013 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
|
-
# Implementation of the MongoDB GridFS specification. A file store.
|
18
|
-
class Grid
|
19
|
-
include GridExt::InstanceMethods
|
20
|
-
|
21
|
-
DEFAULT_FS_NAME = 'fs'
|
22
|
-
|
23
|
-
# Initialize a new Grid instance, consisting of a MongoDB database
|
24
|
-
# and a filesystem prefix if not using the default.
|
25
|
-
#
|
26
|
-
# @see GridFileSystem
|
27
|
-
def initialize(db, fs_name=DEFAULT_FS_NAME)
|
28
|
-
raise MongoArgumentError, "db must be a Mongo::DB." unless db.is_a?(Mongo::DB)
|
29
|
-
|
30
|
-
@db = db
|
31
|
-
@files = @db["#{fs_name}.files"]
|
32
|
-
@chunks = @db["#{fs_name}.chunks"]
|
33
|
-
@fs_name = fs_name
|
34
|
-
|
35
|
-
# This will create indexes only if we're connected to a primary node.
|
36
|
-
begin
|
37
|
-
@chunks.ensure_index([['files_id', Mongo::ASCENDING], ['n', Mongo::ASCENDING]], :unique => true)
|
38
|
-
rescue Mongo::ConnectionFailure
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
# Store a file in the file store. This method is designed only for writing new files;
|
43
|
-
# if you need to update a given file, first delete it using Grid#delete.
|
44
|
-
#
|
45
|
-
# Note that arbitrary metadata attributes can be saved to the file by passing
|
46
|
-
# them in as options.
|
47
|
-
#
|
48
|
-
# @param [String, #read] data a string or io-like object to store.
|
49
|
-
#
|
50
|
-
# @option opts [String] :filename (nil) a name for the file.
|
51
|
-
# @option opts [Hash] :metadata ({}) any additional data to store with the file.
|
52
|
-
# @option opts [ObjectId] :_id (ObjectId) a unique id for
|
53
|
-
# the file to be use in lieu of an automatically generated one.
|
54
|
-
# @option opts [String] :content_type ('binary/octet-stream') If no content type is specified,
|
55
|
-
# the content type will may be inferred from the filename extension if the mime-types gem can be
|
56
|
-
# loaded. Otherwise, the content type 'binary/octet-stream' will be used.
|
57
|
-
# @option opts [Integer] (261120) :chunk_size size of file chunks in bytes.
|
58
|
-
# @option opts [String, Integer, Symbol] :w (1) Set write concern
|
59
|
-
#
|
60
|
-
# Notes on write concern:
|
61
|
-
# When :w > 0, the chunks sent to the server are validated using an md5 hash.
|
62
|
-
# If validation fails, an exception will be raised.
|
63
|
-
#
|
64
|
-
# @return [BSON::ObjectId] the file's id.
|
65
|
-
def put(data, opts={})
|
66
|
-
begin
|
67
|
-
# Ensure there is an index on files_id and n, as state may have changed since instantiation of self.
|
68
|
-
# Recall that index definitions are cached with ensure_index so this statement won't unneccesarily repeat index creation.
|
69
|
-
@chunks.ensure_index([['files_id', Mongo::ASCENDING], ['n', Mongo::ASCENDING]], :unique => true)
|
70
|
-
opts = opts.dup
|
71
|
-
filename = opts.delete(:filename)
|
72
|
-
opts.merge!(default_grid_io_opts)
|
73
|
-
file = GridIO.new(@files, @chunks, filename, 'w', opts)
|
74
|
-
file.write(data)
|
75
|
-
file.close
|
76
|
-
file.files_id
|
77
|
-
rescue Mongo::ConnectionFailure => e
|
78
|
-
raise e, "Failed to create necessary index and write data."
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
# Read a file from the file store.
|
83
|
-
#
|
84
|
-
# @param id the file's unique id.
|
85
|
-
#
|
86
|
-
# @return [Mongo::GridIO]
|
87
|
-
def get(id)
|
88
|
-
opts = {:query => {'_id' => id}}.merge!(default_grid_io_opts)
|
89
|
-
GridIO.new(@files, @chunks, nil, 'r', opts)
|
90
|
-
end
|
91
|
-
|
92
|
-
# Delete a file from the store.
|
93
|
-
#
|
94
|
-
# Note that deleting a GridFS file can result in read errors if another process
|
95
|
-
# is attempting to read a file while it's being deleted. While the odds for this
|
96
|
-
# kind of race condition are small, it's important to be aware of.
|
97
|
-
#
|
98
|
-
# @param id
|
99
|
-
#
|
100
|
-
# @return [Boolean]
|
101
|
-
def delete(id)
|
102
|
-
@files.remove({"_id" => id})
|
103
|
-
@chunks.remove({"files_id" => id})
|
104
|
-
end
|
105
|
-
|
106
|
-
private
|
107
|
-
|
108
|
-
def default_grid_io_opts
|
109
|
-
{:fs_name => @fs_name}
|
110
|
-
end
|
111
|
-
end
|
112
|
-
end
|
@@ -1,53 +0,0 @@
|
|
1
|
-
# Copyright (C) 2009-2013 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 GridExt
|
17
|
-
module InstanceMethods
|
18
|
-
|
19
|
-
# Check the existence of a file matching the given query selector.
|
20
|
-
#
|
21
|
-
# Note that this method can be used with both the Grid and GridFileSystem classes. Also
|
22
|
-
# keep in mind that if you're going to be performing lots of existence checks, you should
|
23
|
-
# keep an instance of Grid or GridFileSystem handy rather than instantiating for each existence
|
24
|
-
# check. Alternatively, simply keep a reference to the proper files collection and query that
|
25
|
-
# as needed. That's exactly how this methods works.
|
26
|
-
#
|
27
|
-
# @param [Hash] selector a query selector.
|
28
|
-
#
|
29
|
-
# @example
|
30
|
-
#
|
31
|
-
# # Check for the existence of a given filename
|
32
|
-
# @grid = Mongo::GridFileSystem.new(@db)
|
33
|
-
# @grid.exist?(:filename => 'foo.txt')
|
34
|
-
#
|
35
|
-
# # Check for existence filename and content type
|
36
|
-
# @grid = Mongo::GridFileSystem.new(@db)
|
37
|
-
# @grid.exist?(:filename => 'foo.txt', :content_type => 'image/jpg')
|
38
|
-
#
|
39
|
-
# # Check for existence by _id
|
40
|
-
# @grid = Mongo::Grid.new(@db)
|
41
|
-
# @grid.exist?(:_id => BSON::ObjectId.from_string('4bddcd24beffd95a7db9b8c8'))
|
42
|
-
#
|
43
|
-
# # Check for existence by an arbitrary attribute.
|
44
|
-
# @grid = Mongo::Grid.new(@db)
|
45
|
-
# @grid.exist?(:tags => {'$in' => ['nature', 'zen', 'photography']})
|
46
|
-
#
|
47
|
-
# @return [nil, Hash] either nil for the file's metadata as a hash.
|
48
|
-
def exist?(selector)
|
49
|
-
@files.find_one(selector)
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|