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,53 @@
|
|
1
|
+
|
2
|
+
# Copyright (C) 2014-2015 MongoDB, Inc.
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
|
16
|
+
module Mongo
|
17
|
+
module Event
|
18
|
+
|
19
|
+
# This handles host added events for server descriptions.
|
20
|
+
#
|
21
|
+
# @since 2.0.0
|
22
|
+
class ServerAdded
|
23
|
+
|
24
|
+
# @return [ Mongo::Cluster ] cluster The event publisher.
|
25
|
+
attr_reader :cluster
|
26
|
+
|
27
|
+
# Initialize the new host added event handler.
|
28
|
+
#
|
29
|
+
# @example Create the new handler.
|
30
|
+
# ServerAdded.new(cluster)
|
31
|
+
#
|
32
|
+
# @param [ Mongo::Cluster ] cluster The cluster to publish from.
|
33
|
+
#
|
34
|
+
# @since 2.0.0
|
35
|
+
def initialize(cluster)
|
36
|
+
@cluster = cluster
|
37
|
+
end
|
38
|
+
|
39
|
+
# This event publishes an event to add the cluster and logs the
|
40
|
+
# configuration change.
|
41
|
+
#
|
42
|
+
# @example Handle the event.
|
43
|
+
# server_added.handle('127.0.0.1:27018')
|
44
|
+
#
|
45
|
+
# @param [ Address ] address The added host.
|
46
|
+
#
|
47
|
+
# @since 2.0.0
|
48
|
+
def handle(address)
|
49
|
+
cluster.add(address)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,53 @@
|
|
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 Event
|
17
|
+
|
18
|
+
# This handles host removed events for server descriptions.
|
19
|
+
#
|
20
|
+
# @since 2.0.0
|
21
|
+
class ServerRemoved
|
22
|
+
include Loggable
|
23
|
+
|
24
|
+
# @return [ Mongo::Cluster ] cluster The event publisher.
|
25
|
+
attr_reader :cluster
|
26
|
+
|
27
|
+
# Initialize the new host removed event handler.
|
28
|
+
#
|
29
|
+
# @example Create the new handler.
|
30
|
+
# ServerRemoved.new(cluster)
|
31
|
+
#
|
32
|
+
# @param [ Mongo::Cluster ] cluster The cluster to publish from.
|
33
|
+
#
|
34
|
+
# @since 2.0.0
|
35
|
+
def initialize(cluster)
|
36
|
+
@cluster = cluster
|
37
|
+
end
|
38
|
+
|
39
|
+
# This event publishes an event to remove from the cluster and logs the
|
40
|
+
# configuration change.
|
41
|
+
#
|
42
|
+
# @example Handle the event.
|
43
|
+
# server_removed.handle('127.0.0.1:27018')
|
44
|
+
#
|
45
|
+
# @param [ Address ] address The removed host.
|
46
|
+
#
|
47
|
+
# @since 2.0.0
|
48
|
+
def handle(address)
|
49
|
+
cluster.remove(address)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,41 @@
|
|
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 Event
|
17
|
+
|
18
|
+
# Adds convenience methods for adding listeners to event publishers.
|
19
|
+
#
|
20
|
+
# @since 2.0.0
|
21
|
+
module Subscriber
|
22
|
+
|
23
|
+
# @return [ Event::Listeners ] event_listeners The listeners.
|
24
|
+
attr_reader :event_listeners
|
25
|
+
|
26
|
+
# Subscribe to the provided event.
|
27
|
+
#
|
28
|
+
# @example Subscribe to the event.
|
29
|
+
# subscriber.subscribe_to('test', listener)
|
30
|
+
#
|
31
|
+
# @param [ String ] event The event.
|
32
|
+
# @param [ Object ] listener The event listener.
|
33
|
+
#
|
34
|
+
# @since 2.0.0
|
35
|
+
def subscribe_to(event, listener)
|
36
|
+
event_listeners.add_listener(event, listener)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
data/lib/mongo/event.rb
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
# Copyright (C) 2014-2015 MongoDB, Inc.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the 'License');
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an 'AS IS' BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
require 'mongo/event/listeners'
|
16
|
+
require 'mongo/event/publisher'
|
17
|
+
require 'mongo/event/subscriber'
|
18
|
+
require 'mongo/event/primary_elected'
|
19
|
+
require 'mongo/event/server_added'
|
20
|
+
require 'mongo/event/server_removed'
|
21
|
+
|
22
|
+
module Mongo
|
23
|
+
module Event
|
24
|
+
|
25
|
+
# When a server is elected primary.
|
26
|
+
#
|
27
|
+
# @since 2.0.0
|
28
|
+
PRIMARY_ELECTED = 'primary_elected'.freeze
|
29
|
+
|
30
|
+
# When a server is to be added to a cluster.
|
31
|
+
#
|
32
|
+
# @since 2.0.0
|
33
|
+
SERVER_ADDED = 'server_added'.freeze
|
34
|
+
|
35
|
+
# When a server is to be removed from a cluster.
|
36
|
+
#
|
37
|
+
# @since 2.0.0
|
38
|
+
SERVER_REMOVED = 'server_removed'.freeze
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,184 @@
|
|
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 Grid
|
17
|
+
class File
|
18
|
+
|
19
|
+
# Encapsulates behaviour around GridFS chunks of file data.
|
20
|
+
#
|
21
|
+
# @since 2.0.0
|
22
|
+
class Chunk
|
23
|
+
|
24
|
+
# Name of the chunks collection.
|
25
|
+
#
|
26
|
+
# @since 2.0.0
|
27
|
+
COLLECTION = 'chunks'.freeze
|
28
|
+
|
29
|
+
# Default size for chunks of data.
|
30
|
+
#
|
31
|
+
# @since 2.0.0
|
32
|
+
DEFAULT_SIZE = (255 * 1024).freeze
|
33
|
+
|
34
|
+
# @return [ BSON::Document ] document The document to store for the
|
35
|
+
# chunk.
|
36
|
+
attr_reader :document
|
37
|
+
|
38
|
+
# Check chunk equality.
|
39
|
+
#
|
40
|
+
# @example Check chunk equality.
|
41
|
+
# chunk == other
|
42
|
+
#
|
43
|
+
# @param [ Object ] other The object ot compare to.
|
44
|
+
#
|
45
|
+
# @return [ true, false ] If the objects are equal.
|
46
|
+
#
|
47
|
+
# @since 2.0.0
|
48
|
+
def ==(other)
|
49
|
+
return false unless other.is_a?(Chunk)
|
50
|
+
document == other.document
|
51
|
+
end
|
52
|
+
|
53
|
+
# Get the BSON type for a chunk document.
|
54
|
+
#
|
55
|
+
# @example Get the BSON type.
|
56
|
+
# chunk.bson_type
|
57
|
+
#
|
58
|
+
# @return [ Integer ] The BSON type.
|
59
|
+
#
|
60
|
+
# @since 2.0.0
|
61
|
+
def bson_type
|
62
|
+
BSON::Hash::BSON_TYPE
|
63
|
+
end
|
64
|
+
|
65
|
+
# Get the chunk data.
|
66
|
+
#
|
67
|
+
# @example Get the chunk data.
|
68
|
+
# chunk.data
|
69
|
+
#
|
70
|
+
# @return [ BSON::Binary ] The chunk data.
|
71
|
+
#
|
72
|
+
# @since 2.0.0
|
73
|
+
def data
|
74
|
+
document[:data]
|
75
|
+
end
|
76
|
+
|
77
|
+
# Get the chunk id.
|
78
|
+
#
|
79
|
+
# @example Get the chunk id.
|
80
|
+
# chunk.id
|
81
|
+
#
|
82
|
+
# @return [ BSON::ObjectId ] The chunk id.
|
83
|
+
#
|
84
|
+
# @since 2.0.0
|
85
|
+
def id
|
86
|
+
document[:_id]
|
87
|
+
end
|
88
|
+
|
89
|
+
# Get the files id.
|
90
|
+
#
|
91
|
+
# @example Get the files id.
|
92
|
+
# chunk.files_id
|
93
|
+
#
|
94
|
+
# @return [ BSON::ObjectId ] The files id.
|
95
|
+
#
|
96
|
+
# @since 2.0.0
|
97
|
+
def files_id
|
98
|
+
document[:files_id]
|
99
|
+
end
|
100
|
+
|
101
|
+
# Get the chunk position.
|
102
|
+
#
|
103
|
+
# @example Get the chunk position.
|
104
|
+
# chunk.n
|
105
|
+
#
|
106
|
+
# @return [ Integer ] The chunk position.
|
107
|
+
#
|
108
|
+
# @since 2.0.0
|
109
|
+
def n
|
110
|
+
document[:n]
|
111
|
+
end
|
112
|
+
|
113
|
+
# Create the new chunk.
|
114
|
+
#
|
115
|
+
# @example Create the chunk.
|
116
|
+
# Chunk.new(document)
|
117
|
+
#
|
118
|
+
# @param [ BSON::Document ] document The document to create the chunk
|
119
|
+
# from.
|
120
|
+
#
|
121
|
+
# @since 2.0.0
|
122
|
+
def initialize(document)
|
123
|
+
@document = BSON::Document.new(:_id => BSON::ObjectId.new).merge(document)
|
124
|
+
end
|
125
|
+
|
126
|
+
# Conver the chunk to BSON for storage.
|
127
|
+
#
|
128
|
+
# @example Convert the chunk to BSON.
|
129
|
+
# chunk.to_bson
|
130
|
+
#
|
131
|
+
# @param [ String ] encoded The encoded data to append to.
|
132
|
+
#
|
133
|
+
# @return [ String ] The raw BSON data.
|
134
|
+
#
|
135
|
+
# @since 2.0.0
|
136
|
+
def to_bson(encoded = ''.force_encoding(BSON::BINARY))
|
137
|
+
document.to_bson(encoded)
|
138
|
+
end
|
139
|
+
|
140
|
+
class << self
|
141
|
+
|
142
|
+
# Takes an array of chunks and assembles them back into the full
|
143
|
+
# piece of raw data.
|
144
|
+
#
|
145
|
+
# @example Assemble the chunks.
|
146
|
+
# Chunk.assemble(chunks)
|
147
|
+
#
|
148
|
+
# @param [ Array<Chunk> ] chunks The chunks.
|
149
|
+
#
|
150
|
+
# @return [ String ] The assembled data.
|
151
|
+
#
|
152
|
+
# @since 2.0.0
|
153
|
+
def assemble(chunks)
|
154
|
+
chunks.reduce(''){ |data, chunk| data << chunk.data.data }
|
155
|
+
end
|
156
|
+
|
157
|
+
# Split the provided data into multiple chunks.
|
158
|
+
#
|
159
|
+
# @example Split the data into chunks.
|
160
|
+
# Chunks.split(data)
|
161
|
+
#
|
162
|
+
# @param [ String ] data The raw bytes.
|
163
|
+
# @param [ Metadata ] metadata The file metadata.
|
164
|
+
#
|
165
|
+
# @return [ Array<Chunk> ] The chunks of the data.
|
166
|
+
#
|
167
|
+
# @since 2.0.0
|
168
|
+
def split(data, metadata)
|
169
|
+
chunks, index, n = [], 0, 0
|
170
|
+
while index < data.length
|
171
|
+
bytes = data.slice(index, metadata.chunk_size)
|
172
|
+
metadata.md5.update(bytes)
|
173
|
+
chunk = Chunk.new(:data => BSON::Binary.new(bytes), :files_id => metadata.id, :n => n)
|
174
|
+
chunks.push(chunk)
|
175
|
+
index += bytes.length
|
176
|
+
n += 1
|
177
|
+
end
|
178
|
+
chunks
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|
@@ -0,0 +1,229 @@
|
|
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 Grid
|
17
|
+
class File
|
18
|
+
|
19
|
+
# Encapsulates behaviour around GridFS file metadata.
|
20
|
+
#
|
21
|
+
# @since 2.0.0
|
22
|
+
class Metadata
|
23
|
+
|
24
|
+
# Name of the files collection.
|
25
|
+
#
|
26
|
+
# @since 2.0.0
|
27
|
+
COLLECTION = 'files'.freeze
|
28
|
+
|
29
|
+
# Mappings of user supplied fields to db specification.
|
30
|
+
#
|
31
|
+
# @since 2.0.0
|
32
|
+
MAPPINGS = {
|
33
|
+
:chunk_size => :chunkSize,
|
34
|
+
:content_type => :contentType,
|
35
|
+
:filename => :filename,
|
36
|
+
:_id => :_id,
|
37
|
+
:md5 => :md5,
|
38
|
+
:metadata => :metadata,
|
39
|
+
:upload_date => :uploadDate
|
40
|
+
}.freeze
|
41
|
+
|
42
|
+
# Default content type for stored files.
|
43
|
+
#
|
44
|
+
# @since 2.0.0
|
45
|
+
DEFAULT_CONTENT_TYPE = 'binary/octet-stream'.freeze
|
46
|
+
|
47
|
+
# @return [ BSON::Document ] document The file metadata document.
|
48
|
+
attr_reader :document
|
49
|
+
|
50
|
+
# Is this metadata equal to another?
|
51
|
+
#
|
52
|
+
# @example Check metadata equality.
|
53
|
+
# metadata == other
|
54
|
+
#
|
55
|
+
# @param [ Object ] other The object to check against.
|
56
|
+
#
|
57
|
+
# @return [ true, false ] If the objects are equal.
|
58
|
+
#
|
59
|
+
# @since 2.0.0
|
60
|
+
def ==(other)
|
61
|
+
return false unless other.is_a?(Metadata)
|
62
|
+
document == other.document
|
63
|
+
end
|
64
|
+
|
65
|
+
# Get the BSON type for a metadata document.
|
66
|
+
#
|
67
|
+
# @example Get the BSON type.
|
68
|
+
# metadata.bson_type
|
69
|
+
#
|
70
|
+
# @return [ Integer ] The BSON type.
|
71
|
+
#
|
72
|
+
# @since 2.0.0
|
73
|
+
def bson_type
|
74
|
+
BSON::Hash::BSON_TYPE
|
75
|
+
end
|
76
|
+
|
77
|
+
# Get the metadata chunk size.
|
78
|
+
#
|
79
|
+
# @example Get the chunk size.
|
80
|
+
# metadata.chunk_size
|
81
|
+
#
|
82
|
+
# @return [ Integer ] The chunksize in bytes.
|
83
|
+
#
|
84
|
+
# @since 2.0.0
|
85
|
+
def chunk_size
|
86
|
+
document[:chunkSize]
|
87
|
+
end
|
88
|
+
|
89
|
+
# Get the metadata content type.
|
90
|
+
#
|
91
|
+
# @example Get the content type.
|
92
|
+
# metadata.content_type
|
93
|
+
#
|
94
|
+
# @return [ String ] The content type.
|
95
|
+
#
|
96
|
+
# @since 2.0.0
|
97
|
+
def content_type
|
98
|
+
document[:contentType]
|
99
|
+
end
|
100
|
+
|
101
|
+
# Get the metadata filename.
|
102
|
+
#
|
103
|
+
# @example Get the filename.
|
104
|
+
# metadata.filename
|
105
|
+
#
|
106
|
+
# @return [ String ] The filename.
|
107
|
+
def filename
|
108
|
+
document[:filename]
|
109
|
+
end
|
110
|
+
|
111
|
+
# Get the metadata id.
|
112
|
+
#
|
113
|
+
# @example Get the metadata id.
|
114
|
+
# metadata.id
|
115
|
+
#
|
116
|
+
# @return [ BSON::ObjectId ] The metadata id.
|
117
|
+
#
|
118
|
+
# @since 2.0.0
|
119
|
+
def id
|
120
|
+
document[:_id]
|
121
|
+
end
|
122
|
+
|
123
|
+
# Create the new metadata document.
|
124
|
+
#
|
125
|
+
# @example Create the new metadata document.
|
126
|
+
# Metadata.new(:filename => 'test.txt')
|
127
|
+
#
|
128
|
+
# @param [ BSON::Document ] document The document to create from.
|
129
|
+
#
|
130
|
+
# @since 2.0.0
|
131
|
+
def initialize(document)
|
132
|
+
@document = default_document.merge(Options::Mapper.transform(document, MAPPINGS))
|
133
|
+
@client_md5 = Digest::MD5.new
|
134
|
+
end
|
135
|
+
|
136
|
+
# Get a readable inspection for the object.
|
137
|
+
#
|
138
|
+
# @example Inspect the metadata.
|
139
|
+
# metadata.inspect
|
140
|
+
#
|
141
|
+
# @return [ String ] The nice inspection.
|
142
|
+
#
|
143
|
+
# @since 2.0.0
|
144
|
+
def inspect
|
145
|
+
"#<Mongo::Grid::File::Metadata:0x#{object_id} chunk_size=#{chunk_size} " +
|
146
|
+
"filename=#{filename} content_type=#{content_type} id=#{id} md5=#{md5}>"
|
147
|
+
end
|
148
|
+
|
149
|
+
# Get the length of the document in bytes.
|
150
|
+
#
|
151
|
+
# @example Get the length
|
152
|
+
# metadata.length
|
153
|
+
#
|
154
|
+
# @return [ Integer ] The length.
|
155
|
+
#
|
156
|
+
# @since 2.0.0
|
157
|
+
def length
|
158
|
+
document[:length]
|
159
|
+
end
|
160
|
+
alias :size :length
|
161
|
+
|
162
|
+
# Get the additional metadata.
|
163
|
+
#
|
164
|
+
# @example Get additional metadata.
|
165
|
+
# metadata.metadata
|
166
|
+
#
|
167
|
+
# @return [ String ] The additional metadata.
|
168
|
+
#
|
169
|
+
# @since 2.0.0
|
170
|
+
def metadata
|
171
|
+
document[:metadata]
|
172
|
+
end
|
173
|
+
|
174
|
+
# Get the md5 hash.
|
175
|
+
#
|
176
|
+
# @example Get the md5 hash.
|
177
|
+
# metadata.md5
|
178
|
+
#
|
179
|
+
# @return [ String ] The md5 hash as a string.
|
180
|
+
#
|
181
|
+
# @since 2.0.0
|
182
|
+
def md5
|
183
|
+
document[:md5] || @client_md5
|
184
|
+
end
|
185
|
+
|
186
|
+
# Conver the metadata to BSON for storage.
|
187
|
+
#
|
188
|
+
# @note If no md5 exists in the metadata (it was loaded from the server
|
189
|
+
# and is not a new file) then we digest the md5 and set it.
|
190
|
+
#
|
191
|
+
# @example Convert the metadata to BSON.
|
192
|
+
# metadata.to_bson
|
193
|
+
#
|
194
|
+
# @param [ String ] encoded The encoded data to append to.
|
195
|
+
#
|
196
|
+
# @return [ String ] The raw BSON data.
|
197
|
+
#
|
198
|
+
# @since 2.0.0
|
199
|
+
def to_bson(encoded = ''.force_encoding(BSON::BINARY))
|
200
|
+
document[:md5] ||= @client_md5.hexdigest
|
201
|
+
document.to_bson(encoded)
|
202
|
+
end
|
203
|
+
|
204
|
+
# Get the upload date.
|
205
|
+
#
|
206
|
+
# @example Get the upload date.
|
207
|
+
# metadata.upload_date
|
208
|
+
#
|
209
|
+
# @return [ Time ] The upload date.
|
210
|
+
#
|
211
|
+
# @since 2.0.0
|
212
|
+
def upload_date
|
213
|
+
document[:uploadDate]
|
214
|
+
end
|
215
|
+
|
216
|
+
private
|
217
|
+
|
218
|
+
def default_document
|
219
|
+
BSON::Document.new(
|
220
|
+
:_id => BSON::ObjectId.new,
|
221
|
+
:chunkSize => Chunk::DEFAULT_SIZE,
|
222
|
+
:uploadDate => Time.now.utc,
|
223
|
+
:contentType => DEFAULT_CONTENT_TYPE
|
224
|
+
)
|
225
|
+
end
|
226
|
+
end
|
227
|
+
end
|
228
|
+
end
|
229
|
+
end
|
@@ -0,0 +1,106 @@
|
|
1
|
+
# Copyright (C) 2014-2015 MongoDB, Inc.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
require 'mongo/grid/file/chunk'
|
16
|
+
require 'mongo/grid/file/metadata'
|
17
|
+
|
18
|
+
module Mongo
|
19
|
+
module Grid
|
20
|
+
|
21
|
+
# A representation of a file in the database.
|
22
|
+
#
|
23
|
+
# @since 2.0.0
|
24
|
+
class File
|
25
|
+
extend Forwardable
|
26
|
+
|
27
|
+
# Delegate to metadata for convenience.
|
28
|
+
def_delegators :metadata, :chunk_size, :content_type, :filename, :id, :md5, :upload_date
|
29
|
+
|
30
|
+
# @return [ Array<Chunk> ] chunks The file chunks.
|
31
|
+
attr_reader :chunks
|
32
|
+
|
33
|
+
# @return [ IO ] data The raw datafor the file.
|
34
|
+
attr_reader :data
|
35
|
+
|
36
|
+
# @return [ Metadata ] metadata The file metadata.
|
37
|
+
attr_reader :metadata
|
38
|
+
|
39
|
+
# Check equality of files.
|
40
|
+
#
|
41
|
+
# @example Check the equality of files.
|
42
|
+
# file == other
|
43
|
+
#
|
44
|
+
# @param [ Object ] other The object to check against.
|
45
|
+
#
|
46
|
+
# @return [ true, false ] If the objects are equal.
|
47
|
+
#
|
48
|
+
# @since 2.0.0
|
49
|
+
def ==(other)
|
50
|
+
return false unless other.is_a?(File)
|
51
|
+
chunks == other.chunks && data == other.data && metadata == other.metadata
|
52
|
+
end
|
53
|
+
|
54
|
+
# Initialize the file.
|
55
|
+
#
|
56
|
+
# @example Create the file.
|
57
|
+
# Grid::File.new(data, :filename => 'test.txt')
|
58
|
+
#
|
59
|
+
# @param [ IO, Array<BSON::Document> ] data The file or IO object or
|
60
|
+
# chunks.
|
61
|
+
# @param [ BSON::Document, Hash ] options The metadata options.
|
62
|
+
#
|
63
|
+
# @option options [ String ] :filename Required name of the file.
|
64
|
+
# @option options [ String ] :content_type The content type of the file.
|
65
|
+
# @option options [ String ] :metadata Optional file metadata.
|
66
|
+
# @option options [ Integer ] :chunk_size Override the default chunk
|
67
|
+
# size.
|
68
|
+
#
|
69
|
+
# @since 2.0.0
|
70
|
+
def initialize(data, options = {})
|
71
|
+
@metadata = Metadata.new({ :length => data.length }.merge(options))
|
72
|
+
initialize_chunks!(data)
|
73
|
+
end
|
74
|
+
|
75
|
+
# Gets a pretty inspection of the file.
|
76
|
+
#
|
77
|
+
# @example Get the file inspection.
|
78
|
+
# file.inspect
|
79
|
+
#
|
80
|
+
# @return [ String ] The file inspection.
|
81
|
+
#
|
82
|
+
# @since 2.0.0
|
83
|
+
def inspect
|
84
|
+
"#<Mongo::Grid::File:0x#{object_id} filename=#{filename}>"
|
85
|
+
end
|
86
|
+
|
87
|
+
private
|
88
|
+
|
89
|
+
# @note If we have provided an array of BSON::Documents to initialize
|
90
|
+
# with, we have an array of chunk documents and need to create the
|
91
|
+
# chunk objects and assemble the data. If we have an IO object, then
|
92
|
+
# it's the original file data and we must split it into chunks and set
|
93
|
+
# the original data itself.
|
94
|
+
def initialize_chunks!(value)
|
95
|
+
if value.is_a?(Array)
|
96
|
+
chks = value.map{ |doc| Chunk.new(doc) }
|
97
|
+
@chunks = chks
|
98
|
+
@data = Chunk.assemble(chks)
|
99
|
+
else
|
100
|
+
@chunks = Chunk.split(value, metadata)
|
101
|
+
@data = value
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|