mongo 2.1.2 → 2.2.0.rc0

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 (140) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/README.md +10 -3
  5. data/Rakefile +1 -7
  6. data/lib/csasl/csasl.bundle +0 -0
  7. data/lib/mongo/auth/user/view.rb +1 -1
  8. data/lib/mongo/bulk_write.rb +7 -1
  9. data/lib/mongo/client.rb +17 -15
  10. data/lib/mongo/cluster.rb +4 -2
  11. data/lib/mongo/collection.rb +36 -2
  12. data/lib/mongo/collection/view.rb +24 -21
  13. data/lib/mongo/collection/view/aggregation.rb +5 -42
  14. data/lib/mongo/collection/view/builder.rb +20 -0
  15. data/lib/mongo/collection/view/builder/aggregation.rb +98 -0
  16. data/lib/mongo/collection/view/builder/find_command.rb +111 -0
  17. data/lib/mongo/collection/view/builder/flags.rb +62 -0
  18. data/lib/mongo/collection/view/builder/map_reduce.rb +134 -0
  19. data/lib/mongo/collection/view/builder/modifiers.rb +80 -0
  20. data/lib/mongo/collection/view/builder/op_query.rb +83 -0
  21. data/lib/mongo/collection/view/explainable.rb +15 -0
  22. data/lib/mongo/collection/view/immutable.rb +5 -12
  23. data/lib/mongo/collection/view/iterable.rb +24 -2
  24. data/lib/mongo/collection/view/map_reduce.rb +18 -27
  25. data/lib/mongo/collection/view/readable.rb +70 -112
  26. data/lib/mongo/collection/view/writable.rb +23 -7
  27. data/lib/mongo/cursor.rb +76 -25
  28. data/lib/mongo/cursor/builder.rb +18 -0
  29. data/lib/mongo/cursor/builder/get_more_command.rb +71 -0
  30. data/lib/mongo/cursor/builder/kill_cursors_command.rb +62 -0
  31. data/lib/mongo/cursor/builder/op_get_more.rb +61 -0
  32. data/lib/mongo/cursor/builder/op_kill_cursors.rb +56 -0
  33. data/lib/mongo/database.rb +2 -2
  34. data/lib/mongo/database/view.rb +9 -5
  35. data/lib/mongo/dbref.rb +3 -3
  36. data/lib/mongo/error.rb +1 -0
  37. data/lib/mongo/error/invalid_write_concern.rb +35 -0
  38. data/lib/mongo/grid/file/chunk.rb +2 -2
  39. data/lib/mongo/index/view.rb +5 -2
  40. data/lib/mongo/operation.rb +1 -0
  41. data/lib/mongo/operation/commands.rb +2 -0
  42. data/lib/mongo/operation/commands/aggregate.rb +39 -45
  43. data/lib/mongo/operation/commands/aggregate/result.rb +54 -68
  44. data/lib/mongo/operation/commands/collections_info.rb +38 -36
  45. data/lib/mongo/operation/commands/collections_info/result.rb +17 -15
  46. data/lib/mongo/operation/commands/command.rb +24 -22
  47. data/lib/mongo/operation/commands/find.rb +27 -0
  48. data/lib/mongo/operation/commands/find/result.rb +62 -0
  49. data/lib/mongo/operation/commands/get_more.rb +27 -0
  50. data/lib/mongo/operation/commands/get_more/result.rb +62 -0
  51. data/lib/mongo/operation/commands/indexes.rb +41 -39
  52. data/lib/mongo/operation/commands/list_collections.rb +25 -31
  53. data/lib/mongo/operation/commands/list_collections/result.rb +63 -81
  54. data/lib/mongo/operation/commands/list_indexes.rb +27 -35
  55. data/lib/mongo/operation/commands/list_indexes/result.rb +67 -85
  56. data/lib/mongo/operation/commands/map_reduce.rb +29 -37
  57. data/lib/mongo/operation/commands/map_reduce/result.rb +85 -88
  58. data/lib/mongo/operation/commands/parallel_scan.rb +29 -33
  59. data/lib/mongo/operation/commands/parallel_scan/result.rb +34 -42
  60. data/lib/mongo/operation/commands/user_query.rb +40 -38
  61. data/lib/mongo/operation/commands/users_info.rb +24 -29
  62. data/lib/mongo/operation/commands/users_info/result.rb +13 -11
  63. data/lib/mongo/operation/object_id_generator.rb +36 -0
  64. data/lib/mongo/operation/result.rb +30 -0
  65. data/lib/mongo/operation/specifiable.rb +35 -1
  66. data/lib/mongo/operation/write/bulk/bulkable.rb +4 -3
  67. data/lib/mongo/operation/write/bulk/delete/result.rb +18 -25
  68. data/lib/mongo/operation/write/bulk/legacy_mergable.rb +2 -2
  69. data/lib/mongo/operation/write/command/delete.rb +3 -2
  70. data/lib/mongo/operation/write/command/insert.rb +4 -2
  71. data/lib/mongo/operation/write/command/update.rb +6 -3
  72. data/lib/mongo/operation/write/gle.rb +2 -1
  73. data/lib/mongo/operation/write/idable.rb +19 -2
  74. data/lib/mongo/options/mapper.rb +22 -0
  75. data/lib/mongo/protocol/bit_vector.rb +3 -3
  76. data/lib/mongo/protocol/delete.rb +15 -5
  77. data/lib/mongo/protocol/get_more.rb +10 -5
  78. data/lib/mongo/protocol/insert.rb +1 -6
  79. data/lib/mongo/protocol/kill_cursors.rb +14 -1
  80. data/lib/mongo/protocol/message.rb +32 -8
  81. data/lib/mongo/protocol/serializers.rb +15 -16
  82. data/lib/mongo/protocol/update.rb +35 -12
  83. data/lib/mongo/server/connectable.rb +3 -1
  84. data/lib/mongo/server/connection.rb +5 -5
  85. data/lib/mongo/server/description.rb +8 -2
  86. data/lib/mongo/server/description/features.rb +2 -1
  87. data/lib/mongo/server/monitor.rb +1 -12
  88. data/lib/mongo/server/monitor/connection.rb +30 -26
  89. data/lib/mongo/server_selector/selectable.rb +21 -4
  90. data/lib/mongo/uri.rb +2 -0
  91. data/lib/mongo/version.rb +1 -1
  92. data/lib/mongo/write_concern.rb +21 -6
  93. data/mongo.gemspec +1 -2
  94. data/spec/mongo/bulk_write/ordered_combiner_spec.rb +13 -0
  95. data/spec/mongo/bulk_write_spec.rb +58 -0
  96. data/spec/mongo/client_spec.rb +6 -4
  97. data/spec/mongo/collection/view/builder/find_command_spec.rb +167 -0
  98. data/spec/mongo/collection/view/builder/flags_spec.rb +106 -0
  99. data/spec/mongo/collection/view/builder/modifiers_spec.rb +210 -0
  100. data/spec/mongo/collection/view/builder/op_query_spec.rb +154 -0
  101. data/spec/mongo/collection/view/explainable_spec.rb +1 -2
  102. data/spec/mongo/collection/view/immutable_spec.rb +3 -52
  103. data/spec/mongo/collection/view/map_reduce_spec.rb +12 -12
  104. data/spec/mongo/collection/view/readable_spec.rb +86 -80
  105. data/spec/mongo/collection/view_spec.rb +109 -703
  106. data/spec/mongo/collection_spec.rb +594 -11
  107. data/spec/mongo/command_monitoring_spec.rb +40 -27
  108. data/spec/mongo/cursor/builder/get_more_command_spec.rb +160 -0
  109. data/spec/mongo/cursor/builder/op_get_more_spec.rb +52 -0
  110. data/spec/mongo/cursor_spec.rb +10 -60
  111. data/spec/mongo/database_spec.rb +24 -3
  112. data/spec/mongo/dbref_spec.rb +4 -4
  113. data/spec/mongo/grid/file/chunk_spec.rb +1 -1
  114. data/spec/mongo/grid/fs_bucket_spec.rb +3 -3
  115. data/spec/mongo/index/view_spec.rb +41 -0
  116. data/spec/mongo/operation/{aggregate → commands/aggregate}/result_spec.rb +1 -1
  117. data/spec/mongo/operation/commands/aggregate_spec.rb +1 -1
  118. data/spec/mongo/operation/commands/collections_info_spec.rb +1 -1
  119. data/spec/mongo/operation/commands/command_spec.rb +1 -1
  120. data/spec/mongo/operation/commands/indexes_spec.rb +1 -1
  121. data/spec/mongo/operation/commands/map_reduce_spec.rb +1 -1
  122. data/spec/mongo/operation/write/command/delete_spec.rb +25 -0
  123. data/spec/mongo/operation/write/command/insert_spec.rb +25 -0
  124. data/spec/mongo/operation/write/command/update_spec.rb +25 -0
  125. data/spec/mongo/protocol/delete_spec.rb +4 -4
  126. data/spec/mongo/protocol/get_more_spec.rb +4 -4
  127. data/spec/mongo/protocol/insert_spec.rb +3 -3
  128. data/spec/mongo/protocol/kill_cursors_spec.rb +3 -3
  129. data/spec/mongo/protocol/query_spec.rb +7 -7
  130. data/spec/mongo/protocol/update_spec.rb +5 -5
  131. data/spec/mongo/server/description/features_spec.rb +25 -0
  132. data/spec/mongo/write_concern_spec.rb +126 -0
  133. data/spec/spec_helper.rb +9 -19
  134. data/spec/support/command_monitoring.rb +8 -0
  135. data/spec/support/command_monitoring/find.yml +53 -4
  136. data/spec/support/matchers.rb +1 -1
  137. data/spec/support/shared/protocol.rb +5 -5
  138. data/spec/support/travis.rb +1 -1
  139. metadata +43 -10
  140. metadata.gz.sig +0 -0
@@ -42,6 +42,28 @@ module Mongo
42
42
  end
43
43
  end
44
44
 
45
+ # Transforms the provided options to a new set of options given the
46
+ # provided mapping. Expects BSON::Documents in and out so no explicit
47
+ # string conversion needs to happen.
48
+ #
49
+ # @example Transform the options.
50
+ # Mapper.transform_documents({ name: 1 }, { :name => :nombre })
51
+ #
52
+ # @param [ BSON::Document ] options The options to transform
53
+ # @param [ BSON::Document ] mappings The key mappings.
54
+ # @param [ BSON::Document ] document The output document.
55
+ #
56
+ # @return [ BSON::Document ] The transformed options.
57
+ #
58
+ # @since 2.0.0
59
+ def transform_documents(options, mappings, document = BSON::Document.new)
60
+ options.reduce(document) do |transformed, (key, value)|
61
+ name = mappings[key]
62
+ transformed[name] = value if name && !value.nil?
63
+ transformed
64
+ end
65
+ end
66
+
45
67
  # Coverts all the keys of the options to strings.
46
68
  #
47
69
  # @example Convert all option keys to strings.
@@ -40,15 +40,15 @@ module Mongo
40
40
  def serialize(buffer, value)
41
41
  bits = 0
42
42
  value.each { |flag| bits |= @masks[flag] }
43
- buffer << [bits].pack(INT32_PACK)
43
+ buffer.put_int32(bits)
44
44
  end
45
45
 
46
46
  # Deserializes vector by decoding the symbol according to its mask
47
47
  #
48
48
  # @param io [IO] Stream containing the vector to be deserialized
49
49
  # @return [Array<Symbol>] Flags contained in the vector
50
- def deserialize(io)
51
- vector = io.read(4).unpack(INT32_PACK).first
50
+ def deserialize(buffer)
51
+ vector = buffer.get_int32
52
52
  flags = []
53
53
  @masks.each do |flag, mask|
54
54
  flags << flag if mask & vector != 0
@@ -99,6 +99,16 @@ module Mongo
99
99
  # @since 2.1.0
100
100
  class Upconverter
101
101
 
102
+ # The delete command constant.
103
+ #
104
+ # @since 2.2.0
105
+ DELETE = 'delete'.freeze
106
+
107
+ # The deletes command constant.
108
+ #
109
+ # @since 2.2.0
110
+ DELETES = 'deletes'.freeze
111
+
102
112
  # @return [ String ] collection The name of the collection.
103
113
  attr_reader :collection
104
114
 
@@ -132,11 +142,11 @@ module Mongo
132
142
  #
133
143
  # @since 2.1.0
134
144
  def command
135
- BSON::Document.new(
136
- delete: collection,
137
- deletes: [ BSON::Document.new(q: filter, limit: limit) ],
138
- ordered: true
139
- )
145
+ document = BSON::Document.new
146
+ document.store(DELETE, collection)
147
+ document.store(DELETES, [ BSON::Document.new(Message::Q => filter, Message::LIMIT => limit) ])
148
+ document.store(Message::ORDERED, true)
149
+ document
140
150
  end
141
151
 
142
152
  private
@@ -104,6 +104,11 @@ module Mongo
104
104
  # @since 2.1.0
105
105
  class Upconverter
106
106
 
107
+ # The get more constant.
108
+ #
109
+ # @since 2.2.0
110
+ GET_MORE = 'getMore'.freeze
111
+
107
112
  # @return [ String ] collection The name of the collection.
108
113
  attr_reader :collection
109
114
 
@@ -139,11 +144,11 @@ module Mongo
139
144
  #
140
145
  # @since 2.1.0
141
146
  def command
142
- BSON::Document.new(
143
- getMore: cursor_id,
144
- batchSize: number_to_return,
145
- collection: collection
146
- )
147
+ document = BSON::Document.new
148
+ document.store(GET_MORE, cursor_id)
149
+ document.store(Message::BATCH_SIZE, number_to_return)
150
+ document.store(Message::COLLECTION, collection)
151
+ document
147
152
  end
148
153
  end
149
154
  end
@@ -114,11 +114,6 @@ module Mongo
114
114
  # @since 2.1.0
115
115
  DOCUMENTS = 'documents'.freeze
116
116
 
117
- # Ordered field constant.
118
- #
119
- # @since 2.1.0
120
- ORDERED = 'ordered'.freeze
121
-
122
117
  # Write concern field constant.
123
118
  #
124
119
  # @since 2.1.0
@@ -161,7 +156,7 @@ module Mongo
161
156
  document = BSON::Document.new
162
157
  document.store(INSERT, collection)
163
158
  document.store(DOCUMENTS, documents)
164
- document.store(ORDERED, options.fetch(:ordered, true))
159
+ document.store(Message::ORDERED, options.fetch(:ordered, true))
165
160
  document.merge!(WRITE_CONCERN => options[:write_concern].options) if options[:write_concern]
166
161
  document
167
162
  end
@@ -82,6 +82,16 @@ module Mongo
82
82
  # @since 2.1.0
83
83
  class Upconverter
84
84
 
85
+ # The kill cursors constant.
86
+ #
87
+ # @since 2.2.0
88
+ KILL_CURSORS = 'killCursors'.freeze
89
+
90
+ # The cursors constant.
91
+ #
92
+ # @since 2.2.0
93
+ CURSORS = 'cursors'.freeze
94
+
85
95
  # @return [ String ] collection The name of the collection.
86
96
  attr_reader :collection
87
97
 
@@ -111,7 +121,10 @@ module Mongo
111
121
  #
112
122
  # @since 2.1.0
113
123
  def command
114
- BSON::Document.new(killCursors: collection, cursors: cursor_ids)
124
+ document = BSON::Document.new
125
+ document.store(KILL_CURSORS, collection)
126
+ document.store(CURSORS, cursor_ids)
127
+ document
115
128
  end
116
129
  end
117
130
  end
@@ -42,6 +42,31 @@ module Mongo
42
42
  class Message
43
43
  include Serializers
44
44
 
45
+ # The batch size constant.
46
+ #
47
+ # @since 2.2.0
48
+ BATCH_SIZE = 'batchSize'.freeze
49
+
50
+ # The collection constant.
51
+ #
52
+ # @since 2.2.0
53
+ COLLECTION = 'collection'.freeze
54
+
55
+ # The limit constant.
56
+ #
57
+ # @since 2.2.0
58
+ LIMIT = 'limit'.freeze
59
+
60
+ # The ordered constant.
61
+ #
62
+ # @since 2.2.0
63
+ ORDERED = 'ordered'.freeze
64
+
65
+ # The q constant.
66
+ #
67
+ # @since 2.2.0
68
+ Q = 'q'.freeze
69
+
45
70
  # Returns the request id for the message
46
71
  #
47
72
  # @return [Fixnum] The request id for this message
@@ -64,13 +89,11 @@ module Mongo
64
89
  #
65
90
  # @param buffer [String] buffer where the message should be inserted
66
91
  # @return [String] buffer containing the serialized message
67
- def serialize(buffer = ''.force_encoding('BINARY'), max_bson_size = nil)
68
- start = buffer.bytesize
92
+ def serialize(buffer = BSON::ByteBuffer.new, max_bson_size = nil)
93
+ start = buffer.length
69
94
  serialize_header(buffer)
70
95
  serialize_fields(buffer, max_bson_size)
71
- length = buffer.bytesize - start
72
- buffer[start, 4] = Int32.serialize('', length)
73
- buffer
96
+ buffer.replace_int32(start, buffer.length - start)
74
97
  end
75
98
 
76
99
  alias_method :to_s, :serialize
@@ -80,13 +103,14 @@ module Mongo
80
103
  # @param io [IO] Stream containing a message
81
104
  # @return [Message] Instance of a Message class
82
105
  def self.deserialize(io)
83
- deserialize_header(io)
106
+ length = deserialize_header(BSON::ByteBuffer.new(io.read(16))).first
107
+ buffer = BSON::ByteBuffer.new(io.read(length - 16))
84
108
  message = allocate
85
109
  fields.each do |field|
86
110
  if field[:multi]
87
- deserialize_array(message, io, field)
111
+ deserialize_array(message, buffer, field)
88
112
  else
89
- deserialize_field(message, io, field)
113
+ deserialize_field(message, buffer, field)
90
114
  end
91
115
  end
92
116
  message
@@ -50,7 +50,7 @@ module Mongo
50
50
  # @param value [String] Header value to be serialized.
51
51
  # @return [String] Buffer with serialized value.
52
52
  def self.serialize(buffer, value)
53
- buffer << value.pack(HEADER_PACK)
53
+ buffer.put_bytes(value.pack(HEADER_PACK))
54
54
  end
55
55
 
56
56
  # Deserializes the header value from the IO stream
@@ -58,8 +58,8 @@ module Mongo
58
58
  # @param io [IO] IO stream containing the message header.
59
59
  # @return [Array<Fixnum>] Array consisting of the deserialized
60
60
  # length, request id, response id, and op code.
61
- def self.deserialize(io)
62
- io.read(16).unpack(HEADER_PACK)
61
+ def self.deserialize(buffer)
62
+ buffer.get_bytes(16).unpack(HEADER_PACK)
63
63
  end
64
64
  end
65
65
 
@@ -74,8 +74,7 @@ module Mongo
74
74
  # @param value [String] The string to be serialized.
75
75
  # @return [String] Buffer with serialized value.
76
76
  def self.serialize(buffer, value)
77
- buffer << value.force_encoding(BSON::BINARY)
78
- buffer << NULL
77
+ buffer.put_cstring(value)
79
78
  end
80
79
  end
81
80
 
@@ -90,7 +89,7 @@ module Mongo
90
89
  # @param value [Fixnum] Ignored value.
91
90
  # @return [String] Buffer with serialized value.
92
91
  def self.serialize(buffer, value)
93
- buffer << [ZERO].pack(INT32_PACK)
92
+ buffer.put_int32(ZERO)
94
93
  end
95
94
  end
96
95
 
@@ -105,15 +104,15 @@ module Mongo
105
104
  # @param value [Fixnum] 32-bit integer to be serialized.
106
105
  # @return [String] Buffer with serialized value.
107
106
  def self.serialize(buffer, value)
108
- buffer << [value].pack(INT32_PACK)
107
+ buffer.put_int32(value)
109
108
  end
110
109
 
111
110
  # Deserializes a 32-bit Fixnum from the IO stream
112
111
  #
113
112
  # @param io [IO] IO stream containing the 32-bit integer
114
113
  # @return [Fixnum] Deserialized Int32
115
- def self.deserialize(io)
116
- io.read(4).unpack(INT32_PACK).first
114
+ def self.deserialize(buffer)
115
+ buffer.get_int32
117
116
  end
118
117
  end
119
118
 
@@ -128,15 +127,15 @@ module Mongo
128
127
  # @param value [Fixnum] 64-bit integer to be serialized.
129
128
  # @return [String] Buffer with serialized value.
130
129
  def self.serialize(buffer, value)
131
- buffer << [value].pack(INT64_PACK)
130
+ buffer.put_int64(value)
132
131
  end
133
132
 
134
133
  # Deserializes a 64-bit Fixnum from the IO stream
135
134
  #
136
135
  # @param io [IO] IO stream containing the 64-bit integer.
137
136
  # @return [Fixnum] Deserialized Int64.
138
- def self.deserialize(io)
139
- io.read(8).unpack(INT64_PACK).first
137
+ def self.deserialize(buffer)
138
+ buffer.get_int64
140
139
  end
141
140
  end
142
141
 
@@ -151,9 +150,9 @@ module Mongo
151
150
  # @param value [Hash] Document to serialize as BSON.
152
151
  # @return [String] Buffer with serialized value.
153
152
  def self.serialize(buffer, value, max_bson_size = nil)
154
- start_size = buffer.size
153
+ start_size = buffer.length
155
154
  value.to_bson(buffer)
156
- if max_bson_size && buffer.size - start_size > max_bson_size
155
+ if max_bson_size && buffer.length - start_size > max_bson_size
157
156
  raise Error::MaxBSONSize.new(max_bson_size)
158
157
  end
159
158
  end
@@ -162,8 +161,8 @@ module Mongo
162
161
  #
163
162
  # @param io [IO] IO stream containing the BSON encoded document.
164
163
  # @return [Hash] The decoded BSON document.
165
- def self.deserialize(io)
166
- BSON::Document.from_bson(io)
164
+ def self.deserialize(buffer)
165
+ BSON::Document.from_bson(buffer)
167
166
  end
168
167
 
169
168
  # Whether there can be a size limit on this type after serialization.
@@ -116,6 +116,31 @@ module Mongo
116
116
  # @since 2.1.0
117
117
  class Upconverter
118
118
 
119
+ # The multi constant.
120
+ #
121
+ # @since 2.2.0
122
+ MULTI = 'multi'.freeze
123
+
124
+ # The u constant.
125
+ #
126
+ # @since 2.2.0
127
+ U = 'u'.freeze
128
+
129
+ # The update constant.
130
+ #
131
+ # @since 2.2.0
132
+ UPDATE = 'update'.freeze
133
+
134
+ # The updates constant.
135
+ #
136
+ # @since 2.2.0
137
+ UPDATES = 'updates'.freeze
138
+
139
+ # The upsert constant.
140
+ #
141
+ # @since 2.2.0
142
+ UPSERT = 'upsert'.freeze
143
+
119
144
  # @return [ String ] collection The name of the collection.
120
145
  attr_reader :collection
121
146
 
@@ -160,18 +185,16 @@ module Mongo
160
185
  #
161
186
  # @since 2.1.0
162
187
  def command
163
- BSON::Document.new(
164
- update: collection,
165
- ordered: true,
166
- updates: [
167
- BSON::Document.new(
168
- q: filter,
169
- u: update,
170
- multi: flags.include?(:multi_update),
171
- upsert: flags.include?(:upsert),
172
- )
173
- ]
174
- )
188
+ document = BSON::Document.new
189
+ updates = BSON::Document.new
190
+ updates.store(Message::Q, filter)
191
+ updates.store(U, update)
192
+ updates.store(MULTI, flags.include?(:multi_update))
193
+ updates.store(UPSERT, flags.include?(:upsert))
194
+ document.store(UPDATE, collection)
195
+ document.store(Message::ORDERED, true)
196
+ document.store(UPDATES, [ updates ])
197
+ document
175
198
  end
176
199
  end
177
200
  end
@@ -103,7 +103,9 @@ module Mongo
103
103
  end
104
104
 
105
105
  def read
106
- ensure_connected{ |socket| Protocol::Reply.deserialize(socket) }
106
+ ensure_connected do |socket|
107
+ Protocol::Reply.deserialize(socket)
108
+ end
107
109
  end
108
110
  end
109
111
  end
@@ -36,7 +36,7 @@ module Mongo
36
36
  # The ping message as raw bytes.
37
37
  #
38
38
  # @since 2.1.0
39
- PING_BYTES = PING_MESSAGE.serialize.freeze
39
+ PING_BYTES = PING_MESSAGE.serialize.to_s.freeze
40
40
 
41
41
  # @return [ Mongo::Auth::CR, Mongo::Auth::X509, Mongo::Auth:LDAP, Mongo::Auth::SCRAM ]
42
42
  # authenticator The authentication strategy.
@@ -188,17 +188,17 @@ module Mongo
188
188
  end
189
189
  end
190
190
 
191
- def write(messages, buffer = ''.force_encoding(BSON::BINARY))
191
+ def write(messages, buffer = BSON::ByteBuffer.new)
192
192
  start_size = 0
193
193
  messages.each do |message|
194
194
  message.serialize(buffer, max_bson_object_size)
195
195
  if max_message_size &&
196
- (buffer.size - start_size) > max_message_size
196
+ (buffer.length - start_size) > max_message_size
197
197
  raise Error::MaxMessageSize.new(max_message_size)
198
- start_size = buffer.size
198
+ start_size = buffer.length
199
199
  end
200
200
  end
201
- ensure_connected{ |socket| socket.write(buffer) }
201
+ ensure_connected{ |socket| socket.write(buffer.to_s) }
202
202
  end
203
203
  end
204
204
  end
@@ -142,7 +142,7 @@ module Mongo
142
142
  # Fields to exclude when comparing two descriptions.
143
143
  #
144
144
  # @since 2.0.6
145
- EXCLUDE_FOR_COMPARISON = [ LOCAL_TIME, ELECTION_ID ]
145
+ EXCLUDE_FOR_COMPARISON = [ LOCAL_TIME, ELECTION_ID ].freeze
146
146
 
147
147
  # @return [ Address ] address The server's address.
148
148
  attr_reader :address
@@ -553,11 +553,17 @@ module Mongo
553
553
  def ==(other)
554
554
  return false if self.class != other.class
555
555
  return true if config == other.config
556
+ compare_config(other)
557
+ end
558
+ alias_method :eql?, :==
559
+
560
+ private
561
+
562
+ def compare_config(other)
556
563
  !config.keys.empty? && config.keys.all? do |k|
557
564
  config[k] == other.config[k] || EXCLUDE_FOR_COMPARISON.include?(k)
558
565
  end
559
566
  end
560
- alias_method :eql?, :==
561
567
  end
562
568
  end
563
569
  end