mongo 2.23.0 → 2.24.0

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 (463) hide show
  1. checksums.yaml +4 -4
  2. data/bin/mongo_console +0 -1
  3. data/lib/mongo/active_support.rb +1 -2
  4. data/lib/mongo/address/ipv4.rb +3 -6
  5. data/lib/mongo/address/ipv6.rb +6 -10
  6. data/lib/mongo/address/unix.rb +1 -4
  7. data/lib/mongo/address/validator.rb +16 -28
  8. data/lib/mongo/address.rb +30 -40
  9. data/lib/mongo/auth/aws/conversation.rb +6 -10
  10. data/lib/mongo/auth/aws/credentials.rb +0 -1
  11. data/lib/mongo/auth/aws/credentials_cache.rb +0 -1
  12. data/lib/mongo/auth/aws/credentials_retriever.rb +45 -59
  13. data/lib/mongo/auth/aws/request.rb +20 -35
  14. data/lib/mongo/auth/aws.rb +1 -2
  15. data/lib/mongo/auth/base.rb +20 -29
  16. data/lib/mongo/auth/conversation_base.rb +14 -18
  17. data/lib/mongo/auth/cr/conversation.rb +0 -3
  18. data/lib/mongo/auth/cr.rb +1 -4
  19. data/lib/mongo/auth/credential_cache.rb +0 -2
  20. data/lib/mongo/auth/gssapi/conversation.rb +3 -8
  21. data/lib/mongo/auth/gssapi.rb +1 -4
  22. data/lib/mongo/auth/ldap/conversation.rb +0 -3
  23. data/lib/mongo/auth/ldap.rb +1 -4
  24. data/lib/mongo/auth/roles.rb +16 -19
  25. data/lib/mongo/auth/sasl_conversation_base.rb +7 -11
  26. data/lib/mongo/auth/scram/conversation.rb +2 -5
  27. data/lib/mongo/auth/scram.rb +5 -10
  28. data/lib/mongo/auth/scram256/conversation.rb +2 -5
  29. data/lib/mongo/auth/scram256.rb +1 -3
  30. data/lib/mongo/auth/scram_conversation_base.rb +18 -24
  31. data/lib/mongo/auth/stringprep/profiles/sasl.rb +17 -18
  32. data/lib/mongo/auth/stringprep/tables.rb +2209 -2210
  33. data/lib/mongo/auth/stringprep/unicode_normalize/normalize.rb +36 -38
  34. data/lib/mongo/auth/stringprep/unicode_normalize/tables.rb +1142 -1150
  35. data/lib/mongo/auth/stringprep.rb +9 -12
  36. data/lib/mongo/auth/user/view.rb +3 -5
  37. data/lib/mongo/auth/user.rb +14 -24
  38. data/lib/mongo/auth/x509/conversation.rb +0 -3
  39. data/lib/mongo/auth/x509.rb +7 -9
  40. data/lib/mongo/auth.rb +18 -30
  41. data/lib/mongo/background_thread.rb +9 -17
  42. data/lib/mongo/bson.rb +0 -2
  43. data/lib/mongo/bulk_write/combineable.rb +0 -3
  44. data/lib/mongo/bulk_write/ordered_combiner.rb +1 -3
  45. data/lib/mongo/bulk_write/result.rb +11 -16
  46. data/lib/mongo/bulk_write/result_combiner.rb +9 -12
  47. data/lib/mongo/bulk_write/transformable.rb +16 -19
  48. data/lib/mongo/bulk_write/unordered_combiner.rb +1 -3
  49. data/lib/mongo/bulk_write/validatable.rb +11 -18
  50. data/lib/mongo/bulk_write.rb +76 -91
  51. data/lib/mongo/caching_cursor.rb +2 -7
  52. data/lib/mongo/client.rb +230 -275
  53. data/lib/mongo/client_encryption.rb +4 -5
  54. data/lib/mongo/cluster/periodic_executor.rb +2 -5
  55. data/lib/mongo/cluster/reapers/cursor_reaper.rb +21 -29
  56. data/lib/mongo/cluster/reapers/socket_reaper.rb +1 -6
  57. data/lib/mongo/cluster/sdam_flow.rb +136 -159
  58. data/lib/mongo/cluster/topology/base.rb +15 -18
  59. data/lib/mongo/cluster/topology/load_balanced.rb +24 -14
  60. data/lib/mongo/cluster/topology/no_replica_set_options.rb +3 -6
  61. data/lib/mongo/cluster/topology/replica_set_no_primary.rb +20 -23
  62. data/lib/mongo/cluster/topology/replica_set_with_primary.rb +0 -2
  63. data/lib/mongo/cluster/topology/sharded.rb +19 -9
  64. data/lib/mongo/cluster/topology/single.rb +24 -14
  65. data/lib/mongo/cluster/topology/unknown.rb +20 -10
  66. data/lib/mongo/cluster/topology.rb +29 -25
  67. data/lib/mongo/cluster.rb +148 -183
  68. data/lib/mongo/cluster_time.rb +14 -31
  69. data/lib/mongo/collection/helpers.rb +5 -8
  70. data/lib/mongo/collection/view/aggregation.rb +5 -10
  71. data/lib/mongo/collection/view/builder/aggregation.rb +6 -9
  72. data/lib/mongo/collection/view/builder/map_reduce.rb +18 -17
  73. data/lib/mongo/collection/view/builder.rb +0 -1
  74. data/lib/mongo/collection/view/change_stream/retryable.rb +3 -8
  75. data/lib/mongo/collection/view/change_stream.rb +59 -58
  76. data/lib/mongo/collection/view/explainable.rb +11 -20
  77. data/lib/mongo/collection/view/immutable.rb +1 -3
  78. data/lib/mongo/collection/view/iterable.rb +35 -28
  79. data/lib/mongo/collection/view/map_reduce.rb +20 -25
  80. data/lib/mongo/collection/view/readable.rb +50 -57
  81. data/lib/mongo/collection/view/writable.rb +56 -72
  82. data/lib/mongo/collection/view.rb +9 -8
  83. data/lib/mongo/collection.rb +63 -76
  84. data/lib/mongo/condition_variable.rb +4 -4
  85. data/lib/mongo/config/options.rb +0 -3
  86. data/lib/mongo/config/validators/option.rb +3 -5
  87. data/lib/mongo/config.rb +2 -4
  88. data/lib/mongo/crypt/auto_decryption_context.rb +0 -3
  89. data/lib/mongo/crypt/auto_encrypter.rb +34 -43
  90. data/lib/mongo/crypt/auto_encryption_context.rb +0 -3
  91. data/lib/mongo/crypt/binary.rb +5 -9
  92. data/lib/mongo/crypt/binding.rb +149 -155
  93. data/lib/mongo/crypt/context.rb +10 -17
  94. data/lib/mongo/crypt/data_key_context.rb +2 -7
  95. data/lib/mongo/crypt/encryption_io.rb +29 -39
  96. data/lib/mongo/crypt/explicit_decryption_context.rb +0 -3
  97. data/lib/mongo/crypt/explicit_encrypter.rb +1 -1
  98. data/lib/mongo/crypt/explicit_encryption_context.rb +19 -30
  99. data/lib/mongo/crypt/explicit_encryption_expression_context.rb +0 -2
  100. data/lib/mongo/crypt/handle.rb +42 -48
  101. data/lib/mongo/crypt/hooks.rb +12 -15
  102. data/lib/mongo/crypt/kms/aws/credentials.rb +12 -16
  103. data/lib/mongo/crypt/kms/aws/master_document.rb +6 -9
  104. data/lib/mongo/crypt/kms/aws.rb +0 -2
  105. data/lib/mongo/crypt/kms/azure/credentials_retriever.rb +2 -7
  106. data/lib/mongo/crypt/kms/azure/master_document.rb +15 -19
  107. data/lib/mongo/crypt/kms/azure.rb +0 -1
  108. data/lib/mongo/crypt/kms/credentials.rb +13 -27
  109. data/lib/mongo/crypt/kms/gcp/credentials.rb +12 -14
  110. data/lib/mongo/crypt/kms/gcp/credentials_retriever.rb +7 -9
  111. data/lib/mongo/crypt/kms/gcp/master_document.rb +12 -16
  112. data/lib/mongo/crypt/kms/gcp.rb +0 -2
  113. data/lib/mongo/crypt/kms/kmip/credentials.rb +7 -8
  114. data/lib/mongo/crypt/kms/kmip/master_document.rb +3 -5
  115. data/lib/mongo/crypt/kms/kmip.rb +0 -1
  116. data/lib/mongo/crypt/kms/local/credentials.rb +7 -8
  117. data/lib/mongo/crypt/kms/local/master_document.rb +2 -6
  118. data/lib/mongo/crypt/kms/local.rb +0 -1
  119. data/lib/mongo/crypt/kms/master_key_document.rb +11 -15
  120. data/lib/mongo/crypt/kms.rb +14 -16
  121. data/lib/mongo/crypt/kms_context.rb +0 -2
  122. data/lib/mongo/crypt/rewrap_many_data_key_context.rb +2 -7
  123. data/lib/mongo/crypt/rewrap_many_data_key_result.rb +2 -4
  124. data/lib/mongo/crypt/status.rb +12 -14
  125. data/lib/mongo/crypt.rb +0 -1
  126. data/lib/mongo/csot_timeout_holder.rb +3 -2
  127. data/lib/mongo/cursor/kill_spec.rb +7 -10
  128. data/lib/mongo/cursor.rb +74 -64
  129. data/lib/mongo/cursor_host.rb +8 -10
  130. data/lib/mongo/database/view.rb +16 -37
  131. data/lib/mongo/database.rb +52 -56
  132. data/lib/mongo/dbref.rb +0 -1
  133. data/lib/mongo/distinguishing_semaphore.rb +0 -1
  134. data/lib/mongo/error/auth_error.rb +0 -2
  135. data/lib/mongo/error/bad_load_balancer_target.rb +0 -2
  136. data/lib/mongo/error/bulk_write_error.rb +7 -10
  137. data/lib/mongo/error/change_stream_resumable.rb +0 -2
  138. data/lib/mongo/error/client_closed.rb +0 -2
  139. data/lib/mongo/error/closed_stream.rb +1 -4
  140. data/lib/mongo/error/connection_check_out_timeout.rb +3 -6
  141. data/lib/mongo/error/connection_perished.rb +0 -2
  142. data/lib/mongo/error/connection_unavailable.rb +0 -2
  143. data/lib/mongo/error/credential_check_error.rb +0 -2
  144. data/lib/mongo/error/crypt_error.rb +0 -2
  145. data/lib/mongo/error/extra_file_chunk.rb +1 -4
  146. data/lib/mongo/error/failed_string_prep_validation.rb +5 -6
  147. data/lib/mongo/error/file_not_found.rb +0 -3
  148. data/lib/mongo/error/handshake_error.rb +0 -2
  149. data/lib/mongo/error/insufficient_iteration_count.rb +1 -4
  150. data/lib/mongo/error/internal_driver_error.rb +0 -2
  151. data/lib/mongo/error/invalid_address.rb +0 -2
  152. data/lib/mongo/error/invalid_application_name.rb +0 -3
  153. data/lib/mongo/error/invalid_bulk_operation.rb +1 -4
  154. data/lib/mongo/error/invalid_bulk_operation_type.rb +1 -4
  155. data/lib/mongo/error/invalid_collection_name.rb +1 -4
  156. data/lib/mongo/error/invalid_config_option.rb +0 -3
  157. data/lib/mongo/error/invalid_cursor_operation.rb +0 -2
  158. data/lib/mongo/error/invalid_database_name.rb +1 -4
  159. data/lib/mongo/error/invalid_document.rb +1 -4
  160. data/lib/mongo/error/invalid_file.rb +0 -3
  161. data/lib/mongo/error/invalid_file_revision.rb +0 -3
  162. data/lib/mongo/error/invalid_min_pool_size.rb +0 -3
  163. data/lib/mongo/error/invalid_nonce.rb +0 -3
  164. data/lib/mongo/error/invalid_read_concern.rb +2 -4
  165. data/lib/mongo/error/invalid_read_option.rb +0 -3
  166. data/lib/mongo/error/invalid_replacement_document.rb +2 -5
  167. data/lib/mongo/error/invalid_server_auth_host.rb +0 -2
  168. data/lib/mongo/error/invalid_server_auth_response.rb +0 -2
  169. data/lib/mongo/error/invalid_server_preference.rb +7 -16
  170. data/lib/mongo/error/invalid_session.rb +1 -4
  171. data/lib/mongo/error/invalid_signature.rb +0 -3
  172. data/lib/mongo/error/invalid_transaction_operation.rb +5 -8
  173. data/lib/mongo/error/invalid_txt_record.rb +0 -2
  174. data/lib/mongo/error/invalid_update_document.rb +2 -5
  175. data/lib/mongo/error/invalid_uri.rb +1 -4
  176. data/lib/mongo/error/invalid_write_concern.rb +2 -5
  177. data/lib/mongo/error/kms_error.rb +0 -2
  178. data/lib/mongo/error/labelable.rb +0 -3
  179. data/lib/mongo/error/lint_error.rb +0 -2
  180. data/lib/mongo/error/max_bson_size.rb +8 -11
  181. data/lib/mongo/error/max_message_size.rb +2 -5
  182. data/lib/mongo/error/mismatched_domain.rb +0 -2
  183. data/lib/mongo/error/missing_connection.rb +0 -2
  184. data/lib/mongo/error/missing_file_chunk.rb +0 -3
  185. data/lib/mongo/error/missing_password.rb +0 -2
  186. data/lib/mongo/error/missing_resume_token.rb +1 -4
  187. data/lib/mongo/error/missing_scram_server_signature.rb +2 -4
  188. data/lib/mongo/error/missing_service_id.rb +0 -2
  189. data/lib/mongo/error/mongocryptd_spawn_error.rb +0 -2
  190. data/lib/mongo/error/multi_index_drop.rb +0 -3
  191. data/lib/mongo/error/need_primary_server.rb +0 -2
  192. data/lib/mongo/error/no_server_available.rb +3 -8
  193. data/lib/mongo/error/no_service_connection_available.rb +1 -3
  194. data/lib/mongo/error/no_srv_records.rb +0 -2
  195. data/lib/mongo/error/notable.rb +8 -16
  196. data/lib/mongo/error/operation_failure.rb +22 -35
  197. data/lib/mongo/error/parser.rb +33 -75
  198. data/lib/mongo/error/pool_cleared_error.rb +1 -3
  199. data/lib/mongo/error/pool_closed_error.rb +0 -3
  200. data/lib/mongo/error/pool_error.rb +0 -3
  201. data/lib/mongo/error/pool_paused_error.rb +0 -2
  202. data/lib/mongo/error/raise_original_error.rb +1 -3
  203. data/lib/mongo/error/read_write_retryable.rb +14 -17
  204. data/lib/mongo/error/sdam_error_detection.rb +3 -5
  205. data/lib/mongo/error/server_api_conflict.rb +0 -2
  206. data/lib/mongo/error/server_certificate_revoked.rb +0 -2
  207. data/lib/mongo/error/server_not_usable.rb +0 -2
  208. data/lib/mongo/error/session_ended.rb +1 -3
  209. data/lib/mongo/error/session_not_materialized.rb +1 -3
  210. data/lib/mongo/error/sessions_not_supported.rb +1 -4
  211. data/lib/mongo/error/snapshot_session_invalid_server_version.rb +1 -4
  212. data/lib/mongo/error/snapshot_session_transaction_prohibited.rb +1 -4
  213. data/lib/mongo/error/socket_error.rb +0 -2
  214. data/lib/mongo/error/socket_timeout_error.rb +0 -2
  215. data/lib/mongo/error/transactions_not_supported.rb +3 -6
  216. data/lib/mongo/error/unchangeable_collection_option.rb +1 -4
  217. data/lib/mongo/error/unexpected_chunk_length.rb +0 -3
  218. data/lib/mongo/error/unexpected_response.rb +1 -4
  219. data/lib/mongo/error/unknown_payload_type.rb +0 -3
  220. data/lib/mongo/error/unmet_dependency.rb +0 -2
  221. data/lib/mongo/error/unsupported_array_filters.rb +3 -24
  222. data/lib/mongo/error/unsupported_collation.rb +3 -24
  223. data/lib/mongo/error/unsupported_features.rb +0 -2
  224. data/lib/mongo/error/unsupported_message_type.rb +0 -2
  225. data/lib/mongo/error/unsupported_option.rb +19 -21
  226. data/lib/mongo/error/write_retryable.rb +0 -2
  227. data/lib/mongo/error.rb +10 -24
  228. data/lib/mongo/event/base.rb +0 -2
  229. data/lib/mongo/event/listeners.rb +0 -3
  230. data/lib/mongo/event/publisher.rb +0 -3
  231. data/lib/mongo/event/subscriber.rb +0 -4
  232. data/lib/mongo/event.rb +4 -6
  233. data/lib/mongo/grid/file/chunk.rb +7 -10
  234. data/lib/mongo/grid/file/info.rb +20 -24
  235. data/lib/mongo/grid/file.rb +7 -8
  236. data/lib/mongo/grid/fs_bucket.rb +40 -48
  237. data/lib/mongo/grid/stream/read.rb +25 -35
  238. data/lib/mongo/grid/stream/write.rb +17 -22
  239. data/lib/mongo/grid/stream.rb +2 -4
  240. data/lib/mongo/grid.rb +0 -1
  241. data/lib/mongo/id.rb +0 -1
  242. data/lib/mongo/index/view.rb +49 -48
  243. data/lib/mongo/index.rb +7 -10
  244. data/lib/mongo/lint.rb +31 -37
  245. data/lib/mongo/loggable.rb +5 -8
  246. data/lib/mongo/logger.rb +1 -7
  247. data/lib/mongo/monitoring/cmap_log_subscriber.rb +0 -2
  248. data/lib/mongo/monitoring/command_log_subscriber.rb +25 -33
  249. data/lib/mongo/monitoring/event/cmap/base.rb +0 -2
  250. data/lib/mongo/monitoring/event/cmap/connection_check_out_failed.rb +1 -4
  251. data/lib/mongo/monitoring/event/cmap/connection_check_out_started.rb +0 -3
  252. data/lib/mongo/monitoring/event/cmap/connection_checked_in.rb +1 -4
  253. data/lib/mongo/monitoring/event/cmap/connection_checked_out.rb +2 -5
  254. data/lib/mongo/monitoring/event/cmap/connection_closed.rb +1 -4
  255. data/lib/mongo/monitoring/event/cmap/connection_created.rb +1 -4
  256. data/lib/mongo/monitoring/event/cmap/connection_ready.rb +1 -4
  257. data/lib/mongo/monitoring/event/cmap/pool_cleared.rb +0 -3
  258. data/lib/mongo/monitoring/event/cmap/pool_closed.rb +1 -4
  259. data/lib/mongo/monitoring/event/cmap/pool_created.rb +1 -4
  260. data/lib/mongo/monitoring/event/cmap/pool_ready.rb +1 -4
  261. data/lib/mongo/monitoring/event/cmap.rb +0 -1
  262. data/lib/mongo/monitoring/event/command_failed.rb +5 -9
  263. data/lib/mongo/monitoring/event/command_started.rb +8 -12
  264. data/lib/mongo/monitoring/event/command_succeeded.rb +7 -15
  265. data/lib/mongo/monitoring/event/secure.rb +15 -20
  266. data/lib/mongo/monitoring/event/server_closed.rb +1 -4
  267. data/lib/mongo/monitoring/event/server_description_changed.rb +4 -8
  268. data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +5 -10
  269. data/lib/mongo/monitoring/event/server_heartbeat_started.rb +1 -4
  270. data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +3 -8
  271. data/lib/mongo/monitoring/event/server_opening.rb +1 -4
  272. data/lib/mongo/monitoring/event/topology_changed.rb +2 -5
  273. data/lib/mongo/monitoring/event/topology_closed.rb +1 -4
  274. data/lib/mongo/monitoring/event/topology_opening.rb +1 -4
  275. data/lib/mongo/monitoring/event.rb +0 -1
  276. data/lib/mongo/monitoring/publishable.rb +20 -30
  277. data/lib/mongo/monitoring/sdam_log_subscriber.rb +0 -2
  278. data/lib/mongo/monitoring/server_closed_log_subscriber.rb +0 -3
  279. data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +0 -3
  280. data/lib/mongo/monitoring/server_opening_log_subscriber.rb +0 -3
  281. data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +5 -8
  282. data/lib/mongo/monitoring/topology_closed_log_subscriber.rb +0 -3
  283. data/lib/mongo/monitoring/topology_opening_log_subscriber.rb +0 -3
  284. data/lib/mongo/monitoring/unified_sdam_log_subscriber.rb +1 -3
  285. data/lib/mongo/monitoring.rb +38 -39
  286. data/lib/mongo/operation/aggregate/op_msg.rb +0 -2
  287. data/lib/mongo/operation/aggregate/result.rb +3 -6
  288. data/lib/mongo/operation/aggregate.rb +0 -2
  289. data/lib/mongo/operation/collections_info/result.rb +0 -3
  290. data/lib/mongo/operation/collections_info.rb +0 -2
  291. data/lib/mongo/operation/command/op_msg.rb +1 -4
  292. data/lib/mongo/operation/command.rb +0 -2
  293. data/lib/mongo/operation/context.rb +13 -16
  294. data/lib/mongo/operation/count/op_msg.rb +2 -4
  295. data/lib/mongo/operation/count.rb +0 -2
  296. data/lib/mongo/operation/create/op_msg.rb +2 -5
  297. data/lib/mongo/operation/create.rb +0 -2
  298. data/lib/mongo/operation/create_index/op_msg.rb +3 -7
  299. data/lib/mongo/operation/create_index.rb +0 -2
  300. data/lib/mongo/operation/create_user/op_msg.rb +2 -4
  301. data/lib/mongo/operation/create_user.rb +0 -2
  302. data/lib/mongo/operation/delete/bulk_result.rb +2 -3
  303. data/lib/mongo/operation/delete/op_msg.rb +3 -10
  304. data/lib/mongo/operation/delete/result.rb +0 -3
  305. data/lib/mongo/operation/delete.rb +1 -5
  306. data/lib/mongo/operation/distinct/op_msg.rb +2 -5
  307. data/lib/mongo/operation/distinct.rb +0 -2
  308. data/lib/mongo/operation/drop/op_msg.rb +0 -2
  309. data/lib/mongo/operation/drop.rb +0 -2
  310. data/lib/mongo/operation/drop_database/op_msg.rb +0 -2
  311. data/lib/mongo/operation/drop_database.rb +0 -2
  312. data/lib/mongo/operation/drop_index/op_msg.rb +4 -6
  313. data/lib/mongo/operation/drop_index.rb +0 -2
  314. data/lib/mongo/operation/explain/op_msg.rb +0 -2
  315. data/lib/mongo/operation/explain/result.rb +0 -3
  316. data/lib/mongo/operation/explain.rb +0 -2
  317. data/lib/mongo/operation/find/builder/command.rb +4 -12
  318. data/lib/mongo/operation/find/builder/flags.rb +9 -15
  319. data/lib/mongo/operation/find/builder/modifiers.rb +1 -4
  320. data/lib/mongo/operation/find/builder.rb +0 -1
  321. data/lib/mongo/operation/find/op_msg.rb +4 -12
  322. data/lib/mongo/operation/find/result.rb +0 -3
  323. data/lib/mongo/operation/find.rb +0 -2
  324. data/lib/mongo/operation/get_more/command_builder.rb +1 -6
  325. data/lib/mongo/operation/get_more/op_msg.rb +10 -4
  326. data/lib/mongo/operation/get_more/result.rb +0 -3
  327. data/lib/mongo/operation/get_more.rb +0 -2
  328. data/lib/mongo/operation/indexes/op_msg.rb +0 -2
  329. data/lib/mongo/operation/indexes/result.rb +1 -5
  330. data/lib/mongo/operation/indexes.rb +0 -2
  331. data/lib/mongo/operation/insert/bulk_result.rb +2 -6
  332. data/lib/mongo/operation/insert/op_msg.rb +2 -4
  333. data/lib/mongo/operation/insert/result.rb +0 -3
  334. data/lib/mongo/operation/insert.rb +2 -5
  335. data/lib/mongo/operation/kill_cursors/command_builder.rb +0 -3
  336. data/lib/mongo/operation/kill_cursors/op_msg.rb +1 -3
  337. data/lib/mongo/operation/kill_cursors.rb +0 -2
  338. data/lib/mongo/operation/list_collections/op_msg.rb +4 -6
  339. data/lib/mongo/operation/list_collections/result.rb +1 -4
  340. data/lib/mongo/operation/list_collections.rb +0 -2
  341. data/lib/mongo/operation/map_reduce/op_msg.rb +0 -2
  342. data/lib/mongo/operation/map_reduce/result.rb +3 -6
  343. data/lib/mongo/operation/map_reduce.rb +0 -2
  344. data/lib/mongo/operation/op_msg_base.rb +0 -1
  345. data/lib/mongo/operation/parallel_scan/op_msg.rb +4 -5
  346. data/lib/mongo/operation/parallel_scan/result.rb +2 -5
  347. data/lib/mongo/operation/parallel_scan.rb +0 -2
  348. data/lib/mongo/operation/remove_user/op_msg.rb +2 -4
  349. data/lib/mongo/operation/remove_user.rb +0 -2
  350. data/lib/mongo/operation/result.rb +38 -48
  351. data/lib/mongo/operation/shared/bypass_document_validation.rb +3 -7
  352. data/lib/mongo/operation/shared/causal_consistency_supported.rb +0 -3
  353. data/lib/mongo/operation/shared/executable.rb +19 -28
  354. data/lib/mongo/operation/shared/executable_no_validate.rb +0 -3
  355. data/lib/mongo/operation/shared/executable_transaction_label.rb +0 -2
  356. data/lib/mongo/operation/shared/idable.rb +3 -6
  357. data/lib/mongo/operation/shared/limited.rb +0 -3
  358. data/lib/mongo/operation/shared/object_id_generator.rb +0 -3
  359. data/lib/mongo/operation/shared/op_msg_executable.rb +0 -2
  360. data/lib/mongo/operation/shared/polymorphic_lookup.rb +0 -2
  361. data/lib/mongo/operation/shared/polymorphic_result.rb +2 -4
  362. data/lib/mongo/operation/shared/read_preference_supported.rb +10 -15
  363. data/lib/mongo/operation/shared/response_handling.rb +13 -26
  364. data/lib/mongo/operation/shared/result/aggregatable.rb +12 -13
  365. data/lib/mongo/operation/shared/sessions_supported.rb +87 -99
  366. data/lib/mongo/operation/shared/specifiable.rb +32 -58
  367. data/lib/mongo/operation/shared/write.rb +12 -17
  368. data/lib/mongo/operation/shared/write_concern_supported.rb +4 -7
  369. data/lib/mongo/operation/update/bulk_result.rb +13 -17
  370. data/lib/mongo/operation/update/op_msg.rb +2 -5
  371. data/lib/mongo/operation/update/result.rb +5 -5
  372. data/lib/mongo/operation/update.rb +1 -5
  373. data/lib/mongo/operation/update_user/op_msg.rb +2 -4
  374. data/lib/mongo/operation/update_user.rb +0 -2
  375. data/lib/mongo/operation/users_info/op_msg.rb +2 -4
  376. data/lib/mongo/operation/users_info/result.rb +1 -4
  377. data/lib/mongo/operation/users_info.rb +0 -2
  378. data/lib/mongo/operation/write_command/op_msg.rb +2 -10
  379. data/lib/mongo/operation/write_command.rb +0 -2
  380. data/lib/mongo/operation.rb +9 -14
  381. data/lib/mongo/options/mapper.rb +8 -15
  382. data/lib/mongo/options/redacted.rb +7 -9
  383. data/lib/mongo/options.rb +0 -1
  384. data/lib/mongo/protocol/bit_vector.rb +3 -5
  385. data/lib/mongo/protocol/caching_hash.rb +2 -7
  386. data/lib/mongo/protocol/compressed.rb +5 -10
  387. data/lib/mongo/protocol/get_more.rb +2 -8
  388. data/lib/mongo/protocol/kill_cursors.rb +2 -8
  389. data/lib/mongo/protocol/message.rb +103 -105
  390. data/lib/mongo/protocol/msg.rb +48 -63
  391. data/lib/mongo/protocol/query.rb +32 -41
  392. data/lib/mongo/protocol/registry.rb +2 -5
  393. data/lib/mongo/protocol/reply.rb +10 -16
  394. data/lib/mongo/protocol/serializers.rb +41 -59
  395. data/lib/mongo/protocol.rb +0 -1
  396. data/lib/mongo/query_cache.rb +7 -15
  397. data/lib/mongo/retryable/backpressure.rb +31 -0
  398. data/lib/mongo/retryable/base_worker.rb +39 -13
  399. data/lib/mongo/retryable/read_worker.rb +77 -21
  400. data/lib/mongo/retryable/retry_policy.rb +59 -0
  401. data/lib/mongo/retryable/write_worker.rb +155 -56
  402. data/lib/mongo/retryable.rb +70 -9
  403. data/lib/mongo/search_index/view.rb +1 -1
  404. data/lib/mongo/semaphore.rb +0 -1
  405. data/lib/mongo/server/app_metadata/environment.rb +3 -3
  406. data/lib/mongo/server/app_metadata.rb +4 -5
  407. data/lib/mongo/server/connection.rb +61 -61
  408. data/lib/mongo/server/connection_base.rb +43 -53
  409. data/lib/mongo/server/connection_common.rb +41 -64
  410. data/lib/mongo/server/connection_pool/generation_manager.rb +6 -11
  411. data/lib/mongo/server/connection_pool/populator.rb +1 -4
  412. data/lib/mongo/server/connection_pool.rb +195 -167
  413. data/lib/mongo/server/description/features.rb +23 -60
  414. data/lib/mongo/server/description/load_balancer.rb +0 -2
  415. data/lib/mongo/server/description.rb +117 -138
  416. data/lib/mongo/server/monitor/app_metadata.rb +3 -4
  417. data/lib/mongo/server/monitor/connection.rb +28 -35
  418. data/lib/mongo/server/monitor.rb +65 -60
  419. data/lib/mongo/server/pending_connection.rb +70 -71
  420. data/lib/mongo/server/push_monitor/connection.rb +0 -3
  421. data/lib/mongo/server/push_monitor.rb +21 -29
  422. data/lib/mongo/server/round_trip_time_calculator.rb +11 -17
  423. data/lib/mongo/server.rb +60 -93
  424. data/lib/mongo/server_selector/base.rb +133 -157
  425. data/lib/mongo/server_selector/nearest.rb +2 -5
  426. data/lib/mongo/server_selector/primary.rb +1 -5
  427. data/lib/mongo/server_selector/primary_preferred.rb +2 -6
  428. data/lib/mongo/server_selector/secondary.rb +2 -6
  429. data/lib/mongo/server_selector/secondary_preferred.rb +1 -5
  430. data/lib/mongo/server_selector.rb +3 -4
  431. data/lib/mongo/session/server_session.rb +6 -7
  432. data/lib/mongo/session/session_pool.rb +20 -34
  433. data/lib/mongo/session.rb +287 -188
  434. data/lib/mongo/socket/ocsp_cache.rb +8 -13
  435. data/lib/mongo/socket/ocsp_verifier.rb +69 -70
  436. data/lib/mongo/socket/ssl.rb +44 -43
  437. data/lib/mongo/socket/tcp.rb +5 -8
  438. data/lib/mongo/socket/unix.rb +0 -4
  439. data/lib/mongo/socket.rb +80 -102
  440. data/lib/mongo/srv/monitor.rb +6 -11
  441. data/lib/mongo/srv/resolver.rb +15 -24
  442. data/lib/mongo/srv/result.rb +18 -24
  443. data/lib/mongo/srv.rb +0 -1
  444. data/lib/mongo/timeout.rb +4 -11
  445. data/lib/mongo/topology_version.rb +8 -13
  446. data/lib/mongo/tracing/open_telemetry/command_tracer.rb +1 -1
  447. data/lib/mongo/tracing/open_telemetry/operation_tracer.rb +1 -1
  448. data/lib/mongo/tracing/open_telemetry/tracer.rb +1 -1
  449. data/lib/mongo/uri/options_mapper.rb +135 -126
  450. data/lib/mongo/uri/srv_protocol.rb +25 -38
  451. data/lib/mongo/uri.rb +95 -139
  452. data/lib/mongo/utils.rb +5 -12
  453. data/lib/mongo/version.rb +1 -1
  454. data/lib/mongo/write_concern/acknowledged.rb +0 -2
  455. data/lib/mongo/write_concern/base.rb +6 -6
  456. data/lib/mongo/write_concern/unacknowledged.rb +0 -2
  457. data/lib/mongo/write_concern.rb +14 -15
  458. data/lib/mongo.rb +1 -3
  459. data/mongo.gemspec +17 -17
  460. metadata +5 -5
  461. data/lib/mongo/error/server_api_not_supported.rb +0 -27
  462. data/lib/mongo/operation/shared/result/use_legacy_error_parser.rb +0 -32
  463. data/lib/mongo/operation/shared/validatable.rb +0 -87
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # rubocop:todo all
3
2
 
4
3
  # Copyright (C) 2015-2020 MongoDB Inc.
5
4
  #
@@ -17,48 +16,46 @@
17
16
 
18
17
  module Mongo
19
18
  class BulkWrite
20
-
21
19
  # Defines behavior around transformations.
22
20
  #
23
21
  # @api private
24
22
  #
25
23
  # @since 2.1.0
26
24
  module Transformable
27
-
28
25
  # The delete many model constant.
29
26
  #
30
27
  # @since 2.1.0
31
- DELETE_MANY = :delete_many.freeze
28
+ DELETE_MANY = :delete_many
32
29
 
33
30
  # The delete one model constant.
34
31
  #
35
32
  # @since 2.1.0
36
- DELETE_ONE = :delete_one.freeze
33
+ DELETE_ONE = :delete_one
37
34
 
38
35
  # The insert one model constant.
39
36
  #
40
37
  # @since 2.1.0
41
- INSERT_ONE = :insert_one.freeze
38
+ INSERT_ONE = :insert_one
42
39
 
43
40
  # The replace one model constant.
44
41
  #
45
42
  # @since 2.1.0
46
- REPLACE_ONE = :replace_one.freeze
43
+ REPLACE_ONE = :replace_one
47
44
 
48
45
  # The update many model constant.
49
46
  #
50
47
  # @since 2.1.0
51
- UPDATE_MANY = :update_many.freeze
48
+ UPDATE_MANY = :update_many
52
49
 
53
50
  # The update one model constant.
54
51
  #
55
52
  # @since 2.1.0
56
- UPDATE_ONE = :update_one.freeze
53
+ UPDATE_ONE = :update_one
57
54
 
58
55
  # Proc to transform delete many ops.
59
56
  #
60
57
  # @since 2.1.0
61
- DELETE_MANY_TRANSFORM = ->(doc){
58
+ DELETE_MANY_TRANSFORM = lambda { |doc|
62
59
  {
63
60
  Operation::Q => doc[:filter],
64
61
  Operation::LIMIT => 0,
@@ -71,7 +68,7 @@ module Mongo
71
68
  # Proc to transform delete one ops.
72
69
  #
73
70
  # @since 2.1.0
74
- DELETE_ONE_TRANSFORM = ->(doc){
71
+ DELETE_ONE_TRANSFORM = lambda { |doc|
75
72
  {
76
73
  Operation::Q => doc[:filter],
77
74
  Operation::LIMIT => 1,
@@ -84,14 +81,14 @@ module Mongo
84
81
  # Proc to transform insert one ops.
85
82
  #
86
83
  # @since 2.1.0
87
- INSERT_ONE_TRANSFORM = ->(doc){
84
+ INSERT_ONE_TRANSFORM = lambda { |doc|
88
85
  doc
89
86
  }
90
87
 
91
- # Proc to transfor replace one ops.
88
+ # Proc to transform replace one ops.
92
89
  #
93
90
  # @since 2.1.0
94
- REPLACE_ONE_TRANSFORM = ->(doc){
91
+ REPLACE_ONE_TRANSFORM = lambda { |doc|
95
92
  {
96
93
  Operation::Q => doc[:filter],
97
94
  Operation::U => doc[:replacement],
@@ -106,7 +103,7 @@ module Mongo
106
103
  # Proc to transform update many ops.
107
104
  #
108
105
  # @since 2.1.0
109
- UPDATE_MANY_TRANSFORM = ->(doc){
106
+ UPDATE_MANY_TRANSFORM = lambda { |doc|
110
107
  {
111
108
  Operation::Q => doc[:filter],
112
109
  Operation::U => doc[:update],
@@ -122,7 +119,7 @@ module Mongo
122
119
  # Proc to transform update one ops.
123
120
  #
124
121
  # @since 2.1.0
125
- UPDATE_ONE_TRANSFORM = ->(doc){
122
+ UPDATE_ONE_TRANSFORM = lambda { |doc|
126
123
  {
127
124
  Operation::Q => doc[:filter],
128
125
  Operation::U => doc[:update],
@@ -140,11 +137,11 @@ module Mongo
140
137
  # @since 2.1.0
141
138
  MAPPERS = {
142
139
  DELETE_MANY => DELETE_MANY_TRANSFORM,
143
- DELETE_ONE => DELETE_ONE_TRANSFORM,
144
- INSERT_ONE => INSERT_ONE_TRANSFORM,
140
+ DELETE_ONE => DELETE_ONE_TRANSFORM,
141
+ INSERT_ONE => INSERT_ONE_TRANSFORM,
145
142
  REPLACE_ONE => REPLACE_ONE_TRANSFORM,
146
143
  UPDATE_MANY => UPDATE_MANY_TRANSFORM,
147
- UPDATE_ONE => UPDATE_ONE_TRANSFORM
144
+ UPDATE_ONE => UPDATE_ONE_TRANSFORM
148
145
  }.freeze
149
146
 
150
147
  private
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # rubocop:todo all
3
2
 
4
3
  # Copyright (C) 2015-2020 MongoDB Inc.
5
4
  #
@@ -17,15 +16,14 @@
17
16
 
18
17
  module Mongo
19
18
  class BulkWrite
20
-
21
19
  # Combines groups of bulk write operations in no order.
22
20
  #
23
21
  # @api private
24
22
  #
25
23
  # @since 2.1.0
26
24
  class UnorderedCombiner
27
- include Transformable
28
25
  include Validatable
26
+ include Transformable
29
27
  include Combineable
30
28
 
31
29
  # Combine the requests in order.
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # rubocop:todo all
3
2
 
4
3
  # Copyright (C) 2015-2020 MongoDB Inc.
5
4
  #
@@ -17,14 +16,12 @@
17
16
 
18
17
  module Mongo
19
18
  class BulkWrite
20
-
21
19
  # Defines behavior around validations.
22
20
  #
23
21
  # @api private
24
22
  #
25
23
  # @since 2.1.0
26
24
  module Validatable
27
-
28
25
  # Validate the document.
29
26
  #
30
27
  # @api private
@@ -43,33 +40,29 @@ module Mongo
43
40
  def validate(name, document)
44
41
  validate_operation(name)
45
42
  validate_document(name, document)
46
- if document.respond_to?(:keys) && (document[:collation] || document[Operation::COLLATION])
47
- @has_collation = true
48
- end
43
+ @has_collation = true if document.respond_to?(:keys) && (document[:collation] || document[Operation::COLLATION])
49
44
 
50
- if document.respond_to?(:keys) && document[:array_filters]
51
- @has_array_filters = true
52
- end
45
+ @has_array_filters = true if document.respond_to?(:keys) && document[:array_filters]
53
46
 
54
- if document.respond_to?(:keys) && document[:hint]
55
- @has_hint = true
56
- end
47
+ return unless document.respond_to?(:keys) && document[:hint]
48
+
49
+ @has_hint = true
57
50
  end
58
51
 
59
52
  private
60
53
 
61
54
  def validate_document(name, document)
62
- if document.respond_to?(:keys) || document.respond_to?(:data)
63
- document
64
- else
55
+ unless document.respond_to?(:keys) || document.respond_to?(:data)
65
56
  raise Error::InvalidBulkOperation.new(name, document)
66
57
  end
58
+
59
+ document
67
60
  end
68
61
 
69
62
  def validate_operation(name)
70
- unless Transformable::MAPPERS.key?(name)
71
- raise Error::InvalidBulkOperationType.new(name)
72
- end
63
+ return if Transformable::MAPPERS.key?(name)
64
+
65
+ raise Error::InvalidBulkOperationType.new(name)
73
66
  end
74
67
  end
75
68
  end
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # rubocop:todo all
3
2
 
4
3
  # Copyright (C) 2014-2020 MongoDB Inc.
5
4
  #
@@ -67,7 +66,7 @@ module Mongo
67
66
  context = Operation::Context.new(
68
67
  client: client,
69
68
  session: session,
70
- operation_timeouts: { operation_timeout_ms: op_timeout_ms(deadline) }
69
+ operation_timeouts: operation_timeouts(deadline)
71
70
  )
72
71
  if single_statement?(operation)
73
72
  write_concern = write_concern(session)
@@ -80,10 +79,11 @@ module Mongo
80
79
  operation_id,
81
80
  result_combiner,
82
81
  session,
83
- txn_num)
82
+ txn_num
83
+ )
84
84
  end
85
85
  else
86
- nro_write_with_retry(write_concern, context: context) do |connection, txn_num, context|
86
+ nro_write_with_retry(write_concern, context: context) do |connection, _txn_num, context|
87
87
  execute_operation(
88
88
  operation.keys.first,
89
89
  operation.values.flatten,
@@ -91,7 +91,8 @@ module Mongo
91
91
  context,
92
92
  operation_id,
93
93
  result_combiner,
94
- session)
94
+ session
95
+ )
95
96
  end
96
97
  end
97
98
  end
@@ -129,9 +130,9 @@ module Mongo
129
130
  @collection = collection
130
131
  @requests = requests
131
132
  @options = options || {}
132
- if @options[:timeout_ms] && @options[:timeout_ms] < 0
133
- raise ArgumentError, "timeout_ms options must be non-negative integer"
134
- end
133
+ return unless @options[:timeout_ms] && @options[:timeout_ms] < 0
134
+
135
+ raise ArgumentError, 'timeout_ms options must be non-negative integer'
135
136
  end
136
137
 
137
138
  # Is the bulk write ordered?
@@ -159,16 +160,18 @@ module Mongo
159
160
  #
160
161
  # @since 2.1.0
161
162
  def write_concern(session = nil)
162
- @write_concern ||= options[:write_concern] ?
163
- WriteConcern.get(options[:write_concern]) :
164
- collection.write_concern_with_session(session)
163
+ @write_concern ||= if options[:write_concern]
164
+ WriteConcern.get(options[:write_concern])
165
+ else
166
+ collection.write_concern_with_session(session)
167
+ end
165
168
  end
166
169
 
167
170
  private
168
171
 
169
- SINGLE_STATEMENT_OPS = [ :delete_one,
170
- :update_one,
171
- :insert_one ].freeze
172
+ SINGLE_STATEMENT_OPS = %i[delete_one
173
+ update_one
174
+ insert_one].freeze
172
175
 
173
176
  # @return [ Float | nil ] Deadline for the batch of operations, if set.
174
177
  def calculate_deadline
@@ -182,6 +185,22 @@ module Mongo
182
185
  end
183
186
  end
184
187
 
188
+ # Returns the operation_timeouts hash for creating an Operation::Context.
189
+ # Uses operation_timeout_ms when the timeout was explicitly set on the
190
+ # bulk write, or inherited_timeout_ms when it comes from the collection
191
+ # or client. This distinction is important inside transactions where
192
+ # operation_timeout_ms is not allowed (RUBY-3685).
193
+ def operation_timeouts(deadline)
194
+ timeout = op_timeout_ms(deadline)
195
+ return {} if timeout.nil?
196
+
197
+ if @options[:timeout_ms]
198
+ { operation_timeout_ms: timeout }
199
+ else
200
+ { inherited_timeout_ms: timeout }
201
+ end
202
+ end
203
+
185
204
  # @param [ Float | nil ] deadline Deadline for the batch of operations.
186
205
  #
187
206
  # @return [ Integer | nil ] Timeout in milliseconds for the next operation.
@@ -201,24 +220,22 @@ module Mongo
201
220
 
202
221
  def base_spec(operation_id, session)
203
222
  {
204
- :db_name => database.name,
205
- :coll_name => collection.name,
206
- :write_concern => write_concern(session),
207
- :ordered => ordered?,
208
- :operation_id => operation_id,
209
- :bypass_document_validation => !!options[:bypass_document_validation],
210
- :max_time_ms => options[:max_time_ms],
211
- :options => options,
212
- :id_generator => client.options[:id_generator],
213
- :session => session,
214
- :comment => options[:comment],
215
- :let => options[:let],
223
+ db_name: database.name,
224
+ coll_name: collection.name,
225
+ write_concern: write_concern(session),
226
+ ordered: ordered?,
227
+ operation_id: operation_id,
228
+ bypass_document_validation: !!options[:bypass_document_validation],
229
+ max_time_ms: options[:max_time_ms],
230
+ options: options,
231
+ id_generator: client.options[:id_generator],
232
+ session: session,
233
+ comment: options[:comment],
234
+ let: options[:let],
216
235
  }
217
236
  end
218
237
 
219
238
  def execute_operation(name, values, connection, context, operation_id, result_combiner, session, txn_num = nil)
220
- validate_collation!(connection)
221
- validate_array_filters!(connection)
222
239
  validate_hint!(connection)
223
240
 
224
241
  unpin_maybe(session, connection) do
@@ -234,15 +251,12 @@ module Mongo
234
251
  end
235
252
  end
236
253
  end
237
- # With OP_MSG (3.6+ servers), the size of each section in the message
254
+ # The size of each section in the message
238
255
  # is independently capped at 16m and each bulk operation becomes
239
256
  # its own section. The size of the entire bulk write is limited to 48m.
240
- # With OP_QUERY (pre-3.6 servers), the entire bulk write is sent as a
241
- # single document and is thus subject to the 16m document size limit.
242
- # This means the splits differ between pre-3.6 and 3.6+ servers, with
243
- # 3.6+ servers being able to split less.
244
257
  rescue Error::MaxBSONSize, Error::MaxMessageSize => e
245
258
  raise e if values.size <= 1
259
+
246
260
  unpin_maybe(session, connection) do
247
261
  split_execute(name, values, connection, context, operation_id, result_combiner, session, txn_num)
248
262
  end
@@ -253,7 +267,8 @@ module Mongo
253
267
  end
254
268
 
255
269
  def split_execute(name, values, connection, context, operation_id, result_combiner, session, txn_num)
256
- execute_operation(name, values.shift(values.size / 2), connection, context, operation_id, result_combiner, session, txn_num)
270
+ execute_operation(name, values.shift(values.size / 2), connection, context, operation_id, result_combiner,
271
+ session, txn_num)
257
272
 
258
273
  txn_num = session.next_txn_num if txn_num && !session.in_transaction?
259
274
  execute_operation(name, values, connection, context, operation_id, result_combiner, session, txn_num)
@@ -262,68 +277,51 @@ module Mongo
262
277
  def delete_one(documents, connection, context, operation_id, session, txn_num)
263
278
  QueryCache.clear_namespace(collection.namespace)
264
279
 
265
- spec = base_spec(operation_id, session).merge(:deletes => documents, :txn_num => txn_num)
280
+ spec = base_spec(operation_id, session).merge(deletes: documents, txn_num: txn_num)
266
281
  Operation::Delete.new(spec).bulk_execute(connection, context: context)
267
282
  end
268
283
 
269
- def delete_many(documents, connection, context, operation_id, session, txn_num)
284
+ def delete_many(documents, connection, context, operation_id, session, _txn_num)
270
285
  QueryCache.clear_namespace(collection.namespace)
271
286
 
272
- spec = base_spec(operation_id, session).merge(:deletes => documents)
287
+ spec = base_spec(operation_id, session).merge(deletes: documents)
273
288
  Operation::Delete.new(spec).bulk_execute(connection, context: context)
274
289
  end
275
290
 
276
291
  def insert_one(documents, connection, context, operation_id, session, txn_num)
277
292
  QueryCache.clear_namespace(collection.namespace)
278
293
 
279
- spec = base_spec(operation_id, session).merge(:documents => documents, :txn_num => txn_num)
294
+ spec = base_spec(operation_id, session).merge(documents: documents, txn_num: txn_num)
280
295
  Operation::Insert.new(spec).bulk_execute(connection, context: context)
281
296
  end
282
297
 
283
298
  def update_one(documents, connection, context, operation_id, session, txn_num)
284
299
  QueryCache.clear_namespace(collection.namespace)
285
300
 
286
- spec = base_spec(operation_id, session).merge(:updates => documents, :txn_num => txn_num)
301
+ spec = base_spec(operation_id, session).merge(updates: documents, txn_num: txn_num)
287
302
  Operation::Update.new(spec).bulk_execute(connection, context: context)
288
303
  end
289
- alias :replace_one :update_one
304
+ alias replace_one update_one
290
305
 
291
- def update_many(documents, connection, context, operation_id, session, txn_num)
306
+ def update_many(documents, connection, context, operation_id, session, _txn_num)
292
307
  QueryCache.clear_namespace(collection.namespace)
293
308
 
294
- spec = base_spec(operation_id, session).merge(:updates => documents)
309
+ spec = base_spec(operation_id, session).merge(updates: documents)
295
310
  Operation::Update.new(spec).bulk_execute(connection, context: context)
296
311
  end
297
312
 
298
- private
299
-
300
- def validate_collation!(connection)
301
- if op_combiner.has_collation? && !connection.features.collation_enabled?
302
- raise Error::UnsupportedCollation.new
303
- end
304
- end
305
-
306
- def validate_array_filters!(connection)
307
- if op_combiner.has_array_filters? && !connection.features.array_filters_enabled?
308
- raise Error::UnsupportedArrayFilters.new
309
- end
310
- end
311
-
312
313
  def validate_hint!(connection)
313
- if op_combiner.has_hint?
314
- if !can_hint?(connection) && write_concern && !write_concern.acknowledged?
315
- raise Error::UnsupportedOption.hint_error(unacknowledged_write: true)
316
- elsif !connection.features.update_delete_option_validation_enabled?
317
- raise Error::UnsupportedOption.hint_error
318
- end
319
- end
314
+ return unless op_combiner.has_hint?
315
+ return unless !can_hint?(connection) && write_concern && !write_concern.acknowledged?
316
+
317
+ raise Error::UnsupportedOption.hint_error(unacknowledged_write: true)
320
318
  end
321
319
 
322
320
  # Loop through the requests and check if each operation is allowed to send
323
321
  # a hint for each operation on the given server version.
324
322
  #
325
- # For the following operations, the client can send a hint for servers >= 4.2
326
- # and for the rest, the client can only send it for 4.4+:
323
+ # For the following operations, the client can send a hint for all supported
324
+ # server versions, and for the rest, the client can only send it for 4.4+:
327
325
  # - updateOne
328
326
  # - updateMany
329
327
  # - replaceOne
@@ -333,16 +331,11 @@ module Mongo
333
331
  # @return [ true | false ] Whether the request is able to send hints for
334
332
  # the current server version.
335
333
  def can_hint?(connection)
336
- gte_4_2 = connection.server.description.server_version_gte?('4.2')
337
334
  gte_4_4 = connection.server.description.server_version_gte?('4.4')
338
335
  op_combiner.requests.all? do |req|
339
336
  op = req.keys.first
340
337
  if req[op].keys.include?(:hint)
341
- if [:update_one, :update_many, :replace_one].include?(op)
342
- gte_4_2
343
- else
344
- gte_4_4
345
- end
338
+ %i[update_one update_many replace_one].include?(op) || gte_4_4
346
339
  else
347
340
  true
348
341
  end
@@ -368,32 +361,24 @@ module Mongo
368
361
  @requests.each do |req|
369
362
  requests_empty = false
370
363
  if op = req.keys.first
371
- if [:update_one, :update_many].include?(op)
372
- if doc = maybe_first(req.dig(op, :update))
373
- if key = doc.keys&.first
374
- unless key.to_s.start_with?("$")
375
- if Mongo.validate_update_replace
376
- raise Error::InvalidUpdateDocument.new(key: key)
377
- else
378
- Error::InvalidUpdateDocument.warn(Logger.logger, key)
379
- end
380
- end
381
- end
364
+ if %i[update_one update_many].include?(op)
365
+ if (doc = maybe_first(req.dig(op, :update))) && (key = doc.keys&.first) && !key.to_s.start_with?('$')
366
+ raise Error::InvalidUpdateDocument.new(key: key) if Mongo.validate_update_replace
367
+
368
+ Error::InvalidUpdateDocument.warn(Logger.logger, key)
369
+
382
370
  end
383
371
  elsif op == :replace_one
384
- if key = req.dig(op, :replacement)&.keys&.first
385
- if key.to_s.start_with?("$")
386
- if Mongo.validate_update_replace
387
- raise Error::InvalidReplacementDocument.new(key: key)
388
- else
389
- Error::InvalidReplacementDocument.warn(Logger.logger, key)
390
- end
391
- end
372
+ if (key = req.dig(op, :replacement)&.keys&.first) && key.to_s.start_with?('$')
373
+ raise Error::InvalidReplacementDocument.new(key: key) if Mongo.validate_update_replace
374
+
375
+ Error::InvalidReplacementDocument.warn(Logger.logger, key)
376
+
392
377
  end
393
378
  end
394
379
  end
395
380
  end.tap do
396
- raise ArgumentError, "Bulk write requests cannot be empty" if requests_empty
381
+ raise ArgumentError, 'Bulk write requests cannot be empty' if requests_empty
397
382
  end
398
383
  end
399
384
 
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # rubocop:todo all
3
2
 
4
3
  # Copyright (C) 2020 MongoDB Inc.
5
4
  #
@@ -16,13 +15,11 @@
16
15
  # limitations under the License.
17
16
 
18
17
  module Mongo
19
-
20
18
  # A Cursor that attempts to load documents from memory first before hitting
21
19
  # the database if the same query has already been executed.
22
20
  #
23
21
  # @api semiprivate
24
22
  class CachingCursor < Cursor
25
-
26
23
  # @return [ Array <BSON::Document> ] The cursor's cached documents.
27
24
  # @api private
28
25
  attr_reader :cached_docs
@@ -34,11 +31,9 @@ module Mongo
34
31
  # cursor.each do |doc|
35
32
  # # ...
36
33
  # end
37
- def each
34
+ def each(&block)
38
35
  if @cached_docs
39
- @cached_docs.each do |doc|
40
- yield doc
41
- end
36
+ @cached_docs.each(&block)
42
37
 
43
38
  unless closed?
44
39
  # StopIteration raised by try_next ends this loop.