mongo 2.4.0.rc0 → 2.4.0.rc1

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.
Files changed (93) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +1 -2
  4. data/lib/mongo/bulk_write/validatable.rb +3 -1
  5. data/lib/mongo/client.rb +30 -3
  6. data/lib/mongo/cluster/app_metadata.rb +7 -2
  7. data/lib/mongo/collection.rb +3 -1
  8. data/lib/mongo/collection/view.rb +3 -1
  9. data/lib/mongo/collection/view/aggregation.rb +3 -1
  10. data/lib/mongo/collection/view/builder/find_command.rb +20 -5
  11. data/lib/mongo/collection/view/map_reduce.rb +3 -1
  12. data/lib/mongo/collection/view/writable.rb +12 -2
  13. data/lib/mongo/cursor/builder/get_more_command.rb +3 -2
  14. data/lib/mongo/error/closed_stream.rb +1 -1
  15. data/lib/mongo/error/invalid_server_preference.rb +1 -1
  16. data/lib/mongo/index/view.rb +3 -1
  17. data/lib/mongo/operation/write/bulk/mergable.rb +1 -1
  18. data/lib/mongo/operation/write/create_index.rb +1 -1
  19. data/lib/mongo/operation/write/delete.rb +1 -1
  20. data/lib/mongo/operation/write/update.rb +1 -1
  21. data/lib/mongo/protocol/delete.rb +4 -1
  22. data/lib/mongo/protocol/get_more.rb +4 -1
  23. data/lib/mongo/protocol/insert.rb +7 -3
  24. data/lib/mongo/protocol/kill_cursors.rb +4 -1
  25. data/lib/mongo/protocol/message.rb +5 -1
  26. data/lib/mongo/protocol/query.rb +11 -4
  27. data/lib/mongo/protocol/update.rb +4 -1
  28. data/lib/mongo/server/connectable.rb +8 -2
  29. data/lib/mongo/server/connection_pool.rb +3 -1
  30. data/lib/mongo/server/monitor.rb +1 -0
  31. data/lib/mongo/socket.rb +16 -8
  32. data/lib/mongo/socket/ssl.rb +24 -9
  33. data/lib/mongo/uri.rb +6 -6
  34. data/lib/mongo/version.rb +1 -1
  35. data/mongo.gemspec +1 -1
  36. data/spec/mongo/bulk_write_spec.rb +117 -0
  37. data/spec/mongo/collection/view/aggregation_spec.rb +26 -0
  38. data/spec/mongo/collection/view/builder/find_command_spec.rb +244 -2
  39. data/spec/mongo/collection/view/map_reduce_spec.rb +13 -0
  40. data/spec/mongo/collection/view/readable_spec.rb +26 -0
  41. data/spec/mongo/collection/view/writable_spec.rb +104 -0
  42. data/spec/mongo/collection/view_spec.rb +13 -0
  43. data/spec/mongo/collection_spec.rb +226 -7
  44. data/spec/mongo/crud_spec.rb +5 -5
  45. data/spec/mongo/index/view_spec.rb +53 -0
  46. data/spec/mongo/server/connection_spec.rb +45 -26
  47. data/spec/mongo/socket/ssl_spec.rb +358 -22
  48. data/spec/spec_helper.rb +4 -0
  49. data/spec/support/authorization.rb +3 -3
  50. data/spec/support/certificates/client_cert.pem +21 -0
  51. data/spec/support/certificates/client_key.pem +28 -0
  52. data/spec/support/certificates/client_key_encrypted.pem +30 -0
  53. data/spec/support/crud.rb +67 -22
  54. data/spec/support/crud/read.rb +18 -36
  55. data/spec/support/crud/write.rb +0 -44
  56. data/spec/support/crud_tests/read/aggregate-collation.yml +17 -0
  57. data/spec/support/crud_tests/read/aggregate-out.yml +28 -0
  58. data/spec/support/crud_tests/read/aggregate.yml +1 -35
  59. data/spec/support/crud_tests/read/count-collation.yml +15 -0
  60. data/spec/support/crud_tests/read/count.yml +3 -15
  61. data/spec/support/crud_tests/read/distinct-collation.yml +17 -0
  62. data/spec/support/crud_tests/read/distinct.yml +1 -14
  63. data/spec/support/crud_tests/read/find-collation.yml +15 -0
  64. data/spec/support/crud_tests/read/find.yml +1 -12
  65. data/spec/support/crud_tests/write/deleteMany-collation.yml +22 -0
  66. data/spec/support/crud_tests/write/deleteMany.yml +1 -23
  67. data/spec/support/crud_tests/write/deleteOne-collation.yml +22 -0
  68. data/spec/support/crud_tests/write/deleteOne.yml +1 -21
  69. data/spec/support/crud_tests/write/findOneAndDelete-collation.yml +23 -0
  70. data/spec/support/crud_tests/write/findOneAndDelete.yml +2 -28
  71. data/spec/support/crud_tests/write/findOneAndReplace-collation.yml +24 -0
  72. data/spec/support/crud_tests/write/findOneAndReplace-upsert.yml +47 -0
  73. data/spec/support/crud_tests/write/findOneAndReplace.yml +13 -53
  74. data/spec/support/crud_tests/write/findOneAndUpdate-collation.yml +27 -0
  75. data/spec/support/crud_tests/write/findOneAndUpdate.yml +8 -51
  76. data/spec/support/crud_tests/write/insertMany.yml +1 -2
  77. data/spec/support/crud_tests/write/insertOne.yml +1 -2
  78. data/spec/support/crud_tests/write/replaceOne-collation.yml +23 -0
  79. data/spec/support/crud_tests/write/replaceOne-upsert.yml +48 -0
  80. data/spec/support/crud_tests/write/replaceOne.yml +11 -45
  81. data/spec/support/crud_tests/write/updateMany-collation.yml +27 -0
  82. data/spec/support/crud_tests/write/updateMany.yml +10 -42
  83. data/spec/support/crud_tests/write/updateOne-collation.yml +24 -0
  84. data/spec/support/crud_tests/write/updateOne.yml +7 -33
  85. data/spec/support/sdam/rs/new_primary_new_setversion.yml +1 -1
  86. data/spec/support/sdam/rs/null_election_id.yml +1 -0
  87. data/spec/support/sdam/rs/primary_disconnect_electionid.yml +2 -3
  88. data/spec/support/sdam/rs/primary_disconnect_setversion.yml +1 -2
  89. data/spec/support/sdam/single/direct_connection_rsarbiter.yml +1 -1
  90. data/spec/support/sdam/single/direct_connection_rsprimary.yml +1 -1
  91. data/spec/support/sdam/single/direct_connection_rssecondary.yml +1 -1
  92. metadata +40 -4
  93. metadata.gz.sig +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 19ae8d6c4e2881b28ba15899b6f928e5f050ad5b
4
- data.tar.gz: 7addb2834adeaaaf441891f34f58660faeead9d9
3
+ metadata.gz: 0fceb612725957e97b29a1b35a376821d685dea7
4
+ data.tar.gz: 3f1ee5867327a164aa2bff5e00a517387df406e0
5
5
  SHA512:
6
- metadata.gz: ad67bd7b0d541f6f97645004c983bd73183001fcd5ece022d3294d81ebaa8bb693bf96c3da944fbfdddde4064bfb23aa2503b82766326258dac53ebdafab4e36
7
- data.tar.gz: 0d2a4a97d7a2b9ba1e8d40ccc19685336cf75c405558fae2db8e19e3b850ca7f4eb3e7cf81a6507fc2f35c2104e7604659e6e3afac3348ef67525806533ebcae
6
+ metadata.gz: 70a87aadb4c5f8a31582dfada8c8810a4a71d8c7b59fd4fda010f2d680a8d555a2401e190e37d37106f268d40019e67926a7cb48ae33f5937d90b5227e9b29af
7
+ data.tar.gz: c6d42e01149a0140f59494999d98e69a3f7df8480fc5fac6054d518fca9d80fa58278e3529a8b9e7274ef069080d4e5f07cf1aae72e3119c90527465268b01b1
Binary file
data.tar.gz.sig CHANGED
@@ -1,2 +1 @@
1
- "d��"'�̑ ��(w0K_�u4��1*�^��� �@�?�ȣ��h���r����@]=tE��Z�a`��;-�稓C=p��\떃�4rx�7+QIy\B
2
- �=.WX��E�:J4z�bc�x\=��jp)��y�s���ڬW)e �|wBos�ͬ���G-Xx��AOfj�`巪Z�`���z{���Wl�P"��J���͏˷P�HHO�2��ftz�h��,g�\hc
1
+ ,��J�|)�@��0�Lzu�](�dAC���y��Cϭ�"d��qg�)�/���ً*5��;H{U|�\�7�$P��s0��������d{�d{x���M�>��RT/I��c B�ǵ��e��IA� ��3Mkp�e�� ��}l���p�������O�Ȭ:��q�Z�0��7^D��ZrȦZq�=������S�����cB�,��<Q��^���UFhHFBf�ݩ�L{Ʃ-qQQ���m �+�]
@@ -40,7 +40,9 @@ module Mongo
40
40
  def validate(name, document)
41
41
  validate_operation(name)
42
42
  validate_document(name, document)
43
- @has_collation = true if document.respond_to?(:keys) && document[:collation]
43
+ if document.respond_to?(:keys) && (document[:collation] || document[Operation::COLLATION])
44
+ @has_collation = true
45
+ end
44
46
  end
45
47
 
46
48
  private
@@ -55,8 +55,14 @@ module Mongo
55
55
  :socket_timeout,
56
56
  :ssl,
57
57
  :ssl_ca_cert,
58
+ :ssl_ca_cert_string,
59
+ :ssl_ca_cert_object,
58
60
  :ssl_cert,
61
+ :ssl_cert_string,
62
+ :ssl_cert_object,
59
63
  :ssl_key,
64
+ :ssk_key_string,
65
+ :ssl_key_object,
60
66
  :ssl_key_pass_phrase,
61
67
  :ssl_verify,
62
68
  :truncate_logs,
@@ -167,16 +173,37 @@ module Mongo
167
173
  # connect to. Servers not in this replica set will be ignored.
168
174
  # @option options [ true, false ] :ssl Whether to use SSL.
169
175
  # @option options [ String ] :ssl_cert The certificate file used to identify
170
- # the connection against MongoDB.
176
+ # the connection against MongoDB. This option, if present, takes precedence
177
+ # over the values of :ssl_cert_string and :ssl_cert_object
178
+ # @option options [ String ] :ssl_cert_string A string containing the PEM-encoded
179
+ # certificate used to identify the connection against MongoDB. This option, if present,
180
+ # takes precedence over the value of :ssl_cert_object
181
+ # @option options [ OpenSSL::X509::Certificate ] :ssl_cert_object The OpenSSL::X509::Certificate
182
+ # used to identify the connection against MongoDB
171
183
  # @option options [ String ] :ssl_key The private keyfile used to identify the
172
184
  # connection against MongoDB. Note that even if the key is stored in the same
173
- # file as the certificate, both need to be explicitly specified.
185
+ # file as the certificate, both need to be explicitly specified. This option,
186
+ # if present, takes precedence over the values of :ssl_key_string and :ssl_key_object
187
+ # @option options [ String ] :ssl_key_string A string containing the PEM-encoded private key
188
+ # used to identify the connection against MongoDB. This parameter, if present,
189
+ # takes precedence over the value of option :ssl_key_object
190
+ # @option options [ OpenSSL::PKey ] :ssl_key_object The private key used to identify the
191
+ # connection against MongoDB
174
192
  # @option options [ String ] :ssl_key_pass_phrase A passphrase for the private key.
175
193
  # @option options [ true, false ] :ssl_verify Whether or not to do peer certification
176
194
  # validation.
177
195
  # @option options [ String ] :ssl_ca_cert The file containing a set of concatenated
178
196
  # certification authority certifications used to validate certs passed from the
179
- # other end of the connection. Required for :ssl_verify.
197
+ # other end of the connection. One of :ssl_ca_cert, :ssl_ca_cert_string or
198
+ # :ssl_ca_cert_object (in order of priority) is required for :ssl_verify.
199
+ # @option options [ String ] :ssl_ca_cert_string A string containing a set of concatenated
200
+ # certification authority certifications used to validate certs passed from the
201
+ # other end of the connection. One of :ssl_ca_cert, :ssl_ca_cert_string or
202
+ # :ssl_ca_cert_object (in order of priority) is required for :ssl_verify.
203
+ # @option options [ Array<OpenSSL::X509::Certificate> ] :ssl_ca_cert_object An array of OpenSSL::X509::Certificate
204
+ # reprenting the certification authority certifications used to validate certs passed from the
205
+ # other end of the connection. One of :ssl_ca_cert, :ssl_ca_cert_string or
206
+ # :ssl_ca_cert_object (in order of priority) is required for :ssl_verify.
180
207
  # @option options [ Float ] :socket_timeout The timeout, in seconds, to
181
208
  # execute operations on a socket.
182
209
  # @option options [ String ] :user The user name.
@@ -36,6 +36,11 @@ module Mongo
36
36
  # @ since 2.4.0
37
37
  MAX_APP_NAME_SIZE = 128.freeze
38
38
 
39
+ # The driver name.
40
+ #
41
+ # @ since 2.4.0
42
+ DRIVER_NAME = 'mongo-ruby-driver'
43
+
39
44
  # Instantiate the new AppMetadata object.
40
45
  #
41
46
  # @api private
@@ -101,7 +106,7 @@ module Mongo
101
106
 
102
107
  def driver_doc
103
108
  {
104
- name: :'mongo-ruby-driver',
109
+ name: DRIVER_NAME,
105
110
  version: Mongo::VERSION
106
111
  }
107
112
  end
@@ -116,7 +121,7 @@ module Mongo
116
121
 
117
122
  def type
118
123
  (RbConfig::CONFIG && RbConfig::CONFIG['host_os']) ?
119
- RbConfig::CONFIG['host_os'].split('_').first[/[a-z]+/i].downcase.to_sym : :unknown
124
+ RbConfig::CONFIG['host_os'].split('_').first[/[a-z]+/i].downcase : 'unknown'
120
125
  end
121
126
 
122
127
  def name
@@ -172,7 +172,9 @@ module Mongo
172
172
  operation = { :create => name }.merge(options)
173
173
  operation.delete(:write)
174
174
  server = next_primary
175
- raise Error::UnsupportedCollation.new if options[:collation] && !server.features.collation_enabled?
175
+ if (options[:collation] || options[Operation::COLLATION]) && !server.features.collation_enabled?
176
+ raise Error::UnsupportedCollation.new
177
+ end
176
178
  Operation::Commands::Create.new({
177
179
  selector: operation,
178
180
  db_name: database.name,
@@ -178,7 +178,9 @@ module Mongo
178
178
  end
179
179
 
180
180
  def validate_collation!(server, opts)
181
- raise Error::UnsupportedCollation.new if opts[:collation] && !server.features.collation_enabled?
181
+ if (opts[:collation] || opts[Operation::COLLATION]) && !server.features.collation_enabled?
182
+ raise Error::UnsupportedCollation.new
183
+ end
182
184
  end
183
185
 
184
186
  def view; self; end
@@ -120,7 +120,9 @@ module Mongo
120
120
  end
121
121
 
122
122
  def validate_collation!(server)
123
- raise Error::UnsupportedCollation.new if @options[:collation] && !server.features.collation_enabled?
123
+ if (@options[:collation] || @options[Operation::COLLATION]) && !server.features.collation_enabled?
124
+ raise Error::UnsupportedCollation.new
125
+ end
124
126
  end
125
127
  end
126
128
  end
@@ -96,15 +96,30 @@ module Mongo
96
96
  def find_command
97
97
  document = BSON::Document.new('find' => collection.name, 'filter' => filter)
98
98
  command = Options::Mapper.transform_documents(convert_flags(options), MAPPINGS, document)
99
- convert_negative_limit(command)
99
+ convert_limit_and_batch_size(command)
100
+ command
100
101
  end
101
102
 
102
- def convert_negative_limit(command)
103
- if command[:limit] && command[:limit] < 0
104
- command['limit'] = command['limit'].abs
103
+ def convert_limit_and_batch_size(command)
104
+ if command[:limit] && command[:limit] < 0 &&
105
+ command[:batchSize] && command[:batchSize] < 0
106
+
107
+ command[:limit] = command[:limit].abs
108
+ command[:batchSize] = command[:limit].abs
105
109
  command[:singleBatch] = true
110
+
111
+ else
112
+ [:limit, :batchSize].each do |opt|
113
+ if command[opt]
114
+ if command[opt] < 0
115
+ command[opt] = command[opt].abs
116
+ command[:singleBatch] = true
117
+ elsif command[opt] == 0
118
+ command.delete(opt)
119
+ end
120
+ end
121
+ end
106
122
  end
107
- command
108
123
  end
109
124
 
110
125
  def convert_flags(options)
@@ -237,7 +237,9 @@ module Mongo
237
237
  end
238
238
 
239
239
  def validate_collation!(server)
240
- raise Error::UnsupportedCollation.new if options[:collation] && !server.features.collation_enabled?
240
+ if (options[:collation] || options[Operation::COLLATION]) && !server.features.collation_enabled?
241
+ raise Error::UnsupportedCollation.new
242
+ end
241
243
  end
242
244
  end
243
245
  end
@@ -211,7 +211,12 @@ module Mongo
211
211
  server = next_primary
212
212
  validate_collation!(server, opts)
213
213
  delete_doc = { Operation::Q => filter, Operation::LIMIT => value }
214
- delete_doc[:collation] = opts[:collation] if opts[:collation]
214
+ # We must extract the collation at the String key as well so that if w == 0,
215
+ # an error can be raised later when an OpCode is used.
216
+ # Otherwise, the collation will silently not be sent.
217
+ if collation = opts[:collation] || opts[Operation::COLLATION]
218
+ delete_doc[:collation] = collation
219
+ end
215
220
  write_with_retry do
216
221
  Operation::Write::Delete.new(
217
222
  :delete => delete_doc,
@@ -229,7 +234,12 @@ module Mongo
229
234
  Operation::U => spec,
230
235
  Operation::MULTI => multi,
231
236
  Operation::UPSERT => !!opts[:upsert] }
232
- update_doc[:collation] = opts[:collation] if opts[:collation]
237
+ # We must extract the collation at the String key as well so that if w == 0,
238
+ # an error can be raised later when an OpCode is used.
239
+ # Otherwise, the collation will silently not be sent.
240
+ if collation = opts[:collation] || opts[Operation::COLLATION]
241
+ update_doc[:collation] = collation
242
+ end
233
243
  write_with_retry do
234
244
  Operation::Write::Update.new(
235
245
  :update => update_doc,
@@ -25,7 +25,8 @@ module Mongo
25
25
  # @return [ Cursor ] cursor The cursor.
26
26
  attr_reader :cursor
27
27
 
28
- def_delegators :@cursor, :batch_size, :collection_name, :database, :view
28
+ def_delegators :@cursor, :collection_name, :database, :view
29
+ def_delegators :view, :batch_size
29
30
 
30
31
  # Create the new builder.
31
32
  #
@@ -55,7 +56,7 @@ module Mongo
55
56
 
56
57
  def get_more_command
57
58
  command = { :getMore => cursor.id, :collection => collection_name }
58
- command[:batchSize] = batch_size if batch_size
59
+ command[:batchSize] = batch_size.abs if batch_size && batch_size != 0
59
60
  # If the max_await_time_ms option is set, then we set maxTimeMS on
60
61
  # the get more command.
61
62
  if view.respond_to?(:max_await_time_ms)
@@ -15,7 +15,7 @@
15
15
  module Mongo
16
16
  class Error
17
17
 
18
- # Raised if the GridFS::Stream object is closed and an operation is attempted.
18
+ # Raised if the Grid::FSBucket::Stream object is closed and an operation is attempted.
19
19
  #
20
20
  # @since 2.1.0
21
21
  class ClosedStream < Error
@@ -46,7 +46,7 @@ module Mongo
46
46
  # @example Instantiate the exception.
47
47
  # Mongo::Error::InvalidServerPreference.new
48
48
  #
49
- # @param [ String ] name The preference name.
49
+ # @param [ String ] message The error message.
50
50
  #
51
51
  # @since 2.0.0
52
52
  def initialize(message)
@@ -271,7 +271,9 @@ module Mongo
271
271
  end
272
272
 
273
273
  def validate_collation!(model, server)
274
- raise Error::UnsupportedCollation.new if model[:collation] && !server.features.collation_enabled?
274
+ if (model[:collation] || model[Operation::COLLATION]) && !server.features.collation_enabled?
275
+ raise Error::UnsupportedCollation.new
276
+ end
275
277
  end
276
278
  end
277
279
  end
@@ -55,7 +55,7 @@ module Mongo
55
55
  #
56
56
  # @since 2.0.0
57
57
  def aggregate_write_concern_errors(count)
58
- @replies.each_with_index.reduce(nil) do |errors, (reply, i)|
58
+ @replies.each_with_index.reduce(nil) do |errors, (reply, _)|
59
59
  if write_concern_errors = reply.documents.first[Error::WRITE_CONCERN_ERRORS]
60
60
  (errors || []) << write_concern_errors.reduce(nil) do |errs, wce|
61
61
  wce.merge!('index' => count + wce['index'])
@@ -59,7 +59,7 @@ module Mongo
59
59
  end
60
60
 
61
61
  def message(server)
62
- Protocol::Insert.new(db_name, Index::COLLECTION, index_documents)
62
+ Protocol::Insert.new(db_name, Index::COLLECTION, index_documents, validating_keys: false)
63
63
  end
64
64
  end
65
65
  end
@@ -61,7 +61,7 @@ module Mongo
61
61
  end
62
62
 
63
63
  def has_collation?
64
- delete[:collation]
64
+ delete[:collation] || delete[Operation::COLLATION]
65
65
  end
66
66
 
67
67
  def message(server)
@@ -64,7 +64,7 @@ module Mongo
64
64
  end
65
65
 
66
66
  def has_collation?
67
- update[:collation]
67
+ update[:collation] || update[Operation::COLLATION]
68
68
  end
69
69
 
70
70
  def message(server)
@@ -46,6 +46,7 @@ module Mongo
46
46
  @selector = selector
47
47
  @flags = options[:flags] || []
48
48
  @upconverter = Upconverter.new(collection, selector, options)
49
+ super
49
50
  end
50
51
 
51
52
  # Return the event payload for monitoring.
@@ -65,10 +66,12 @@ module Mongo
65
66
  }
66
67
  end
67
68
 
68
- private
69
+ protected
69
70
 
70
71
  attr_reader :upconverter
71
72
 
73
+ private
74
+
72
75
  # The operation code required to specify a Delete message.
73
76
  # @return [Fixnum] the operation code.
74
77
  def op_code
@@ -42,6 +42,7 @@ module Mongo
42
42
  @number_to_return = number_to_return
43
43
  @cursor_id = cursor_id
44
44
  @upconverter = Upconverter.new(collection, cursor_id, number_to_return)
45
+ super
45
46
  end
46
47
 
47
48
  # Return the event payload for monitoring.
@@ -73,10 +74,12 @@ module Mongo
73
74
  true
74
75
  end
75
76
 
76
- private
77
+ protected
77
78
 
78
79
  attr_reader :upconverter
79
80
 
81
+ private
82
+
80
83
  # The operation code required to specify a GetMore message.
81
84
  # @return [Fixnum] the operation code.
82
85
  def op_code
@@ -54,6 +54,8 @@ module Mongo
54
54
  @documents = documents
55
55
  @flags = options[:flags] || []
56
56
  @upconverter = Upconverter.new(collection, documents, options)
57
+ @options = options
58
+ super
57
59
  end
58
60
 
59
61
  # Return the event payload for monitoring.
@@ -73,14 +75,16 @@ module Mongo
73
75
  }
74
76
  end
75
77
 
78
+ protected
79
+
80
+ attr_reader :upconverter
81
+
76
82
  private
77
83
 
78
84
  def validating_keys?
79
- true
85
+ @options.fetch(:validating_keys, true)
80
86
  end
81
87
 
82
- attr_reader :upconverter
83
-
84
88
  # The operation code required to specify an Insert message.
85
89
  # @return [Fixnum] the operation code.
86
90
  def op_code
@@ -36,6 +36,7 @@ module Mongo
36
36
  @cursor_ids = cursor_ids
37
37
  @id_count = @cursor_ids.size
38
38
  @upconverter = Upconverter.new(collection, cursor_ids)
39
+ super
39
40
  end
40
41
 
41
42
  # Return the event payload for monitoring.
@@ -55,10 +56,12 @@ module Mongo
55
56
  }
56
57
  end
57
58
 
58
- private
59
+ protected
59
60
 
60
61
  attr_reader :upconverter
61
62
 
63
+ private
64
+
62
65
  # The operation code required to specify +KillCursors+ message.
63
66
  # @return [Fixnum] the operation code.
64
67
  def op_code
@@ -77,6 +77,10 @@ module Mongo
77
77
  # @return [Fixnum] The request id for this message
78
78
  attr_reader :request_id
79
79
 
80
+ def initialize(*args) # :nodoc:
81
+ @request_id = nil
82
+ end
83
+
80
84
  # The default for messages is not to require a reply after sending a
81
85
  # message to the server.
82
86
  #
@@ -110,7 +114,7 @@ module Mongo
110
114
  #
111
115
  # @return [ Message ] Instance of a Message class
112
116
  def self.deserialize(io, max_message_size = MAX_MESSAGE_SIZE, expected_response_to = nil)
113
- length, request_id, response_to, op_code = deserialize_header(BSON::ByteBuffer.new(io.read(16)))
117
+ length, _request_id, response_to, _op_code = deserialize_header(BSON::ByteBuffer.new(io.read(16)))
114
118
 
115
119
  # Protection from potential DOS man-in-the-middle attacks. See
116
120
  # DRIVERS-276.
@@ -67,6 +67,7 @@ module Mongo
67
67
  @skip = options[:skip] || 0
68
68
  @flags = options[:flags] || []
69
69
  @upconverter = Upconverter.new(collection, selector, options, flags)
70
+ super
70
71
  end
71
72
 
72
73
  # Return the event payload for monitoring.
@@ -98,10 +99,12 @@ module Mongo
98
99
  true
99
100
  end
100
101
 
101
- private
102
+ protected
102
103
 
103
104
  attr_reader :upconverter
104
105
 
106
+ private
107
+
105
108
  # The operation code required to specify a Query message.
106
109
  # @return [Fixnum] the operation code.
107
110
  def op_code
@@ -252,7 +255,7 @@ module Mongo
252
255
  #
253
256
  # @since 2.1.0
254
257
  def command_name
255
- command? ? filter.keys.first : FIND
258
+ (filter[:$query] || !command?) ? FIND : filter.keys.first
256
259
  end
257
260
 
258
261
  private
@@ -261,9 +264,13 @@ module Mongo
261
264
  collection == Database::COMMAND
262
265
  end
263
266
 
267
+ def query_filter
268
+ filter[:$query] || filter
269
+ end
270
+
264
271
  def op_command
265
272
  document = BSON::Document.new
266
- filter.each do |field, value|
273
+ query_filter.each do |field, value|
267
274
  document.store(field.to_s, value)
268
275
  end
269
276
  document
@@ -272,7 +279,7 @@ module Mongo
272
279
  def find_command
273
280
  document = BSON::Document.new
274
281
  document.store(FIND, collection)
275
- document.store(FILTER, filter[:$query] ? filter[:$query] : filter)
282
+ document.store(FILTER, query_filter)
276
283
  OPTION_MAPPINGS.each do |legacy, option|
277
284
  document.store(option, options[legacy]) unless options[legacy].nil?
278
285
  end