mongo 2.0.6 → 2.1.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 +5 -2
- data/lib/mongo/address/ipv4.rb +6 -1
- data/lib/mongo/address/unix.rb +2 -2
- data/lib/mongo/address.rb +18 -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 +191 -0
- 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 +159 -23
- data/lib/mongo/client.rb +52 -16
- data/lib/mongo/cluster/topology/replica_set.rb +27 -9
- data/lib/mongo/cluster/topology/sharded.rb +1 -1
- data/lib/mongo/cluster/topology/unknown.rb +5 -2
- data/lib/mongo/cluster.rb +42 -7
- data/lib/mongo/collection/view/aggregation.rb +48 -9
- data/lib/mongo/collection/view/immutable.rb +6 -6
- data/lib/mongo/collection/view/iterable.rb +18 -4
- data/lib/mongo/collection/view/map_reduce.rb +58 -17
- data/lib/mongo/collection/view/readable.rb +173 -42
- data/lib/mongo/collection/view/writable.rb +37 -23
- data/lib/mongo/collection/view.rb +2 -2
- data/lib/mongo/collection.rb +370 -33
- data/lib/mongo/cursor.rb +15 -3
- data/lib/mongo/database/view.rb +5 -4
- data/lib/mongo/database.rb +14 -4
- data/lib/mongo/dbref.rb +113 -0
- data/lib/mongo/error/closed_stream.rb +34 -0
- data/lib/mongo/error/extra_file_chunk.rb +34 -0
- data/lib/mongo/error/{invalid_uri_option.rb → file_not_found.rb} +11 -12
- 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/missing_file_chunk.rb +38 -0
- data/lib/mongo/error/operation_failure.rb +1 -1
- data/lib/mongo/error/parser.rb +1 -1
- 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 +13 -2
- data/lib/mongo/event/description_changed.rb +1 -1
- data/lib/mongo/grid/file/chunk.rb +6 -6
- data/lib/mongo/grid/file/{metadata.rb → info.rb} +41 -39
- data/lib/mongo/grid/file.rb +13 -10
- 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 +3 -3
- 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 +112 -0
- data/lib/mongo/monitoring/event/command_failed.rb +96 -0
- data/lib/mongo/monitoring/event/command_started.rb +89 -0
- data/lib/mongo/monitoring/event/command_succeeded.rb +118 -0
- data/lib/mongo/monitoring/event/secure.rb +58 -0
- data/lib/mongo/monitoring/event.rb +18 -0
- data/lib/mongo/monitoring/publishable.rb +106 -0
- data/lib/mongo/monitoring.rb +195 -0
- data/lib/mongo/operation/{aggregate.rb → commands/aggregate.rb} +3 -41
- data/lib/mongo/operation/commands/collections_info/result.rb +39 -0
- data/lib/mongo/operation/commands/collections_info.rb +68 -0
- data/lib/mongo/operation/{command.rb → commands/command.rb} +2 -18
- data/lib/mongo/operation/commands/indexes.rb +70 -0
- data/lib/mongo/operation/commands/list_collections/result.rb +112 -0
- data/lib/mongo/operation/commands/list_collections.rb +54 -0
- data/lib/mongo/operation/commands/list_indexes/result.rb +116 -0
- data/lib/mongo/operation/commands/list_indexes.rb +56 -0
- data/lib/mongo/operation/{map_reduce → commands/map_reduce}/result.rb +1 -1
- data/lib/mongo/operation/{map_reduce.rb → commands/map_reduce.rb} +3 -41
- data/lib/mongo/operation/commands/parallel_scan/result.rb +72 -0
- data/lib/mongo/operation/commands/parallel_scan.rb +56 -0
- data/lib/mongo/operation/commands/user_query.rb +69 -0
- data/lib/mongo/{bulk_write/ordered_bulk_write.rb → operation/commands/users_info/result.rb} +18 -30
- data/lib/mongo/operation/commands/users_info.rb +53 -0
- data/lib/mongo/operation/commands.rb +24 -0
- data/lib/mongo/operation/executable.rb +4 -68
- data/lib/mongo/operation/kill_cursors.rb +3 -3
- data/lib/mongo/operation/read/get_more.rb +2 -22
- data/lib/mongo/{bulk_write/unordered_bulk_write.rb → operation/read/query/result.rb} +20 -26
- 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 +13 -1
- data/lib/mongo/operation/specifiable.rb +42 -0
- data/lib/mongo/operation/write/bulk/bulkable.rb +82 -0
- data/lib/mongo/operation/write/bulk/delete/result.rb +74 -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 +0 -1
- data/lib/mongo/operation/write/command/drop_index.rb +0 -1
- data/lib/mongo/operation/write/command/insert.rb +0 -1
- data/lib/mongo/operation/write/command/remove_user.rb +0 -1
- data/lib/mongo/operation/write/command/update.rb +0 -1
- 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 +48 -0
- data/lib/mongo/operation/write/idable.rb +5 -0
- 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 +32 -4
- data/lib/mongo/options/mapper.rb +4 -2
- data/lib/mongo/options/redacted.rb +156 -0
- data/lib/mongo/options.rb +1 -0
- data/lib/mongo/protocol/delete.rb +75 -15
- data/lib/mongo/protocol/get_more.rb +65 -13
- data/lib/mongo/protocol/insert.rb +85 -13
- data/lib/mongo/protocol/kill_cursors.rb +59 -14
- data/lib/mongo/protocol/message.rb +12 -12
- data/lib/mongo/protocol/query.rb +163 -37
- data/lib/mongo/protocol/reply.rb +103 -0
- data/lib/mongo/protocol/serializers.rb +1 -1
- data/lib/mongo/protocol/update.rb +82 -14
- data/lib/mongo/retryable.rb +83 -0
- data/lib/mongo/server/connectable.rb +21 -25
- data/lib/mongo/server/connection.rb +75 -4
- data/lib/mongo/server/connection_pool/queue.rb +15 -0
- data/lib/mongo/server/connection_pool.rb +12 -0
- data/lib/mongo/server/description/features.rb +2 -1
- data/lib/mongo/server/description.rb +52 -1
- data/lib/mongo/server/monitor/connection.rb +26 -2
- data/lib/mongo/server/monitor.rb +19 -3
- data/lib/mongo/server.rb +39 -5
- data/lib/mongo/server_selector/selectable.rb +40 -31
- data/lib/mongo/server_selector.rb +19 -10
- data/lib/mongo/socket/ssl.rb +28 -16
- data/lib/mongo/socket/tcp.rb +3 -3
- data/lib/mongo/socket/unix.rb +5 -8
- data/lib/mongo/socket.rb +11 -4
- data/lib/mongo/uri.rb +248 -137
- data/lib/mongo/version.rb +1 -1
- data/lib/mongo.rb +5 -3
- data/spec/mongo/address/unix_spec.rb +1 -1
- data/spec/mongo/address_spec.rb +25 -0
- data/spec/mongo/auth/cr_spec.rb +9 -1
- data/spec/mongo/auth/ldap/conversation_spec.rb +43 -0
- data/spec/mongo/auth/ldap_spec.rb +9 -1
- data/spec/mongo/auth/scram_spec.rb +9 -1
- data/spec/mongo/auth/user/view_spec.rb +26 -1
- data/spec/mongo/auth/x509_spec.rb +9 -1
- data/spec/mongo/bulk_write/ordered_combiner_spec.rb +271 -0
- data/spec/mongo/bulk_write/unordered_combiner_spec.rb +239 -0
- data/spec/mongo/bulk_write_spec.rb +428 -0
- data/spec/mongo/client_spec.rb +167 -17
- data/spec/mongo/cluster/topology/replica_set_spec.rb +18 -9
- data/spec/mongo/cluster/topology/sharded_spec.rb +11 -3
- data/spec/mongo/cluster/topology/single_spec.rb +12 -4
- data/spec/mongo/cluster_spec.rb +55 -10
- data/spec/mongo/collection/view/aggregation_spec.rb +188 -1
- data/spec/mongo/collection/view/explainable_spec.rb +1 -1
- data/spec/mongo/collection/view/immutable_spec.rb +103 -0
- data/spec/mongo/collection/view/map_reduce_spec.rb +99 -4
- data/spec/mongo/collection/view/readable_spec.rb +238 -6
- data/spec/mongo/collection/view/writable_spec.rb +4 -4
- data/spec/mongo/collection/view_spec.rb +459 -71
- data/spec/mongo/collection_spec.rb +1291 -9
- data/spec/mongo/command_monitoring_spec.rb +51 -0
- data/spec/mongo/connection_string_spec.rb +115 -0
- data/spec/mongo/crud_spec.rb +2 -2
- data/spec/mongo/cursor_spec.rb +3 -3
- data/spec/mongo/database_spec.rb +47 -11
- data/spec/mongo/dbref_spec.rb +149 -0
- data/spec/mongo/grid/file/chunk_spec.rb +5 -5
- 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/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/monitoring_spec.rb +168 -0
- 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} +0 -18
- 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/write/bulk/{bulk_delete_spec.rb → delete_spec.rb} +18 -29
- data/spec/mongo/operation/write/bulk/{bulk_insert_spec.rb → insert_spec.rb} +3 -14
- data/spec/mongo/operation/write/bulk/{bulk_update_spec.rb → update_spec.rb} +8 -19
- data/spec/mongo/operation/write/command/delete_spec.rb +0 -16
- data/spec/mongo/operation/write/command/insert_spec.rb +0 -16
- data/spec/mongo/operation/write/command/update_spec.rb +0 -16
- data/spec/mongo/operation/write/delete_spec.rb +4 -4
- data/spec/mongo/operation/write/insert_spec.rb +2 -13
- data/spec/mongo/operation/write/update_spec.rb +7 -7
- data/spec/mongo/options/redacted_spec.rb +350 -0
- data/spec/mongo/protocol/kill_cursors_spec.rb +5 -3
- data/spec/mongo/protocol/query_spec.rb +15 -30
- data/spec/mongo/retryable_spec.rb +147 -0
- data/spec/mongo/server/connection_pool/queue_spec.rb +16 -0
- data/spec/mongo/server/connection_pool_spec.rb +50 -6
- data/spec/mongo/server/connection_spec.rb +49 -4
- data/spec/mongo/server/description_spec.rb +49 -3
- data/spec/mongo/server/monitor_spec.rb +51 -0
- data/spec/mongo/server_discovery_and_monitoring_spec.rb +32 -59
- data/spec/mongo/server_selection_rtt_spec.rb +37 -57
- data/spec/mongo/server_selection_spec.rb +19 -9
- 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 +94 -8
- data/spec/mongo/socket/ssl_spec.rb +123 -13
- data/spec/mongo/socket/unix_spec.rb +52 -0
- data/spec/mongo/uri_spec.rb +295 -67
- data/spec/spec_helper.rb +40 -24
- data/spec/support/authorization.rb +23 -9
- data/spec/support/certificates/client.pem +4 -4
- 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 +219 -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 +365 -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 +22 -19
- data/spec/support/crud/write.rb +58 -27
- 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 +1 -1
- data/spec/support/sdam/rs/equal_electionids.yml +44 -0
- data/spec/support/sdam/rs/new_primary_new_electionid.yml +95 -0
- data/spec/support/sdam/rs/null_election_id.yml +144 -0
- data/spec/support/sdam/rs/primary_disconnect_electionid.yml +124 -0
- 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/secondary_mismatched_me.yml +37 -0
- data/spec/support/sdam/sharded/mongos_disconnect.yml +104 -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 +22 -3
- data/spec/support/server_selection.rb +3 -1
- data/spec/support/shared/bulk_write.rb +218 -22
- data/spec/support/shared/server_selector.rb +80 -14
- data.tar.gz.sig +0 -0
- metadata +188 -59
- metadata.gz.sig +0 -0
- data/lib/mongo/bulk_write/bulk_writable.rb +0 -196
- data/lib/mongo/bulk_write/deletable.rb +0 -56
- data/lib/mongo/bulk_write/insertable.rb +0 -48
- data/lib/mongo/bulk_write/replacable.rb +0 -57
- data/lib/mongo/bulk_write/updatable.rb +0 -68
- data/lib/mongo/grid/fs.rb +0 -149
- data/lib/mongo/operation/list_collections/result.rb +0 -114
- data/lib/mongo/operation/list_indexes/result.rb +0 -118
- data/lib/mongo/operation/read/collections_info.rb +0 -68
- data/lib/mongo/operation/read/indexes.rb +0 -69
- data/lib/mongo/operation/read/list_collections.rb +0 -76
- data/lib/mongo/operation/read/list_indexes.rb +0 -78
- 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 -162
- 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/bulk/bulk_write_spec.rb +0 -262
- 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
- /data/lib/mongo/operation/{aggregate → commands/aggregate}/result.rb +0 -0
@@ -49,31 +49,34 @@ module Mongo
|
|
49
49
|
#
|
50
50
|
# Supported flags: +:continue_on_error+
|
51
51
|
def initialize(database, collection, documents, options = {})
|
52
|
+
@database = database
|
52
53
|
@namespace = "#{database}.#{collection}"
|
53
54
|
@documents = documents
|
54
55
|
@flags = options[:flags] || []
|
56
|
+
@upconverter = Upconverter.new(collection, documents, options)
|
55
57
|
end
|
56
58
|
|
57
|
-
#
|
59
|
+
# Return the event payload for monitoring.
|
58
60
|
#
|
59
|
-
# @example
|
60
|
-
#
|
61
|
+
# @example Return the event payload.
|
62
|
+
# message.payload
|
61
63
|
#
|
62
|
-
# @return [
|
64
|
+
# @return [ Hash ] The event payload.
|
63
65
|
#
|
64
|
-
# @since 2.
|
65
|
-
def
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
f.join(" ") % v
|
66
|
+
# @since 2.1.0
|
67
|
+
def payload
|
68
|
+
{
|
69
|
+
command_name: 'insert',
|
70
|
+
database_name: @database,
|
71
|
+
command: upconverter.command,
|
72
|
+
request_id: request_id
|
73
|
+
}
|
73
74
|
end
|
74
75
|
|
75
76
|
private
|
76
77
|
|
78
|
+
attr_reader :upconverter
|
79
|
+
|
77
80
|
# The operation code required to specify an Insert message.
|
78
81
|
# @return [Fixnum] the operation code.
|
79
82
|
def op_code
|
@@ -94,6 +97,75 @@ module Mongo
|
|
94
97
|
# @!attribute
|
95
98
|
# @return [Array<Hash>] The documents to insert.
|
96
99
|
field :documents, Document, true
|
100
|
+
|
101
|
+
# Converts legacy insert messages to the appropriare OP_COMMAND style
|
102
|
+
# message.
|
103
|
+
#
|
104
|
+
# @since 2.1.0
|
105
|
+
class Upconverter
|
106
|
+
|
107
|
+
# Insert field constant.
|
108
|
+
#
|
109
|
+
# @since 2.1.0
|
110
|
+
INSERT = 'insert'.freeze
|
111
|
+
|
112
|
+
# Documents field constant.
|
113
|
+
#
|
114
|
+
# @since 2.1.0
|
115
|
+
DOCUMENTS = 'documents'.freeze
|
116
|
+
|
117
|
+
# Ordered field constant.
|
118
|
+
#
|
119
|
+
# @since 2.1.0
|
120
|
+
ORDERED = 'ordered'.freeze
|
121
|
+
|
122
|
+
# Write concern field constant.
|
123
|
+
#
|
124
|
+
# @since 2.1.0
|
125
|
+
WRITE_CONCERN = 'writeConcern'.freeze
|
126
|
+
|
127
|
+
# @return [ String ] collection The name of the collection.
|
128
|
+
attr_reader :collection
|
129
|
+
|
130
|
+
# @return [ Array<BSON::Document> ] documents The documents to insert.
|
131
|
+
attr_reader :documents
|
132
|
+
|
133
|
+
# @return [ Hash ] options The options.
|
134
|
+
attr_reader :options
|
135
|
+
|
136
|
+
# Instantiate the upconverter.
|
137
|
+
#
|
138
|
+
# @example Instantiate the upconverter.
|
139
|
+
# Upconverter.new('users', documents)
|
140
|
+
#
|
141
|
+
# @param [ String ] collection The name of the collection.
|
142
|
+
# @param [ Array<BSON::Document> ] documents The documents.
|
143
|
+
# @param [ Hash ] options The options.
|
144
|
+
#
|
145
|
+
# @since 2.1.0
|
146
|
+
def initialize(collection, documents, options)
|
147
|
+
@collection = collection
|
148
|
+
@documents = documents
|
149
|
+
@options = options
|
150
|
+
end
|
151
|
+
|
152
|
+
# Get the upconverted command.
|
153
|
+
#
|
154
|
+
# @example Get the command.
|
155
|
+
# upconverter.command
|
156
|
+
#
|
157
|
+
# @return [ BSON::Document ] The upconverted command.
|
158
|
+
#
|
159
|
+
# @since 2.1.0
|
160
|
+
def command
|
161
|
+
document = BSON::Document.new
|
162
|
+
document.store(INSERT, collection)
|
163
|
+
document.store(DOCUMENTS, documents)
|
164
|
+
document.store(ORDERED, options.fetch(:ordered, true))
|
165
|
+
document.merge!(WRITE_CONCERN => options[:write_concern].options) if options[:write_concern]
|
166
|
+
document
|
167
|
+
end
|
168
|
+
end
|
97
169
|
end
|
98
170
|
end
|
99
171
|
end
|
@@ -28,31 +28,37 @@ module Mongo
|
|
28
28
|
# @example Kill the cursor on the server with id 1.
|
29
29
|
# KillCursors.new([1])
|
30
30
|
#
|
31
|
-
# @param
|
32
|
-
# @param
|
33
|
-
|
31
|
+
# @param [ Mongo::Database ] collection The collection.
|
32
|
+
# @param [ Mongo::Database ] database The database.
|
33
|
+
# @param [ Array<Fixnum> ] cursor_ids The cursor ids to kill.
|
34
|
+
def initialize(collection, database, cursor_ids)
|
35
|
+
@database = database
|
34
36
|
@cursor_ids = cursor_ids
|
35
37
|
@id_count = @cursor_ids.size
|
38
|
+
@upconverter = Upconverter.new(collection, cursor_ids)
|
36
39
|
end
|
37
40
|
|
38
|
-
#
|
41
|
+
# Return the event payload for monitoring.
|
39
42
|
#
|
40
|
-
# @example
|
41
|
-
#
|
43
|
+
# @example Return the event payload.
|
44
|
+
# message.payload
|
42
45
|
#
|
43
|
-
# @return [
|
46
|
+
# @return [ Hash ] The event payload.
|
44
47
|
#
|
45
|
-
# @since 2.
|
46
|
-
def
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
48
|
+
# @since 2.1.0
|
49
|
+
def payload
|
50
|
+
{
|
51
|
+
command_name: 'killCursors',
|
52
|
+
database_name: @database,
|
53
|
+
command: upconverter.command,
|
54
|
+
request_id: request_id
|
55
|
+
}
|
52
56
|
end
|
53
57
|
|
54
58
|
private
|
55
59
|
|
60
|
+
attr_reader :upconverter
|
61
|
+
|
56
62
|
# The operation code required to specify +KillCursors+ message.
|
57
63
|
# @return [Fixnum] the operation code.
|
58
64
|
def op_code
|
@@ -69,6 +75,45 @@ module Mongo
|
|
69
75
|
# @!attribute
|
70
76
|
# @return [Array<Fixnum>] Cursors to kill.
|
71
77
|
field :cursor_ids, Int64, true
|
78
|
+
|
79
|
+
# Converts legacy insert messages to the appropriare OP_COMMAND style
|
80
|
+
# message.
|
81
|
+
#
|
82
|
+
# @since 2.1.0
|
83
|
+
class Upconverter
|
84
|
+
|
85
|
+
# @return [ String ] collection The name of the collection.
|
86
|
+
attr_reader :collection
|
87
|
+
|
88
|
+
# @return [ Array<Integer> ] cursor_ids The cursor ids.
|
89
|
+
attr_reader :cursor_ids
|
90
|
+
|
91
|
+
# Instantiate the upconverter.
|
92
|
+
#
|
93
|
+
# @example Instantiate the upconverter.
|
94
|
+
# Upconverter.new('users', [ 1, 2, 3 ])
|
95
|
+
#
|
96
|
+
# @param [ String ] collection The name of the collection.
|
97
|
+
# @param [ Array<Integer> ] cursor_ids The cursor ids.
|
98
|
+
#
|
99
|
+
# @since 2.1.0
|
100
|
+
def initialize(collection, cursor_ids)
|
101
|
+
@collection = collection
|
102
|
+
@cursor_ids = cursor_ids
|
103
|
+
end
|
104
|
+
|
105
|
+
# Get the upconverted command.
|
106
|
+
#
|
107
|
+
# @example Get the command.
|
108
|
+
# upconverter.command
|
109
|
+
#
|
110
|
+
# @return [ BSON::Document ] The upconverted command.
|
111
|
+
#
|
112
|
+
# @since 2.1.0
|
113
|
+
def command
|
114
|
+
BSON::Document.new(killCursors: collection, cursors: cursor_ids)
|
115
|
+
end
|
116
|
+
end
|
72
117
|
end
|
73
118
|
end
|
74
119
|
end
|
@@ -114,6 +114,17 @@ module Mongo
|
|
114
114
|
fields.map { |field| instance_variable_get(field[:name]) }.hash
|
115
115
|
end
|
116
116
|
|
117
|
+
# Generates a request id for a message
|
118
|
+
#
|
119
|
+
# @return [Fixnum] a request id used for sending a message to the
|
120
|
+
# server. The server will put this id in the response_to field of
|
121
|
+
# a reply.
|
122
|
+
def set_request_id
|
123
|
+
@@id_lock.synchronize do
|
124
|
+
@request_id = @@request_id += 1
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
117
128
|
private
|
118
129
|
|
119
130
|
@@request_id = 0
|
@@ -158,17 +169,6 @@ module Mongo
|
|
158
169
|
end
|
159
170
|
end
|
160
171
|
|
161
|
-
# Generates a request id for a message
|
162
|
-
#
|
163
|
-
# @return [Fixnum] a request id used for sending a message to the
|
164
|
-
# server. The server will put this id in the response_to field of
|
165
|
-
# a reply.
|
166
|
-
def set_request_id
|
167
|
-
@@id_lock.synchronize do
|
168
|
-
@request_id = @@request_id += 1
|
169
|
-
end
|
170
|
-
end
|
171
|
-
|
172
172
|
# Serializes the header of the message consisting of 4 32bit integers
|
173
173
|
#
|
174
174
|
# The integers represent a message length placeholder (calculation of
|
@@ -181,7 +181,7 @@ module Mongo
|
|
181
181
|
# @param buffer [String] Buffer to receive the header
|
182
182
|
# @return [String] Serialized header
|
183
183
|
def serialize_header(buffer)
|
184
|
-
set_request_id
|
184
|
+
set_request_id unless @request_id
|
185
185
|
Header.serialize(buffer, [0, request_id, 0, op_code])
|
186
186
|
end
|
187
187
|
|
data/lib/mongo/protocol/query.rb
CHANGED
@@ -30,12 +30,6 @@ module Mongo
|
|
30
30
|
# @api semipublic
|
31
31
|
class Query < Message
|
32
32
|
|
33
|
-
# Constant for the max number of characters to print when inspecting
|
34
|
-
# a query field.
|
35
|
-
#
|
36
|
-
# @since 2.0.3
|
37
|
-
LOG_STRING_LIMIT = 250
|
38
|
-
|
39
33
|
# Creates a new Query message
|
40
34
|
#
|
41
35
|
# @example Find all users named Tyler.
|
@@ -64,33 +58,32 @@ module Mongo
|
|
64
58
|
# Supported flags: +:tailable_cursor+, +:slave_ok+, +:oplog_replay+,
|
65
59
|
# +:no_cursor_timeout+, +:await_data+, +:exhaust+, +:partial+
|
66
60
|
def initialize(database, collection, selector, options = {})
|
67
|
-
@
|
68
|
-
@
|
69
|
-
@
|
70
|
-
@
|
71
|
-
@
|
72
|
-
@
|
61
|
+
@database = database
|
62
|
+
@namespace = "#{database}.#{collection}"
|
63
|
+
@selector = selector
|
64
|
+
@options = options
|
65
|
+
@project = options[:project]
|
66
|
+
@limit = determine_limit
|
67
|
+
@skip = options[:skip] || 0
|
68
|
+
@flags = options[:flags] || []
|
69
|
+
@upconverter = Upconverter.new(collection, selector, options, flags)
|
73
70
|
end
|
74
71
|
|
75
|
-
#
|
72
|
+
# Return the event payload for monitoring.
|
76
73
|
#
|
77
|
-
# @example
|
78
|
-
#
|
74
|
+
# @example Return the event payload.
|
75
|
+
# message.payload
|
79
76
|
#
|
80
|
-
# @return [
|
77
|
+
# @return [ Hash ] The event payload.
|
81
78
|
#
|
82
|
-
# @since 2.
|
83
|
-
def
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
fields << ["skip=%s", skip.inspect]
|
91
|
-
fields << ["project=%s", project.inspect]
|
92
|
-
f, v = fields.transpose
|
93
|
-
f.join(" ") % v
|
79
|
+
# @since 2.1.0
|
80
|
+
def payload
|
81
|
+
{
|
82
|
+
command_name: upconverter.command_name,
|
83
|
+
database_name: @database,
|
84
|
+
command: upconverter.command,
|
85
|
+
request_id: request_id
|
86
|
+
}
|
94
87
|
end
|
95
88
|
|
96
89
|
# Query messages require replies from the database.
|
@@ -107,21 +100,16 @@ module Mongo
|
|
107
100
|
|
108
101
|
private
|
109
102
|
|
103
|
+
attr_reader :upconverter
|
104
|
+
|
110
105
|
# The operation code required to specify a Query message.
|
111
106
|
# @return [Fixnum] the operation code.
|
112
107
|
def op_code
|
113
108
|
2004
|
114
109
|
end
|
115
110
|
|
116
|
-
def
|
117
|
-
|
118
|
-
end
|
119
|
-
|
120
|
-
def formatted_selector
|
121
|
-
( (str = selector.inspect).length > LOG_STRING_LIMIT ) ?
|
122
|
-
"#{str[0..LOG_STRING_LIMIT]}..." : str
|
123
|
-
rescue ArgumentError
|
124
|
-
'<Unable to inspect selector>'
|
111
|
+
def determine_limit
|
112
|
+
[ @options[:limit] || @options[:batch_size], @options[:batch_size] || @options[:limit] ].min || 0
|
125
113
|
end
|
126
114
|
|
127
115
|
# Available flags for a Query message.
|
@@ -159,6 +147,144 @@ module Mongo
|
|
159
147
|
# @!attribute
|
160
148
|
# @return [Hash] The projection.
|
161
149
|
field :project, Document
|
150
|
+
|
151
|
+
# Converts legacy query messages to the appropriare OP_COMMAND style
|
152
|
+
# message.
|
153
|
+
#
|
154
|
+
# @since 2.1.0
|
155
|
+
class Upconverter
|
156
|
+
|
157
|
+
# Mappings of the options to the find command options.
|
158
|
+
#
|
159
|
+
# @since 2.1.0
|
160
|
+
OPTION_MAPPINGS = {
|
161
|
+
:project => 'projection',
|
162
|
+
:skip => 'skip',
|
163
|
+
:limit => 'limit',
|
164
|
+
:batch_size => 'batchSize'
|
165
|
+
}.freeze
|
166
|
+
|
167
|
+
SPECIAL_FIELD_MAPPINGS = {
|
168
|
+
:$readPreference => 'readPreference',
|
169
|
+
:$orderby => 'sort',
|
170
|
+
:$hint => 'hint',
|
171
|
+
:$comment => 'comment',
|
172
|
+
:$returnKey => 'returnKey',
|
173
|
+
:$snapshot => 'snapshot',
|
174
|
+
:$maxScan => 'maxScan',
|
175
|
+
:$max => 'max',
|
176
|
+
:$min => 'min',
|
177
|
+
:$maxTimeMS => 'maxTimeMS',
|
178
|
+
:$showDiskLoc => 'showRecordId',
|
179
|
+
:$explain => 'explain'
|
180
|
+
}.freeze
|
181
|
+
|
182
|
+
# Mapping of flags to find command options.
|
183
|
+
#
|
184
|
+
# @since 2.1.0
|
185
|
+
FLAG_MAPPINGS = {
|
186
|
+
:tailable_cursor => 'tailable',
|
187
|
+
:oplog_replay => 'oplogReplay',
|
188
|
+
:no_cursor_timeout => 'noCursorTimeout',
|
189
|
+
:await_data => 'awaitData',
|
190
|
+
:partial => 'allowPartialResults'
|
191
|
+
}.freeze
|
192
|
+
|
193
|
+
# Find command constant.
|
194
|
+
#
|
195
|
+
# @since 2.1.0
|
196
|
+
FIND = 'find'.freeze
|
197
|
+
|
198
|
+
# Filter attribute constant.
|
199
|
+
#
|
200
|
+
# @since 2.1.0
|
201
|
+
FILTER = 'filter'.freeze
|
202
|
+
|
203
|
+
# @return [ String ] collection The name of the collection.
|
204
|
+
attr_reader :collection
|
205
|
+
|
206
|
+
# @return [ BSON::Document, Hash ] filter The query filter or command.
|
207
|
+
attr_reader :filter
|
208
|
+
|
209
|
+
# @return [ BSON::Document, Hash ] options The options.
|
210
|
+
attr_reader :options
|
211
|
+
|
212
|
+
# @return [ Array<Symbol> ] flags The flags.
|
213
|
+
attr_reader :flags
|
214
|
+
|
215
|
+
# Instantiate the upconverter.
|
216
|
+
#
|
217
|
+
# @example Instantiate the upconverter.
|
218
|
+
# Upconverter.new('users', { name: 'test' }, { skip: 10 })
|
219
|
+
#
|
220
|
+
# @param [ String ] collection The name of the collection.
|
221
|
+
# @param [ BSON::Document, Hash ] filter The filter or command.
|
222
|
+
# @param [ BSON::Document, Hash ] options The options.
|
223
|
+
# @param [ Array<Symbol> ] flags The flags.
|
224
|
+
#
|
225
|
+
# @since 2.1.0
|
226
|
+
def initialize(collection, filter, options, flags)
|
227
|
+
@collection = collection
|
228
|
+
@filter = filter
|
229
|
+
@options = options
|
230
|
+
@flags = flags
|
231
|
+
end
|
232
|
+
|
233
|
+
# Get the upconverted command.
|
234
|
+
#
|
235
|
+
# @example Get the command.
|
236
|
+
# upconverter.command
|
237
|
+
#
|
238
|
+
# @return [ BSON::Document ] The upconverted command.
|
239
|
+
#
|
240
|
+
# @since 2.1.0
|
241
|
+
def command
|
242
|
+
command? ? op_command : find_command
|
243
|
+
end
|
244
|
+
|
245
|
+
# Get the name of the command. If the collection is $cmd then it's the
|
246
|
+
# first key in the filter, otherwise it's a find.
|
247
|
+
#
|
248
|
+
# @example Get the command name.
|
249
|
+
# upconverter.command_name
|
250
|
+
#
|
251
|
+
# @return [ String, Symbol ] The command name.
|
252
|
+
#
|
253
|
+
# @since 2.1.0
|
254
|
+
def command_name
|
255
|
+
command? ? filter.keys.first : FIND
|
256
|
+
end
|
257
|
+
|
258
|
+
private
|
259
|
+
|
260
|
+
def command?
|
261
|
+
collection == Database::COMMAND
|
262
|
+
end
|
263
|
+
|
264
|
+
def op_command
|
265
|
+
document = BSON::Document.new
|
266
|
+
filter.each do |field, value|
|
267
|
+
document.store(field.to_s, value)
|
268
|
+
end
|
269
|
+
document
|
270
|
+
end
|
271
|
+
|
272
|
+
def find_command
|
273
|
+
document = BSON::Document.new
|
274
|
+
document.store(FIND, collection)
|
275
|
+
document.store(FILTER, filter[:$query] ? filter[:$query] : filter)
|
276
|
+
OPTION_MAPPINGS.each do |legacy, option|
|
277
|
+
document.store(option, options[legacy]) unless options[legacy].nil?
|
278
|
+
end
|
279
|
+
SPECIAL_FIELD_MAPPINGS.each do |special, normal|
|
280
|
+
document.store(normal, filter[special]) unless filter[special].nil?
|
281
|
+
end
|
282
|
+
FLAG_MAPPINGS.each do |legacy, flag|
|
283
|
+
document.store(flag, true) if flags.include?(legacy)
|
284
|
+
end
|
285
|
+
document
|
286
|
+
end
|
287
|
+
end
|
162
288
|
end
|
163
289
|
end
|
164
290
|
end
|
data/lib/mongo/protocol/reply.rb
CHANGED
@@ -38,8 +38,24 @@ module Mongo
|
|
38
38
|
flags.include?(:query_failure)
|
39
39
|
end
|
40
40
|
|
41
|
+
# Return the event payload for monitoring.
|
42
|
+
#
|
43
|
+
# @example Return the event payload.
|
44
|
+
# message.payload
|
45
|
+
#
|
46
|
+
# @return [ Hash ] The event payload.
|
47
|
+
#
|
48
|
+
# @since 2.1.0
|
49
|
+
def payload
|
50
|
+
{ reply: upconverter.command, request_id: request_id }
|
51
|
+
end
|
52
|
+
|
41
53
|
private
|
42
54
|
|
55
|
+
def upconverter
|
56
|
+
@upconverter ||= Upconverter.new(documents, cursor_id, starting_from)
|
57
|
+
end
|
58
|
+
|
43
59
|
# The operation code required to specify a Reply message.
|
44
60
|
# @return [Fixnum] the operation code.
|
45
61
|
def op_code
|
@@ -79,6 +95,93 @@ module Mongo
|
|
79
95
|
# @!attribute
|
80
96
|
# @return [Array<Hash>] The documents in this Reply.
|
81
97
|
field :documents, Document, :@number_returned
|
98
|
+
|
99
|
+
# Upconverts legacy replies to new op command replies.
|
100
|
+
#
|
101
|
+
# @since 2.1.0
|
102
|
+
class Upconverter
|
103
|
+
|
104
|
+
# Next batch constant.
|
105
|
+
#
|
106
|
+
# @since 2.1.0
|
107
|
+
NEXT_BATCH = 'nextBatch'.freeze
|
108
|
+
|
109
|
+
# First batch constant.
|
110
|
+
#
|
111
|
+
# @since 2.1.0
|
112
|
+
FIRST_BATCH = 'firstBatch'.freeze
|
113
|
+
|
114
|
+
# Cursor field constant.
|
115
|
+
#
|
116
|
+
# @since 2.1.0
|
117
|
+
CURSOR = 'cursor'.freeze
|
118
|
+
|
119
|
+
# Id field constant.
|
120
|
+
#
|
121
|
+
# @since 2.1.0
|
122
|
+
ID = 'id'.freeze
|
123
|
+
|
124
|
+
# @return [ Array<BSON::Document> ] documents The documents.
|
125
|
+
attr_reader :documents
|
126
|
+
|
127
|
+
# @return [ Integer ] cursor_id The cursor id.
|
128
|
+
attr_reader :cursor_id
|
129
|
+
|
130
|
+
# @return [ Integer ] starting_from The starting point in the cursor.
|
131
|
+
attr_reader :starting_from
|
132
|
+
|
133
|
+
# Initialize the new upconverter.
|
134
|
+
#
|
135
|
+
# @example Create the upconverter.
|
136
|
+
# Upconverter.new(docs, 1, 3)
|
137
|
+
#
|
138
|
+
# @param [ Array<BSON::Document> ] documents The documents.
|
139
|
+
# @param [ Integer ] cursor_id The cursor id.
|
140
|
+
# @param [ Integer ] starting_from The starting position.
|
141
|
+
#
|
142
|
+
# @since 2.1.0
|
143
|
+
def initialize(documents, cursor_id, starting_from)
|
144
|
+
@documents = documents
|
145
|
+
@cursor_id = cursor_id
|
146
|
+
@starting_from = starting_from
|
147
|
+
end
|
148
|
+
|
149
|
+
# Get the upconverted command.
|
150
|
+
#
|
151
|
+
# @example Get the command.
|
152
|
+
# upconverter.command
|
153
|
+
#
|
154
|
+
# @return [ BSON::Document ] The command.
|
155
|
+
#
|
156
|
+
# @since 2.1.0
|
157
|
+
def command
|
158
|
+
command? ? op_command : find_command
|
159
|
+
end
|
160
|
+
|
161
|
+
private
|
162
|
+
|
163
|
+
def batch_field
|
164
|
+
starting_from > 0 ? NEXT_BATCH : FIRST_BATCH
|
165
|
+
end
|
166
|
+
|
167
|
+
def command?
|
168
|
+
!documents.empty? && documents.first.key?(Operation::Result::OK)
|
169
|
+
end
|
170
|
+
|
171
|
+
def find_command
|
172
|
+
document = BSON::Document.new
|
173
|
+
cursor_document = BSON::Document.new
|
174
|
+
cursor_document.store(ID, cursor_id)
|
175
|
+
cursor_document.store(batch_field, documents)
|
176
|
+
document.store(Operation::Result::OK, 1)
|
177
|
+
document.store(CURSOR, cursor_document)
|
178
|
+
document
|
179
|
+
end
|
180
|
+
|
181
|
+
def op_command
|
182
|
+
documents.first
|
183
|
+
end
|
184
|
+
end
|
82
185
|
end
|
83
186
|
end
|
84
187
|
end
|