mongo 2.14.0 → 2.15.0.alpha

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 (230) 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 +4 -1
  5. data/Rakefile +8 -15
  6. data/lib/mongo.rb +23 -0
  7. data/lib/mongo/auth/aws/conversation.rb +1 -4
  8. data/lib/mongo/auth/base.rb +13 -7
  9. data/lib/mongo/auth/conversation_base.rb +32 -0
  10. data/lib/mongo/auth/cr/conversation.rb +6 -29
  11. data/lib/mongo/auth/gssapi/conversation.rb +4 -15
  12. data/lib/mongo/auth/ldap/conversation.rb +3 -14
  13. data/lib/mongo/auth/sasl_conversation_base.rb +1 -13
  14. data/lib/mongo/auth/scram_conversation_base.rb +7 -34
  15. data/lib/mongo/auth/user/view.rb +16 -9
  16. data/lib/mongo/auth/x509/conversation.rb +4 -25
  17. data/lib/mongo/background_thread.rb +11 -0
  18. data/lib/mongo/bulk_write.rb +21 -18
  19. data/lib/mongo/client.rb +82 -6
  20. data/lib/mongo/cluster.rb +19 -28
  21. data/lib/mongo/cluster/reapers/cursor_reaper.rb +6 -2
  22. data/lib/mongo/cluster/sdam_flow.rb +14 -0
  23. data/lib/mongo/collection.rb +8 -6
  24. data/lib/mongo/collection/view/aggregation.rb +1 -1
  25. data/lib/mongo/collection/view/change_stream.rb +1 -1
  26. data/lib/mongo/collection/view/iterable.rb +1 -1
  27. data/lib/mongo/collection/view/map_reduce.rb +2 -2
  28. data/lib/mongo/collection/view/readable.rb +42 -20
  29. data/lib/mongo/collection/view/writable.rb +14 -14
  30. data/lib/mongo/cursor.rb +2 -2
  31. data/lib/mongo/database.rb +22 -5
  32. data/lib/mongo/database/view.rb +1 -1
  33. data/lib/mongo/error.rb +9 -1
  34. data/lib/mongo/error/bulk_write_error.rb +17 -3
  35. data/lib/mongo/error/internal_driver_error.rb +22 -0
  36. data/lib/mongo/error/operation_failure.rb +21 -2
  37. data/lib/mongo/error/parser.rb +65 -12
  38. data/lib/mongo/error/server_api_conflict.rb +23 -0
  39. data/lib/mongo/error/server_api_not_supported.rb +24 -0
  40. data/lib/mongo/error/unmet_dependency.rb +21 -0
  41. data/lib/mongo/grid/fs_bucket.rb +37 -37
  42. data/lib/mongo/index/view.rb +21 -11
  43. data/lib/mongo/monitoring.rb +13 -4
  44. data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +27 -16
  45. data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +26 -15
  46. data/lib/mongo/operation.rb +2 -2
  47. data/lib/mongo/operation/collections_info.rb +18 -1
  48. data/lib/mongo/operation/collections_info/command.rb +2 -2
  49. data/lib/mongo/operation/context.rb +99 -0
  50. data/lib/mongo/operation/indexes.rb +15 -1
  51. data/lib/mongo/operation/insert/command.rb +2 -2
  52. data/lib/mongo/operation/insert/legacy.rb +2 -2
  53. data/lib/mongo/operation/insert/op_msg.rb +2 -2
  54. data/lib/mongo/operation/list_collections/result.rb +4 -1
  55. data/lib/mongo/operation/result.rb +2 -0
  56. data/lib/mongo/operation/shared/executable.rb +24 -14
  57. data/lib/mongo/operation/shared/executable_no_validate.rb +2 -2
  58. data/lib/mongo/operation/shared/op_msg_or_command.rb +1 -7
  59. data/lib/mongo/operation/shared/op_msg_or_find_command.rb +1 -7
  60. data/lib/mongo/operation/shared/polymorphic_operation.rb +39 -0
  61. data/lib/mongo/operation/shared/response_handling.rb +23 -23
  62. data/lib/mongo/operation/shared/sessions_supported.rb +13 -2
  63. data/lib/mongo/operation/shared/write.rb +8 -18
  64. data/lib/mongo/protocol/compressed.rb +51 -5
  65. data/lib/mongo/protocol/message.rb +20 -2
  66. data/lib/mongo/protocol/msg.rb +36 -11
  67. data/lib/mongo/query_cache.rb +30 -0
  68. data/lib/mongo/retryable.rb +1 -1
  69. data/lib/mongo/server.rb +7 -15
  70. data/lib/mongo/server/app_metadata.rb +52 -18
  71. data/lib/mongo/server/connection.rb +5 -0
  72. data/lib/mongo/server/connection_base.rb +13 -10
  73. data/lib/mongo/server/connection_pool.rb +6 -4
  74. data/lib/mongo/server/description.rb +4 -0
  75. data/lib/mongo/server/description/features.rb +9 -8
  76. data/lib/mongo/server/monitor.rb +20 -1
  77. data/lib/mongo/server/monitor/app_metadata.rb +1 -1
  78. data/lib/mongo/server/monitor/connection.rb +9 -10
  79. data/lib/mongo/server/pending_connection.rb +24 -6
  80. data/lib/mongo/server/push_monitor.rb +11 -1
  81. data/lib/mongo/session.rb +2 -2
  82. data/lib/mongo/session/session_pool.rb +4 -2
  83. data/lib/mongo/socket.rb +29 -4
  84. data/lib/mongo/socket/ssl.rb +8 -0
  85. data/lib/mongo/srv/monitor.rb +0 -11
  86. data/lib/mongo/uri/options_mapper.rb +38 -0
  87. data/lib/mongo/utils.rb +15 -0
  88. data/lib/mongo/version.rb +1 -1
  89. data/spec/README.md +24 -1
  90. data/spec/integration/auth_spec.rb +25 -15
  91. data/spec/integration/bulk_write_error_message_spec.rb +41 -0
  92. data/spec/integration/change_stream_spec.rb +4 -4
  93. data/spec/integration/command_monitoring_spec.rb +2 -2
  94. data/spec/integration/connection_spec.rb +2 -0
  95. data/spec/integration/docs_examples_spec.rb +8 -1
  96. data/spec/integration/fork_reconnect_spec.rb +4 -1
  97. data/spec/integration/ocsp_verifier_spec.rb +13 -7
  98. data/spec/integration/operation_failure_code_spec.rb +1 -1
  99. data/spec/integration/operation_failure_message_spec.rb +90 -0
  100. data/spec/integration/reconnect_spec.rb +1 -1
  101. data/spec/integration/sdam_error_handling_spec.rb +1 -1
  102. data/spec/integration/sdam_events_spec.rb +3 -5
  103. data/spec/integration/snappy_compression_spec.rb +25 -0
  104. data/spec/integration/srv_monitoring_spec.rb +1 -1
  105. data/spec/integration/transactions_examples_spec.rb +6 -0
  106. data/spec/integration/zlib_compression_spec.rb +1 -1
  107. data/spec/integration/zstd_compression_spec.rb +26 -0
  108. data/spec/lite_spec_helper.rb +7 -1
  109. data/spec/mongo/address_spec.rb +15 -11
  110. data/spec/mongo/auth/ldap/conversation_spec.rb +1 -1
  111. data/spec/mongo/auth/ldap_spec.rb +5 -1
  112. data/spec/mongo/auth/scram_negotiation_spec.rb +1 -1
  113. data/spec/mongo/auth/scram_spec.rb +1 -1
  114. data/spec/mongo/auth/x509/conversation_spec.rb +3 -3
  115. data/spec/mongo/client_construction_spec.rb +207 -33
  116. data/spec/mongo/client_spec.rb +17 -0
  117. data/spec/mongo/cluster_spec.rb +3 -18
  118. data/spec/mongo/collection/view/explainable_spec.rb +1 -1
  119. data/spec/mongo/collection/view/readable_spec.rb +33 -19
  120. data/spec/mongo/collection_crud_spec.rb +4357 -0
  121. data/spec/mongo/collection_ddl_spec.rb +534 -0
  122. data/spec/mongo/collection_spec.rb +5 -4859
  123. data/spec/mongo/database_spec.rb +66 -4
  124. data/spec/mongo/error/bulk_write_error_spec.rb +3 -3
  125. data/spec/mongo/error/parser_spec.rb +37 -6
  126. data/spec/mongo/index/view_spec.rb +8 -2
  127. data/spec/mongo/monitoring/event/server_heartbeat_failed_spec.rb +1 -1
  128. data/spec/mongo/monitoring/event/server_heartbeat_succeeded_spec.rb +1 -1
  129. data/spec/mongo/operation/aggregate_spec.rb +2 -1
  130. data/spec/mongo/operation/collections_info_spec.rb +4 -1
  131. data/spec/mongo/operation/command_spec.rb +6 -3
  132. data/spec/mongo/operation/create_index_spec.rb +6 -3
  133. data/spec/mongo/operation/create_user_spec.rb +6 -3
  134. data/spec/mongo/operation/delete/bulk_spec.rb +9 -6
  135. data/spec/mongo/operation/delete_spec.rb +11 -7
  136. data/spec/mongo/operation/drop_index_spec.rb +6 -2
  137. data/spec/mongo/operation/find/legacy_spec.rb +3 -1
  138. data/spec/mongo/operation/get_more_spec.rb +3 -1
  139. data/spec/mongo/operation/indexes_spec.rb +5 -1
  140. data/spec/mongo/operation/insert/bulk_spec.rb +10 -7
  141. data/spec/mongo/operation/insert_spec.rb +15 -12
  142. data/spec/mongo/operation/map_reduce_spec.rb +5 -2
  143. data/spec/mongo/operation/remove_user_spec.rb +6 -3
  144. data/spec/mongo/operation/result_spec.rb +1 -1
  145. data/spec/mongo/operation/update/bulk_spec.rb +9 -6
  146. data/spec/mongo/operation/update_spec.rb +10 -7
  147. data/spec/mongo/operation/update_user_spec.rb +4 -1
  148. data/spec/mongo/protocol/compressed_spec.rb +26 -12
  149. data/spec/mongo/query_cache_middleware_spec.rb +55 -0
  150. data/spec/mongo/retryable_spec.rb +3 -2
  151. data/spec/mongo/server/app_metadata_spec.rb +2 -0
  152. data/spec/mongo/server/connection_pool/populator_spec.rb +3 -1
  153. data/spec/mongo/server/connection_pool_spec.rb +1 -1
  154. data/spec/mongo/server/connection_spec.rb +24 -17
  155. data/spec/mongo/server/monitor/connection_spec.rb +17 -7
  156. data/spec/mongo/server/monitor_spec.rb +9 -1
  157. data/spec/mongo/server_spec.rb +15 -2
  158. data/spec/mongo/socket/ssl_spec.rb +40 -0
  159. data/spec/mongo/socket_spec.rb +2 -2
  160. data/spec/mongo/tls_context_hooks_spec.rb +37 -0
  161. data/spec/runners/connection_string.rb +0 -4
  162. data/spec/runners/crud/requirement.rb +40 -3
  163. data/spec/runners/crud/verifier.rb +8 -0
  164. data/spec/runners/transactions/operation.rb +13 -2
  165. data/spec/runners/transactions/test.rb +1 -0
  166. data/spec/runners/unified.rb +96 -0
  167. data/spec/runners/unified/assertions.rb +249 -0
  168. data/spec/runners/unified/change_stream_operations.rb +26 -0
  169. data/spec/runners/unified/crud_operations.rb +199 -0
  170. data/spec/runners/unified/ddl_operations.rb +96 -0
  171. data/spec/runners/unified/entity_map.rb +39 -0
  172. data/spec/runners/unified/error.rb +25 -0
  173. data/spec/runners/unified/event_subscriber.rb +91 -0
  174. data/spec/runners/unified/exceptions.rb +21 -0
  175. data/spec/runners/unified/grid_fs_operations.rb +55 -0
  176. data/spec/runners/unified/support_operations.rb +250 -0
  177. data/spec/runners/unified/test.rb +393 -0
  178. data/spec/runners/unified/test_group.rb +28 -0
  179. data/spec/runners/unified/using_hash.rb +31 -0
  180. data/spec/shared/bin/get-mongodb-download-url +17 -0
  181. data/spec/shared/lib/mrss/cluster_config.rb +218 -0
  182. data/spec/shared/lib/mrss/constraints.rb +43 -0
  183. data/spec/shared/lib/mrss/docker_runner.rb +262 -0
  184. data/spec/shared/lib/mrss/server_version_registry.rb +112 -0
  185. data/spec/shared/lib/mrss/utils.rb +15 -0
  186. data/spec/shared/share/Dockerfile.erb +231 -0
  187. data/spec/shared/shlib/distro.sh +73 -0
  188. data/spec/shared/shlib/server.sh +290 -0
  189. data/spec/shared/shlib/set_env.sh +128 -0
  190. data/spec/solo/clean_exit_spec.rb +21 -0
  191. data/spec/spec_helper.rb +4 -1
  192. data/spec/spec_tests/crud_unified_spec.rb +10 -0
  193. data/spec/spec_tests/data/change_streams/change-streams.yml +0 -1
  194. data/spec/spec_tests/data/crud_unified/estimatedDocumentCount.yml +267 -0
  195. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-4.9.yml +60 -0
  196. data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount.yml → estimatedDocumentCount-pre4.9.yml} +2 -0
  197. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-serverErrors-4.9.yml +146 -0
  198. data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount-serverErrors.yml → estimatedDocumentCount-serverErrors-pre4.9.yml} +2 -0
  199. data/spec/spec_tests/data/retryable_reads/listIndexNames.yml +1 -1
  200. data/spec/spec_tests/data/unified/valid-fail/operation-failure.yml +31 -0
  201. data/spec/spec_tests/data/unified/valid-pass/poc-change-streams.yml +220 -0
  202. data/spec/spec_tests/data/unified/valid-pass/poc-command-monitoring.yml +102 -0
  203. data/spec/spec_tests/data/unified/valid-pass/poc-crud.yml +184 -0
  204. data/spec/spec_tests/data/unified/valid-pass/poc-gridfs.yml +155 -0
  205. data/spec/spec_tests/data/unified/valid-pass/poc-retryable-reads.yml +193 -0
  206. data/spec/spec_tests/data/unified/valid-pass/poc-retryable-writes.yml +210 -0
  207. data/spec/spec_tests/data/unified/valid-pass/poc-sessions.yml +215 -0
  208. data/spec/spec_tests/data/unified/valid-pass/poc-transactions-convenient-api.yml +235 -0
  209. data/spec/spec_tests/data/unified/valid-pass/poc-transactions-mongos-pin-auto.yml +169 -0
  210. data/spec/spec_tests/data/unified/valid-pass/poc-transactions.yml +170 -0
  211. data/spec/spec_tests/data/uri_options/compression-options.yml +1 -1
  212. data/spec/spec_tests/data/versioned_api/crud-api-version-1-strict.yml +416 -0
  213. data/spec/spec_tests/data/versioned_api/crud-api-version-1.yml +409 -0
  214. data/spec/spec_tests/data/versioned_api/runcommand-helper-no-api-version-declared.yml +67 -0
  215. data/spec/spec_tests/data/versioned_api/test-commands-deprecation-errors.yml +47 -0
  216. data/spec/spec_tests/data/versioned_api/test-commands-strict-mode.yml +44 -0
  217. data/spec/spec_tests/data/versioned_api/transaction-handling.yml +180 -0
  218. data/spec/spec_tests/unified_spec.rb +15 -0
  219. data/spec/spec_tests/uri_options_spec.rb +16 -0
  220. data/spec/spec_tests/versioned_api_spec.rb +10 -0
  221. data/spec/support/common_shortcuts.rb +15 -1
  222. data/spec/support/shared/session.rb +2 -2
  223. data/spec/support/spec_config.rb +46 -3
  224. data/spec/support/spec_setup.rb +48 -38
  225. data/spec/support/utils.rb +64 -3
  226. metadata +1104 -992
  227. metadata.gz.sig +0 -0
  228. data/lib/mongo/operation/shared/collections_info_or_list_collections.rb +0 -58
  229. data/lib/mongo/operation/shared/op_msg_or_list_indexes_command.rb +0 -47
  230. data/spec/support/cluster_config.rb +0 -207
@@ -15,9 +15,19 @@
15
15
  module Mongo
16
16
  class Error
17
17
 
18
- # Exception raised if there are write errors upon executing the bulk
18
+ # Exception raised if there are write errors upon executing a bulk
19
19
  # operation.
20
20
  #
21
+ # Unlike OperationFailure, BulkWriteError does not currently expose
22
+ # individual error components (such as the error code). The result document
23
+ # (which can be obtained using the +result+ attribute) provides detailed
24
+ # error information and can be examined by the application if desired.
25
+ #
26
+ # @note A bulk operation that resulted in a BulkWriteError may have
27
+ # written some of the documents to the database. If the bulk write
28
+ # was unordered, writes may have also continued past the write that
29
+ # produced a BulkWriteError.
30
+ #
21
31
  # @since 2.0.0
22
32
  class BulkWriteError < Error
23
33
 
@@ -47,11 +57,15 @@ module Mongo
47
57
  return nil unless errors
48
58
 
49
59
  fragment = errors.first(10).map do |error|
50
- "#{error['errmsg']} (#{error['code']})"
51
- end.join(', ')
60
+ "[#{error['code']}]: #{error['errmsg']}"
61
+ end.join('; ')
52
62
 
53
63
  fragment += '...' if errors.length > 10
54
64
 
65
+ if errors.length > 1
66
+ fragment = "Multiple errors: #{fragment}"
67
+ end
68
+
55
69
  fragment
56
70
  end
57
71
  end
@@ -0,0 +1,22 @@
1
+ # Copyright (C) 2021 MongoDB Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module Mongo
16
+ class Error
17
+
18
+ # Raised when the driver detects an internal implementation problem.
19
+ class InternalDriverError < Error
20
+ end
21
+ end
22
+ end
@@ -89,6 +89,12 @@ module Mongo
89
89
  # @since 2.6.0
90
90
  attr_reader :code_name
91
91
 
92
+ # @return [ String ] The server-returned error message
93
+ # parsed from the response.
94
+ #
95
+ # @api experimental
96
+ attr_reader :server_message
97
+
92
98
  # Whether the error is a retryable error according to the legacy
93
99
  # read retry logic.
94
100
  #
@@ -215,6 +221,11 @@ module Mongo
215
221
  # @since 2.10.0
216
222
  attr_reader :write_concern_error_code_name
217
223
 
224
+ # @return [ BSON::Document | nil ] The server-returned error document.
225
+ #
226
+ # @api experimental
227
+ attr_reader :document
228
+
218
229
  # Create the operation failure.
219
230
  #
220
231
  # @example Create the error object
@@ -229,6 +240,10 @@ module Mongo
229
240
  #
230
241
  # @option options [ Integer ] :code Error code.
231
242
  # @option options [ String ] :code_name Error code name.
243
+ # @option options [ BSON::Document ] :document The server-returned
244
+ # error document.
245
+ # @option options [ String ] server_message The server-returned
246
+ # error message parsed from the response.
232
247
  # @option options [ Hash ] :write_concern_error_document The
233
248
  # server-supplied write concern error document, if any.
234
249
  # @option options [ Integer ] :write_concern_error_code Error code for
@@ -253,6 +268,8 @@ module Mongo
253
268
  @write_concern_error_labels = options[:write_concern_error_labels] || []
254
269
  @labels = options[:labels] || []
255
270
  @wtimeout = !!options[:wtimeout]
271
+ @document = options[:document]
272
+ @server_message = options[:server_message]
256
273
  end
257
274
 
258
275
  # Whether the error is a write concern timeout.
@@ -281,8 +298,10 @@ module Mongo
281
298
  #
282
299
  # @since 2.10.0
283
300
  def unsupported_retryable_write?
284
- # code 20 is IllegalOperation
285
- code == 20 && message.start_with?("Transaction numbers")
301
+ # code 20 is IllegalOperation.
302
+ # Note that the document is expected to be a BSON::Document, thus
303
+ # either having string keys or providing indifferent access.
304
+ code == 20 && server_message&.start_with?("Transaction numbers") || false
286
305
  end
287
306
  end
288
307
  end
@@ -42,28 +42,53 @@ module Mongo
42
42
  # Class for parsing the various forms that errors can come in from MongoDB
43
43
  # command responses.
44
44
  #
45
+ # The errors can be reported by the server in a number of ways:
46
+ # - {ok:0} response indicates failure. In newer servers, code, codeName
47
+ # and errmsg fields should be set. In older servers some may not be set.
48
+ # - {ok:1} response with a write concern error (writeConcernError top-level
49
+ # field). This indicates that the node responding successfully executed
50
+ # the request, but not enough other nodes successfully executed the
51
+ # request to satisfy the write concern.
52
+ # - {ok:1} response with writeErrors top-level field. This can be obtained
53
+ # in a bulk write but also in a non-bulk write. In a non-bulk write
54
+ # there should be exactly one error in the writeErrors list.
55
+ # The case of multiple errors is handled by BulkWrite::Result.
56
+ # - {ok:1} response with writeConcernErrors top-level field. This can
57
+ # only be obtained in a bulk write and is handled by BulkWrite::Result,
58
+ # not by this class.
59
+ #
60
+ # Note that writeErrors do not have codeName fields - they just provide
61
+ # codes and messages. writeConcernErrors may similarly not provide code
62
+ # names.
63
+ #
45
64
  # @since 2.0.0
65
+ # @api private
46
66
  class Parser
47
67
  include SdamErrorDetection
48
68
 
49
- # @return [ BSON::Document ] document The returned document.
69
+ # @return [ BSON::Document ] The returned document.
50
70
  attr_reader :document
51
71
 
52
- # @return [ String ] message The error message parsed from the document.
72
+ # @return [ String ] The full error message to be used in the
73
+ # raised exception.
53
74
  attr_reader :message
54
75
 
55
- # @return [ Array<Protocol::Message> ] replies The message replies.
76
+ # @return [ String ] The server-returned error message
77
+ # parsed from the response.
78
+ attr_reader :server_message
79
+
80
+ # @return [ Array<Protocol::Message> ] The message replies.
56
81
  attr_reader :replies
57
82
 
58
- # @return [ Integer ] code The error code parsed from the document.
83
+ # @return [ Integer ] The error code parsed from the document.
59
84
  # @since 2.6.0
60
85
  attr_reader :code
61
86
 
62
- # @return [ String ] code_name The error code name parsed from the document.
87
+ # @return [ String ] The error code name parsed from the document.
63
88
  # @since 2.6.0
64
89
  attr_reader :code_name
65
90
 
66
- # @return [ Array<String> ] labels The set of labels associated with the error.
91
+ # @return [ Array<String> ] The set of labels associated with the error.
67
92
  # @since 2.7.0
68
93
  attr_reader :labels
69
94
 
@@ -145,33 +170,61 @@ module Mongo
145
170
  write_concern_error_document && write_concern_error_document['errorLabels']
146
171
  end
147
172
 
173
+ class << self
174
+ def build_message(code: nil, code_name: nil, message: nil)
175
+ if code_name && code
176
+ "[#{code}:#{code_name}]: #{message}"
177
+ elsif code_name
178
+ # This surely should never happen, if there's a code name
179
+ # there ought to also be the code provided.
180
+ # Handle this case for completeness.
181
+ "[#{code_name}]: #{message}"
182
+ elsif code
183
+ "[#{code}]: #{message}"
184
+ else
185
+ message
186
+ end
187
+ end
188
+ end
189
+
148
190
  private
149
191
 
150
192
  def parse!
193
+ if document['ok'] != 1 && document['writeErrors']
194
+ raise ArgumentError, "writeErrors should only be given in successful responses"
195
+ end
196
+
151
197
  @message = ""
152
- parse_single(@message, ERR)
153
- parse_single(@message, ERROR)
154
- parse_single(@message, ERRMSG)
198
+ parse_single(@message, '$err')
199
+ parse_single(@message, 'err')
200
+ parse_single(@message, 'errmsg')
155
201
  parse_multiple(@message, 'writeErrors')
156
202
  if write_concern_error_document
157
- parse_single(@message, ERRMSG, write_concern_error_document)
203
+ parse_single(@message, 'errmsg', write_concern_error_document)
158
204
  end
159
205
  parse_flag(@message)
160
206
  parse_code
161
207
  parse_labels
162
208
  parse_wtimeout
209
+
210
+ @server_message = @message
211
+ @message = self.class.build_message(
212
+ code: code,
213
+ code_name: code_name,
214
+ message: @message,
215
+ )
163
216
  end
164
217
 
165
218
  def parse_single(message, key, doc = document)
166
219
  if error = doc[key]
167
- append(message ,"#{error} (#{doc[CODE]})")
220
+ append(message, error)
168
221
  end
169
222
  end
170
223
 
171
224
  def parse_multiple(message, key)
172
225
  if errors = document[key]
173
226
  errors.each do |error|
174
- parse_single(message, ERRMSG, error)
227
+ parse_single(message, 'errmsg', error)
175
228
  end
176
229
  end
177
230
  end
@@ -0,0 +1,23 @@
1
+ # Copyright (C) 2021 MongoDB Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module Mongo
16
+ class Error
17
+
18
+ # Exception raised when a Client has :server_api configured and an
19
+ # operation attempts to specify any of server API version parameters.
20
+ class ServerApiConflict < Error
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,24 @@
1
+ # Copyright (C) 2021 MongoDB Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module Mongo
16
+ class Error
17
+
18
+ # Exception raised when a Client has :server_api configured and an
19
+ # operation is executed against a pre-3.6 MongoDB server using a legacy
20
+ # wire protocol message that does not permit sending API parameters.
21
+ class ServerApiNotSupported < Error
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,21 @@
1
+ # Copyright (C) 2020 MongoDB Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module Mongo
16
+ class Error
17
+
18
+ # Raised if an optional dependency of the driver is not met.
19
+ class UnmetDependency < Error; end
20
+ end
21
+ end
@@ -36,6 +36,43 @@ module Mongo
36
36
  # @since 2.1.0
37
37
  FILES_INDEX = { filename: 1, uploadDate: 1 }.freeze
38
38
 
39
+ # Create the GridFS.
40
+ #
41
+ # @example Create the GridFS.
42
+ # Grid::FSBucket.new(database)
43
+ #
44
+ # @param [ Database ] database The database the files reside in.
45
+ # @param [ Hash ] options The GridFS options.
46
+ #
47
+ # @option options [ String ] :bucket_name The prefix for the files and chunks
48
+ # collections.
49
+ # @option options [ Integer ] :chunk_size Override the default chunk
50
+ # size.
51
+ # @option options [ String ] :fs_name The prefix for the files and chunks
52
+ # collections.
53
+ # @option options [ String ] :read The read preference.
54
+ # @option options [ Session ] :session The session to use.
55
+ # @option options [ Hash ] :write Deprecated. Equivalent to :write_concern
56
+ # option.
57
+ # @option options [ Hash ] :write_concern The write concern options.
58
+ # Can be :w => Integer|String, :fsync => Boolean, :j => Boolean.
59
+ #
60
+ # @since 2.0.0
61
+ def initialize(database, options = {})
62
+ @database = database
63
+ @options = options.dup
64
+ =begin WriteConcern object support
65
+ if @options[:write_concern].is_a?(WriteConcern::Base)
66
+ # Cache the instance so that we do not needlessly reconstruct it.
67
+ @write_concern = @options[:write_concern]
68
+ @options[:write_concern] = @write_concern.options
69
+ end
70
+ =end
71
+ @options.freeze
72
+ @chunks_collection = database[chunks_name]
73
+ @files_collection = database[files_name]
74
+ end
75
+
39
76
  # @return [ Collection ] chunks_collection The chunks collection.
40
77
  #
41
78
  # @since 2.0.0
@@ -133,43 +170,6 @@ module Mongo
133
170
  file.id
134
171
  end
135
172
 
136
- # Create the GridFS.
137
- #
138
- # @example Create the GridFS.
139
- # Grid::FSBucket.new(database)
140
- #
141
- # @param [ Database ] database The database the files reside in.
142
- # @param [ Hash ] options The GridFS options.
143
- #
144
- # @option options [ String ] :fs_name The prefix for the files and chunks
145
- # collections.
146
- # @option options [ String ] :bucket_name The prefix for the files and chunks
147
- # collections.
148
- # @option options [ Integer ] :chunk_size Override the default chunk
149
- # size.
150
- # @option options [ String ] :read The read preference.
151
- # @option options [ Session ] :session The session to use.
152
- # @option options [ Hash ] :write Deprecated. Equivalent to :write_concern
153
- # option.
154
- # @option options [ Hash ] :write_concern The write concern options.
155
- # Can be :w => Integer|String, :fsync => Boolean, :j => Boolean.
156
- #
157
- # @since 2.0.0
158
- def initialize(database, options = {})
159
- @database = database
160
- @options = options.dup
161
- =begin WriteConcern object support
162
- if @options[:write_concern].is_a?(WriteConcern::Base)
163
- # Cache the instance so that we do not needlessly reconstruct it.
164
- @write_concern = @options[:write_concern]
165
- @options[:write_concern] = @write_concern.options
166
- end
167
- =end
168
- @options.freeze
169
- @chunks_collection = database[chunks_name]
170
- @files_collection = database[files_name]
171
- end
172
-
173
173
  # Get the prefix for the GridFS
174
174
  #
175
175
  # @example Get the prefix.
@@ -127,6 +127,7 @@ module Mongo
127
127
  # data-bearing members of a replica set, including the primary, must
128
128
  # complete the index builds successfully before the primary marks
129
129
  # the indexes as ready.
130
+ # @option options [ Session ] :session The session to use for the operation.
130
131
  #
131
132
  # @note Note that the options listed may be subset of those available.
132
133
  # See the MongoDB documentation for a full list of supported options by server version.
@@ -137,7 +138,15 @@ module Mongo
137
138
  def create_one(keys, options = {})
138
139
  options = options.dup
139
140
 
140
- create_options = { commit_quorum: options.delete(:commit_quorum) }
141
+ create_options = {}
142
+ if session = @options[:session]
143
+ create_options[:session] = session
144
+ end
145
+ %i(commit_quorum session).each do |key|
146
+ if value = options.delete(key)
147
+ create_options[key] = value
148
+ end
149
+ end
141
150
  create_many({ key: keys }.merge(options), create_options)
142
151
  end
143
152
 
@@ -166,19 +175,20 @@ module Mongo
166
175
  # - commit_quorum: Specify how many data-bearing members of a replica set,
167
176
  # including the primary, must complete the index builds successfully
168
177
  # before the primary marks the indexes as ready.
178
+ # - session: The session to use.
169
179
  #
170
180
  # @return [ Result ] The result of the command.
171
181
  #
172
182
  # @since 2.0.0
173
183
  def create_many(*models)
174
- client.send(:with_session, @options) do |session|
175
- server = next_primary(nil, session)
184
+ models = models.flatten
185
+ options = {}
186
+ if models && !models.last.key?(:key)
187
+ options = models.pop
188
+ end
176
189
 
177
- models = models.flatten
178
- options = {}
179
- if models && !models.last.key?(:key)
180
- options = models.pop
181
- end
190
+ client.send(:with_session, @options.merge(options)) do |session|
191
+ server = next_primary(nil, session)
182
192
 
183
193
  # While server versions 3.4 and newer generally perform option
184
194
  # validation, there was a bug on server versions 4.2.0 - 4.2.5 where
@@ -208,7 +218,7 @@ module Mongo
208
218
 
209
219
  spec[:write_concern] = write_concern if description.features.collation_enabled?
210
220
 
211
- Operation::CreateIndex.new(spec).execute(server, client: client)
221
+ Operation::CreateIndex.new(spec).execute(server, context: Operation::Context.new(client: client, session: session))
212
222
  end
213
223
  end
214
224
 
@@ -286,7 +296,7 @@ module Mongo
286
296
  }
287
297
  server = next_primary(nil, session)
288
298
  spec[:write_concern] = write_concern if server.with_connection { |connection| connection.features }.collation_enabled?
289
- Operation::DropIndex.new(spec).execute(server, client: client)
299
+ Operation::DropIndex.new(spec).execute(server, context: Operation::Context.new(client: client, session: session))
290
300
  end
291
301
  end
292
302
 
@@ -322,7 +332,7 @@ module Mongo
322
332
  end
323
333
 
324
334
  def send_initial_query(server, session)
325
- initial_query_op(session).execute(server, client: client)
335
+ initial_query_op(session).execute(server, context: Operation::Context.new(client: client, session: session))
326
336
  end
327
337
 
328
338
  def with_generated_names(models, server)