mongo 1.12.5 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CONTRIBUTING.md +64 -0
- data/LICENSE +1 -1
- data/README.md +21 -126
- data/Rakefile +39 -21
- data/bin/mongo_console +6 -38
- data/lib/mongo/address/ipv4.rb +85 -0
- data/lib/mongo/address/ipv6.rb +85 -0
- data/lib/mongo/address/unix.rb +76 -0
- data/lib/mongo/address.rb +111 -0
- data/lib/mongo/auth/cr/conversation.rb +119 -0
- data/lib/mongo/auth/cr.rb +44 -0
- data/lib/mongo/auth/executable.rb +52 -0
- data/lib/mongo/auth/ldap/conversation.rb +92 -0
- data/lib/mongo/auth/ldap.rb +48 -0
- data/lib/mongo/auth/roles.rb +104 -0
- data/lib/mongo/auth/scram/conversation.rb +450 -0
- data/lib/mongo/auth/scram.rb +53 -0
- data/lib/mongo/auth/user/view.rb +102 -0
- data/lib/mongo/auth/user.rb +159 -0
- data/lib/mongo/auth/x509/conversation.rb +92 -0
- data/lib/mongo/auth/x509.rb +48 -0
- data/lib/mongo/auth.rb +108 -0
- data/lib/mongo/bulk_write/bulk_writable.rb +191 -0
- data/lib/mongo/bulk_write/deletable.rb +60 -0
- data/lib/mongo/bulk_write/insertable.rb +52 -0
- data/lib/mongo/bulk_write/ordered_bulk_write.rb +48 -0
- data/lib/mongo/bulk_write/replacable.rb +57 -0
- data/lib/mongo/bulk_write/unordered_bulk_write.rb +46 -0
- data/lib/mongo/bulk_write/updatable.rb +68 -0
- data/lib/mongo/bulk_write.rb +52 -0
- data/lib/mongo/client.rb +246 -0
- data/lib/mongo/cluster/topology/replica_set.rb +160 -0
- data/lib/mongo/cluster/topology/sharded.rb +132 -0
- data/lib/mongo/cluster/topology/standalone.rb +132 -0
- data/lib/mongo/cluster/topology/unknown.rb +155 -0
- data/lib/mongo/cluster/topology.rb +60 -0
- data/lib/mongo/cluster.rb +203 -0
- data/lib/mongo/collection/view/aggregation.rb +108 -0
- data/lib/mongo/collection/view/explainable.rb +49 -0
- data/lib/mongo/collection/view/immutable.rb +43 -0
- data/lib/mongo/collection/view/iterable.rb +48 -0
- data/lib/mongo/collection/view/map_reduce.rb +191 -0
- data/lib/mongo/collection/view/readable.rb +363 -0
- data/lib/mongo/collection/view/writable.rb +185 -0
- data/lib/mongo/collection/view.rb +169 -0
- data/lib/mongo/collection.rb +130 -1101
- data/lib/mongo/cursor.rb +78 -681
- data/lib/mongo/database/view.rb +101 -0
- data/lib/mongo/database.rb +224 -0
- data/lib/mongo/error/bulk_write_error.rb +41 -0
- data/lib/mongo/error/invalid_bulk_operation.rb +36 -0
- data/lib/mongo/error/invalid_bulk_operation_type.rb +36 -0
- data/lib/mongo/error/invalid_collection_name.rb +39 -0
- data/lib/mongo/error/invalid_database_name.rb +39 -0
- data/{test/replica_set/ssl_test.rb → lib/mongo/error/invalid_document.rb} +21 -14
- data/lib/mongo/error/invalid_file.rb +38 -0
- data/lib/mongo/error/invalid_nonce.rb +46 -0
- data/lib/mongo/error/invalid_replacement_document.rb +39 -0
- data/lib/mongo/error/invalid_signature.rb +47 -0
- data/{test/functional/ssl_test.rb → lib/mongo/error/invalid_update_document.rb} +22 -12
- data/lib/mongo/error/max_bson_size.rb +40 -0
- data/lib/mongo/error/max_message_size.rb +42 -0
- data/{test/functional/db_connection_test.rb → lib/mongo/error/multi_index_drop.rb} +17 -8
- data/lib/mongo/{utils.rb → error/need_primary_server.rb} +10 -6
- data/lib/mongo/{connection.rb → error/operation_failure.rb} +10 -6
- data/lib/mongo/error/parser.rb +77 -0
- data/lib/mongo/{connection/socket.rb → error/socket_error.rb} +10 -5
- data/lib/mongo/error/socket_timeout_error.rb +23 -0
- data/lib/mongo/error/unsupported_features.rb +43 -0
- data/lib/mongo/error.rb +82 -0
- data/lib/mongo/event/listeners.rb +63 -0
- data/lib/mongo/event/primary_elected.rb +53 -0
- data/lib/mongo/event/publisher.rb +42 -0
- data/lib/mongo/event/server_added.rb +53 -0
- data/lib/mongo/event/server_removed.rb +53 -0
- data/lib/mongo/event/subscriber.rb +41 -0
- data/lib/mongo/event.rb +40 -0
- data/lib/mongo/grid/file/chunk.rb +184 -0
- data/lib/mongo/grid/file/metadata.rb +229 -0
- data/lib/mongo/grid/file.rb +106 -0
- data/lib/mongo/grid/fs.rb +149 -0
- data/lib/mongo/{gridfs.rb → grid.rb} +3 -5
- data/lib/mongo/index/view.rb +261 -0
- data/lib/mongo/index.rb +64 -0
- data/lib/mongo/loggable.rb +126 -0
- data/lib/mongo/logger.rb +132 -0
- data/lib/mongo/operation/aggregate/result.rb +88 -0
- data/lib/mongo/operation/aggregate.rb +100 -0
- data/lib/mongo/operation/command.rb +62 -0
- data/lib/mongo/operation/executable.rb +105 -0
- data/lib/mongo/operation/kill_cursors.rb +39 -0
- data/lib/mongo/operation/limited.rb +37 -0
- data/lib/mongo/operation/list_collections/result.rb +114 -0
- data/lib/mongo/operation/list_indexes/result.rb +118 -0
- data/lib/mongo/operation/map_reduce/result.rb +122 -0
- data/lib/mongo/operation/map_reduce.rb +96 -0
- data/lib/mongo/operation/read/collections_info.rb +67 -0
- data/lib/mongo/operation/read/get_more.rb +71 -0
- data/lib/mongo/operation/read/indexes.rb +68 -0
- data/lib/mongo/operation/read/list_collections.rb +75 -0
- data/lib/mongo/operation/read/list_indexes.rb +77 -0
- data/lib/mongo/operation/read/query.rb +71 -0
- data/lib/mongo/{functional.rb → operation/read.rb} +7 -7
- data/lib/mongo/operation/read_preferrable.rb +34 -0
- data/lib/mongo/operation/result.rb +259 -0
- data/lib/mongo/operation/specifiable.rb +397 -0
- data/lib/mongo/operation/write/bulk/bulk_delete/result.rb +75 -0
- data/lib/mongo/operation/write/bulk/bulk_delete.rb +144 -0
- data/lib/mongo/operation/write/bulk/bulk_insert/result.rb +68 -0
- data/lib/mongo/operation/write/bulk/bulk_insert.rb +129 -0
- data/lib/mongo/operation/write/bulk/bulk_mergable.rb +67 -0
- data/lib/mongo/operation/write/bulk/bulk_update/result.rb +162 -0
- data/lib/mongo/operation/write/bulk/bulk_update.rb +153 -0
- data/lib/mongo/operation/write/bulk/legacy_bulk_mergable.rb +83 -0
- data/lib/mongo/operation/write/bulk.rb +17 -0
- data/lib/mongo/operation/write/command/create_index.rb +50 -0
- data/lib/mongo/operation/write/command/create_user.rb +43 -0
- data/lib/mongo/operation/write/command/delete.rb +56 -0
- data/lib/mongo/operation/write/command/drop_index.rb +51 -0
- data/lib/mongo/operation/write/command/insert.rb +55 -0
- data/lib/mongo/operation/write/command/remove_user.rb +42 -0
- data/lib/mongo/operation/write/command/update.rb +60 -0
- data/lib/mongo/operation/write/command/writable.rb +61 -0
- data/lib/mongo/operation/write/command.rb +22 -0
- data/lib/mongo/operation/write/create_index.rb +89 -0
- data/lib/mongo/operation/write/create_user.rb +75 -0
- data/lib/mongo/operation/write/delete/result.rb +40 -0
- data/lib/mongo/operation/write/delete.rb +93 -0
- data/lib/mongo/operation/write/drop_index.rb +62 -0
- data/lib/mongo/{utils/thread_local_variable_manager.rb → operation/write/insert/result.rb} +15 -8
- data/lib/mongo/operation/write/insert.rb +90 -0
- data/lib/mongo/operation/write/remove_user.rb +70 -0
- data/lib/mongo/operation/write/update/result.rb +160 -0
- data/lib/mongo/operation/write/update.rb +103 -0
- data/lib/mongo/{connection/socket/socket_util.rb → operation/write.rb} +10 -24
- data/lib/mongo/operation.rb +25 -0
- data/lib/mongo/options/mapper.rb +78 -0
- data/lib/mongo/options.rb +15 -0
- data/lib/mongo/protocol/bit_vector.rb +61 -0
- data/lib/mongo/protocol/delete.rb +94 -0
- data/lib/mongo/protocol/get_more.rb +99 -0
- data/lib/mongo/protocol/insert.rb +99 -0
- data/lib/mongo/protocol/kill_cursors.rb +74 -0
- data/lib/mongo/protocol/message.rb +252 -0
- data/lib/mongo/protocol/query.rb +147 -0
- data/lib/mongo/protocol/reply.rb +72 -0
- data/lib/mongo/protocol/serializers.rb +180 -0
- data/lib/mongo/protocol/update.rb +111 -0
- data/lib/mongo/protocol.rb +15 -0
- data/lib/mongo/server/connectable.rb +110 -0
- data/lib/mongo/server/connection.rb +134 -0
- data/lib/mongo/server/connection_pool/queue.rb +182 -0
- data/lib/mongo/server/connection_pool.rb +141 -0
- data/lib/mongo/server/context.rb +66 -0
- data/lib/mongo/server/description/features.rb +85 -0
- data/lib/mongo/server/description/inspector/primary_elected.rb +58 -0
- data/lib/mongo/server/description/inspector/server_added.rb +59 -0
- data/lib/mongo/server/description/inspector/server_removed.rb +59 -0
- data/lib/mongo/server/description/inspector.rb +79 -0
- data/lib/mongo/server/description.rb +450 -0
- data/lib/mongo/server/monitor/connection.rb +89 -0
- data/lib/mongo/server/monitor.rb +176 -0
- data/lib/mongo/server.rb +163 -0
- data/lib/mongo/server_selector/nearest.rb +94 -0
- data/lib/mongo/server_selector/primary.rb +88 -0
- data/lib/mongo/server_selector/primary_preferred.rb +94 -0
- data/lib/mongo/server_selector/secondary.rb +91 -0
- data/lib/mongo/server_selector/secondary_preferred.rb +96 -0
- data/lib/mongo/server_selector/selectable.rb +209 -0
- data/lib/mongo/server_selector.rb +81 -0
- data/lib/mongo/socket/ssl.rb +130 -0
- data/lib/mongo/socket/tcp.rb +69 -0
- data/lib/mongo/socket/unix.rb +64 -0
- data/lib/mongo/socket.rb +179 -0
- data/lib/mongo/uri.rb +504 -0
- data/lib/mongo/version.rb +21 -0
- data/lib/mongo/write_concern/acknowledged.rb +52 -0
- data/lib/mongo/write_concern/normalizable.rb +51 -0
- data/lib/mongo/write_concern/unacknowledged.rb +55 -0
- data/lib/mongo/write_concern.rb +99 -0
- data/lib/mongo.rb +24 -82
- data/mongo.gemspec +17 -14
- data/spec/certificates/ca.pem +17 -0
- data/spec/certificates/client.pem +101 -0
- data/spec/certificates/crl.pem +10 -0
- data/spec/certificates/crl_client_revoked.pem +12 -0
- data/spec/certificates/password_protected.pem +51 -0
- data/spec/certificates/server.pem +34 -0
- data/spec/mongo/address/ipv4_spec.rb +74 -0
- data/spec/mongo/address/ipv6_spec.rb +74 -0
- data/spec/mongo/address/unix_spec.rb +30 -0
- data/spec/mongo/address_spec.rb +206 -0
- data/spec/mongo/auth/cr_spec.rb +59 -0
- data/spec/mongo/auth/ldap_spec.rb +40 -0
- data/spec/mongo/auth/scram/conversation_spec.rb +197 -0
- data/spec/mongo/auth/scram_spec.rb +55 -0
- data/spec/mongo/auth/user/view_spec.rb +76 -0
- data/spec/mongo/auth/user_spec.rb +190 -0
- data/spec/mongo/auth/x509_spec.rb +40 -0
- data/spec/mongo/auth_spec.rb +65 -0
- data/spec/mongo/bulk/bulk_write_spec.rb +262 -0
- data/spec/mongo/client_spec.rb +564 -0
- data/spec/mongo/cluster/topology/replica_set_spec.rb +101 -0
- data/spec/mongo/cluster/topology/sharded_spec.rb +74 -0
- data/spec/mongo/cluster/topology/standalone_spec.rb +79 -0
- data/spec/mongo/cluster/topology_spec.rb +65 -0
- data/spec/mongo/cluster_spec.rb +129 -0
- data/spec/mongo/collection/view/aggregation_spec.rb +148 -0
- data/spec/mongo/collection/view/explainable_spec.rb +32 -0
- data/spec/mongo/collection/view/map_reduce_spec.rb +242 -0
- data/spec/mongo/collection/view/readable_spec.rb +603 -0
- data/spec/mongo/collection/view/writable_spec.rb +679 -0
- data/spec/mongo/collection/view_spec.rb +530 -0
- data/spec/mongo/collection_spec.rb +362 -0
- data/spec/mongo/crud_spec.rb +42 -0
- data/spec/mongo/cursor_spec.rb +295 -0
- data/spec/mongo/database_spec.rb +302 -0
- data/spec/mongo/error/parser_spec.rb +119 -0
- data/spec/mongo/event/publisher_spec.rb +50 -0
- data/spec/mongo/event/subscriber_spec.rb +34 -0
- data/spec/mongo/grid/file/chunk_spec.rb +226 -0
- data/spec/mongo/grid/file/metadata_spec.rb +92 -0
- data/spec/mongo/grid/file_spec.rb +172 -0
- data/spec/mongo/grid/fs_spec.rb +129 -0
- data/spec/mongo/index/view_spec.rb +330 -0
- data/spec/mongo/loggable_spec.rb +62 -0
- data/spec/mongo/logger_spec.rb +97 -0
- data/spec/mongo/operation/aggregate/result_spec.rb +80 -0
- data/spec/mongo/operation/aggregate_spec.rb +127 -0
- data/spec/mongo/operation/command_spec.rb +98 -0
- data/spec/mongo/operation/kill_cursors_spec.rb +66 -0
- data/spec/mongo/operation/limited_spec.rb +50 -0
- data/spec/mongo/operation/map_reduce_spec.rb +143 -0
- data/spec/mongo/operation/read/collections_info_spec.rb +40 -0
- data/spec/mongo/operation/read/get_more_spec.rb +81 -0
- data/spec/mongo/operation/read/indexes_spec.rb +31 -0
- data/spec/mongo/operation/read/query_spec.rb +84 -0
- data/spec/mongo/operation/result_spec.rb +275 -0
- data/spec/mongo/operation/specifiable_spec.rb +53 -0
- data/spec/mongo/operation/write/bulk_delete_spec.rb +235 -0
- data/spec/mongo/operation/write/bulk_insert_spec.rb +235 -0
- data/spec/mongo/operation/write/bulk_update_spec.rb +236 -0
- data/spec/mongo/operation/write/command/delete_spec.rb +103 -0
- data/spec/mongo/operation/write/command/insert_spec.rb +103 -0
- data/spec/mongo/operation/write/command/update_spec.rb +109 -0
- data/spec/mongo/operation/write/create_index_spec.rb +63 -0
- data/spec/mongo/operation/write/create_user_spec.rb +44 -0
- data/spec/mongo/operation/write/delete_spec.rb +186 -0
- data/spec/mongo/operation/write/drop_index_spec.rb +51 -0
- data/spec/mongo/operation/write/insert_spec.rb +244 -0
- data/spec/mongo/operation/write/remove_user_spec.rb +46 -0
- data/spec/mongo/operation/write/response_spec.rb +85 -0
- data/spec/mongo/operation/write/update_spec.rb +228 -0
- data/spec/mongo/protocol/delete_spec.rb +167 -0
- data/spec/mongo/protocol/get_more_spec.rb +146 -0
- data/spec/mongo/protocol/insert_spec.rb +161 -0
- data/spec/mongo/protocol/kill_cursors_spec.rb +101 -0
- data/spec/mongo/protocol/query_spec.rb +285 -0
- data/spec/mongo/protocol/reply_spec.rb +157 -0
- data/spec/mongo/protocol/update_spec.rb +186 -0
- data/spec/mongo/server/connection_pool/queue_spec.rb +170 -0
- data/spec/mongo/server/connection_pool_spec.rb +120 -0
- data/spec/mongo/server/connection_spec.rb +312 -0
- data/spec/mongo/server/description/features_spec.rb +138 -0
- data/spec/mongo/server/description/inspector/primary_elected_spec.rb +94 -0
- data/spec/mongo/server/description/inspector/server_added_spec.rb +92 -0
- data/spec/mongo/server/description/inspector/server_removed_spec.rb +95 -0
- data/spec/mongo/server/description_spec.rb +510 -0
- data/spec/mongo/server/monitor_spec.rb +144 -0
- data/spec/mongo/server_discovery_and_monitoring_spec.rb +103 -0
- data/spec/mongo/server_selection_rtt_spec.rb +104 -0
- data/spec/mongo/server_selection_spec.rb +89 -0
- data/spec/mongo/server_selector/nearest_spec.rb +250 -0
- data/spec/mongo/server_selector/primary_preferred_spec.rb +290 -0
- data/spec/mongo/server_selector/primary_spec.rb +114 -0
- data/spec/mongo/server_selector/secondary_preferred_spec.rb +252 -0
- data/spec/mongo/server_selector/secondary_spec.rb +196 -0
- data/spec/mongo/server_selector_spec.rb +101 -0
- data/spec/mongo/server_spec.rb +131 -0
- data/spec/mongo/uri_spec.rb +517 -0
- data/spec/mongo/write_concern/acknowledged_spec.rb +44 -0
- data/spec/mongo/write_concern/unacknowledged_spec.rb +15 -0
- data/spec/spec_helper.rb +133 -0
- data/spec/support/authorization.rb +247 -0
- data/spec/support/crud/read.rb +144 -0
- data/spec/support/crud/write.rb +214 -0
- data/spec/support/crud.rb +203 -0
- data/spec/support/crud_tests/read/aggregate.yml +43 -0
- data/spec/support/crud_tests/read/count.yml +37 -0
- data/spec/support/crud_tests/read/distinct.yml +33 -0
- data/spec/support/crud_tests/read/find.yml +50 -0
- data/spec/support/crud_tests/write/deleteMany.yml +36 -0
- data/spec/support/crud_tests/write/deleteOne.yml +49 -0
- data/spec/support/crud_tests/write/findOneAndDelete.yml +54 -0
- data/spec/support/crud_tests/write/findOneAndReplace.yml +153 -0
- data/spec/support/crud_tests/write/findOneAndUpdate.yml +161 -0
- data/spec/support/crud_tests/write/insertMany.yml +24 -0
- data/spec/support/crud_tests/write/insertOne.yml +19 -0
- data/spec/support/crud_tests/write/replaceOne.yml +96 -0
- data/spec/support/crud_tests/write/updateMany.yml +83 -0
- data/spec/support/crud_tests/write/updateOne.yml +80 -0
- data/spec/support/helpers.rb +140 -0
- data/spec/support/matchers.rb +37 -0
- data/spec/support/sdam/rs/discover_arbiters.yml +41 -0
- data/spec/support/sdam/rs/discover_passives.yml +41 -0
- data/spec/support/sdam/rs/discover_primary.yml +40 -0
- data/spec/support/sdam/rs/discover_secondary.yml +41 -0
- data/spec/support/sdam/rs/discovery.yml +195 -0
- data/spec/support/sdam/rs/ghost_discovered.yml +39 -0
- data/spec/support/sdam/rs/hosts_differ_from_seeds.yml +34 -0
- data/spec/support/sdam/rs/member_reconfig.yml +68 -0
- data/spec/support/sdam/rs/member_standalone.yml +60 -0
- data/spec/support/sdam/rs/new_primary.yml +74 -0
- data/spec/support/sdam/rs/new_primary_wrong_set_name.yml +71 -0
- data/spec/support/sdam/rs/non_rs_member.yml +31 -0
- data/spec/support/sdam/rs/normalize_case.yml +49 -0
- data/spec/support/sdam/rs/primary_becomes_standalone.yml +52 -0
- data/spec/support/sdam/rs/primary_changes_set_name.yml +57 -0
- data/spec/support/sdam/rs/primary_disconnect.yml +56 -0
- data/spec/support/sdam/rs/primary_wrong_set_name.yml +27 -0
- data/spec/support/sdam/rs/response_from_removed.yml +63 -0
- data/spec/support/sdam/rs/rsother_discovered.yml +41 -0
- data/spec/support/sdam/rs/sec_not_auth.yml +49 -0
- data/spec/support/sdam/rs/secondary_wrong_set_name.yml +28 -0
- data/spec/support/sdam/rs/secondary_wrong_set_name_with_primary.yml +69 -0
- data/spec/support/sdam/rs/unexpected_mongos.yml +26 -0
- data/spec/support/sdam/rs/wrong_set_name.yml +35 -0
- data/spec/support/sdam/sharded/multiple_mongoses.yml +46 -0
- data/spec/support/sdam/sharded/non_mongos_removed.yml +41 -0
- data/spec/support/sdam/sharded/normalize_uri_case.yml +32 -0
- data/spec/support/sdam/single/direct_connection_external_ip.yml +34 -0
- data/spec/support/sdam/single/direct_connection_mongos.yml +33 -0
- data/spec/support/sdam/single/direct_connection_rsarbiter.yml +35 -0
- data/spec/support/sdam/single/direct_connection_rsprimary.yml +34 -0
- data/spec/support/sdam/single/direct_connection_rssecondary.yml +35 -0
- data/spec/support/sdam/single/direct_connection_slave.yml +32 -0
- data/spec/support/sdam/single/direct_connection_standalone.yml +32 -0
- data/spec/support/sdam/single/not_ok_response.yml +39 -0
- data/spec/support/sdam/single/standalone_removed.yml +32 -0
- data/spec/support/sdam/single/unavailable_seed.yml +28 -0
- data/spec/support/server_discovery_and_monitoring.rb +167 -0
- data/spec/support/server_selection/rtt/first_value.yml +4 -0
- data/spec/support/server_selection/rtt/first_value_zero.yml +4 -0
- data/spec/support/server_selection/rtt/value_test_1.yml +4 -0
- data/spec/support/server_selection/rtt/value_test_2.yml +4 -0
- data/spec/support/server_selection/rtt/value_test_3.yml +4 -0
- data/spec/support/server_selection/rtt/value_test_4.yml +4 -0
- data/spec/support/server_selection/rtt/value_test_5.yml +4 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest.yml +26 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest_non_matching.yml +21 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Primary.yml +21 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred.yml +26 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred_non_matching.yml +21 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary.yml +26 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred.yml +26 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred_non_matching.yml +21 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary_non_matching.yml +21 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest.yml +33 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest_non_matching.yml +26 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Primary.yml +29 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred.yml +29 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred_non_matching.yml +29 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Secondary.yml +31 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/SecondaryPreferred.yml +31 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/SecondaryPreferred_non_matching.yml +29 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Secondary_non_matching.yml +26 -0
- data/spec/support/server_selection/selection/Sharded/read/SecondaryPreferred.yml +26 -0
- data/spec/support/server_selection/selection/Single/read/SecondaryPreferred.yml +19 -0
- data/spec/support/server_selection/selection/Unknown/read/SecondaryPreferred.yml +11 -0
- data/spec/support/server_selection.rb +157 -0
- data/spec/support/server_selection_rtt.rb +41 -0
- data/spec/support/shared/bulk_write.rb +535 -0
- data/spec/support/shared/cursor.rb +38 -0
- data/spec/support/shared/operation.rb +77 -0
- data/spec/support/shared/protocol.rb +31 -0
- data/spec/support/shared/server_selector.rb +111 -0
- data/spec/support/shared/socket.rb +82 -0
- data/spec/support/travis.rb +14 -0
- data.tar.gz.sig +2 -3
- metadata +583 -186
- metadata.gz.sig +0 -0
- data/VERSION +0 -1
- data/lib/mongo/bulk_write_collection_view.rb +0 -387
- data/lib/mongo/collection_writer.rb +0 -364
- data/lib/mongo/connection/node.rb +0 -249
- data/lib/mongo/connection/pool.rb +0 -340
- data/lib/mongo/connection/pool_manager.rb +0 -320
- data/lib/mongo/connection/sharding_pool_manager.rb +0 -67
- data/lib/mongo/connection/socket/ssl_socket.rb +0 -95
- data/lib/mongo/connection/socket/tcp_socket.rb +0 -87
- data/lib/mongo/connection/socket/unix_socket.rb +0 -39
- data/lib/mongo/db.rb +0 -808
- data/lib/mongo/exception.rb +0 -145
- data/lib/mongo/functional/authentication.rb +0 -455
- data/lib/mongo/functional/logging.rb +0 -85
- data/lib/mongo/functional/read_preference.rb +0 -183
- data/lib/mongo/functional/scram.rb +0 -556
- data/lib/mongo/functional/uri_parser.rb +0 -409
- data/lib/mongo/functional/write_concern.rb +0 -66
- data/lib/mongo/gridfs/grid.rb +0 -112
- data/lib/mongo/gridfs/grid_ext.rb +0 -53
- data/lib/mongo/gridfs/grid_file_system.rb +0 -163
- data/lib/mongo/gridfs/grid_io.rb +0 -484
- data/lib/mongo/legacy.rb +0 -140
- data/lib/mongo/mongo_client.rb +0 -697
- data/lib/mongo/mongo_replica_set_client.rb +0 -535
- data/lib/mongo/mongo_sharded_client.rb +0 -159
- data/lib/mongo/networking.rb +0 -372
- data/lib/mongo/utils/conversions.rb +0 -110
- data/lib/mongo/utils/core_ext.rb +0 -70
- data/lib/mongo/utils/server_version.rb +0 -69
- data/lib/mongo/utils/support.rb +0 -80
- data/test/functional/authentication_test.rb +0 -39
- data/test/functional/bulk_api_stress_test.rb +0 -133
- data/test/functional/bulk_write_collection_view_test.rb +0 -1198
- data/test/functional/client_test.rb +0 -627
- data/test/functional/collection_test.rb +0 -2175
- data/test/functional/collection_writer_test.rb +0 -83
- data/test/functional/conversions_test.rb +0 -163
- data/test/functional/cursor_fail_test.rb +0 -57
- data/test/functional/cursor_message_test.rb +0 -56
- data/test/functional/cursor_test.rb +0 -683
- data/test/functional/db_api_test.rb +0 -835
- data/test/functional/db_test.rb +0 -348
- data/test/functional/grid_file_system_test.rb +0 -285
- data/test/functional/grid_io_test.rb +0 -252
- data/test/functional/grid_test.rb +0 -273
- data/test/functional/pool_test.rb +0 -136
- data/test/functional/safe_test.rb +0 -98
- data/test/functional/support_test.rb +0 -62
- data/test/functional/timeout_test.rb +0 -60
- data/test/functional/uri_test.rb +0 -446
- data/test/functional/write_concern_test.rb +0 -118
- data/test/helpers/general.rb +0 -50
- data/test/helpers/test_unit.rb +0 -476
- data/test/replica_set/authentication_test.rb +0 -37
- data/test/replica_set/basic_test.rb +0 -189
- data/test/replica_set/client_test.rb +0 -393
- data/test/replica_set/connection_test.rb +0 -138
- data/test/replica_set/count_test.rb +0 -66
- data/test/replica_set/cursor_test.rb +0 -220
- data/test/replica_set/insert_test.rb +0 -157
- data/test/replica_set/max_values_test.rb +0 -151
- data/test/replica_set/pinning_test.rb +0 -105
- data/test/replica_set/query_test.rb +0 -73
- data/test/replica_set/read_preference_test.rb +0 -219
- data/test/replica_set/refresh_test.rb +0 -211
- data/test/replica_set/replication_ack_test.rb +0 -95
- data/test/sharded_cluster/basic_test.rb +0 -203
- data/test/shared/authentication/basic_auth_shared.rb +0 -260
- data/test/shared/authentication/bulk_api_auth_shared.rb +0 -249
- data/test/shared/authentication/gssapi_shared.rb +0 -176
- data/test/shared/authentication/sasl_plain_shared.rb +0 -96
- data/test/shared/authentication/scram_shared.rb +0 -92
- data/test/shared/ssl_shared.rb +0 -235
- data/test/test_helper.rb +0 -61
- data/test/threading/basic_test.rb +0 -120
- data/test/tools/mongo_config.rb +0 -708
- data/test/tools/mongo_config_test.rb +0 -160
- data/test/unit/client_test.rb +0 -381
- data/test/unit/collection_test.rb +0 -166
- data/test/unit/connection_test.rb +0 -335
- data/test/unit/cursor_test.rb +0 -307
- data/test/unit/db_test.rb +0 -136
- data/test/unit/grid_test.rb +0 -76
- data/test/unit/mongo_sharded_client_test.rb +0 -48
- data/test/unit/node_test.rb +0 -93
- data/test/unit/pool_manager_test.rb +0 -111
- data/test/unit/read_pref_test.rb +0 -406
- data/test/unit/read_test.rb +0 -159
- data/test/unit/safe_test.rb +0 -158
- data/test/unit/sharding_pool_manager_test.rb +0 -84
- data/test/unit/write_concern_test.rb +0 -175
@@ -0,0 +1,147 @@
|
|
1
|
+
# Copyright (C) 2014-2015 MongoDB, Inc.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
module Mongo
|
16
|
+
module Protocol
|
17
|
+
|
18
|
+
# MongoDB Wire protocol Query message.
|
19
|
+
#
|
20
|
+
# This is a client request message that is sent to the server in order
|
21
|
+
# to retrieve documents matching provided query.
|
22
|
+
#
|
23
|
+
# Users may also provide additional options such as a projection, to
|
24
|
+
# select a subset of the fields, a number to skip or a limit on the
|
25
|
+
# number of returned documents.
|
26
|
+
#
|
27
|
+
# There are a variety of flags that can be used to adjust cursor
|
28
|
+
# parameters or the desired consistancy and integrity the results.
|
29
|
+
#
|
30
|
+
# @api semipublic
|
31
|
+
class Query < Message
|
32
|
+
|
33
|
+
# Creates a new Query message
|
34
|
+
#
|
35
|
+
# @example Find all users named Tyler.
|
36
|
+
# Query.new('xgen', 'users', {:name => 'Tyler'})
|
37
|
+
#
|
38
|
+
# @example Find all users named Tyler skipping 5 and returning 10.
|
39
|
+
# Query.new('xgen', 'users', {:name => 'Tyler'}, :skip => 5,
|
40
|
+
# :limit => 10)
|
41
|
+
#
|
42
|
+
# @example Find all users with slave ok bit set
|
43
|
+
# Query.new('xgen', 'users', {:name => 'Tyler'}, :flags => [:slave_ok])
|
44
|
+
#
|
45
|
+
# @example Find all user ids.
|
46
|
+
# Query.new('xgen', 'users', {}, :fields => {:id => 1})
|
47
|
+
#
|
48
|
+
# @param database [String, Symbol] The database to query.
|
49
|
+
# @param collection [String, Symbol] The collection to query.
|
50
|
+
# @param selector [Hash] The query selector.
|
51
|
+
# @param options [Hash] The additional query options.
|
52
|
+
#
|
53
|
+
# @option options :project [Hash] The projection.
|
54
|
+
# @option options :skip [Integer] The number of documents to skip.
|
55
|
+
# @option options :limit [Integer] The number of documents to return.
|
56
|
+
# @option options :flags [Array] The flags for the query message.
|
57
|
+
#
|
58
|
+
# Supported flags: +:tailable_cursor+, +:slave_ok+, +:oplog_replay+,
|
59
|
+
# +:no_cursor_timeout+, +:await_data+, +:exhaust+, +:partial+
|
60
|
+
def initialize(database, collection, selector, options = {})
|
61
|
+
@namespace = "#{database}.#{collection}"
|
62
|
+
@selector = selector
|
63
|
+
@project = options[:project]
|
64
|
+
@skip = options[:skip] || 0
|
65
|
+
@limit = options[:limit] || 0
|
66
|
+
@flags = options[:flags] || []
|
67
|
+
end
|
68
|
+
|
69
|
+
# The log message for a query operation.
|
70
|
+
#
|
71
|
+
# @example Get the log message.
|
72
|
+
# query.log_message
|
73
|
+
#
|
74
|
+
# @return [ String ] The log message
|
75
|
+
#
|
76
|
+
# @since 2.0.0
|
77
|
+
def log_message
|
78
|
+
fields = []
|
79
|
+
fields << ["%s |", "QUERY"]
|
80
|
+
fields << ["namespace=%s", namespace]
|
81
|
+
fields << ["selector=%s", selector.inspect]
|
82
|
+
fields << ["flags=%s", flags.inspect]
|
83
|
+
fields << ["limit=%s", limit.inspect]
|
84
|
+
fields << ["skip=%s", skip.inspect]
|
85
|
+
fields << ["project=%s", project.inspect]
|
86
|
+
f, v = fields.transpose
|
87
|
+
f.join(" ") % v
|
88
|
+
end
|
89
|
+
|
90
|
+
# Query messages require replies from the database.
|
91
|
+
#
|
92
|
+
# @example Does the message require a reply?
|
93
|
+
# message.replyable?
|
94
|
+
#
|
95
|
+
# @return [ true ] Always true for queries.
|
96
|
+
#
|
97
|
+
# @since 2.0.0
|
98
|
+
def replyable?
|
99
|
+
true
|
100
|
+
end
|
101
|
+
|
102
|
+
private
|
103
|
+
|
104
|
+
# The operation code required to specify a Query message.
|
105
|
+
# @return [Fixnum] the operation code.
|
106
|
+
def op_code
|
107
|
+
2004
|
108
|
+
end
|
109
|
+
|
110
|
+
# Available flags for a Query message.
|
111
|
+
FLAGS = [
|
112
|
+
:reserved,
|
113
|
+
:tailable_cursor,
|
114
|
+
:slave_ok,
|
115
|
+
:oplog_replay,
|
116
|
+
:no_cursor_timeout,
|
117
|
+
:await_data,
|
118
|
+
:exhaust,
|
119
|
+
:partial
|
120
|
+
]
|
121
|
+
|
122
|
+
# @!attribute
|
123
|
+
# @return [Array<Symbol>] The flags for this query message.
|
124
|
+
field :flags, BitVector.new(FLAGS)
|
125
|
+
|
126
|
+
# @!attribute
|
127
|
+
# @return [String] The namespace for this query message.
|
128
|
+
field :namespace, CString
|
129
|
+
|
130
|
+
# @!attribute
|
131
|
+
# @return [Integer] The number of documents to skip.
|
132
|
+
field :skip, Int32
|
133
|
+
|
134
|
+
# @!attribute
|
135
|
+
# @return [Integer] The number of documents to return.
|
136
|
+
field :limit, Int32
|
137
|
+
|
138
|
+
# @!attribute
|
139
|
+
# @return [Hash] The query selector.
|
140
|
+
field :selector, Document
|
141
|
+
|
142
|
+
# @!attribute
|
143
|
+
# @return [Hash] The projection.
|
144
|
+
field :project, Document
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
# Copyright (C) 2014-2015 MongoDB, Inc.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
module Mongo
|
16
|
+
module Protocol
|
17
|
+
|
18
|
+
# The MongoDB wire protocol message representing a reply
|
19
|
+
#
|
20
|
+
# @example
|
21
|
+
# socket = TCPSocket.new('localhost', 27017)
|
22
|
+
# query = Protocol::Query.new('xgen', 'users', {:name => 'Tyler'})
|
23
|
+
# socket.write(query)
|
24
|
+
# reply = Protocol::Reply::deserialize(socket)
|
25
|
+
#
|
26
|
+
# @api semipublic
|
27
|
+
class Reply < Message
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
# The operation code required to specify a Reply message.
|
32
|
+
# @return [Fixnum] the operation code.
|
33
|
+
def op_code
|
34
|
+
1
|
35
|
+
end
|
36
|
+
|
37
|
+
# Available flags for a Reply message.
|
38
|
+
FLAGS = [
|
39
|
+
:cursor_not_found,
|
40
|
+
:query_failure,
|
41
|
+
:shard_config_stale,
|
42
|
+
:await_capable
|
43
|
+
]
|
44
|
+
|
45
|
+
public
|
46
|
+
|
47
|
+
# @!attribute
|
48
|
+
# @return [Array<Symbol>] The flags for this reply.
|
49
|
+
#
|
50
|
+
# Supported flags: +:cursor_not_found+, +:query_failure+,
|
51
|
+
# +:shard_config_stale+, +:await_capable+
|
52
|
+
field :flags, BitVector.new(FLAGS)
|
53
|
+
|
54
|
+
# @!attribute
|
55
|
+
# @return [Fixnum] The cursor id for this response. Will be zero
|
56
|
+
# if there are no additional results.
|
57
|
+
field :cursor_id, Int64
|
58
|
+
|
59
|
+
# @!attribute
|
60
|
+
# @return [Fixnum] The starting position of the cursor for this Reply.
|
61
|
+
field :starting_from, Int32
|
62
|
+
|
63
|
+
# @!attribute
|
64
|
+
# @return [Fixnum] Number of documents in this Reply.
|
65
|
+
field :number_returned, Int32
|
66
|
+
|
67
|
+
# @!attribute
|
68
|
+
# @return [Array<Hash>] The documents in this Reply.
|
69
|
+
field :documents, Document, :@number_returned
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,180 @@
|
|
1
|
+
# Copyright (C) 2014-2015 MongoDB, Inc.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
module Mongo
|
16
|
+
module Protocol
|
17
|
+
|
18
|
+
# Container for various serialization strategies
|
19
|
+
#
|
20
|
+
# Each strategy must have a serialization method named +serailize+
|
21
|
+
# and a deserialization method named +deserialize+
|
22
|
+
#
|
23
|
+
# Serialize methods must take buffer and value arguements and
|
24
|
+
# serialize the value into the buffer
|
25
|
+
#
|
26
|
+
# Deserialize methods must take an IO stream argument and
|
27
|
+
# deserialize the value from the stream of bytes
|
28
|
+
#
|
29
|
+
# @api private
|
30
|
+
module Serializers
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
ZERO = 0.freeze
|
35
|
+
NULL = 0.chr.freeze
|
36
|
+
INT32_PACK = 'l<'.freeze
|
37
|
+
INT64_PACK = 'q<'.freeze
|
38
|
+
HEADER_PACK = 'l<l<l<l<'.freeze
|
39
|
+
|
40
|
+
# MongoDB wire protocol serialization strategy for message headers.
|
41
|
+
#
|
42
|
+
# Serializes and de-serializes four 32-bit integers consisting
|
43
|
+
# of the length of the message, the request id, the response id,
|
44
|
+
# and the op code for the operation.
|
45
|
+
module Header
|
46
|
+
|
47
|
+
# Serializes the header value into the buffer
|
48
|
+
#
|
49
|
+
# @param buffer [String] Buffer to receive the serialized value.
|
50
|
+
# @param value [String] Header value to be serialized.
|
51
|
+
# @return [String] Buffer with serialized value.
|
52
|
+
def self.serialize(buffer, value)
|
53
|
+
buffer << value.pack(HEADER_PACK)
|
54
|
+
end
|
55
|
+
|
56
|
+
# Deserializes the header value from the IO stream
|
57
|
+
#
|
58
|
+
# @param io [IO] IO stream containing the message header.
|
59
|
+
# @return [Array<Fixnum>] Array consisting of the deserialized
|
60
|
+
# length, request id, response id, and op code.
|
61
|
+
def self.deserialize(io)
|
62
|
+
io.read(16).unpack(HEADER_PACK)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
# MongoDB wire protocol serialization strategy for C style strings.
|
67
|
+
#
|
68
|
+
# Serializes and de-serializes C style strings (null terminated).
|
69
|
+
module CString
|
70
|
+
|
71
|
+
# Serializes a C style string into the buffer
|
72
|
+
#
|
73
|
+
# @param buffer [String] Buffer to receive the serialized CString.
|
74
|
+
# @param value [String] The string to be serialized.
|
75
|
+
# @return [String] Buffer with serialized value.
|
76
|
+
def self.serialize(buffer, value)
|
77
|
+
buffer << value
|
78
|
+
buffer << NULL
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
# MongoDB wire protocol serialization strategy for 32-bit Zero.
|
83
|
+
#
|
84
|
+
# Serializes and de-serializes one 32-bit Zero.
|
85
|
+
module Zero
|
86
|
+
|
87
|
+
# Serializes a 32-bit Zero into the buffer
|
88
|
+
#
|
89
|
+
# @param buffer [String] Buffer to receive the serialized Zero.
|
90
|
+
# @param value [Fixnum] Ignored value.
|
91
|
+
# @return [String] Buffer with serialized value.
|
92
|
+
def self.serialize(buffer, value)
|
93
|
+
buffer << [ZERO].pack(INT32_PACK)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
# MongoDB wire protocol serialization strategy for 32-bit integers.
|
98
|
+
#
|
99
|
+
# Serializes and de-serializes one 32-bit integer.
|
100
|
+
module Int32
|
101
|
+
|
102
|
+
# Serializes a fixnum to a 4-byte 32-bit integer
|
103
|
+
#
|
104
|
+
# @param buffer [String] Buffer to receive the serialized Int32.
|
105
|
+
# @param value [Fixnum] 32-bit integer to be serialized.
|
106
|
+
# @return [String] Buffer with serialized value.
|
107
|
+
def self.serialize(buffer, value)
|
108
|
+
buffer << [value].pack(INT32_PACK)
|
109
|
+
end
|
110
|
+
|
111
|
+
# Deserializes a 32-bit Fixnum from the IO stream
|
112
|
+
#
|
113
|
+
# @param io [IO] IO stream containing the 32-bit integer
|
114
|
+
# @return [Fixnum] Deserialized Int32
|
115
|
+
def self.deserialize(io)
|
116
|
+
io.read(4).unpack(INT32_PACK).first
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
# MongoDB wire protocol serialization strategy for 64-bit integers.
|
121
|
+
#
|
122
|
+
# Serializes and de-serializes one 64-bit integer.
|
123
|
+
module Int64
|
124
|
+
|
125
|
+
# Serializes a fixnum to an 8-byte 64-bit integer
|
126
|
+
#
|
127
|
+
# @param buffer [String] Buffer to receive the serialized Int64.
|
128
|
+
# @param value [Fixnum] 64-bit integer to be serialized.
|
129
|
+
# @return [String] Buffer with serialized value.
|
130
|
+
def self.serialize(buffer, value)
|
131
|
+
buffer << [value].pack(INT64_PACK)
|
132
|
+
end
|
133
|
+
|
134
|
+
# Deserializes a 64-bit Fixnum from the IO stream
|
135
|
+
#
|
136
|
+
# @param io [IO] IO stream containing the 64-bit integer.
|
137
|
+
# @return [Fixnum] Deserialized Int64.
|
138
|
+
def self.deserialize(io)
|
139
|
+
io.read(8).unpack(INT64_PACK).first
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
# MongoDB wire protocol serialization strategy for a BSON Document.
|
144
|
+
#
|
145
|
+
# Serializes and de-serializes a single document.
|
146
|
+
module Document
|
147
|
+
|
148
|
+
# Serializes a document into the buffer
|
149
|
+
#
|
150
|
+
# @param buffer [String] Buffer to receive the BSON encoded document.
|
151
|
+
# @param value [Hash] Document to serialize as BSON.
|
152
|
+
# @return [String] Buffer with serialized value.
|
153
|
+
def self.serialize(buffer, value, max_bson_size = nil)
|
154
|
+
start_size = buffer.size
|
155
|
+
value.to_bson(buffer)
|
156
|
+
if max_bson_size && buffer.size - start_size > max_bson_size
|
157
|
+
raise Error::MaxBSONSize.new(max_bson_size)
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
# Deserializes a document from the IO stream
|
162
|
+
#
|
163
|
+
# @param io [IO] IO stream containing the BSON encoded document.
|
164
|
+
# @return [Hash] The decoded BSON document.
|
165
|
+
def self.deserialize(io)
|
166
|
+
BSON::Document.from_bson(io)
|
167
|
+
end
|
168
|
+
|
169
|
+
# Whether there can be a size limit on this type after serialization.
|
170
|
+
#
|
171
|
+
# @return [ true ] Documents can be size limited upon serialization.
|
172
|
+
#
|
173
|
+
# @since 2.0.0
|
174
|
+
def self.size_limited?
|
175
|
+
true
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
# Copyright (C) 2014-2015 MongoDB, Inc.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
module Mongo
|
16
|
+
module Protocol
|
17
|
+
|
18
|
+
# MongoDB Wire protocol Update message.
|
19
|
+
#
|
20
|
+
# This is a client request message that is sent to the server in order
|
21
|
+
# to update documents matching the provided query.
|
22
|
+
#
|
23
|
+
# The default is to update a single document. In order to update many at
|
24
|
+
# a time users should set the +:multi_update+ flag for the update.
|
25
|
+
#
|
26
|
+
# If an upsert (update or insert) is desired, users can set the +:upsert+
|
27
|
+
# flag in order to indicate they would like to insert the merged selector
|
28
|
+
# and update if no document matching the update query currently exists.
|
29
|
+
#
|
30
|
+
# @api semipublic
|
31
|
+
class Update < Message
|
32
|
+
|
33
|
+
# Creates a new Update message
|
34
|
+
#
|
35
|
+
# @example Update single document
|
36
|
+
# Update.new('xgen', 'users', {:name => 'Tyler'}, {:name => 'Bob'})
|
37
|
+
#
|
38
|
+
# @example Perform a multi update
|
39
|
+
# Update.new('xgen', 'users',
|
40
|
+
# {:age => 20}, {:age => 21}, :flags => [:multi_update])
|
41
|
+
#
|
42
|
+
# @example Perform an upsert
|
43
|
+
# Update.new('xgen', 'users', {:name => 'Tyler'}, :flags => [:upsert])
|
44
|
+
#
|
45
|
+
# @param database [String, Symbol] The database to update.
|
46
|
+
# @param collection [String, Symbol] The collection to update.
|
47
|
+
# @param selector [Hash] The update selector.
|
48
|
+
# @param update [Hash] The update to perform.
|
49
|
+
# @param options [Hash] The additional query options.
|
50
|
+
#
|
51
|
+
# @option options :flags [Array] The flags for the update message.
|
52
|
+
#
|
53
|
+
# Supported flags: +:upsert+, +:multi_update+
|
54
|
+
def initialize(database, collection, selector, update, options = {})
|
55
|
+
@namespace = "#{database}.#{collection}"
|
56
|
+
@selector = selector
|
57
|
+
@update = update
|
58
|
+
@flags = options[:flags] || []
|
59
|
+
end
|
60
|
+
|
61
|
+
# The log message for an update operation.
|
62
|
+
#
|
63
|
+
# @example Get the log message.
|
64
|
+
# update.log_message
|
65
|
+
#
|
66
|
+
# @return [ String ] The log message
|
67
|
+
#
|
68
|
+
# @since 2.0.0
|
69
|
+
def log_message
|
70
|
+
fields = []
|
71
|
+
fields << ["%s |", "UPDATE"]
|
72
|
+
fields << ["namespace=%s", namespace]
|
73
|
+
fields << ["selector=%s", selector.inspect]
|
74
|
+
fields << ["udpdate=%s", update.inspect]
|
75
|
+
fields << ["flags=%s", flags.inspect]
|
76
|
+
f, v = fields.transpose
|
77
|
+
f.join(" ") % v
|
78
|
+
end
|
79
|
+
|
80
|
+
private
|
81
|
+
|
82
|
+
# The operation code required to specify an Update message.
|
83
|
+
# @return [Fixnum] the operation code.
|
84
|
+
def op_code
|
85
|
+
2001
|
86
|
+
end
|
87
|
+
|
88
|
+
# Available flags for an Update message.
|
89
|
+
FLAGS = [:upsert, :multi_update]
|
90
|
+
|
91
|
+
# Field representing Zero encoded as an Int32.
|
92
|
+
field :zero, Zero
|
93
|
+
|
94
|
+
# @!attribute
|
95
|
+
# @return [String] The namespace for this Update message.
|
96
|
+
field :namespace, CString
|
97
|
+
|
98
|
+
# @!attribute
|
99
|
+
# @return [Array<Symbol>] The flags for this Update message.
|
100
|
+
field :flags, BitVector.new(FLAGS)
|
101
|
+
|
102
|
+
# @!attribute
|
103
|
+
# @return [Hash] The selector for this Update message.
|
104
|
+
field :selector, Document
|
105
|
+
|
106
|
+
# @!attribute
|
107
|
+
# @return [Hash] The update for this Delete message.
|
108
|
+
field :update, Document
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# Wire Protocol Base
|
2
|
+
require 'mongo/protocol/serializers'
|
3
|
+
require 'mongo/protocol/bit_vector'
|
4
|
+
require 'mongo/protocol/message'
|
5
|
+
|
6
|
+
# Client Requests
|
7
|
+
require 'mongo/protocol/delete'
|
8
|
+
require 'mongo/protocol/get_more'
|
9
|
+
require 'mongo/protocol/insert'
|
10
|
+
require 'mongo/protocol/kill_cursors'
|
11
|
+
require 'mongo/protocol/query'
|
12
|
+
require 'mongo/protocol/update'
|
13
|
+
|
14
|
+
# Server Responses
|
15
|
+
require 'mongo/protocol/reply'
|
@@ -0,0 +1,110 @@
|
|
1
|
+
# Copyright (C) 2015 MongoDB, Inc.
|
2
|
+
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
module Mongo
|
16
|
+
class Server
|
17
|
+
|
18
|
+
# This provides common behaviour for connection objects.
|
19
|
+
#
|
20
|
+
# @since 2.0.0
|
21
|
+
module Connectable
|
22
|
+
include Loggable
|
23
|
+
|
24
|
+
# The default time in seconds to timeout a connection attempt.
|
25
|
+
#
|
26
|
+
# @since 2.0.0
|
27
|
+
TIMEOUT = 5.freeze
|
28
|
+
|
29
|
+
# @return [ Mongo::Address ] address The address to connect to.
|
30
|
+
attr_reader :address
|
31
|
+
|
32
|
+
# @return [ Hash ] options The passed in options.
|
33
|
+
attr_reader :options
|
34
|
+
|
35
|
+
# @return [ Integer ] pid The process id when the connection was created.
|
36
|
+
attr_reader :pid
|
37
|
+
|
38
|
+
# Determine if the connection is currently connected.
|
39
|
+
#
|
40
|
+
# @example Is the connection connected?
|
41
|
+
# connection.connected?
|
42
|
+
#
|
43
|
+
# @return [ true, false ] If connected.
|
44
|
+
#
|
45
|
+
# @since 2.0.0
|
46
|
+
def connected?
|
47
|
+
!!@socket && @socket.alive?
|
48
|
+
end
|
49
|
+
|
50
|
+
# Dispatch the provided messages to the connection. If the last message
|
51
|
+
# requires a response a reply will be returned.
|
52
|
+
#
|
53
|
+
# @example Dispatch the messages.
|
54
|
+
# connection.dispatch([ insert, command ])
|
55
|
+
#
|
56
|
+
# @note This method is named dispatch since 'send' is a core Ruby method on
|
57
|
+
# all objects.
|
58
|
+
#
|
59
|
+
# @param [ Array<Message> ] messages The messages to dispatch.
|
60
|
+
#
|
61
|
+
# @return [ Protocol::Reply ] The reply if needed.
|
62
|
+
#
|
63
|
+
# @since 2.0.0
|
64
|
+
def dispatch(messages)
|
65
|
+
log_debug(messages) do |msgs|
|
66
|
+
write(msgs)
|
67
|
+
msgs.last.replyable? ? read : nil
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
# Get the connection timeout.
|
72
|
+
#
|
73
|
+
# @example Get the connection timeout.
|
74
|
+
# connection.timeout
|
75
|
+
#
|
76
|
+
# @return [ Float ] The connection timeout in seconds.
|
77
|
+
#
|
78
|
+
# @since 2.0.0
|
79
|
+
def timeout
|
80
|
+
@timeout ||= options[:socket_timeout] || TIMEOUT
|
81
|
+
end
|
82
|
+
|
83
|
+
private
|
84
|
+
|
85
|
+
attr_reader :socket, :ssl_options
|
86
|
+
|
87
|
+
def ensure_connected
|
88
|
+
ensure_same_process!
|
89
|
+
connect! if socket.nil? || !socket.alive?
|
90
|
+
begin
|
91
|
+
yield socket
|
92
|
+
rescue Error::SocketError, Error::SocketTimeoutError => e
|
93
|
+
disconnect!
|
94
|
+
raise e
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def ensure_same_process!
|
99
|
+
if pid != Process.pid
|
100
|
+
disconnect!
|
101
|
+
@pid = Process.pid
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def read
|
106
|
+
ensure_connected{ |socket| Protocol::Reply.deserialize(socket) }
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|