mongo 1.12.5 → 2.0.0.beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/CONTRIBUTING.md +64 -0
- data/LICENSE +1 -1
- data/README.md +23 -125
- data/Rakefile +26 -21
- data/bin/mongo_console +6 -38
- data/lib/mongo.rb +23 -82
- data/lib/mongo/address.rb +111 -0
- data/lib/mongo/address/ipv4.rb +85 -0
- data/lib/mongo/address/ipv6.rb +85 -0
- data/lib/mongo/address/unix.rb +76 -0
- data/lib/mongo/auth.rb +108 -0
- data/lib/mongo/auth/cr.rb +44 -0
- data/lib/mongo/auth/cr/conversation.rb +119 -0
- data/lib/mongo/auth/executable.rb +52 -0
- data/lib/mongo/auth/ldap.rb +48 -0
- data/lib/mongo/auth/ldap/conversation.rb +92 -0
- data/lib/mongo/auth/roles.rb +104 -0
- data/lib/mongo/auth/scram.rb +53 -0
- data/lib/mongo/auth/scram/conversation.rb +450 -0
- data/lib/mongo/auth/user.rb +159 -0
- data/lib/mongo/auth/user/view.rb +102 -0
- data/lib/mongo/auth/x509.rb +48 -0
- data/lib/mongo/auth/x509/conversation.rb +92 -0
- data/lib/mongo/{gridfs.rb → bulk.rb} +2 -5
- data/lib/mongo/bulk/bulk_write.rb +307 -0
- data/lib/mongo/client.rb +233 -0
- data/lib/mongo/cluster.rb +203 -0
- data/lib/mongo/cluster/topology.rb +60 -0
- data/lib/mongo/cluster/topology/replica_set.rb +160 -0
- data/lib/mongo/cluster/topology/sharded.rb +132 -0
- data/lib/mongo/cluster/topology/standalone.rb +132 -0
- data/lib/mongo/cluster/topology/unknown.rb +155 -0
- data/lib/mongo/collection.rb +130 -1101
- data/lib/mongo/collection/view.rb +169 -0
- data/lib/mongo/collection/view/aggregation.rb +108 -0
- data/lib/mongo/collection/view/explainable.rb +49 -0
- data/lib/mongo/collection/view/immutable.rb +43 -0
- data/lib/mongo/collection/view/iterable.rb +48 -0
- data/lib/mongo/collection/view/map_reduce.rb +191 -0
- data/lib/mongo/collection/view/readable.rb +363 -0
- data/lib/mongo/collection/view/writable.rb +169 -0
- data/lib/mongo/cursor.rb +79 -680
- data/lib/mongo/database.rb +224 -0
- data/lib/mongo/database/view.rb +101 -0
- data/lib/mongo/error.rb +81 -0
- data/lib/mongo/error/bulk_write_failure.rb +41 -0
- data/lib/mongo/{utils/thread_local_variable_manager.rb → error/empty_batch.rb} +22 -8
- data/{test/functional/db_connection_test.rb → lib/mongo/error/invalid_bulk_operation.rb} +19 -8
- data/lib/mongo/error/invalid_collection_name.rb +39 -0
- data/lib/mongo/error/invalid_database_name.rb +39 -0
- data/{test/replica_set/ssl_test.rb → lib/mongo/error/invalid_document.rb} +21 -14
- data/lib/mongo/error/invalid_file.rb +38 -0
- data/lib/mongo/error/invalid_nonce.rb +46 -0
- data/lib/mongo/error/invalid_replacement_document.rb +39 -0
- data/lib/mongo/error/invalid_signature.rb +47 -0
- data/{test/functional/ssl_test.rb → lib/mongo/error/invalid_update_document.rb} +22 -12
- data/lib/mongo/error/max_bson_size.rb +40 -0
- data/lib/mongo/error/max_message_size.rb +42 -0
- data/lib/mongo/{utils.rb → error/need_primary_server.rb} +10 -6
- data/lib/mongo/{connection.rb → error/operation_failure.rb} +10 -6
- data/lib/mongo/error/parser.rb +77 -0
- data/lib/mongo/{connection/socket.rb → error/socket_error.rb} +10 -5
- data/lib/mongo/error/socket_timeout_error.rb +23 -0
- data/lib/mongo/error/unsupported_features.rb +43 -0
- data/lib/mongo/event.rb +40 -0
- data/lib/mongo/event/listeners.rb +63 -0
- data/lib/mongo/event/primary_elected.rb +53 -0
- data/lib/mongo/event/publisher.rb +42 -0
- data/lib/mongo/event/server_added.rb +53 -0
- data/lib/mongo/event/server_removed.rb +53 -0
- data/lib/mongo/event/subscriber.rb +41 -0
- data/lib/mongo/grid.rb +16 -0
- data/lib/mongo/grid/file.rb +94 -0
- data/lib/mongo/grid/file/chunk.rb +184 -0
- data/lib/mongo/grid/file/metadata.rb +223 -0
- data/lib/mongo/grid/fs.rb +149 -0
- data/lib/mongo/index.rb +64 -0
- data/lib/mongo/index/view.rb +205 -0
- data/lib/mongo/loggable.rb +126 -0
- data/lib/mongo/logger.rb +132 -0
- data/lib/mongo/operation.rb +26 -0
- data/lib/mongo/operation/aggregate.rb +100 -0
- data/lib/mongo/operation/aggregate/result.rb +84 -0
- data/lib/mongo/operation/batchable.rb +103 -0
- data/lib/mongo/operation/bulk_delete/result.rb +197 -0
- data/lib/mongo/operation/bulk_insert/result.rb +195 -0
- data/lib/mongo/operation/bulk_update/result.rb +295 -0
- data/lib/mongo/operation/command.rb +62 -0
- data/lib/mongo/operation/executable.rb +105 -0
- data/lib/mongo/operation/kill_cursors.rb +39 -0
- data/lib/mongo/operation/limited.rb +37 -0
- data/lib/mongo/operation/list_collections/result.rb +116 -0
- data/lib/mongo/operation/list_indexes/result.rb +118 -0
- data/lib/mongo/operation/map_reduce.rb +96 -0
- data/lib/mongo/operation/map_reduce/result.rb +122 -0
- data/lib/mongo/{functional.rb → operation/read.rb} +7 -7
- data/lib/mongo/operation/read/collections_info.rb +67 -0
- data/lib/mongo/operation/read/get_more.rb +71 -0
- data/lib/mongo/operation/read/indexes.rb +68 -0
- data/lib/mongo/operation/read/list_collections.rb +75 -0
- data/lib/mongo/operation/read/list_indexes.rb +77 -0
- data/lib/mongo/operation/read/query.rb +71 -0
- data/lib/mongo/operation/read_preferrable.rb +34 -0
- data/lib/mongo/operation/result.rb +259 -0
- data/lib/mongo/operation/specifiable.rb +380 -0
- data/lib/mongo/operation/write.rb +25 -0
- data/lib/mongo/operation/write/bulk_delete.rb +158 -0
- data/lib/mongo/operation/write/bulk_insert.rb +160 -0
- data/lib/mongo/operation/write/bulk_update.rb +167 -0
- data/lib/mongo/{connection/socket/socket_util.rb → operation/write/command.rb} +9 -24
- data/lib/mongo/operation/write/command/create_user.rb +43 -0
- data/lib/mongo/operation/write/command/delete.rb +56 -0
- data/lib/mongo/operation/write/command/drop_index.rb +51 -0
- data/lib/mongo/operation/write/command/ensure_index.rb +55 -0
- data/lib/mongo/operation/write/command/insert.rb +55 -0
- data/lib/mongo/operation/write/command/remove_user.rb +42 -0
- data/lib/mongo/operation/write/command/update.rb +60 -0
- data/lib/mongo/operation/write/command/writable.rb +61 -0
- data/lib/mongo/operation/write/create_index.rb +84 -0
- data/lib/mongo/operation/write/create_user.rb +75 -0
- data/lib/mongo/operation/write/delete.rb +91 -0
- data/lib/mongo/operation/write/drop_index.rb +62 -0
- data/lib/mongo/operation/write/insert.rb +88 -0
- data/lib/mongo/operation/write/remove_user.rb +70 -0
- data/lib/mongo/operation/write/update.rb +98 -0
- data/lib/mongo/protocol.rb +15 -0
- data/lib/mongo/protocol/bit_vector.rb +61 -0
- data/lib/mongo/protocol/delete.rb +94 -0
- data/lib/mongo/protocol/get_more.rb +99 -0
- data/lib/mongo/protocol/insert.rb +99 -0
- data/lib/mongo/protocol/kill_cursors.rb +74 -0
- data/lib/mongo/protocol/message.rb +252 -0
- data/lib/mongo/protocol/query.rb +147 -0
- data/lib/mongo/protocol/reply.rb +72 -0
- data/lib/mongo/protocol/serializers.rb +180 -0
- data/lib/mongo/protocol/update.rb +111 -0
- data/lib/mongo/server.rb +163 -0
- data/lib/mongo/server/connectable.rb +99 -0
- data/lib/mongo/server/connection.rb +133 -0
- data/lib/mongo/server/connection_pool.rb +141 -0
- data/lib/mongo/server/connection_pool/queue.rb +182 -0
- data/lib/mongo/server/context.rb +66 -0
- data/lib/mongo/server/description.rb +450 -0
- data/lib/mongo/server/description/features.rb +85 -0
- data/lib/mongo/server/description/inspector.rb +79 -0
- data/lib/mongo/server/description/inspector/primary_elected.rb +58 -0
- data/lib/mongo/server/description/inspector/server_added.rb +59 -0
- data/lib/mongo/server/description/inspector/server_removed.rb +59 -0
- data/lib/mongo/server/monitor.rb +160 -0
- data/lib/mongo/server/monitor/connection.rb +88 -0
- data/lib/mongo/server_selector.rb +81 -0
- data/lib/mongo/server_selector/nearest.rb +94 -0
- data/lib/mongo/server_selector/primary.rb +88 -0
- data/lib/mongo/server_selector/primary_preferred.rb +94 -0
- data/lib/mongo/server_selector/secondary.rb +91 -0
- data/lib/mongo/server_selector/secondary_preferred.rb +96 -0
- data/lib/mongo/server_selector/selectable.rb +209 -0
- data/lib/mongo/socket.rb +179 -0
- data/lib/mongo/socket/ssl.rb +108 -0
- data/lib/mongo/socket/tcp.rb +69 -0
- data/lib/mongo/socket/unix.rb +66 -0
- data/lib/mongo/uri.rb +504 -0
- data/lib/mongo/version.rb +21 -0
- data/lib/mongo/write_concern.rb +99 -0
- data/lib/mongo/write_concern/acknowledged.rb +38 -0
- data/lib/mongo/write_concern/normalizable.rb +73 -0
- data/lib/mongo/write_concern/unacknowledged.rb +43 -0
- data/mongo.gemspec +17 -14
- data/spec/mongo/address/ipv4_spec.rb +74 -0
- data/spec/mongo/address/ipv6_spec.rb +74 -0
- data/spec/mongo/address/unix_spec.rb +30 -0
- data/spec/mongo/address_spec.rb +206 -0
- data/spec/mongo/auth/cr_spec.rb +59 -0
- data/spec/mongo/auth/ldap_spec.rb +40 -0
- data/spec/mongo/auth/scram/conversation_spec.rb +197 -0
- data/spec/mongo/auth/scram_spec.rb +55 -0
- data/spec/mongo/auth/user/view_spec.rb +76 -0
- data/spec/mongo/auth/user_spec.rb +190 -0
- data/spec/mongo/auth/x509_spec.rb +40 -0
- data/spec/mongo/auth_spec.rb +65 -0
- data/spec/mongo/bulk/bulk_write_spec.rb +175 -0
- data/spec/mongo/client_spec.rb +564 -0
- data/spec/mongo/cluster/topology/replica_set_spec.rb +101 -0
- data/spec/mongo/cluster/topology/sharded_spec.rb +74 -0
- data/spec/mongo/cluster/topology/standalone_spec.rb +79 -0
- data/spec/mongo/cluster/topology_spec.rb +65 -0
- data/spec/mongo/cluster_spec.rb +129 -0
- data/spec/mongo/collection/view/aggregation_spec.rb +135 -0
- data/spec/mongo/collection/view/explainable_spec.rb +32 -0
- data/spec/mongo/collection/view/map_reduce_spec.rb +242 -0
- data/spec/mongo/collection/view/readable_spec.rb +603 -0
- data/spec/mongo/collection/view/writable_spec.rb +504 -0
- data/spec/mongo/collection/view_spec.rb +521 -0
- data/spec/mongo/collection_spec.rb +362 -0
- data/spec/mongo/cursor_spec.rb +295 -0
- data/spec/mongo/database_spec.rb +306 -0
- data/spec/mongo/error/parser_spec.rb +119 -0
- data/spec/mongo/event/publisher_spec.rb +50 -0
- data/spec/mongo/event/subscriber_spec.rb +34 -0
- data/spec/mongo/grid/file/chunk_spec.rb +226 -0
- data/spec/mongo/grid/file/metadata_spec.rb +69 -0
- data/spec/mongo/grid/file_spec.rb +138 -0
- data/spec/mongo/grid/fs_spec.rb +129 -0
- data/spec/mongo/index/view_spec.rb +226 -0
- data/spec/mongo/loggable_spec.rb +62 -0
- data/spec/mongo/logger_spec.rb +97 -0
- data/spec/mongo/operation/aggregate/result_spec.rb +80 -0
- data/spec/mongo/operation/aggregate_spec.rb +135 -0
- data/spec/mongo/operation/command_spec.rb +106 -0
- data/spec/mongo/operation/kill_cursors_spec.rb +66 -0
- data/spec/mongo/operation/limited_spec.rb +50 -0
- data/spec/mongo/operation/map_reduce_spec.rb +143 -0
- data/spec/mongo/operation/read/collections_info_spec.rb +40 -0
- data/spec/mongo/operation/read/get_more_spec.rb +81 -0
- data/spec/mongo/operation/read/indexes_spec.rb +31 -0
- data/spec/mongo/operation/read/query_spec.rb +84 -0
- data/spec/mongo/operation/result_spec.rb +275 -0
- data/spec/mongo/operation/specifiable_spec.rb +53 -0
- data/spec/mongo/operation/write/bulk_delete_spec.rb +473 -0
- data/spec/mongo/operation/write/bulk_insert_spec.rb +466 -0
- data/spec/mongo/operation/write/bulk_update_spec.rb +524 -0
- data/spec/mongo/operation/write/command/delete_spec.rb +116 -0
- data/spec/mongo/operation/write/command/insert_spec.rb +117 -0
- data/spec/mongo/operation/write/command/update_spec.rb +123 -0
- data/spec/mongo/operation/write/create_user_spec.rb +44 -0
- data/spec/mongo/operation/write/delete_spec.rb +178 -0
- data/spec/mongo/operation/write/drop_index_spec.rb +51 -0
- data/spec/mongo/operation/write/ensure_index_spec.rb +81 -0
- data/spec/mongo/operation/write/insert_spec.rb +231 -0
- data/spec/mongo/operation/write/remove_user_spec.rb +46 -0
- data/spec/mongo/operation/write/response_spec.rb +85 -0
- data/spec/mongo/operation/write/update_spec.rb +177 -0
- data/spec/mongo/protocol/delete_spec.rb +167 -0
- data/spec/mongo/protocol/get_more_spec.rb +146 -0
- data/spec/mongo/protocol/insert_spec.rb +161 -0
- data/spec/mongo/protocol/kill_cursors_spec.rb +101 -0
- data/spec/mongo/protocol/query_spec.rb +285 -0
- data/spec/mongo/protocol/reply_spec.rb +157 -0
- data/spec/mongo/protocol/update_spec.rb +186 -0
- data/spec/mongo/server/connection_pool/queue_spec.rb +170 -0
- data/spec/mongo/server/connection_pool_spec.rb +120 -0
- data/spec/mongo/server/connection_spec.rb +289 -0
- data/spec/mongo/server/description/features_spec.rb +138 -0
- data/spec/mongo/server/description/inspector/primary_elected_spec.rb +94 -0
- data/spec/mongo/server/description/inspector/server_added_spec.rb +92 -0
- data/spec/mongo/server/description/inspector/server_removed_spec.rb +95 -0
- data/spec/mongo/server/description_spec.rb +510 -0
- data/spec/mongo/server/monitor_spec.rb +130 -0
- data/spec/mongo/server_discovery_and_monitoring_spec.rb +103 -0
- data/spec/mongo/server_selection_rtt_spec.rb +104 -0
- data/spec/mongo/server_selection_spec.rb +89 -0
- data/spec/mongo/server_selector/nearest_spec.rb +250 -0
- data/spec/mongo/server_selector/primary_preferred_spec.rb +290 -0
- data/spec/mongo/server_selector/primary_spec.rb +114 -0
- data/spec/mongo/server_selector/secondary_preferred_spec.rb +252 -0
- data/spec/mongo/server_selector/secondary_spec.rb +196 -0
- data/spec/mongo/server_selector_spec.rb +101 -0
- data/spec/mongo/server_spec.rb +131 -0
- data/spec/mongo/uri_spec.rb +517 -0
- data/spec/mongo/write_concern/acknowledged_spec.rb +44 -0
- data/spec/mongo/write_concern/unacknowledged_spec.rb +15 -0
- data/spec/mongo_orchestration_spec.rb +70 -0
- data/spec/spec_helper.rb +148 -0
- data/spec/support/authorization.rb +245 -0
- data/spec/support/helpers.rb +140 -0
- data/spec/support/matchers.rb +37 -0
- data/spec/support/mongo_orchestration.rb +61 -0
- data/spec/support/mongo_orchestration/requestable.rb +109 -0
- data/spec/support/mongo_orchestration/standalone.rb +57 -0
- data/spec/support/sdam/rs/discover_arbiters.yml +41 -0
- data/spec/support/sdam/rs/discover_passives.yml +41 -0
- data/spec/support/sdam/rs/discover_primary.yml +40 -0
- data/spec/support/sdam/rs/discover_secondary.yml +41 -0
- data/spec/support/sdam/rs/discovery.yml +195 -0
- data/spec/support/sdam/rs/ghost_discovered.yml +39 -0
- data/spec/support/sdam/rs/hosts_differ_from_seeds.yml +34 -0
- data/spec/support/sdam/rs/member_reconfig.yml +68 -0
- data/spec/support/sdam/rs/member_standalone.yml +60 -0
- data/spec/support/sdam/rs/new_primary.yml +74 -0
- data/spec/support/sdam/rs/new_primary_wrong_set_name.yml +71 -0
- data/spec/support/sdam/rs/non_rs_member.yml +31 -0
- data/spec/support/sdam/rs/normalize_case.yml +49 -0
- data/spec/support/sdam/rs/primary_becomes_standalone.yml +52 -0
- data/spec/support/sdam/rs/primary_changes_set_name.yml +57 -0
- data/spec/support/sdam/rs/primary_disconnect.yml +56 -0
- data/spec/support/sdam/rs/primary_wrong_set_name.yml +27 -0
- data/spec/support/sdam/rs/response_from_removed.yml +63 -0
- data/spec/support/sdam/rs/rsother_discovered.yml +41 -0
- data/spec/support/sdam/rs/sec_not_auth.yml +49 -0
- data/spec/support/sdam/rs/secondary_wrong_set_name.yml +28 -0
- data/spec/support/sdam/rs/secondary_wrong_set_name_with_primary.yml +69 -0
- data/spec/support/sdam/rs/unexpected_mongos.yml +26 -0
- data/spec/support/sdam/rs/wrong_set_name.yml +35 -0
- data/spec/support/sdam/sharded/multiple_mongoses.yml +46 -0
- data/spec/support/sdam/sharded/non_mongos_removed.yml +41 -0
- data/spec/support/sdam/sharded/normalize_uri_case.yml +32 -0
- data/spec/support/sdam/single/direct_connection_external_ip.yml +34 -0
- data/spec/support/sdam/single/direct_connection_mongos.yml +33 -0
- data/spec/support/sdam/single/direct_connection_rsarbiter.yml +35 -0
- data/spec/support/sdam/single/direct_connection_rsprimary.yml +34 -0
- data/spec/support/sdam/single/direct_connection_rssecondary.yml +35 -0
- data/spec/support/sdam/single/direct_connection_slave.yml +32 -0
- data/spec/support/sdam/single/direct_connection_standalone.yml +32 -0
- data/spec/support/sdam/single/not_ok_response.yml +39 -0
- data/spec/support/sdam/single/standalone_removed.yml +32 -0
- data/spec/support/sdam/single/unavailable_seed.yml +28 -0
- data/spec/support/server_discovery_and_monitoring.rb +167 -0
- data/spec/support/server_selection.rb +140 -0
- data/spec/support/server_selection/rtt/first_value.yml +4 -0
- data/spec/support/server_selection/rtt/first_value_zero.yml +4 -0
- data/spec/support/server_selection/rtt/value_test_1.yml +4 -0
- data/spec/support/server_selection/rtt/value_test_2.yml +4 -0
- data/spec/support/server_selection/rtt/value_test_3.yml +4 -0
- data/spec/support/server_selection/rtt/value_test_4.yml +4 -0
- data/spec/support/server_selection/rtt/value_test_5.yml +4 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest.yml +32 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest_non_matching.yml +27 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Primary.yml +23 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred.yml +32 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred_non_matching.yml +27 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary.yml +32 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred.yml +32 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred_non_matching.yml +27 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary_non_matching.yml +27 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest.yml +41 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest_non_matching.yml +34 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Primary.yml +33 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred.yml +39 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred_non_matching.yml +36 -0
- data/spec/support/server_selection/selection/Sharded/read/SecondaryPreferred.yml +32 -0
- data/spec/support/server_selection/selection/Single/read/SecondaryPreferred.yml +23 -0
- data/spec/support/server_selection/selection/Unknown/read/SecondaryPreferred.yml +13 -0
- data/spec/support/server_selection_rtt.rb +41 -0
- data/spec/support/shared/bulk_write.rb +498 -0
- data/spec/support/shared/cursor.rb +38 -0
- data/spec/support/shared/operation.rb +77 -0
- data/spec/support/shared/protocol.rb +31 -0
- data/spec/support/shared/server_selector.rb +111 -0
- data/spec/support/shared/socket.rb +82 -0
- data/spec/support/travis.rb +14 -0
- metadata +523 -189
- metadata.gz.sig +0 -0
- data/VERSION +0 -1
- data/lib/mongo/bulk_write_collection_view.rb +0 -387
- data/lib/mongo/collection_writer.rb +0 -364
- data/lib/mongo/connection/node.rb +0 -249
- data/lib/mongo/connection/pool.rb +0 -340
- data/lib/mongo/connection/pool_manager.rb +0 -320
- data/lib/mongo/connection/sharding_pool_manager.rb +0 -67
- data/lib/mongo/connection/socket/ssl_socket.rb +0 -95
- data/lib/mongo/connection/socket/tcp_socket.rb +0 -87
- data/lib/mongo/connection/socket/unix_socket.rb +0 -39
- data/lib/mongo/db.rb +0 -808
- data/lib/mongo/exception.rb +0 -145
- data/lib/mongo/functional/authentication.rb +0 -455
- data/lib/mongo/functional/logging.rb +0 -85
- data/lib/mongo/functional/read_preference.rb +0 -183
- data/lib/mongo/functional/scram.rb +0 -556
- data/lib/mongo/functional/uri_parser.rb +0 -409
- data/lib/mongo/functional/write_concern.rb +0 -66
- data/lib/mongo/gridfs/grid.rb +0 -112
- data/lib/mongo/gridfs/grid_ext.rb +0 -53
- data/lib/mongo/gridfs/grid_file_system.rb +0 -163
- data/lib/mongo/gridfs/grid_io.rb +0 -484
- data/lib/mongo/legacy.rb +0 -140
- data/lib/mongo/mongo_client.rb +0 -697
- data/lib/mongo/mongo_replica_set_client.rb +0 -535
- data/lib/mongo/mongo_sharded_client.rb +0 -159
- data/lib/mongo/networking.rb +0 -372
- data/lib/mongo/utils/conversions.rb +0 -110
- data/lib/mongo/utils/core_ext.rb +0 -70
- data/lib/mongo/utils/server_version.rb +0 -69
- data/lib/mongo/utils/support.rb +0 -80
- data/test/functional/authentication_test.rb +0 -39
- data/test/functional/bulk_api_stress_test.rb +0 -133
- data/test/functional/bulk_write_collection_view_test.rb +0 -1198
- data/test/functional/client_test.rb +0 -627
- data/test/functional/collection_test.rb +0 -2175
- data/test/functional/collection_writer_test.rb +0 -83
- data/test/functional/conversions_test.rb +0 -163
- data/test/functional/cursor_fail_test.rb +0 -57
- data/test/functional/cursor_message_test.rb +0 -56
- data/test/functional/cursor_test.rb +0 -683
- data/test/functional/db_api_test.rb +0 -835
- data/test/functional/db_test.rb +0 -348
- data/test/functional/grid_file_system_test.rb +0 -285
- data/test/functional/grid_io_test.rb +0 -252
- data/test/functional/grid_test.rb +0 -273
- data/test/functional/pool_test.rb +0 -136
- data/test/functional/safe_test.rb +0 -98
- data/test/functional/support_test.rb +0 -62
- data/test/functional/timeout_test.rb +0 -60
- data/test/functional/uri_test.rb +0 -446
- data/test/functional/write_concern_test.rb +0 -118
- data/test/helpers/general.rb +0 -50
- data/test/helpers/test_unit.rb +0 -476
- data/test/replica_set/authentication_test.rb +0 -37
- data/test/replica_set/basic_test.rb +0 -189
- data/test/replica_set/client_test.rb +0 -393
- data/test/replica_set/connection_test.rb +0 -138
- data/test/replica_set/count_test.rb +0 -66
- data/test/replica_set/cursor_test.rb +0 -220
- data/test/replica_set/insert_test.rb +0 -157
- data/test/replica_set/max_values_test.rb +0 -151
- data/test/replica_set/pinning_test.rb +0 -105
- data/test/replica_set/query_test.rb +0 -73
- data/test/replica_set/read_preference_test.rb +0 -219
- data/test/replica_set/refresh_test.rb +0 -211
- data/test/replica_set/replication_ack_test.rb +0 -95
- data/test/sharded_cluster/basic_test.rb +0 -203
- data/test/shared/authentication/basic_auth_shared.rb +0 -260
- data/test/shared/authentication/bulk_api_auth_shared.rb +0 -249
- data/test/shared/authentication/gssapi_shared.rb +0 -176
- data/test/shared/authentication/sasl_plain_shared.rb +0 -96
- data/test/shared/authentication/scram_shared.rb +0 -92
- data/test/shared/ssl_shared.rb +0 -235
- data/test/test_helper.rb +0 -61
- data/test/threading/basic_test.rb +0 -120
- data/test/tools/mongo_config.rb +0 -708
- data/test/tools/mongo_config_test.rb +0 -160
- data/test/unit/client_test.rb +0 -381
- data/test/unit/collection_test.rb +0 -166
- data/test/unit/connection_test.rb +0 -335
- data/test/unit/cursor_test.rb +0 -307
- data/test/unit/db_test.rb +0 -136
- data/test/unit/grid_test.rb +0 -76
- data/test/unit/mongo_sharded_client_test.rb +0 -48
- data/test/unit/node_test.rb +0 -93
- data/test/unit/pool_manager_test.rb +0 -111
- data/test/unit/read_pref_test.rb +0 -406
- data/test/unit/read_test.rb +0 -159
- data/test/unit/safe_test.rb +0 -158
- data/test/unit/sharding_pool_manager_test.rb +0 -84
- data/test/unit/write_concern_test.rb +0 -175
|
@@ -0,0 +1,223 @@
|
|
|
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(normalize(document))
|
|
133
|
+
@client_md5 = Digest::MD5.new
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
# Get the length of the document in bytes.
|
|
137
|
+
#
|
|
138
|
+
# @example Get the length
|
|
139
|
+
# metadata.length
|
|
140
|
+
#
|
|
141
|
+
# @return [ Integer ] The length.
|
|
142
|
+
#
|
|
143
|
+
# @since 2.0.0
|
|
144
|
+
def length
|
|
145
|
+
document[:length]
|
|
146
|
+
end
|
|
147
|
+
alias :size :length
|
|
148
|
+
|
|
149
|
+
# Get the additional metadata.
|
|
150
|
+
#
|
|
151
|
+
# @example Get additional metadata.
|
|
152
|
+
# metadata.metadata
|
|
153
|
+
#
|
|
154
|
+
# @return [ String ] The additional metadata.
|
|
155
|
+
#
|
|
156
|
+
# @since 2.0.0
|
|
157
|
+
def metadata
|
|
158
|
+
document[:metadata]
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
# Get the md5 hash.
|
|
162
|
+
#
|
|
163
|
+
# @example Get the md5 hash.
|
|
164
|
+
# metadata.md5
|
|
165
|
+
#
|
|
166
|
+
# @return [ String ] The md5 hash as a string.
|
|
167
|
+
#
|
|
168
|
+
# @since 2.0.0
|
|
169
|
+
def md5
|
|
170
|
+
document[:md5] || @client_md5
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
# Conver the metadata to BSON for storage.
|
|
174
|
+
#
|
|
175
|
+
# @note If no md5 exists in the metadata (it was loaded from the server
|
|
176
|
+
# and is not a new file) then we digest the md5 and set it.
|
|
177
|
+
#
|
|
178
|
+
# @example Convert the metadata to BSON.
|
|
179
|
+
# metadata.to_bson
|
|
180
|
+
#
|
|
181
|
+
# @param [ String ] encoded The encoded data to append to.
|
|
182
|
+
#
|
|
183
|
+
# @return [ String ] The raw BSON data.
|
|
184
|
+
#
|
|
185
|
+
# @since 2.0.0
|
|
186
|
+
def to_bson(encoded = ''.force_encoding(BSON::BINARY))
|
|
187
|
+
document[:md5] ||= @client_md5.hexdigest
|
|
188
|
+
document.to_bson(encoded)
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
# Get the upload date.
|
|
192
|
+
#
|
|
193
|
+
# @example Get the upload date.
|
|
194
|
+
# metadata.upload_date
|
|
195
|
+
#
|
|
196
|
+
# @return [ Time ] The upload date.
|
|
197
|
+
#
|
|
198
|
+
# @since 2.0.0
|
|
199
|
+
def upload_date
|
|
200
|
+
document[:uploadDate]
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
private
|
|
204
|
+
|
|
205
|
+
def normalize(document)
|
|
206
|
+
document.reduce(BSON::Document.new) do |doc, (key, value)|
|
|
207
|
+
doc[MAPPINGS[key] || key] = value
|
|
208
|
+
doc
|
|
209
|
+
end
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
def default_document
|
|
213
|
+
BSON::Document.new(
|
|
214
|
+
:_id => BSON::ObjectId.new,
|
|
215
|
+
:chunkSize => Chunk::DEFAULT_SIZE,
|
|
216
|
+
:uploadDate => Time.now.utc,
|
|
217
|
+
:contentType => DEFAULT_CONTENT_TYPE
|
|
218
|
+
)
|
|
219
|
+
end
|
|
220
|
+
end
|
|
221
|
+
end
|
|
222
|
+
end
|
|
223
|
+
end
|
|
@@ -0,0 +1,149 @@
|
|
|
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
|
+
|
|
18
|
+
# Represents a view of the GridFS in the database.
|
|
19
|
+
#
|
|
20
|
+
# @since 2.0.0
|
|
21
|
+
class FS
|
|
22
|
+
extend Forwardable
|
|
23
|
+
|
|
24
|
+
# The default root prefix.
|
|
25
|
+
#
|
|
26
|
+
# @since 2.0.0
|
|
27
|
+
DEFAULT_ROOT = 'fs'.freeze
|
|
28
|
+
|
|
29
|
+
# The specification for the chunks index.
|
|
30
|
+
#
|
|
31
|
+
# @since 2.0.0
|
|
32
|
+
INDEX_SPEC = { :files_id => 1, :n => 1 }.freeze
|
|
33
|
+
|
|
34
|
+
# @return [ Collection ] chunks_collection The chunks collection.
|
|
35
|
+
attr_reader :chunks_collection
|
|
36
|
+
|
|
37
|
+
# @return [ Database ] database The database.
|
|
38
|
+
attr_reader :database
|
|
39
|
+
|
|
40
|
+
# @return [ Collection ] files_collection The files collection.
|
|
41
|
+
attr_reader :files_collection
|
|
42
|
+
|
|
43
|
+
# Get write concern from database.
|
|
44
|
+
def_delegators :database, :write_concern
|
|
45
|
+
|
|
46
|
+
# Find a file in the GridFS.
|
|
47
|
+
#
|
|
48
|
+
# @example Find a file by it's id.
|
|
49
|
+
# fs.find_one(_id: id)
|
|
50
|
+
#
|
|
51
|
+
# @example Find a file by it's filename.
|
|
52
|
+
# fs.find_one(filename: 'test.txt')
|
|
53
|
+
#
|
|
54
|
+
# @param [ Hash ] selector The selector.
|
|
55
|
+
#
|
|
56
|
+
# @return [ Grid::File ] The file.
|
|
57
|
+
#
|
|
58
|
+
# @since 2.0.0
|
|
59
|
+
def find_one(selector = nil)
|
|
60
|
+
metadata = files_collection.find(selector).first
|
|
61
|
+
return nil unless metadata
|
|
62
|
+
chunks = chunks_collection.find(:files_id => metadata[:_id]).sort(:n => 1)
|
|
63
|
+
Grid::File.new(chunks.to_a, metadata)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# Insert a single file into the GridFS.
|
|
67
|
+
#
|
|
68
|
+
# @example Insert a single file.
|
|
69
|
+
# fs.insert_one(file)
|
|
70
|
+
#
|
|
71
|
+
# @param [ Grid::File ] file The file to insert.
|
|
72
|
+
#
|
|
73
|
+
# @return [ Result ] The result of the insert.
|
|
74
|
+
#
|
|
75
|
+
# @since 2.0.0
|
|
76
|
+
def insert_one(file)
|
|
77
|
+
files_collection.insert_one(file.metadata)
|
|
78
|
+
result = chunks_collection.insert_many(file.chunks)
|
|
79
|
+
if write_concern.get_last_error
|
|
80
|
+
validate_md5!(file)
|
|
81
|
+
else
|
|
82
|
+
result
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# Create the GridFS.
|
|
87
|
+
#
|
|
88
|
+
# @example Create the GridFS.
|
|
89
|
+
# Grid::FS.new(database)
|
|
90
|
+
#
|
|
91
|
+
# @param [ Database ] database The database the files reside in.
|
|
92
|
+
# @param [ Hash ] options The GridFS options.
|
|
93
|
+
#
|
|
94
|
+
# @option options [ String ] :fs_name The prefix for the files and chunks
|
|
95
|
+
# collections.
|
|
96
|
+
#
|
|
97
|
+
# @since 2.0.0
|
|
98
|
+
def initialize(database, options = {})
|
|
99
|
+
@database = database
|
|
100
|
+
@options = options
|
|
101
|
+
@chunks_collection = database[chunks_name]
|
|
102
|
+
@files_collection = database[files_name]
|
|
103
|
+
chunks_collection.indexes.create(INDEX_SPEC, :unique => true)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
# Get the prefix for the GridFS
|
|
107
|
+
#
|
|
108
|
+
# @example Get the prefix.
|
|
109
|
+
# fs.prefix
|
|
110
|
+
#
|
|
111
|
+
# @return [ String ] The GridFS prefix.
|
|
112
|
+
#
|
|
113
|
+
# @since 2.0.0
|
|
114
|
+
def prefix
|
|
115
|
+
@options[:fs_name] || DEFAULT_ROOT
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
# Remove a single file from the GridFS.
|
|
119
|
+
#
|
|
120
|
+
# @example Remove a file from the GridFS.
|
|
121
|
+
# fs.remove_one(file)
|
|
122
|
+
#
|
|
123
|
+
# @param [ Grid::File ] file The file to remove.
|
|
124
|
+
#
|
|
125
|
+
# @return [ Result ] The result of the remove.
|
|
126
|
+
#
|
|
127
|
+
# @since 2.0.0
|
|
128
|
+
def remove_one(file)
|
|
129
|
+
files_collection.find(:_id => file.id).remove_one
|
|
130
|
+
chunks_collection.find(:files_id => file.id).remove_many
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
private
|
|
134
|
+
|
|
135
|
+
def chunks_name
|
|
136
|
+
"#{prefix}.#{Grid::File::Chunk::COLLECTION}"
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def files_name
|
|
140
|
+
"#{prefix}.#{Grid::File::Metadata::COLLECTION}"
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
def validate_md5!(file)
|
|
144
|
+
md5 = database.command(:filemd5 => file.id, :root => prefix).documents[0][:md5]
|
|
145
|
+
raise Error::InvalidFile.new(file.md5, md5) unless file.md5 == md5
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
end
|
data/lib/mongo/index.rb
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
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/index/view'
|
|
16
|
+
|
|
17
|
+
module Mongo
|
|
18
|
+
|
|
19
|
+
# Contains constants for indexing purposes.
|
|
20
|
+
#
|
|
21
|
+
# @since 2.0.0
|
|
22
|
+
module Index
|
|
23
|
+
|
|
24
|
+
# Specify ascending order for an index.
|
|
25
|
+
#
|
|
26
|
+
# @since 2.0.0
|
|
27
|
+
ASCENDING = 1
|
|
28
|
+
|
|
29
|
+
# Specify descending order for an index.
|
|
30
|
+
#
|
|
31
|
+
# @since 2.0.0
|
|
32
|
+
DESCENDING = -1
|
|
33
|
+
|
|
34
|
+
# Specify a 2d Geo index.
|
|
35
|
+
#
|
|
36
|
+
# @since 2.0.0
|
|
37
|
+
GEO2D = '2d'.freeze
|
|
38
|
+
|
|
39
|
+
# Specify a 2d sphere Geo index.
|
|
40
|
+
#
|
|
41
|
+
# @since 2.0.0
|
|
42
|
+
GEO2DSPHERE = '2dsphere'.freeze
|
|
43
|
+
|
|
44
|
+
# Specify a geoHaystack index.
|
|
45
|
+
#
|
|
46
|
+
# @since 2.0.0
|
|
47
|
+
GEOHAYSTACK = 'geoHaystack'.freeze
|
|
48
|
+
|
|
49
|
+
# Encodes a text index.
|
|
50
|
+
#
|
|
51
|
+
# @since 2.0.0
|
|
52
|
+
TEXT = 'text'.freeze
|
|
53
|
+
|
|
54
|
+
# Specify a hashed index.
|
|
55
|
+
#
|
|
56
|
+
# @since 2.0.0
|
|
57
|
+
HASHED = 'hashed'.freeze
|
|
58
|
+
|
|
59
|
+
# Constant for the indexes collection.
|
|
60
|
+
#
|
|
61
|
+
# @since 2.0.0
|
|
62
|
+
COLLECTION = 'system.indexes'.freeze
|
|
63
|
+
end
|
|
64
|
+
end
|
|
@@ -0,0 +1,205 @@
|
|
|
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 Index
|
|
17
|
+
|
|
18
|
+
# A class representing a view of indexes.
|
|
19
|
+
#
|
|
20
|
+
# @since 2.0.0
|
|
21
|
+
class View
|
|
22
|
+
extend Forwardable
|
|
23
|
+
include Enumerable
|
|
24
|
+
|
|
25
|
+
# @return [ Collection ] collection The indexes collection.
|
|
26
|
+
attr_reader :collection
|
|
27
|
+
|
|
28
|
+
# @return [ Integer ] batch_size The size of the batch of results
|
|
29
|
+
# when sending the listIndexes command.
|
|
30
|
+
attr_reader :batch_size
|
|
31
|
+
|
|
32
|
+
def_delegators :@collection, :cluster, :database, :read_preference
|
|
33
|
+
def_delegators :cluster, :next_primary
|
|
34
|
+
|
|
35
|
+
# The index key field.
|
|
36
|
+
#
|
|
37
|
+
# @since 2.0.0
|
|
38
|
+
KEY = 'key'.freeze
|
|
39
|
+
|
|
40
|
+
# The index name field.
|
|
41
|
+
#
|
|
42
|
+
# @since 2.0.0
|
|
43
|
+
NAME = 'name'.freeze
|
|
44
|
+
|
|
45
|
+
# Drop an index by its specification.
|
|
46
|
+
#
|
|
47
|
+
# @example Drop the index by spec.
|
|
48
|
+
# view.drop(name: 1)
|
|
49
|
+
#
|
|
50
|
+
# @example Drop an index by its name.
|
|
51
|
+
# view.drop('name_1')
|
|
52
|
+
#
|
|
53
|
+
# @param [ Hash, String ] spec The index spec or name to drop.
|
|
54
|
+
#
|
|
55
|
+
# @return [ Result ] The response.
|
|
56
|
+
#
|
|
57
|
+
# @since 2.0.0
|
|
58
|
+
def drop(spec)
|
|
59
|
+
Operation::Write::DropIndex.new(
|
|
60
|
+
db_name: database.name,
|
|
61
|
+
coll_name: collection.name,
|
|
62
|
+
index_name: spec.is_a?(String) ? spec : index_name(spec)
|
|
63
|
+
).execute(next_primary.context)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# Drop all indexes on the collection.
|
|
67
|
+
#
|
|
68
|
+
# @example Drop all indexes on the collection.
|
|
69
|
+
# view.drop_all
|
|
70
|
+
#
|
|
71
|
+
# @return [ Result ] The response.
|
|
72
|
+
#
|
|
73
|
+
# @since 2.0.0
|
|
74
|
+
def drop_all
|
|
75
|
+
drop('*')
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# Creates an index on the collection.
|
|
79
|
+
#
|
|
80
|
+
# @param [ Hash ] spec A hash of field name/direction pairs.
|
|
81
|
+
# @param [ Hash ] options Options for this index.
|
|
82
|
+
#
|
|
83
|
+
# @option options [ true, false ] :unique (false) If true, this index will enforce
|
|
84
|
+
# a uniqueness constraint on that field.
|
|
85
|
+
# @option options [ true, false ] :background (false) If true, the index will be built
|
|
86
|
+
# in the background (only available for server versions >= 1.3.2 )
|
|
87
|
+
# @option options [ true, false ] :drop_dups (false) If creating a unique index on
|
|
88
|
+
# this collection, this option will keep the first document the database indexes
|
|
89
|
+
# and drop all subsequent documents with duplicate values on this field.
|
|
90
|
+
# @option options [ Integer ] :bucket_size (nil) For use with geoHaystack indexes.
|
|
91
|
+
# Number of documents to group together within a certain proximity to a given
|
|
92
|
+
# longitude and latitude.
|
|
93
|
+
# @option options [ Integer ] :max (nil) Specify the max latitude and longitude for
|
|
94
|
+
# a geo index.
|
|
95
|
+
# @option options [ Integer ] :min (nil) Specify the min latitude and longitude for
|
|
96
|
+
# a geo index.
|
|
97
|
+
#
|
|
98
|
+
# @note Note that the options listed may be subset of those available.
|
|
99
|
+
# See the MongoDB documentation for a full list of supported options by server version.
|
|
100
|
+
#
|
|
101
|
+
# @return [ Result ] The response.
|
|
102
|
+
#
|
|
103
|
+
# @since 2.0.0
|
|
104
|
+
def create(spec, options = {})
|
|
105
|
+
Operation::Write::EnsureIndex.new(
|
|
106
|
+
index: spec,
|
|
107
|
+
db_name: database.name,
|
|
108
|
+
coll_name: collection.name,
|
|
109
|
+
index_name: options[:name] || index_name(spec),
|
|
110
|
+
options: options
|
|
111
|
+
).execute(next_primary.context)
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
# Convenience method for getting index information by a specific name or
|
|
115
|
+
# spec.
|
|
116
|
+
#
|
|
117
|
+
# @example Get index information by name.
|
|
118
|
+
# view.get('name_1')
|
|
119
|
+
#
|
|
120
|
+
# @example Get index information by spec.
|
|
121
|
+
# view.get(name: 1)
|
|
122
|
+
#
|
|
123
|
+
# @param [ Hash, String ] spec The index name or spec.
|
|
124
|
+
#
|
|
125
|
+
# @return [ Hash ] The index information.
|
|
126
|
+
#
|
|
127
|
+
# @since 2.0.0
|
|
128
|
+
def get(spec)
|
|
129
|
+
find do |index|
|
|
130
|
+
(index[NAME] == spec) || (index[KEY] == normalize_keys(spec))
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
# Iterate over all indexes for the collection.
|
|
135
|
+
#
|
|
136
|
+
# @example Get all the indexes.
|
|
137
|
+
# view.each do |index|
|
|
138
|
+
# ...
|
|
139
|
+
# end
|
|
140
|
+
#
|
|
141
|
+
# @since 2.0.0
|
|
142
|
+
def each(&block)
|
|
143
|
+
server = next_primary
|
|
144
|
+
cursor = Cursor.new(self, send_initial_query(server), server).to_enum
|
|
145
|
+
cursor.each do |doc|
|
|
146
|
+
yield doc
|
|
147
|
+
end if block_given?
|
|
148
|
+
cursor
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
# Create the new index view.
|
|
152
|
+
#
|
|
153
|
+
# @example Create the new index view.
|
|
154
|
+
# View::Index.new(collection)
|
|
155
|
+
#
|
|
156
|
+
# @param [ Collection ] collection The collection.
|
|
157
|
+
# @param [ Hash ] options Options for getting a list of indexes.
|
|
158
|
+
# Only relevant for when the listIndexes command is used with server
|
|
159
|
+
# versions >=2.8.
|
|
160
|
+
#
|
|
161
|
+
# @option options [ Integer ] :batch_size The batch size for results
|
|
162
|
+
# returned from the listIndexes command.
|
|
163
|
+
#
|
|
164
|
+
# @since 2.0.0
|
|
165
|
+
def initialize(collection, options = {})
|
|
166
|
+
@collection = collection
|
|
167
|
+
@batch_size = options[:batch_size]
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
private
|
|
171
|
+
|
|
172
|
+
def limit
|
|
173
|
+
-1
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
def indexes_spec
|
|
177
|
+
{ selector: {
|
|
178
|
+
listIndexes: collection.name,
|
|
179
|
+
cursor: batch_size ? { batchSize: batch_size } : {} },
|
|
180
|
+
coll_name: collection.name,
|
|
181
|
+
db_name: database.name }
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
def initial_query_op
|
|
185
|
+
Operation::Read::Indexes.new(indexes_spec)
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
def send_initial_query(server)
|
|
189
|
+
initial_query_op.execute(server.context)
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
def index_name(spec)
|
|
193
|
+
spec.to_a.join('_')
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
def normalize_keys(spec)
|
|
197
|
+
return false if spec.is_a?(String)
|
|
198
|
+
spec.reduce({}) do |normalized, (key, value)|
|
|
199
|
+
normalized[key.to_s] = value
|
|
200
|
+
normalized
|
|
201
|
+
end
|
|
202
|
+
end
|
|
203
|
+
end
|
|
204
|
+
end
|
|
205
|
+
end
|