mongo 2.1.2 → 2.2.0.rc0

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