mongo 2.1.0.beta → 2.2.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/README.md +10 -3
- data/Rakefile +1 -7
- data/lib/mongo/address/ipv4.rb +6 -1
- data/lib/mongo/address/unix.rb +2 -2
- data/lib/mongo/address.rb +32 -10
- data/lib/mongo/auth/cr/conversation.rb +1 -1
- data/lib/mongo/auth/ldap/conversation.rb +7 -3
- data/lib/mongo/auth/scram/conversation.rb +9 -3
- data/lib/mongo/auth/user/view.rb +23 -2
- data/lib/mongo/auth/x509/conversation.rb +1 -1
- data/lib/mongo/bulk_write/combineable.rb +51 -0
- data/lib/mongo/bulk_write/ordered_combiner.rb +55 -0
- data/lib/mongo/bulk_write/result.rb +61 -8
- data/lib/mongo/bulk_write/result_combiner.rb +117 -0
- data/lib/mongo/bulk_write/transformable.rb +132 -0
- data/lib/mongo/bulk_write/unordered_combiner.rb +52 -0
- data/lib/mongo/bulk_write/validatable.rb +62 -0
- data/lib/mongo/bulk_write.rb +164 -23
- data/lib/mongo/client.rb +75 -18
- data/lib/mongo/cluster/topology/replica_set.rb +8 -6
- data/lib/mongo/cluster/topology/unknown.rb +5 -2
- data/lib/mongo/cluster.rb +85 -5
- data/lib/mongo/collection/view/aggregation.rb +19 -45
- data/lib/mongo/collection/view/builder/aggregation.rb +98 -0
- data/lib/mongo/collection/view/builder/find_command.rb +111 -0
- data/lib/mongo/collection/view/builder/flags.rb +62 -0
- data/lib/mongo/collection/view/builder/map_reduce.rb +134 -0
- data/lib/mongo/collection/view/builder/modifiers.rb +80 -0
- data/lib/mongo/collection/view/builder/op_query.rb +83 -0
- data/lib/mongo/collection/view/builder.rb +20 -0
- data/lib/mongo/collection/view/explainable.rb +15 -0
- data/lib/mongo/collection/view/immutable.rb +4 -11
- data/lib/mongo/collection/view/iterable.rb +40 -5
- data/lib/mongo/collection/view/map_reduce.rb +67 -37
- data/lib/mongo/collection/view/readable.rb +114 -100
- data/lib/mongo/collection/view/writable.rb +46 -22
- data/lib/mongo/collection/view.rb +25 -22
- data/lib/mongo/collection.rb +130 -12
- data/lib/mongo/cursor/builder/get_more_command.rb +71 -0
- data/lib/mongo/cursor/builder/kill_cursors_command.rb +62 -0
- data/lib/mongo/cursor/builder/op_get_more.rb +61 -0
- data/lib/mongo/cursor/builder/op_kill_cursors.rb +56 -0
- data/lib/mongo/cursor/builder.rb +18 -0
- data/lib/mongo/cursor.rb +76 -21
- data/lib/mongo/database/view.rb +11 -6
- data/lib/mongo/database.rb +16 -6
- data/lib/mongo/dbref.rb +9 -9
- data/lib/mongo/{bulk_write/unordered_bulk_write.rb → error/closed_stream.rb} +12 -21
- data/lib/mongo/{bulk_write/ordered_bulk_write.rb → error/extra_file_chunk.rb} +13 -27
- data/lib/mongo/error/file_not_found.rb +37 -0
- data/lib/mongo/error/invalid_file.rb +2 -2
- data/lib/mongo/error/invalid_file_revision.rb +37 -0
- data/lib/mongo/error/invalid_uri.rb +5 -4
- data/lib/mongo/error/invalid_write_concern.rb +35 -0
- data/lib/mongo/error/missing_file_chunk.rb +38 -0
- data/lib/mongo/error/operation_failure.rb +33 -2
- data/lib/mongo/error/unchangeable_collection_option.rb +38 -0
- data/lib/mongo/error/unexpected_chunk_length.rb +39 -0
- data/lib/mongo/error.rb +8 -0
- data/lib/mongo/grid/file/chunk.rb +9 -9
- data/lib/mongo/grid/file/{metadata.rb → info.rb} +41 -39
- data/lib/mongo/grid/file.rb +12 -9
- data/lib/mongo/grid/fs_bucket.rb +448 -0
- data/lib/mongo/grid/stream/read.rb +208 -0
- data/lib/mongo/grid/stream/write.rb +187 -0
- data/lib/mongo/grid/stream.rb +64 -0
- data/lib/mongo/grid.rb +2 -1
- data/lib/mongo/index/view.rb +7 -4
- data/lib/mongo/index.rb +5 -0
- data/lib/mongo/loggable.rb +34 -57
- data/lib/mongo/logger.rb +16 -78
- data/lib/mongo/monitoring/command_log_subscriber.rb +38 -14
- data/lib/mongo/monitoring/event/command_started.rb +2 -1
- data/lib/mongo/monitoring/event/command_succeeded.rb +24 -2
- data/lib/mongo/monitoring/event/secure.rb +58 -0
- data/lib/mongo/monitoring/event.rb +1 -0
- data/lib/mongo/monitoring/publishable.rb +22 -12
- data/lib/mongo/monitoring.rb +1 -5
- data/lib/mongo/operation/commands/aggregate/result.rb +89 -0
- data/lib/mongo/operation/commands/aggregate.rb +64 -0
- data/lib/mongo/operation/commands/collections_info/result.rb +41 -0
- data/lib/mongo/operation/{read → commands}/collections_info.rb +5 -3
- data/lib/mongo/operation/commands/command.rb +47 -0
- data/lib/mongo/operation/commands/find/result.rb +62 -0
- data/lib/mongo/operation/commands/find.rb +27 -0
- data/lib/mongo/operation/commands/get_more/result.rb +62 -0
- data/lib/mongo/operation/commands/get_more.rb +27 -0
- data/lib/mongo/operation/{read → commands}/indexes.rb +9 -6
- data/lib/mongo/operation/{list_collections → commands/list_collections}/result.rb +1 -21
- data/lib/mongo/operation/{read → commands}/list_collections.rb +4 -32
- data/lib/mongo/operation/{list_indexes → commands/list_indexes}/result.rb +1 -21
- data/lib/mongo/operation/{read → commands}/list_indexes.rb +3 -33
- data/lib/mongo/operation/commands/map_reduce/result.rb +119 -0
- data/lib/mongo/operation/commands/map_reduce.rb +49 -0
- data/lib/mongo/operation/commands/parallel_scan/result.rb +64 -0
- data/lib/mongo/operation/commands/parallel_scan.rb +52 -0
- data/lib/mongo/operation/commands/user_query.rb +71 -0
- data/lib/mongo/operation/commands/users_info/result.rb +38 -0
- data/lib/mongo/operation/commands/users_info.rb +48 -0
- data/lib/mongo/operation/commands.rb +26 -0
- data/lib/mongo/operation/executable.rb +4 -68
- data/lib/mongo/operation/kill_cursors.rb +3 -3
- data/lib/mongo/operation/object_id_generator.rb +36 -0
- data/lib/mongo/operation/read/get_more.rb +2 -22
- data/lib/mongo/operation/read/query/result.rb +40 -0
- data/lib/mongo/operation/read/query.rb +4 -21
- data/lib/mongo/operation/read.rb +0 -4
- data/lib/mongo/operation/{read_preferrable.rb → read_preference.rb} +3 -2
- data/lib/mongo/operation/result.rb +43 -1
- data/lib/mongo/operation/specifiable.rb +59 -1
- data/lib/mongo/operation/write/bulk/bulkable.rb +83 -0
- data/lib/mongo/operation/write/bulk/delete/result.rb +67 -0
- data/lib/mongo/operation/write/bulk/delete.rb +71 -0
- data/lib/mongo/operation/write/bulk/insert/result.rb +129 -0
- data/lib/mongo/operation/write/bulk/insert.rb +96 -0
- data/lib/mongo/operation/write/bulk/legacy_mergable.rb +87 -0
- data/lib/mongo/operation/write/bulk/mergable.rb +71 -0
- data/lib/mongo/operation/write/bulk/update/result.rb +174 -0
- data/lib/mongo/operation/write/bulk/update.rb +81 -0
- data/lib/mongo/operation/write/bulk.rb +6 -3
- data/lib/mongo/operation/write/command/create_index.rb +0 -1
- data/lib/mongo/operation/write/command/create_user.rb +0 -1
- data/lib/mongo/operation/write/command/delete.rb +3 -3
- data/lib/mongo/operation/write/command/drop_index.rb +0 -1
- data/lib/mongo/operation/write/command/insert.rb +4 -3
- data/lib/mongo/operation/write/command/remove_user.rb +0 -1
- data/lib/mongo/operation/write/command/update.rb +6 -4
- data/lib/mongo/operation/write/command/update_user.rb +0 -1
- data/lib/mongo/operation/write/command/writable.rb +13 -18
- data/lib/mongo/operation/write/create_index.rb +4 -27
- data/lib/mongo/operation/write/create_user.rb +4 -30
- data/lib/mongo/operation/write/delete.rb +6 -29
- data/lib/mongo/operation/write/drop_index.rb +3 -3
- data/lib/mongo/operation/write/gle.rb +49 -0
- data/lib/mongo/operation/write/idable.rb +24 -2
- data/lib/mongo/operation/write/insert.rb +2 -24
- data/lib/mongo/operation/write/remove_user.rb +4 -27
- data/lib/mongo/operation/write/update.rb +13 -36
- data/lib/mongo/operation/write/update_user.rb +4 -30
- data/lib/mongo/operation/write/write_command_enabled.rb +53 -0
- data/lib/mongo/operation/write.rb +2 -0
- data/lib/mongo/operation.rb +33 -5
- data/lib/mongo/options/mapper.rb +26 -2
- data/lib/mongo/options/redacted.rb +156 -0
- data/lib/mongo/options.rb +1 -0
- data/lib/mongo/protocol/bit_vector.rb +11 -9
- data/lib/mongo/protocol/delete.rb +78 -3
- data/lib/mongo/protocol/get_more.rb +59 -2
- data/lib/mongo/protocol/insert.rb +73 -1
- data/lib/mongo/protocol/kill_cursors.rb +66 -4
- data/lib/mongo/protocol/message.rb +44 -20
- data/lib/mongo/protocol/query.rb +153 -65
- data/lib/mongo/protocol/reply.rb +92 -1
- data/lib/mongo/protocol/serializers.rb +49 -40
- data/lib/mongo/protocol/update.rb +93 -1
- data/lib/mongo/retryable.rb +101 -0
- data/lib/mongo/server/connectable.rb +28 -8
- data/lib/mongo/server/connection.rb +52 -10
- data/lib/mongo/server/connection_pool/queue.rb +15 -0
- data/lib/mongo/server/connection_pool.rb +12 -15
- data/lib/mongo/server/description/features.rb +4 -2
- data/lib/mongo/server/description.rb +39 -3
- data/lib/mongo/server/monitor/connection.rb +49 -28
- data/lib/mongo/server/monitor.rb +3 -14
- data/lib/mongo/server.rb +31 -4
- data/lib/mongo/server_selector/selectable.rb +58 -32
- data/lib/mongo/server_selector.rb +19 -10
- data/lib/mongo/socket/ssl.rb +4 -1
- data/lib/mongo/socket/tcp.rb +2 -2
- data/lib/mongo/socket/unix.rb +5 -8
- data/lib/mongo/socket.rb +11 -4
- data/lib/mongo/uri.rb +245 -139
- data/lib/mongo/version.rb +1 -1
- data/lib/mongo/write_concern.rb +21 -6
- data/lib/mongo.rb +4 -4
- data/mongo.gemspec +1 -2
- data/spec/mongo/address/unix_spec.rb +1 -1
- data/spec/mongo/address_spec.rb +25 -0
- data/spec/mongo/auth/ldap/conversation_spec.rb +43 -0
- data/spec/mongo/auth/user/view_spec.rb +26 -1
- data/spec/mongo/bulk_write/ordered_combiner_spec.rb +284 -0
- data/spec/mongo/bulk_write/unordered_combiner_spec.rb +239 -0
- data/spec/mongo/bulk_write_spec.rb +385 -161
- data/spec/mongo/client_spec.rb +193 -23
- data/spec/mongo/cluster/topology/replica_set_spec.rb +2 -0
- data/spec/mongo/collection/view/aggregation_spec.rb +65 -0
- data/spec/mongo/collection/view/builder/find_command_spec.rb +167 -0
- data/spec/mongo/collection/view/builder/flags_spec.rb +106 -0
- data/spec/mongo/collection/view/builder/modifiers_spec.rb +210 -0
- data/spec/mongo/collection/view/builder/op_query_spec.rb +154 -0
- data/spec/mongo/collection/view/explainable_spec.rb +1 -2
- data/spec/mongo/collection/view/immutable_spec.rb +54 -0
- data/spec/mongo/collection/view/map_reduce_spec.rb +104 -9
- data/spec/mongo/collection/view/readable_spec.rb +109 -112
- data/spec/mongo/collection/view_spec.rb +119 -487
- data/spec/mongo/collection_spec.rb +1002 -33
- data/spec/mongo/command_monitoring_spec.rb +64 -0
- data/spec/mongo/connection_string_spec.rb +115 -0
- data/spec/mongo/cursor/builder/get_more_command_spec.rb +160 -0
- data/spec/mongo/cursor/builder/op_get_more_spec.rb +52 -0
- data/spec/mongo/cursor_spec.rb +10 -60
- data/spec/mongo/database_spec.rb +81 -12
- data/spec/mongo/dbref_spec.rb +4 -4
- data/spec/mongo/grid/file/chunk_spec.rb +6 -6
- data/spec/mongo/grid/file/{metadata_spec.rb → info_spec.rb} +29 -17
- data/spec/mongo/grid/file_spec.rb +8 -8
- data/spec/mongo/grid/fs_bucket_spec.rb +1020 -0
- data/spec/mongo/grid/stream/read_spec.rb +275 -0
- data/spec/mongo/grid/stream/write_spec.rb +440 -0
- data/spec/mongo/grid/stream_spec.rb +48 -0
- data/spec/mongo/gridfs_spec.rb +50 -0
- data/spec/mongo/index/view_spec.rb +41 -0
- data/spec/mongo/logger_spec.rb +0 -40
- data/spec/mongo/monitoring/command_log_subscriber_spec.rb +76 -0
- data/spec/mongo/monitoring/event/command_started_spec.rb +26 -0
- data/spec/mongo/monitoring/event/command_succeeded_spec.rb +26 -0
- data/spec/mongo/monitoring/event/secure_spec.rb +57 -0
- data/spec/mongo/operation/{aggregate → commands/aggregate}/result_spec.rb +1 -1
- data/spec/mongo/operation/commands/aggregate_spec.rb +69 -0
- data/spec/mongo/operation/{read → commands}/collections_info_spec.rb +1 -1
- data/spec/mongo/operation/{command_spec.rb → commands/command_spec.rb} +1 -19
- data/spec/mongo/operation/{read → commands}/indexes_spec.rb +1 -1
- data/spec/mongo/operation/{map_reduce_spec.rb → commands/map_reduce_spec.rb} +1 -19
- data/spec/mongo/operation/kill_cursors_spec.rb +1 -17
- data/spec/mongo/operation/read/get_more_spec.rb +0 -16
- data/spec/mongo/operation/read/query_spec.rb +19 -16
- data/spec/mongo/operation/{read_preferrable_spec.rb → read_preference_spec.rb} +11 -11
- data/spec/mongo/operation/result_spec.rb +19 -0
- data/spec/mongo/operation/write/bulk/{bulk_delete_spec.rb → delete_spec.rb} +17 -28
- data/spec/mongo/operation/write/bulk/{bulk_insert_spec.rb → insert_spec.rb} +1 -12
- data/spec/mongo/operation/write/bulk/{bulk_update_spec.rb → update_spec.rb} +7 -18
- data/spec/mongo/operation/write/command/delete_spec.rb +18 -9
- data/spec/mongo/operation/write/command/insert_spec.rb +18 -9
- data/spec/mongo/operation/write/command/update_spec.rb +18 -9
- data/spec/mongo/operation/write/delete_spec.rb +3 -3
- data/spec/mongo/operation/write/insert_spec.rb +0 -11
- data/spec/mongo/operation/write/update_spec.rb +6 -6
- data/spec/mongo/options/redacted_spec.rb +350 -0
- data/spec/mongo/protocol/delete_spec.rb +4 -4
- data/spec/mongo/protocol/get_more_spec.rb +4 -4
- data/spec/mongo/protocol/insert_spec.rb +3 -3
- data/spec/mongo/protocol/kill_cursors_spec.rb +8 -6
- data/spec/mongo/protocol/query_spec.rb +21 -7
- data/spec/mongo/protocol/update_spec.rb +5 -5
- data/spec/mongo/retryable_spec.rb +221 -0
- data/spec/mongo/server/connection_pool/queue_spec.rb +16 -0
- data/spec/mongo/server/connection_pool_spec.rb +42 -6
- data/spec/mongo/server/connection_spec.rb +86 -1
- data/spec/mongo/server/description/features_spec.rb +25 -0
- data/spec/mongo/server/description_spec.rb +42 -0
- data/spec/mongo/server/monitor_spec.rb +44 -0
- data/spec/mongo/server_discovery_and_monitoring_spec.rb +25 -59
- data/spec/mongo/server_selection_rtt_spec.rb +37 -57
- data/spec/mongo/server_selection_spec.rb +5 -3
- data/spec/mongo/server_selector/nearest_spec.rb +35 -27
- data/spec/mongo/server_selector/primary_preferred_spec.rb +32 -30
- data/spec/mongo/server_selector/primary_spec.rb +21 -14
- data/spec/mongo/server_selector/secondary_preferred_spec.rb +28 -26
- data/spec/mongo/server_selector/secondary_spec.rb +24 -22
- data/spec/mongo/server_selector_spec.rb +87 -24
- data/spec/mongo/server_spec.rb +78 -15
- data/spec/mongo/socket/ssl_spec.rb +101 -57
- data/spec/mongo/socket/unix_spec.rb +52 -0
- data/spec/mongo/uri_spec.rb +271 -59
- data/spec/mongo/write_concern_spec.rb +126 -0
- data/spec/spec_helper.rb +29 -23
- data/spec/support/authorization.rb +4 -5
- data/spec/support/command_monitoring/bulkWrite.yml +73 -0
- data/spec/support/command_monitoring/command.yml +42 -0
- data/spec/support/command_monitoring/deleteMany.yml +55 -0
- data/spec/support/command_monitoring/deleteOne.yml +55 -0
- data/spec/support/command_monitoring/find.yml +268 -0
- data/spec/support/command_monitoring/insertMany.yml +81 -0
- data/spec/support/command_monitoring/insertOne.yml +51 -0
- data/spec/support/command_monitoring/updateMany.yml +67 -0
- data/spec/support/command_monitoring/updateOne.yml +95 -0
- data/spec/support/command_monitoring.rb +373 -0
- data/spec/support/connection_string.rb +228 -0
- data/spec/support/connection_string_tests/invalid-uris.yml +193 -0
- data/spec/support/connection_string_tests/valid-auth.yml +256 -0
- data/spec/support/connection_string_tests/valid-host_identifiers.yml +121 -0
- data/spec/support/connection_string_tests/valid-options.yml +30 -0
- data/spec/support/connection_string_tests/valid-unix_socket-absolute.yml +197 -0
- data/spec/support/connection_string_tests/valid-unix_socket-relative.yml +213 -0
- data/spec/support/connection_string_tests/valid-warnings.yml +55 -0
- data/spec/support/crud/read.rb +14 -10
- data/spec/support/crud/write.rb +36 -9
- data/spec/support/crud.rb +10 -2
- data/spec/support/gridfs.rb +637 -0
- data/spec/support/gridfs_tests/delete.yml +157 -0
- data/spec/support/gridfs_tests/download.yml +210 -0
- data/spec/support/gridfs_tests/download_by_name.yml +113 -0
- data/spec/support/gridfs_tests/upload.yml +158 -0
- data/spec/support/matchers.rb +2 -2
- data/spec/support/sdam/rs/equal_electionids.yml +1 -2
- data/spec/support/sdam/rs/new_primary_new_electionid.yml +0 -3
- data/spec/support/sdam/rs/primary_mismatched_me.yml +37 -0
- data/spec/support/sdam/rs/primary_to_no_primary_mismatched_me.yml +75 -0
- data/spec/support/sdam/rs/rsother_discovered.yml +24 -3
- data/spec/support/sdam/rs/secondary_mismatched_me.yml +37 -0
- data/spec/support/sdam/rs/stepdown_change_set_name.yml +59 -0
- data/spec/support/sdam/single/direct_connection_rsarbiter.yml +1 -1
- data/spec/support/sdam/single/direct_connection_rsprimary.yml +1 -1
- data/spec/support/sdam/single/direct_connection_rssecondary.yml +1 -1
- data/spec/support/sdam/single/direct_connection_slave.yml +1 -1
- data/spec/support/sdam/single/direct_connection_standalone.yml +1 -1
- data/spec/support/sdam/single/not_ok_response.yml +0 -1
- data/spec/support/server_discovery_and_monitoring.rb +3 -1
- data/spec/support/server_selection.rb +3 -1
- data/spec/support/shared/bulk_write.rb +192 -0
- data/spec/support/shared/protocol.rb +5 -5
- data/spec/support/shared/server_selector.rb +78 -13
- data/spec/support/travis.rb +1 -1
- data.tar.gz.sig +0 -0
- metadata +211 -72
- metadata.gz.sig +0 -0
- data/lib/mongo/bulk_write/bulk_writable.rb +0 -252
- data/lib/mongo/bulk_write/deletable.rb +0 -57
- data/lib/mongo/bulk_write/insertable.rb +0 -49
- data/lib/mongo/bulk_write/replacable.rb +0 -58
- data/lib/mongo/bulk_write/updatable.rb +0 -69
- data/lib/mongo/grid/fs.rb +0 -146
- data/lib/mongo/operation/aggregate/result.rb +0 -103
- data/lib/mongo/operation/aggregate.rb +0 -108
- data/lib/mongo/operation/command.rb +0 -61
- data/lib/mongo/operation/map_reduce/result.rb +0 -122
- data/lib/mongo/operation/map_reduce.rb +0 -95
- data/lib/mongo/operation/parallel_scan/result.rb +0 -72
- data/lib/mongo/operation/parallel_scan.rb +0 -76
- data/lib/mongo/operation/write/bulk/bulk_delete/result.rb +0 -75
- data/lib/mongo/operation/write/bulk/bulk_delete.rb +0 -145
- data/lib/mongo/operation/write/bulk/bulk_insert/result.rb +0 -130
- data/lib/mongo/operation/write/bulk/bulk_insert.rb +0 -132
- data/lib/mongo/operation/write/bulk/bulk_mergable.rb +0 -67
- data/lib/mongo/operation/write/bulk/bulk_update/result.rb +0 -174
- data/lib/mongo/operation/write/bulk/bulk_update.rb +0 -154
- data/lib/mongo/operation/write/bulk/legacy_bulk_mergable.rb +0 -83
- data/spec/mongo/grid/fs_spec.rb +0 -160
- data/spec/mongo/loggable_spec.rb +0 -63
- data/spec/mongo/operation/aggregate_spec.rb +0 -127
@@ -0,0 +1,132 @@
|
|
1
|
+
# Copyright (C) 2015 MongoDB, Inc.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
module Mongo
|
16
|
+
class BulkWrite
|
17
|
+
|
18
|
+
# Defines behaviour around transformations.
|
19
|
+
#
|
20
|
+
# @api private
|
21
|
+
#
|
22
|
+
# @since 2.1.0
|
23
|
+
module Transformable
|
24
|
+
|
25
|
+
# The delete many model constant.
|
26
|
+
#
|
27
|
+
# @since 2.1.0
|
28
|
+
DELETE_MANY = :delete_many.freeze
|
29
|
+
|
30
|
+
# The delete one model constant.
|
31
|
+
#
|
32
|
+
# @since 2.1.0
|
33
|
+
DELETE_ONE = :delete_one.freeze
|
34
|
+
|
35
|
+
# The insert one model constant.
|
36
|
+
#
|
37
|
+
# @since 2.1.0
|
38
|
+
INSERT_ONE = :insert_one.freeze
|
39
|
+
|
40
|
+
# The replace one model constant.
|
41
|
+
#
|
42
|
+
# @since 2.1.0
|
43
|
+
REPLACE_ONE = :replace_one.freeze
|
44
|
+
|
45
|
+
# The update many model constant.
|
46
|
+
#
|
47
|
+
# @since 2.1.0
|
48
|
+
UPDATE_MANY = :update_many.freeze
|
49
|
+
|
50
|
+
# The update one model constant.
|
51
|
+
#
|
52
|
+
# @since 2.1.0
|
53
|
+
UPDATE_ONE = :update_one.freeze
|
54
|
+
|
55
|
+
# Proc to transform delete many ops.
|
56
|
+
#
|
57
|
+
# @since 2.1.0
|
58
|
+
DELETE_MANY_TRANSFORM = ->(doc){
|
59
|
+
{ Operation::Q => doc[:filter], Operation::LIMIT => 0 }
|
60
|
+
}
|
61
|
+
|
62
|
+
# Proc to transform delete one ops.
|
63
|
+
#
|
64
|
+
# @since 2.1.0
|
65
|
+
DELETE_ONE_TRANSFORM = ->(doc){
|
66
|
+
{ Operation::Q => doc[:filter], Operation::LIMIT => 1 }
|
67
|
+
}
|
68
|
+
|
69
|
+
# Proc to transform insert one ops.
|
70
|
+
#
|
71
|
+
# @since 2.1.0
|
72
|
+
INSERT_ONE_TRANSFORM = ->(doc){
|
73
|
+
doc
|
74
|
+
}
|
75
|
+
|
76
|
+
# Proc to transfor replace one ops.
|
77
|
+
#
|
78
|
+
# @since 2.1.0
|
79
|
+
REPLACE_ONE_TRANSFORM = ->(doc){
|
80
|
+
{
|
81
|
+
Operation::Q => doc[:filter],
|
82
|
+
Operation::U => doc[:replacement],
|
83
|
+
Operation::MULTI => false,
|
84
|
+
Operation::UPSERT => doc.fetch(:upsert, false)
|
85
|
+
}
|
86
|
+
}
|
87
|
+
|
88
|
+
# Proc to transform update many ops.
|
89
|
+
#
|
90
|
+
# @since 2.1.0
|
91
|
+
UPDATE_MANY_TRANSFORM = ->(doc){
|
92
|
+
{
|
93
|
+
Operation::Q => doc[:filter],
|
94
|
+
Operation::U => doc[:update],
|
95
|
+
Operation::MULTI => true,
|
96
|
+
Operation::UPSERT => doc.fetch(:upsert, false)
|
97
|
+
}
|
98
|
+
}
|
99
|
+
|
100
|
+
# Proc to transform update one ops.
|
101
|
+
#
|
102
|
+
# @since 2.1.0
|
103
|
+
UPDATE_ONE_TRANSFORM = ->(doc){
|
104
|
+
{
|
105
|
+
Operation::Q => doc[:filter],
|
106
|
+
Operation::U => doc[:update],
|
107
|
+
Operation::MULTI => false,
|
108
|
+
Operation::UPSERT => doc.fetch(:upsert, false)
|
109
|
+
}
|
110
|
+
}
|
111
|
+
|
112
|
+
# Document mappers from the bulk api input into proper commands.
|
113
|
+
#
|
114
|
+
# @since 2.1.0
|
115
|
+
MAPPERS = {
|
116
|
+
DELETE_MANY => DELETE_MANY_TRANSFORM,
|
117
|
+
DELETE_ONE => DELETE_ONE_TRANSFORM,
|
118
|
+
INSERT_ONE => INSERT_ONE_TRANSFORM,
|
119
|
+
REPLACE_ONE => REPLACE_ONE_TRANSFORM,
|
120
|
+
UPDATE_MANY => UPDATE_MANY_TRANSFORM,
|
121
|
+
UPDATE_ONE => UPDATE_ONE_TRANSFORM
|
122
|
+
}.freeze
|
123
|
+
|
124
|
+
private
|
125
|
+
|
126
|
+
def transform(name, document)
|
127
|
+
validate(name, document)
|
128
|
+
MAPPERS[name].call(document)
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# Copyright (C) 2015 MongoDB, Inc.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
module Mongo
|
16
|
+
class BulkWrite
|
17
|
+
|
18
|
+
# Combines groups of bulk write operations in no order.
|
19
|
+
#
|
20
|
+
# @api private
|
21
|
+
#
|
22
|
+
# @since 2.1.0
|
23
|
+
class UnorderedCombiner
|
24
|
+
include Transformable
|
25
|
+
include Validatable
|
26
|
+
include Combineable
|
27
|
+
|
28
|
+
# Combine the requests in order.
|
29
|
+
#
|
30
|
+
# @api private
|
31
|
+
#
|
32
|
+
# @example Combine the requests.
|
33
|
+
# combiner.combine
|
34
|
+
#
|
35
|
+
# @return [ Array<Hash> ] The combined requests.
|
36
|
+
#
|
37
|
+
# @since 2.1.0
|
38
|
+
def combine
|
39
|
+
combine_requests({}).map do |name, ops|
|
40
|
+
{ name => ops }
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def add(operations, name, document)
|
47
|
+
(operations[name] ||= []).push(transform(name, document))
|
48
|
+
operations
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
# Copyright (C) 2015 MongoDB, Inc.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
module Mongo
|
16
|
+
class BulkWrite
|
17
|
+
|
18
|
+
# Defines behaviour around validations.
|
19
|
+
#
|
20
|
+
# @api private
|
21
|
+
#
|
22
|
+
# @since 2.1.0
|
23
|
+
module Validatable
|
24
|
+
|
25
|
+
# Validate the document.
|
26
|
+
#
|
27
|
+
# @api private
|
28
|
+
#
|
29
|
+
# @example Validate the document.
|
30
|
+
# validatable.validate(:insert_one, { _id: 0 })
|
31
|
+
#
|
32
|
+
# @param [ Symbol ] name The operation name.
|
33
|
+
# @param [ Hash, BSON::Document ] document The document.
|
34
|
+
#
|
35
|
+
# @raise [ InvalidBulkOperation ] If not valid.
|
36
|
+
#
|
37
|
+
# @return [ Hash, BSON::Document ] The document.
|
38
|
+
#
|
39
|
+
# @since 2.1.0
|
40
|
+
def validate(name, document)
|
41
|
+
validate_operation(name)
|
42
|
+
validate_document(name, document)
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
def validate_document(name, document)
|
48
|
+
if document.respond_to?(:keys) || document.respond_to?(:data)
|
49
|
+
document
|
50
|
+
else
|
51
|
+
raise Error::InvalidBulkOperation.new(name, document)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def validate_operation(name)
|
56
|
+
unless Transformable::MAPPERS.key?(name)
|
57
|
+
raise Error::InvalidBulkOperationType.new(name)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
data/lib/mongo/bulk_write.rb
CHANGED
@@ -12,42 +12,183 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
|
15
|
-
require 'mongo/bulk_write/bulk_writable'
|
16
|
-
require 'mongo/bulk_write/ordered_bulk_write'
|
17
|
-
require 'mongo/bulk_write/unordered_bulk_write'
|
18
15
|
require 'mongo/bulk_write/result'
|
16
|
+
require 'mongo/bulk_write/transformable'
|
17
|
+
require 'mongo/bulk_write/validatable'
|
18
|
+
require 'mongo/bulk_write/combineable'
|
19
|
+
require 'mongo/bulk_write/ordered_combiner'
|
20
|
+
require 'mongo/bulk_write/unordered_combiner'
|
21
|
+
require 'mongo/bulk_write/result_combiner'
|
19
22
|
|
20
23
|
module Mongo
|
21
|
-
|
22
|
-
extend
|
24
|
+
class BulkWrite
|
25
|
+
extend Forwardable
|
26
|
+
include Retryable
|
23
27
|
|
24
|
-
#
|
28
|
+
# @return [ Mongo::Collection ] collection The collection.
|
29
|
+
attr_reader :collection
|
30
|
+
|
31
|
+
# @return [ Array<Hash, BSON::Document> ] requests The requests.
|
32
|
+
attr_reader :requests
|
33
|
+
|
34
|
+
# @return [ Hash, BSON::Document ] options The options.
|
35
|
+
attr_reader :options
|
36
|
+
|
37
|
+
# Delegate various methods to the collection.
|
38
|
+
def_delegators :@collection, :database, :cluster, :next_primary
|
39
|
+
|
40
|
+
def_delegators :database, :client
|
41
|
+
|
42
|
+
# Execute the bulk write operation.
|
43
|
+
#
|
44
|
+
# @example Execute the bulk write.
|
45
|
+
# bulk_write.execute
|
46
|
+
#
|
47
|
+
# @return [ Mongo::BulkWrite::Result ] The result.
|
48
|
+
#
|
49
|
+
# @since 2.1.0
|
50
|
+
def execute
|
51
|
+
operation_id = Monitoring.next_operation_id
|
52
|
+
result_combiner = ResultCombiner.new
|
53
|
+
write_with_retry do
|
54
|
+
server = next_primary
|
55
|
+
operations.each do |operation|
|
56
|
+
execute_operation(
|
57
|
+
operation.keys.first,
|
58
|
+
operation.values.first,
|
59
|
+
server,
|
60
|
+
operation_id,
|
61
|
+
result_combiner
|
62
|
+
)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
result_combiner.result
|
66
|
+
end
|
67
|
+
|
68
|
+
# Create the new bulk write operation.
|
69
|
+
#
|
70
|
+
# @api private
|
71
|
+
#
|
72
|
+
# @example Create an ordered bulk write.
|
73
|
+
# Mongo::BulkWrite.new(collection, [{ insert_one: { _id: 1 }}])
|
74
|
+
#
|
75
|
+
# @example Create an unordered bulk write.
|
76
|
+
# Mongo::BulkWrite.new(collection, [{ insert_one: { _id: 1 }}], ordered: false)
|
77
|
+
#
|
78
|
+
# @example Create an ordered mixed bulk write.
|
79
|
+
# Mongo::BulkWrite.new(
|
80
|
+
# collection,
|
81
|
+
# [
|
82
|
+
# { insert_one: { _id: 1 }},
|
83
|
+
# { update_one: { filter: { _id: 0 }, update: { '$set' => { name: 'test' }}}},
|
84
|
+
# { delete_one: { filter: { _id: 2 }}}
|
85
|
+
# ]
|
86
|
+
# )
|
87
|
+
#
|
88
|
+
# @param [ Mongo::Collection ] collection The collection.
|
89
|
+
# @param [ Array<Hash, BSON::Document> ] requests The requests.
|
90
|
+
# @param [ Hash, BSON::Document ] options The options.
|
91
|
+
#
|
92
|
+
# @since 2.1.0
|
93
|
+
def initialize(collection, requests, options = {})
|
94
|
+
@collection = collection
|
95
|
+
@requests = requests
|
96
|
+
@options = options || {}
|
97
|
+
end
|
98
|
+
|
99
|
+
# Is the bulk write ordered?
|
100
|
+
#
|
101
|
+
# @api private
|
25
102
|
#
|
26
|
-
# @example
|
27
|
-
#
|
103
|
+
# @example Is the bulk write ordered?
|
104
|
+
# bulk_write.ordered?
|
28
105
|
#
|
29
|
-
# @
|
30
|
-
# will be executed.
|
106
|
+
# @return [ true, false ] If the bulk write is ordered.
|
31
107
|
#
|
32
|
-
# @
|
108
|
+
# @since 2.1.0
|
109
|
+
def ordered?
|
110
|
+
@ordered ||= options.fetch(:ordered, true)
|
111
|
+
end
|
112
|
+
|
113
|
+
# Get the write concern for the bulk write.
|
33
114
|
#
|
34
|
-
# @
|
115
|
+
# @api private
|
35
116
|
#
|
36
|
-
# @
|
37
|
-
#
|
38
|
-
# @option options [ Hash ] :write_concern The write concern options.
|
39
|
-
# Can be :w => Integer, :fsync => Boolean, :j => Boolean.
|
117
|
+
# @example Get the write concern.
|
118
|
+
# bulk_write.write_concern
|
40
119
|
#
|
41
|
-
# @return [
|
42
|
-
# write object.
|
120
|
+
# @return [ WriteConcern ] The write concern.
|
43
121
|
#
|
44
|
-
# @since 2.
|
45
|
-
def
|
46
|
-
|
47
|
-
|
122
|
+
# @since 2.1.0
|
123
|
+
def write_concern
|
124
|
+
@write_concern ||= options[:write_concern] ?
|
125
|
+
WriteConcern.get(options[:write_concern]) : collection.write_concern
|
126
|
+
end
|
127
|
+
|
128
|
+
private
|
129
|
+
|
130
|
+
def base_spec(operation_id)
|
131
|
+
{
|
132
|
+
:db_name => database.name,
|
133
|
+
:coll_name => collection.name,
|
134
|
+
:write_concern => write_concern,
|
135
|
+
:ordered => ordered?,
|
136
|
+
:operation_id => operation_id,
|
137
|
+
:bypass_document_validation => !!options[:bypass_document_validation],
|
138
|
+
:options => options,
|
139
|
+
:id_generator => client.options[:id_generator]
|
140
|
+
}
|
141
|
+
end
|
142
|
+
|
143
|
+
def execute_operation(name, values, server, operation_id, combiner)
|
144
|
+
begin
|
145
|
+
if values.size > server.max_write_batch_size
|
146
|
+
split_execute(name, values, server, operation_id, combiner)
|
147
|
+
else
|
148
|
+
combiner.combine!(send(name, values, server, operation_id), values.size)
|
149
|
+
end
|
150
|
+
rescue Error::MaxBSONSize, Error::MaxMessageSize => e
|
151
|
+
raise e if values.size <= 1
|
152
|
+
split_execute(name, values, server, operation_id, combiner)
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
def operations
|
157
|
+
if ordered?
|
158
|
+
OrderedCombiner.new(requests).combine
|
48
159
|
else
|
49
|
-
|
160
|
+
UnorderedCombiner.new(requests).combine
|
50
161
|
end
|
51
162
|
end
|
163
|
+
|
164
|
+
def split_execute(name, values, server, operation_id, combiner)
|
165
|
+
execute_operation(name, values.shift(values.size / 2), server, operation_id, combiner)
|
166
|
+
execute_operation(name, values, server, operation_id, combiner)
|
167
|
+
end
|
168
|
+
|
169
|
+
def delete(documents, server, operation_id)
|
170
|
+
Operation::Write::Bulk::Delete.new(
|
171
|
+
base_spec(operation_id).merge(:deletes => documents)
|
172
|
+
).execute(server.context)
|
173
|
+
end
|
174
|
+
|
175
|
+
alias :delete_one :delete
|
176
|
+
alias :delete_many :delete
|
177
|
+
|
178
|
+
def insert_one(documents, server, operation_id)
|
179
|
+
Operation::Write::Bulk::Insert.new(
|
180
|
+
base_spec(operation_id).merge(:documents => documents)
|
181
|
+
).execute(server.context)
|
182
|
+
end
|
183
|
+
|
184
|
+
def update(documents, server, operation_id)
|
185
|
+
Operation::Write::Bulk::Update.new(
|
186
|
+
base_spec(operation_id).merge(:updates => documents)
|
187
|
+
).execute(server.context)
|
188
|
+
end
|
189
|
+
|
190
|
+
alias :replace_one :update
|
191
|
+
alias :update_one :update
|
192
|
+
alias :update_many :update
|
52
193
|
end
|
53
194
|
end
|
data/lib/mongo/client.rb
CHANGED
@@ -20,6 +20,7 @@ module Mongo
|
|
20
20
|
# @since 2.0.0
|
21
21
|
class Client
|
22
22
|
extend Forwardable
|
23
|
+
include Loggable
|
23
24
|
|
24
25
|
# The options that do not affect the behaviour of a cluster and its
|
25
26
|
# subcomponents.
|
@@ -27,6 +28,42 @@ module Mongo
|
|
27
28
|
# @since 2.1.0
|
28
29
|
CRUD_OPTIONS = [ :database, :read, :write ].freeze
|
29
30
|
|
31
|
+
# Valid client options.
|
32
|
+
#
|
33
|
+
# @since 2.1.2
|
34
|
+
VALID_OPTIONS = [
|
35
|
+
:auth_mech,
|
36
|
+
:auth_mech_properties,
|
37
|
+
:auth_source,
|
38
|
+
:connect,
|
39
|
+
:connect_timeout,
|
40
|
+
:database,
|
41
|
+
:heartbeat_frequency,
|
42
|
+
:id_generator,
|
43
|
+
:local_threshold,
|
44
|
+
:logger,
|
45
|
+
:max_pool_size,
|
46
|
+
:max_read_retries,
|
47
|
+
:min_pool_size,
|
48
|
+
:monitoring,
|
49
|
+
:password,
|
50
|
+
:read,
|
51
|
+
:read_retry_interval,
|
52
|
+
:replica_set,
|
53
|
+
:server_selection_timeout,
|
54
|
+
:socket_timeout,
|
55
|
+
:ssl,
|
56
|
+
:ssl_ca_cert,
|
57
|
+
:ssl_cert,
|
58
|
+
:ssl_key,
|
59
|
+
:ssl_key_pass_phrase,
|
60
|
+
:ssl_verify,
|
61
|
+
:truncate_logs,
|
62
|
+
:user,
|
63
|
+
:wait_queue_timeout,
|
64
|
+
:write
|
65
|
+
].freeze
|
66
|
+
|
30
67
|
# @return [ Mongo::Cluster ] cluster The cluster of servers for the client.
|
31
68
|
attr_reader :cluster
|
32
69
|
|
@@ -36,8 +73,8 @@ module Mongo
|
|
36
73
|
# @return [ Hash ] options The configuration options.
|
37
74
|
attr_reader :options
|
38
75
|
|
39
|
-
# Delegate command execution to the current database.
|
40
|
-
def_delegators :@database, :command
|
76
|
+
# Delegate command and collections execution to the current database.
|
77
|
+
def_delegators :@database, :command, :collections
|
41
78
|
|
42
79
|
# Delegate subscription to monitoring.
|
43
80
|
def_delegators :@monitoring, :subscribe, :unsubscribe
|
@@ -122,11 +159,9 @@ module Mongo
|
|
122
159
|
# attempt a connection.
|
123
160
|
# @option options [ Hash ] :read The read preference options. They consist of a
|
124
161
|
# mode specified as a symbol, an array of hashes known as tag_sets,
|
125
|
-
# and
|
162
|
+
# and local_threshold.
|
126
163
|
# :mode can be one of :secondary, :secondary_preferred, :primary,
|
127
164
|
# :primary_preferred, :nearest.
|
128
|
-
# @option options [ Array<Hash, String> ] :roles The list of roles for the
|
129
|
-
# user.
|
130
165
|
# @option options [ Symbol ] :replica_set The name of the replica set to
|
131
166
|
# connect to. Servers not in this replica set will be ignored.
|
132
167
|
# @option options [ true, false ] :ssl Whether to use SSL.
|
@@ -145,17 +180,26 @@ module Mongo
|
|
145
180
|
# execute operations on a socket.
|
146
181
|
# @option options [ String ] :user The user name.
|
147
182
|
# @option options [ Hash ] :write The write concern options. Can be :w =>
|
148
|
-
# Integer, :fsync => Boolean, :j => Boolean.
|
183
|
+
# Integer|String, :fsync => Boolean, :j => Boolean.
|
149
184
|
# @option options [ true, false ] :monitoring Initializes a client without
|
150
185
|
# any default monitoring if false is provided.
|
186
|
+
# @option options [ Logger ] :logger A custom logger if desired.
|
187
|
+
# @option options [ true, false ] :truncate_logs Whether to truncate the
|
188
|
+
# logs at the default 250 characters.
|
189
|
+
# @option options [ Integer ] :max_read_retries The maximum number of read
|
190
|
+
# retries on mongos query failures.
|
191
|
+
# @option options [ Float ] :read_retry_interval The interval, in seconds,
|
192
|
+
# in which reads on a mongos are retried.
|
193
|
+
# @option options [ Object ] :id_generator A custom object to generate ids
|
194
|
+
# for documents. Must respond to #generate.
|
151
195
|
#
|
152
196
|
# @since 2.0.0
|
153
|
-
def initialize(addresses_or_uri, options =
|
197
|
+
def initialize(addresses_or_uri, options = Options::Redacted.new)
|
154
198
|
@monitoring = Monitoring.new(options)
|
155
199
|
if addresses_or_uri.is_a?(::String)
|
156
|
-
create_from_uri(addresses_or_uri, options)
|
200
|
+
create_from_uri(addresses_or_uri, validate_options(options))
|
157
201
|
else
|
158
|
-
create_from_addresses(addresses_or_uri, options)
|
202
|
+
create_from_addresses(addresses_or_uri, validate_options(options))
|
159
203
|
end
|
160
204
|
yield(self) if block_given?
|
161
205
|
end
|
@@ -182,7 +226,7 @@ module Mongo
|
|
182
226
|
#
|
183
227
|
# @since 2.0.0
|
184
228
|
def read_preference
|
185
|
-
@read_preference ||= ServerSelector.get(options[:read] || {}
|
229
|
+
@read_preference ||= ServerSelector.get(Options::Redacted.new(options[:read] || {}).merge(options))
|
186
230
|
end
|
187
231
|
|
188
232
|
# Use the database with the provided name. This will switch the current
|
@@ -212,9 +256,9 @@ module Mongo
|
|
212
256
|
# @return [ Mongo::Client ] A new client instance.
|
213
257
|
#
|
214
258
|
# @since 2.0.0
|
215
|
-
def with(new_options =
|
259
|
+
def with(new_options = Options::Redacted.new)
|
216
260
|
clone.tap do |client|
|
217
|
-
opts = new_options
|
261
|
+
opts = validate_options(new_options)
|
218
262
|
client.options.update(opts)
|
219
263
|
Database.create(client)
|
220
264
|
# We can't use the same cluster if some options that would affect it
|
@@ -271,7 +315,7 @@ module Mongo
|
|
271
315
|
#
|
272
316
|
# @since 2.0.5
|
273
317
|
def database_names
|
274
|
-
list_databases.collect{ |info| info[
|
318
|
+
list_databases.collect{ |info| info[Database::NAME] }
|
275
319
|
end
|
276
320
|
|
277
321
|
# Get info for each database.
|
@@ -283,19 +327,19 @@ module Mongo
|
|
283
327
|
#
|
284
328
|
# @since 2.0.5
|
285
329
|
def list_databases
|
286
|
-
use(Database::ADMIN).command(listDatabases: 1).first[
|
330
|
+
use(Database::ADMIN).command(listDatabases: 1).first[Database::DATABASES]
|
287
331
|
end
|
288
332
|
|
289
333
|
private
|
290
334
|
|
291
|
-
def create_from_addresses(addresses, opts =
|
335
|
+
def create_from_addresses(addresses, opts = Options::Redacted.new)
|
292
336
|
@options = Database::DEFAULT_OPTIONS.merge(opts).freeze
|
293
337
|
@cluster = Cluster.new(addresses, @monitoring, options)
|
294
338
|
@database = Database.new(self, options[:database], options)
|
295
339
|
end
|
296
340
|
|
297
|
-
def create_from_uri(connection_string, opts =
|
298
|
-
uri = URI.new(connection_string)
|
341
|
+
def create_from_uri(connection_string, opts = Options::Redacted.new)
|
342
|
+
uri = URI.new(connection_string, opts)
|
299
343
|
@options = Database::DEFAULT_OPTIONS.merge(uri.client_options.merge(opts)).freeze
|
300
344
|
@cluster = Cluster.new(uri.servers, @monitoring, options)
|
301
345
|
@database = Database.new(self, options[:database], options)
|
@@ -303,6 +347,7 @@ module Mongo
|
|
303
347
|
|
304
348
|
def initialize_copy(original)
|
305
349
|
@options = original.options.dup
|
350
|
+
@monitoring = Monitoring.new(@options)
|
306
351
|
@database = nil
|
307
352
|
@read_preference = nil
|
308
353
|
@write_concern = nil
|
@@ -310,11 +355,23 @@ module Mongo
|
|
310
355
|
|
311
356
|
def cluster_modifying?(new_options)
|
312
357
|
cluster_options = new_options.reject do |name|
|
313
|
-
CRUD_OPTIONS.include?(name)
|
358
|
+
CRUD_OPTIONS.include?(name.to_sym)
|
314
359
|
end
|
315
360
|
cluster_options.any? do |name, value|
|
316
361
|
options[name] != value
|
317
362
|
end
|
318
363
|
end
|
364
|
+
|
365
|
+
def validate_options(opts = Options::Redacted.new)
|
366
|
+
return Options::Redacted.new unless opts
|
367
|
+
Options::Redacted.new(opts.select do |o|
|
368
|
+
if VALID_OPTIONS.include?(o)
|
369
|
+
true
|
370
|
+
else
|
371
|
+
log_warn("Unsupported client option '#{o}'. It will be ignored.")
|
372
|
+
false
|
373
|
+
end
|
374
|
+
end)
|
375
|
+
end
|
319
376
|
end
|
320
377
|
end
|
@@ -61,7 +61,7 @@ module Mongo
|
|
61
61
|
def elect_primary(description, servers)
|
62
62
|
if description.replica_set_name == replica_set_name
|
63
63
|
unless detect_stale_primary!(description)
|
64
|
-
log_debug(
|
64
|
+
log_debug("Server #{description.address.to_s} elected as primary in #{replica_set_name}.")
|
65
65
|
servers.each do |server|
|
66
66
|
if server.primary? && server.address != description.address
|
67
67
|
server.description.unknown!
|
@@ -70,9 +70,10 @@ module Mongo
|
|
70
70
|
update_max_election_id(description)
|
71
71
|
end
|
72
72
|
else
|
73
|
-
log_warn(
|
74
|
-
"Server #{description.address.to_s}
|
75
|
-
|
73
|
+
log_warn(
|
74
|
+
"Server #{description.address.to_s} has incorrect replica set name: " +
|
75
|
+
"'#{description.replica_set_name}'. The current replica set name is '#{replica_set_name}'."
|
76
|
+
)
|
76
77
|
end
|
77
78
|
self
|
78
79
|
end
|
@@ -157,8 +158,9 @@ module Mongo
|
|
157
158
|
def remove_hosts?(description)
|
158
159
|
!description.config.empty? &&
|
159
160
|
(description.primary? ||
|
160
|
-
description.
|
161
|
-
|
161
|
+
description.me_mismatch? ||
|
162
|
+
description.hosts.empty? ||
|
163
|
+
!member_of_this_set?(description))
|
162
164
|
end
|
163
165
|
|
164
166
|
# Whether a specific server in the cluster can be removed, given a description.
|
@@ -55,7 +55,7 @@ module Mongo
|
|
55
55
|
# @return [ Sharded, ReplicaSet ] The new topology.
|
56
56
|
def elect_primary(description, servers)
|
57
57
|
if description.mongos?
|
58
|
-
log_debug(
|
58
|
+
log_debug("Mongos #{description.address.to_s} discovered.")
|
59
59
|
Sharded.new(options)
|
60
60
|
else
|
61
61
|
initialize_replica_set(description, servers)
|
@@ -204,7 +204,10 @@ module Mongo
|
|
204
204
|
private
|
205
205
|
|
206
206
|
def initialize_replica_set(description, servers)
|
207
|
-
log_debug(
|
207
|
+
log_debug(
|
208
|
+
"Server #{description.address.to_s} discovered as primary in replica set: " +
|
209
|
+
"'#{description.replica_set_name}'. Changing topology to replica set."
|
210
|
+
)
|
208
211
|
servers.each do |server|
|
209
212
|
if server.standalone? && server.address != description.address
|
210
213
|
server.description.unknown!
|