mongo 2.4.0.rc0 → 2.4.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
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