mongo 2.17.3 → 2.18.0.beta1

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 (622) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +21 -37
  4. data/lib/mongo/auth/base.rb +8 -1
  5. data/lib/mongo/auth.rb +12 -1
  6. data/lib/mongo/bulk_write/result.rb +10 -1
  7. data/lib/mongo/bulk_write/result_combiner.rb +2 -4
  8. data/lib/mongo/bulk_write.rb +108 -28
  9. data/lib/mongo/client.rb +114 -12
  10. data/lib/mongo/client_encryption.rb +30 -9
  11. data/lib/mongo/cluster/reapers/cursor_reaper.rb +11 -1
  12. data/lib/mongo/cluster.rb +20 -24
  13. data/lib/mongo/collection/helpers.rb +43 -0
  14. data/lib/mongo/collection/queryable_encryption.rb +122 -0
  15. data/lib/mongo/collection/view/aggregation.rb +19 -16
  16. data/lib/mongo/collection/view/change_stream.rb +56 -23
  17. data/lib/mongo/collection/view/explainable.rb +1 -1
  18. data/lib/mongo/collection/view/iterable.rb +2 -3
  19. data/lib/mongo/collection/view/map_reduce.rb +18 -9
  20. data/lib/mongo/collection/view/readable.rb +19 -23
  21. data/lib/mongo/collection/view/writable.rb +133 -40
  22. data/lib/mongo/collection.rb +108 -48
  23. data/lib/mongo/config/options.rb +62 -0
  24. data/lib/mongo/config/validators/option.rb +26 -0
  25. data/lib/mongo/config.rb +31 -0
  26. data/lib/mongo/crypt/auto_encrypter.rb +79 -6
  27. data/lib/mongo/crypt/binding.rb +395 -143
  28. data/lib/mongo/crypt/context.rb +5 -2
  29. data/lib/mongo/crypt/data_key_context.rb +7 -104
  30. data/lib/mongo/crypt/encryption_io.rb +28 -60
  31. data/lib/mongo/crypt/explicit_encrypter.rb +27 -25
  32. data/lib/mongo/crypt/explicit_encryption_context.rb +31 -3
  33. data/lib/mongo/crypt/handle.rb +102 -79
  34. data/lib/mongo/crypt/hooks.rb +25 -2
  35. data/lib/mongo/crypt/kms/aws.rb +128 -0
  36. data/lib/mongo/crypt/kms/azure.rb +136 -0
  37. data/lib/mongo/crypt/kms/credentials.rb +81 -0
  38. data/lib/mongo/crypt/kms/gcp.rb +182 -0
  39. data/lib/mongo/crypt/kms/kmip.rb +110 -0
  40. data/lib/mongo/crypt/kms/local.rb +74 -0
  41. data/lib/mongo/crypt/kms/master_key_document.rb +65 -0
  42. data/lib/mongo/crypt/kms.rb +117 -0
  43. data/lib/mongo/crypt.rb +1 -0
  44. data/lib/mongo/cursor/kill_spec.rb +27 -6
  45. data/lib/mongo/cursor.rb +21 -16
  46. data/lib/mongo/database/view.rb +6 -3
  47. data/lib/mongo/database.rb +73 -12
  48. data/lib/mongo/dbref.rb +1 -105
  49. data/lib/mongo/error/bulk_write_error.rb +31 -4
  50. data/lib/mongo/error/invalid_config_option.rb +20 -0
  51. data/lib/mongo/error/invalid_replacement_document.rb +27 -9
  52. data/lib/mongo/error/invalid_update_document.rb +27 -7
  53. data/lib/mongo/error/labelable.rb +72 -0
  54. data/lib/mongo/error/missing_connection.rb +25 -0
  55. data/lib/mongo/error/notable.rb +7 -0
  56. data/lib/mongo/error/operation_failure.rb +34 -86
  57. data/lib/mongo/error/read_write_retryable.rb +108 -0
  58. data/lib/mongo/{operation/kill_cursors/legacy.rb → error/session_not_materialized.rb} +7 -19
  59. data/lib/mongo/error.rb +5 -37
  60. data/lib/mongo/index/view.rb +22 -7
  61. data/lib/mongo/monitoring/event/command_failed.rb +8 -2
  62. data/lib/mongo/monitoring/event/command_started.rb +1 -1
  63. data/lib/mongo/monitoring/event/command_succeeded.rb +9 -2
  64. data/lib/mongo/monitoring/publishable.rb +9 -5
  65. data/lib/mongo/operation/collections_info/result.rb +5 -2
  66. data/lib/mongo/operation/command/op_msg.rb +6 -0
  67. data/lib/mongo/operation/context.rb +24 -6
  68. data/lib/mongo/operation/count/op_msg.rb +4 -1
  69. data/lib/mongo/operation/create/op_msg.rb +16 -1
  70. data/lib/mongo/operation/create_index/op_msg.rb +2 -1
  71. data/lib/mongo/operation/delete/op_msg.rb +1 -0
  72. data/lib/mongo/operation/delete.rb +0 -1
  73. data/lib/mongo/operation/drop_index/op_msg.rb +5 -1
  74. data/lib/mongo/operation/get_more/command_builder.rb +5 -1
  75. data/lib/mongo/operation/insert/bulk_result.rb +5 -1
  76. data/lib/mongo/operation/insert/command.rb +0 -4
  77. data/lib/mongo/operation/insert/op_msg.rb +6 -3
  78. data/lib/mongo/operation/insert/result.rb +6 -3
  79. data/lib/mongo/operation/insert.rb +0 -1
  80. data/lib/mongo/operation/kill_cursors.rb +0 -1
  81. data/lib/mongo/operation/list_collections/op_msg.rb +4 -1
  82. data/lib/mongo/operation/map_reduce/result.rb +16 -0
  83. data/lib/mongo/operation/result.rb +21 -5
  84. data/lib/mongo/operation/shared/executable.rb +21 -6
  85. data/lib/mongo/operation/shared/polymorphic_operation.rb +15 -3
  86. data/lib/mongo/operation/shared/response_handling.rb +6 -5
  87. data/lib/mongo/operation/shared/sessions_supported.rb +3 -7
  88. data/lib/mongo/operation/shared/write.rb +18 -12
  89. data/lib/mongo/operation/update/op_msg.rb +2 -1
  90. data/lib/mongo/operation/update.rb +0 -1
  91. data/lib/mongo/protocol/caching_hash.rb +69 -0
  92. data/lib/mongo/protocol/msg.rb +37 -1
  93. data/lib/mongo/protocol.rb +1 -0
  94. data/lib/mongo/query_cache.rb +15 -0
  95. data/lib/mongo/retryable.rb +78 -30
  96. data/lib/mongo/server/connection.rb +33 -0
  97. data/lib/mongo/server/connection_base.rb +2 -0
  98. data/lib/mongo/server/connection_common.rb +4 -1
  99. data/lib/mongo/server/connection_pool.rb +69 -42
  100. data/lib/mongo/server/description/features.rb +3 -1
  101. data/lib/mongo/server/description.rb +7 -2
  102. data/lib/mongo/server/monitor/connection.rb +5 -10
  103. data/lib/mongo/server/monitor.rb +21 -13
  104. data/lib/mongo/server/push_monitor.rb +9 -3
  105. data/lib/mongo/server.rb +9 -5
  106. data/lib/mongo/session/session_pool.rb +8 -0
  107. data/lib/mongo/session.rb +111 -35
  108. data/lib/mongo/socket/ocsp_verifier.rb +4 -5
  109. data/lib/mongo/socket/tcp.rb +3 -0
  110. data/lib/mongo/srv/resolver.rb +24 -3
  111. data/lib/mongo/uri/options_mapper.rb +2 -0
  112. data/lib/mongo/uri/srv_protocol.rb +1 -1
  113. data/lib/mongo/uri.rb +20 -0
  114. data/lib/mongo/version.rb +1 -1
  115. data/lib/mongo.rb +20 -0
  116. data/mongo.gemspec +10 -4
  117. data/spec/README.md +5 -5
  118. data/spec/integration/aws_lambda_examples_spec.rb +68 -0
  119. data/spec/integration/bulk_write_error_message_spec.rb +32 -0
  120. data/spec/integration/bulk_write_spec.rb +0 -16
  121. data/spec/integration/change_stream_spec.rb +6 -5
  122. data/spec/integration/client_construction_spec.rb +1 -1
  123. data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +9 -9
  124. data/spec/integration/client_side_encryption/auto_encryption_command_monitoring_spec.rb +18 -19
  125. data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +0 -1
  126. data/spec/integration/client_side_encryption/auto_encryption_reconnect_spec.rb +31 -0
  127. data/spec/integration/client_side_encryption/auto_encryption_spec.rb +108 -1
  128. data/spec/integration/client_side_encryption/bson_size_limit_spec.rb +2 -2
  129. data/spec/integration/client_side_encryption/bypass_mongocryptd_spawn_spec.rb +2 -2
  130. data/spec/integration/client_side_encryption/client_close_spec.rb +1 -1
  131. data/spec/integration/client_side_encryption/corpus_spec.rb +64 -35
  132. data/spec/integration/client_side_encryption/custom_endpoint_spec.rb +39 -42
  133. data/spec/integration/client_side_encryption/data_key_spec.rb +97 -7
  134. data/spec/integration/client_side_encryption/explicit_encryption_spec.rb +59 -0
  135. data/spec/integration/client_side_encryption/explicit_queryable_encryption_spec.rb +147 -0
  136. data/spec/integration/client_side_encryption/external_key_vault_spec.rb +6 -6
  137. data/spec/integration/client_side_encryption/kms_tls_options_spec.rb +394 -0
  138. data/spec/integration/client_side_encryption/kms_tls_spec.rb +92 -0
  139. data/spec/integration/client_side_encryption/queryable_encryption_examples_spec.rb +111 -0
  140. data/spec/integration/client_side_encryption/views_spec.rb +1 -1
  141. data/spec/integration/client_update_spec.rb +2 -2
  142. data/spec/integration/crud_spec.rb +12 -0
  143. data/spec/integration/cursor_pinning_spec.rb +3 -3
  144. data/spec/integration/fork_reconnect_spec.rb +15 -8
  145. data/spec/integration/grid_fs_bucket_spec.rb +3 -3
  146. data/spec/integration/ocsp_verifier_spec.rb +1 -0
  147. data/spec/integration/query_cache_spec.rb +34 -30
  148. data/spec/integration/retryable_writes/retryable_writes_36_and_older_spec.rb +1 -1
  149. data/spec/integration/sdam_events_spec.rb +0 -40
  150. data/spec/integration/server_monitor_spec.rb +2 -1
  151. data/spec/integration/size_limit_spec.rb +4 -1
  152. data/spec/integration/snapshot_query_examples_spec.rb +127 -0
  153. data/spec/integration/srv_monitoring_spec.rb +37 -0
  154. data/spec/integration/step_down_spec.rb +20 -4
  155. data/spec/integration/transaction_pinning_spec.rb +2 -2
  156. data/spec/integration/versioned_api_examples_spec.rb +37 -31
  157. data/spec/lite_spec_helper.rb +14 -5
  158. data/spec/mongo/address/ipv6_spec.rb +7 -0
  159. data/spec/mongo/address_spec.rb +7 -0
  160. data/spec/mongo/auth/scram/conversation_spec.rb +23 -23
  161. data/spec/mongo/auth/scram256/conversation_spec.rb +20 -20
  162. data/spec/mongo/auth/scram_negotiation_spec.rb +1 -0
  163. data/spec/mongo/bulk_write/result_spec.rb +15 -1
  164. data/spec/mongo/bulk_write_spec.rb +128 -20
  165. data/spec/mongo/client_construction_spec.rb +141 -7
  166. data/spec/mongo/client_encryption_spec.rb +11 -11
  167. data/spec/mongo/client_spec.rb +297 -1
  168. data/spec/mongo/cluster/cursor_reaper_spec.rb +21 -3
  169. data/spec/mongo/cluster_spec.rb +0 -44
  170. data/spec/mongo/collection/view/aggregation_spec.rb +2 -2
  171. data/spec/mongo/collection/view/change_stream_spec.rb +2 -2
  172. data/spec/mongo/collection/view/readable_spec.rb +35 -56
  173. data/spec/mongo/collection/view/writable_spec.rb +144 -32
  174. data/spec/mongo/collection_crud_spec.rb +63 -13
  175. data/spec/mongo/config/options_spec.rb +75 -0
  176. data/spec/mongo/config_spec.rb +73 -0
  177. data/spec/mongo/crypt/auto_decryption_context_spec.rb +17 -1
  178. data/spec/mongo/crypt/auto_encrypter_spec.rb +106 -0
  179. data/spec/mongo/crypt/auto_encryption_context_spec.rb +17 -1
  180. data/spec/mongo/crypt/binding/context_spec.rb +99 -17
  181. data/spec/mongo/crypt/binding/mongocrypt_spec.rb +17 -46
  182. data/spec/mongo/crypt/binding/version_spec.rb +25 -0
  183. data/spec/mongo/crypt/binding_unloaded_spec.rb +14 -0
  184. data/spec/mongo/crypt/data_key_context_spec.rb +42 -114
  185. data/spec/mongo/crypt/encryption_io_spec.rb +2 -0
  186. data/spec/mongo/crypt/explicit_decryption_context_spec.rb +32 -1
  187. data/spec/mongo/crypt/explicit_encryption_context_spec.rb +89 -1
  188. data/spec/mongo/crypt/handle_spec.rb +47 -169
  189. data/spec/mongo/crypt/hooks_spec.rb +30 -0
  190. data/spec/mongo/crypt/kms/credentials_spec.rb +404 -0
  191. data/spec/mongo/crypt/kms_spec.rb +59 -0
  192. data/spec/mongo/cursor_spec.rb +37 -51
  193. data/spec/mongo/database_spec.rb +66 -1
  194. data/spec/mongo/error/operation_failure_heavy_spec.rb +49 -0
  195. data/spec/mongo/index/view_spec.rb +69 -0
  196. data/spec/mongo/operation/create/op_msg_spec.rb +286 -0
  197. data/spec/mongo/operation/delete/op_msg_spec.rb +13 -4
  198. data/spec/mongo/operation/delete_spec.rb +0 -30
  199. data/spec/mongo/operation/insert/op_msg_spec.rb +18 -10
  200. data/spec/mongo/operation/insert_spec.rb +0 -32
  201. data/spec/mongo/operation/result_spec.rb +20 -0
  202. data/spec/mongo/operation/update/op_msg_spec.rb +13 -4
  203. data/spec/mongo/operation/update_spec.rb +0 -29
  204. data/spec/mongo/protocol/caching_hash_spec.rb +82 -0
  205. data/spec/mongo/protocol/msg_spec.rb +41 -0
  206. data/spec/mongo/query_cache_spec.rb +1 -0
  207. data/spec/mongo/retryable_spec.rb +32 -3
  208. data/spec/mongo/server/connection_auth_spec.rb +3 -1
  209. data/spec/mongo/server/connection_common_spec.rb +13 -1
  210. data/spec/mongo/server/connection_pool_spec.rb +94 -49
  211. data/spec/mongo/server/connection_spec.rb +50 -159
  212. data/spec/mongo/server/description/features_spec.rb +24 -0
  213. data/spec/mongo/server/push_monitor_spec.rb +2 -8
  214. data/spec/mongo/session_spec.rb +26 -6
  215. data/spec/mongo/session_transaction_spec.rb +2 -1
  216. data/spec/mongo/socket/ssl_spec.rb +15 -4
  217. data/spec/mongo/uri/srv_protocol_spec.rb +101 -2
  218. data/spec/mongo/uri_spec.rb +25 -0
  219. data/spec/runners/connection_string.rb +8 -0
  220. data/spec/runners/crud/operation.rb +12 -3
  221. data/spec/runners/crud/requirement.rb +3 -3
  222. data/spec/runners/crud/spec.rb +5 -0
  223. data/spec/runners/crud/verifier.rb +6 -0
  224. data/spec/runners/transactions/test.rb +33 -14
  225. data/spec/runners/transactions.rb +9 -6
  226. data/spec/runners/unified/assertions.rb +59 -10
  227. data/spec/runners/unified/change_stream_operations.rb +9 -0
  228. data/spec/runners/unified/crud_operations.rb +50 -2
  229. data/spec/runners/unified/ddl_operations.rb +20 -0
  230. data/spec/runners/unified/error.rb +2 -1
  231. data/spec/runners/unified/support_operations.rb +5 -2
  232. data/spec/runners/unified/test.rb +19 -4
  233. data/spec/runners/unified.rb +9 -2
  234. data/spec/shared/lib/mrss/constraints.rb +10 -17
  235. data/spec/shared/lib/mrss/docker_runner.rb +21 -3
  236. data/spec/shared/lib/mrss/lite_constraints.rb +32 -1
  237. data/spec/shared/lib/mrss/session_registry.rb +69 -0
  238. data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
  239. data/spec/shared/share/Dockerfile.erb +56 -54
  240. data/spec/shared/shlib/config.sh +27 -0
  241. data/spec/shared/shlib/distro.sh +2 -1
  242. data/spec/shared/shlib/server.sh +46 -21
  243. data/spec/shared/shlib/set_env.sh +40 -5
  244. data/spec/spec_helper.rb +0 -1
  245. data/spec/spec_tests/crud_spec.rb +0 -10
  246. data/spec/spec_tests/data/change_streams_unified/change-streams-errors.yml +124 -0
  247. data/spec/spec_tests/data/change_streams_unified/change-streams-pre_and_post_images.yml +351 -0
  248. data/spec/spec_tests/data/change_streams_unified/change-streams-resume-allowlist.yml +1171 -0
  249. data/spec/spec_tests/data/change_streams_unified/change-streams-resume-errorLabels.yml +1068 -0
  250. data/spec/spec_tests/data/change_streams_unified/change-streams.yml +859 -4
  251. data/spec/spec_tests/data/client_side_encryption/aggregate.yml +3 -17
  252. data/spec/spec_tests/data/client_side_encryption/azureKMS.yml +46 -0
  253. data/spec/spec_tests/data/client_side_encryption/badQueries.yml +12 -2
  254. data/spec/spec_tests/data/client_side_encryption/basic.yml +3 -17
  255. data/spec/spec_tests/data/client_side_encryption/bulk.yml +1 -8
  256. data/spec/spec_tests/data/client_side_encryption/bypassAutoEncryption.yml +2 -2
  257. data/spec/spec_tests/data/client_side_encryption/count.yml +1 -8
  258. data/spec/spec_tests/data/client_side_encryption/countDocuments.yml +1 -8
  259. data/spec/spec_tests/data/client_side_encryption/delete.yml +2 -16
  260. data/spec/spec_tests/data/client_side_encryption/distinct.yml +1 -8
  261. data/spec/spec_tests/data/client_side_encryption/explain.yml +1 -8
  262. data/spec/spec_tests/data/client_side_encryption/find.yml +2 -16
  263. data/spec/spec_tests/data/client_side_encryption/findOneAndDelete.yml +1 -8
  264. data/spec/spec_tests/data/client_side_encryption/findOneAndReplace.yml +1 -8
  265. data/spec/spec_tests/data/client_side_encryption/findOneAndUpdate.yml +1 -8
  266. data/spec/spec_tests/data/client_side_encryption/fle2-BypassQueryAnalysis.yml +101 -0
  267. data/spec/spec_tests/data/client_side_encryption/fle2-Compact.yml +80 -0
  268. data/spec/spec_tests/data/client_side_encryption/fle2-CreateCollection.yml +1263 -0
  269. data/spec/spec_tests/data/client_side_encryption/fle2-DecryptExistingData.yml +64 -0
  270. data/spec/spec_tests/data/client_side_encryption/fle2-Delete.yml +107 -0
  271. data/spec/spec_tests/data/client_side_encryption/fle2-EncryptedFields-vs-EncryptedFieldsMap.yml +80 -0
  272. data/spec/spec_tests/data/client_side_encryption/fle2-EncryptedFields-vs-jsonSchema.yml +90 -0
  273. data/spec/spec_tests/data/client_side_encryption/fle2-EncryptedFieldsMap-defaults.yml +57 -0
  274. data/spec/spec_tests/data/client_side_encryption/fle2-FindOneAndUpdate.yml +213 -0
  275. data/spec/spec_tests/data/client_side_encryption/fle2-InsertFind-Indexed.yml +86 -0
  276. data/spec/spec_tests/data/client_side_encryption/fle2-InsertFind-Unindexed.yml +83 -0
  277. data/spec/spec_tests/data/client_side_encryption/fle2-MissingKey.yml +41 -0
  278. data/spec/spec_tests/data/client_side_encryption/fle2-NoEncryption.yml +42 -0
  279. data/spec/spec_tests/data/client_side_encryption/fle2-Update.yml +221 -0
  280. data/spec/spec_tests/data/client_side_encryption/fle2-validatorAndPartialFieldExpression.yml +168 -0
  281. data/spec/spec_tests/data/client_side_encryption/gcpKMS.yml +46 -0
  282. data/spec/spec_tests/data/client_side_encryption/getMore.yml +1 -8
  283. data/spec/spec_tests/data/client_side_encryption/insert.yml +2 -16
  284. data/spec/spec_tests/data/client_side_encryption/keyAltName.yml +1 -8
  285. data/spec/spec_tests/data/client_side_encryption/localKMS.yml +1 -8
  286. data/spec/spec_tests/data/client_side_encryption/localSchema.yml +1 -8
  287. data/spec/spec_tests/data/client_side_encryption/maxWireVersion.yml +2 -0
  288. data/spec/spec_tests/data/client_side_encryption/missingKey.yml +2 -9
  289. data/spec/spec_tests/data/client_side_encryption/noSchema.yml +39 -0
  290. data/spec/spec_tests/data/client_side_encryption/replaceOne.yml +1 -8
  291. data/spec/spec_tests/data/client_side_encryption/types.yml +44 -70
  292. data/spec/spec_tests/data/client_side_encryption/updateMany.yml +1 -8
  293. data/spec/spec_tests/data/client_side_encryption/updateOne.yml +1 -8
  294. data/spec/spec_tests/data/collection_management/clustered-indexes.yml +135 -0
  295. data/spec/spec_tests/data/collection_management/createCollection-pre_and_post_images.yml +50 -0
  296. data/spec/spec_tests/data/collection_management/modifyCollection-pre_and_post_images.yml +58 -0
  297. data/spec/spec_tests/data/command_monitoring_unified/pre-42-server-connection-id.yml +56 -0
  298. data/spec/spec_tests/data/command_monitoring_unified/server-connection-id.yml +56 -0
  299. data/spec/spec_tests/data/crud/read/aggregate-collation.yml +1 -1
  300. data/spec/spec_tests/data/crud/read/count-collation.yml +1 -1
  301. data/spec/spec_tests/data/crud/read/distinct-collation.yml +1 -1
  302. data/spec/spec_tests/data/crud/read/find-collation.yml +1 -1
  303. data/spec/spec_tests/data/crud/write/bulkWrite-collation.yml +1 -1
  304. data/spec/spec_tests/data/crud/write/deleteMany-collation.yml +1 -1
  305. data/spec/spec_tests/data/crud/write/deleteOne-collation.yml +1 -1
  306. data/spec/spec_tests/data/crud/write/findOneAndDelete-collation.yml +1 -1
  307. data/spec/spec_tests/data/crud/write/findOneAndReplace-collation.yml +1 -1
  308. data/spec/spec_tests/data/crud/write/findOneAndUpdate-collation.yml +1 -1
  309. data/spec/spec_tests/data/crud/write/replaceOne-collation.yml +1 -1
  310. data/spec/spec_tests/data/crud/write/updateMany-collation.yml +1 -1
  311. data/spec/spec_tests/data/crud/write/updateOne-collation.yml +1 -1
  312. data/spec/spec_tests/data/crud_unified/aggregate-allowdiskuse.yml +75 -0
  313. data/spec/spec_tests/data/crud_unified/aggregate-merge.yml +185 -0
  314. data/spec/spec_tests/data/crud_unified/aggregate-out-readConcern.yml +171 -0
  315. data/spec/spec_tests/data/crud_unified/aggregate.yml +215 -0
  316. data/spec/spec_tests/data/crud_unified/bulkWrite-arrayFilters-clientError.yml +98 -0
  317. data/spec/spec_tests/data/crud_unified/bulkWrite-arrayFilters.yml +174 -0
  318. data/spec/spec_tests/data/crud_unified/bulkWrite-comment.yml +189 -0
  319. data/spec/spec_tests/data/crud_unified/bulkWrite-delete-hint-clientError.yml +113 -0
  320. data/spec/spec_tests/data/crud_unified/bulkWrite-delete-hint-serverError.yml +142 -0
  321. data/spec/spec_tests/data/crud_unified/bulkWrite-delete-hint.yml +154 -0
  322. data/spec/spec_tests/data/crud_unified/bulkWrite-deleteMany-hint-unacknowledged.yml +98 -0
  323. data/spec/spec_tests/data/crud_unified/bulkWrite-deleteMany-let.yml +86 -0
  324. data/spec/spec_tests/data/crud_unified/bulkWrite-deleteOne-hint-unacknowledged.yml +97 -0
  325. data/spec/spec_tests/data/crud_unified/bulkWrite-deleteOne-let.yml +86 -0
  326. data/spec/spec_tests/data/crud_unified/bulkWrite-insertOne-dots_and_dollars.yml +138 -0
  327. data/spec/spec_tests/data/crud_unified/bulkWrite-replaceOne-dots_and_dollars.yml +165 -0
  328. data/spec/spec_tests/data/crud_unified/bulkWrite-replaceOne-hint-unacknowledged.yml +103 -0
  329. data/spec/spec_tests/data/crud_unified/bulkWrite-replaceOne-let.yml +93 -0
  330. data/spec/spec_tests/data/crud_unified/bulkWrite-update-hint-clientError.yml +148 -0
  331. data/spec/spec_tests/data/crud_unified/bulkWrite-update-hint-serverError.yml +239 -0
  332. data/spec/spec_tests/data/crud_unified/bulkWrite-update-hint.yml +256 -0
  333. data/spec/spec_tests/data/crud_unified/bulkWrite-update-validation.yml +73 -0
  334. data/spec/spec_tests/data/crud_unified/bulkWrite-updateMany-dots_and_dollars.yml +150 -0
  335. data/spec/spec_tests/data/crud_unified/bulkWrite-updateMany-hint-unacknowledged.yml +104 -0
  336. data/spec/spec_tests/data/crud_unified/bulkWrite-updateMany-let.yml +96 -0
  337. data/spec/spec_tests/data/crud_unified/bulkWrite-updateOne-dots_and_dollars.yml +150 -0
  338. data/spec/spec_tests/data/crud_unified/bulkWrite-updateOne-hint-unacknowledged.yml +103 -0
  339. data/spec/spec_tests/data/crud_unified/bulkWrite-updateOne-let.yml +95 -0
  340. data/spec/spec_tests/data/crud_unified/countDocuments-comment.yml +92 -0
  341. data/spec/spec_tests/data/crud_unified/db-aggregate.yml +73 -0
  342. data/spec/spec_tests/data/crud_unified/deleteMany-comment.yml +97 -0
  343. data/spec/spec_tests/data/crud_unified/deleteMany-hint-clientError.yml +87 -0
  344. data/spec/spec_tests/data/crud_unified/deleteMany-hint-serverError.yml +107 -0
  345. data/spec/spec_tests/data/crud_unified/deleteMany-hint-unacknowledged.yml +90 -0
  346. data/spec/spec_tests/data/crud_unified/deleteMany-hint.yml +99 -0
  347. data/spec/spec_tests/data/crud_unified/deleteMany-let.yml +2 -0
  348. data/spec/spec_tests/data/crud_unified/deleteOne-comment.yml +98 -0
  349. data/spec/spec_tests/data/crud_unified/deleteOne-hint-clientError.yml +80 -0
  350. data/spec/spec_tests/data/crud_unified/deleteOne-hint-serverError.yml +100 -0
  351. data/spec/spec_tests/data/crud_unified/deleteOne-hint-unacknowledged.yml +89 -0
  352. data/spec/spec_tests/data/crud_unified/deleteOne-hint.yml +95 -0
  353. data/spec/spec_tests/data/crud_unified/deleteOne-let.yml +2 -0
  354. data/spec/spec_tests/data/crud_unified/estimatedDocumentCount-comment.yml +95 -0
  355. data/spec/spec_tests/data/crud_unified/estimatedDocumentCount.yml +5 -135
  356. data/spec/spec_tests/data/crud_unified/find-allowdiskuse-clientError.yml +55 -0
  357. data/spec/spec_tests/data/crud_unified/find-allowdiskuse-serverError.yml +68 -0
  358. data/spec/spec_tests/data/crud_unified/find-allowdiskuse.yml +79 -0
  359. data/spec/spec_tests/data/crud_unified/find-comment.yml +166 -0
  360. data/spec/spec_tests/data/crud_unified/find.yml +68 -0
  361. data/spec/spec_tests/data/crud_unified/findOneAndDelete-comment.yml +96 -0
  362. data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint-clientError.yml +91 -0
  363. data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint-serverError.yml +107 -0
  364. data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint-unacknowledged.yml +88 -0
  365. data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint.yml +102 -0
  366. data/spec/spec_tests/data/crud_unified/findOneAndDelete-let.yml +2 -4
  367. data/spec/spec_tests/data/crud_unified/findOneAndReplace-comment.yml +101 -0
  368. data/spec/spec_tests/data/crud_unified/findOneAndReplace-dots_and_dollars.yml +140 -0
  369. data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint-clientError.yml +83 -0
  370. data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint-serverError.yml +99 -0
  371. data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint-unacknowledged.yml +96 -0
  372. data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint.yml +98 -0
  373. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-comment.yml +95 -0
  374. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-dots_and_dollars.yml +127 -0
  375. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint-clientError.yml +84 -0
  376. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint-serverError.yml +100 -0
  377. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint-unacknowledged.yml +92 -0
  378. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint.yml +99 -0
  379. data/spec/spec_tests/data/crud_unified/insertMany-comment.yml +93 -0
  380. data/spec/spec_tests/data/crud_unified/insertMany-dots_and_dollars.yml +128 -0
  381. data/spec/spec_tests/data/crud_unified/insertOne-comment.yml +91 -0
  382. data/spec/spec_tests/data/crud_unified/insertOne-dots_and_dollars.yml +238 -0
  383. data/spec/spec_tests/data/crud_unified/replaceOne-comment.yml +105 -0
  384. data/spec/spec_tests/data/crud_unified/replaceOne-dots_and_dollars.yml +180 -0
  385. data/spec/spec_tests/data/crud_unified/replaceOne-hint-unacknowledged.yml +95 -0
  386. data/spec/spec_tests/data/crud_unified/replaceOne-hint.yml +108 -0
  387. data/spec/spec_tests/data/crud_unified/replaceOne-let.yml +98 -0
  388. data/spec/spec_tests/data/crud_unified/replaceOne-validation.yml +37 -0
  389. data/spec/spec_tests/data/crud_unified/updateMany-comment.yml +104 -0
  390. data/spec/spec_tests/data/crud_unified/updateMany-dots_and_dollars.yml +138 -0
  391. data/spec/spec_tests/data/crud_unified/updateMany-hint-clientError.yml +91 -0
  392. data/spec/spec_tests/data/crud_unified/updateMany-hint-serverError.yml +115 -0
  393. data/spec/spec_tests/data/crud_unified/updateMany-hint-unacknowledged.yml +96 -0
  394. data/spec/spec_tests/data/crud_unified/updateMany-hint.yml +115 -0
  395. data/spec/spec_tests/data/crud_unified/updateMany-let.yml +5 -1
  396. data/spec/spec_tests/data/crud_unified/updateMany-validation.yml +39 -0
  397. data/spec/spec_tests/data/crud_unified/updateOne-comment.yml +104 -0
  398. data/spec/spec_tests/data/crud_unified/updateOne-dots_and_dollars.yml +138 -0
  399. data/spec/spec_tests/data/crud_unified/updateOne-hint-clientError.yml +85 -0
  400. data/spec/spec_tests/data/crud_unified/updateOne-hint-serverError.yml +109 -0
  401. data/spec/spec_tests/data/crud_unified/updateOne-hint-unacknowledged.yml +95 -0
  402. data/spec/spec_tests/data/crud_unified/updateOne-hint.yml +109 -0
  403. data/spec/spec_tests/data/crud_unified/updateOne-let.yml +5 -1
  404. data/spec/spec_tests/data/crud_unified/updateOne-validation.yml +37 -0
  405. data/spec/spec_tests/data/crud_unified/updateWithPipelines.yml +8 -14
  406. data/spec/spec_tests/data/retryable_reads/{aggregate-merge.yml → legacy/aggregate-merge.yml} +0 -0
  407. data/spec/spec_tests/data/retryable_reads/{aggregate-serverErrors.yml → legacy/aggregate-serverErrors.yml} +0 -0
  408. data/spec/spec_tests/data/retryable_reads/{aggregate.yml → legacy/aggregate.yml} +0 -0
  409. data/spec/spec_tests/data/retryable_reads/{changeStreams-client.watch-serverErrors.yml → legacy/changeStreams-client.watch-serverErrors.yml} +0 -0
  410. data/spec/spec_tests/data/retryable_reads/{changeStreams-client.watch.yml → legacy/changeStreams-client.watch.yml} +0 -0
  411. data/spec/spec_tests/data/retryable_reads/{changeStreams-db.coll.watch-serverErrors.yml → legacy/changeStreams-db.coll.watch-serverErrors.yml} +0 -0
  412. data/spec/spec_tests/data/retryable_reads/{changeStreams-db.coll.watch.yml → legacy/changeStreams-db.coll.watch.yml} +0 -0
  413. data/spec/spec_tests/data/retryable_reads/{changeStreams-db.watch-serverErrors.yml → legacy/changeStreams-db.watch-serverErrors.yml} +0 -0
  414. data/spec/spec_tests/data/retryable_reads/{changeStreams-db.watch.yml → legacy/changeStreams-db.watch.yml} +0 -0
  415. data/spec/spec_tests/data/retryable_reads/{count-serverErrors.yml → legacy/count-serverErrors.yml} +0 -0
  416. data/spec/spec_tests/data/retryable_reads/{count.yml → legacy/count.yml} +0 -0
  417. data/spec/spec_tests/data/retryable_reads/{countDocuments-serverErrors.yml → legacy/countDocuments-serverErrors.yml} +0 -0
  418. data/spec/spec_tests/data/retryable_reads/{countDocuments.yml → legacy/countDocuments.yml} +0 -0
  419. data/spec/spec_tests/data/retryable_reads/{distinct-serverErrors.yml → legacy/distinct-serverErrors.yml} +0 -0
  420. data/spec/spec_tests/data/retryable_reads/{distinct.yml → legacy/distinct.yml} +0 -0
  421. data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount-serverErrors-pre4.9.yml → legacy/estimatedDocumentCount-serverErrors.yml} +0 -2
  422. data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount-pre4.9.yml → legacy/estimatedDocumentCount.yml} +0 -2
  423. data/spec/spec_tests/data/retryable_reads/{find-serverErrors.yml → legacy/find-serverErrors.yml} +0 -0
  424. data/spec/spec_tests/data/retryable_reads/{find.yml → legacy/find.yml} +0 -0
  425. data/spec/spec_tests/data/retryable_reads/{findOne-serverErrors.yml → legacy/findOne-serverErrors.yml} +0 -0
  426. data/spec/spec_tests/data/retryable_reads/{findOne.yml → legacy/findOne.yml} +0 -0
  427. data/spec/spec_tests/data/retryable_reads/{gridfs-download-serverErrors.yml → legacy/gridfs-download-serverErrors.yml} +0 -0
  428. data/spec/spec_tests/data/retryable_reads/{gridfs-download.yml → legacy/gridfs-download.yml} +0 -0
  429. data/spec/spec_tests/data/retryable_reads/{gridfs-downloadByName-serverErrors.yml → legacy/gridfs-downloadByName-serverErrors.yml} +0 -0
  430. data/spec/spec_tests/data/retryable_reads/{gridfs-downloadByName.yml → legacy/gridfs-downloadByName.yml} +0 -0
  431. data/spec/spec_tests/data/retryable_reads/{listCollectionNames-serverErrors.yml → legacy/listCollectionNames-serverErrors.yml} +0 -0
  432. data/spec/spec_tests/data/retryable_reads/{listCollectionNames.yml → legacy/listCollectionNames.yml} +0 -0
  433. data/spec/spec_tests/data/retryable_reads/{listCollectionObjects-serverErrors.yml → legacy/listCollectionObjects-serverErrors.yml} +0 -0
  434. data/spec/spec_tests/data/retryable_reads/{listCollectionObjects.yml → legacy/listCollectionObjects.yml} +0 -0
  435. data/spec/spec_tests/data/retryable_reads/{listCollections-serverErrors.yml → legacy/listCollections-serverErrors.yml} +0 -0
  436. data/spec/spec_tests/data/retryable_reads/{listCollections.yml → legacy/listCollections.yml} +0 -0
  437. data/spec/spec_tests/data/retryable_reads/{listDatabaseNames-serverErrors.yml → legacy/listDatabaseNames-serverErrors.yml} +0 -0
  438. data/spec/spec_tests/data/retryable_reads/{listDatabaseNames.yml → legacy/listDatabaseNames.yml} +0 -0
  439. data/spec/spec_tests/data/retryable_reads/{listDatabaseObjects-serverErrors.yml → legacy/listDatabaseObjects-serverErrors.yml} +0 -0
  440. data/spec/spec_tests/data/retryable_reads/{listDatabaseObjects.yml → legacy/listDatabaseObjects.yml} +0 -0
  441. data/spec/spec_tests/data/retryable_reads/{listDatabases-serverErrors.yml → legacy/listDatabases-serverErrors.yml} +0 -0
  442. data/spec/spec_tests/data/retryable_reads/{listDatabases.yml → legacy/listDatabases.yml} +0 -0
  443. data/spec/spec_tests/data/retryable_reads/{listIndexNames-serverErrors.yml → legacy/listIndexNames-serverErrors.yml} +0 -0
  444. data/spec/spec_tests/data/retryable_reads/{listIndexNames.yml → legacy/listIndexNames.yml} +0 -0
  445. data/spec/spec_tests/data/retryable_reads/{listIndexes-serverErrors.yml → legacy/listIndexes-serverErrors.yml} +0 -0
  446. data/spec/spec_tests/data/retryable_reads/{listIndexes.yml → legacy/listIndexes.yml} +0 -0
  447. data/spec/spec_tests/data/retryable_reads/{mapReduce.yml → legacy/mapReduce.yml} +0 -0
  448. data/spec/spec_tests/data/retryable_reads/unified/handshakeError.yml +129 -0
  449. data/spec/spec_tests/data/retryable_writes/{bulkWrite-errorLabels.yml → legacy/bulkWrite-errorLabels.yml} +0 -0
  450. data/spec/spec_tests/data/retryable_writes/{bulkWrite-serverErrors.yml → legacy/bulkWrite-serverErrors.yml} +1 -1
  451. data/spec/spec_tests/data/retryable_writes/{bulkWrite.yml → legacy/bulkWrite.yml} +0 -0
  452. data/spec/spec_tests/data/retryable_writes/{deleteMany.yml → legacy/deleteMany.yml} +0 -0
  453. data/spec/spec_tests/data/retryable_writes/{deleteOne-errorLabels.yml → legacy/deleteOne-errorLabels.yml} +0 -0
  454. data/spec/spec_tests/data/retryable_writes/{deleteOne-serverErrors.yml → legacy/deleteOne-serverErrors.yml} +1 -1
  455. data/spec/spec_tests/data/retryable_writes/{deleteOne.yml → legacy/deleteOne.yml} +0 -0
  456. data/spec/spec_tests/data/retryable_writes/{findOneAndDelete-errorLabels.yml → legacy/findOneAndDelete-errorLabels.yml} +0 -0
  457. data/spec/spec_tests/data/retryable_writes/{findOneAndDelete-serverErrors.yml → legacy/findOneAndDelete-serverErrors.yml} +1 -1
  458. data/spec/spec_tests/data/retryable_writes/{findOneAndDelete.yml → legacy/findOneAndDelete.yml} +0 -0
  459. data/spec/spec_tests/data/retryable_writes/{findOneAndReplace-errorLabels.yml → legacy/findOneAndReplace-errorLabels.yml} +0 -0
  460. data/spec/spec_tests/data/retryable_writes/{findOneAndReplace-serverErrors.yml → legacy/findOneAndReplace-serverErrors.yml} +1 -1
  461. data/spec/spec_tests/data/retryable_writes/{findOneAndReplace.yml → legacy/findOneAndReplace.yml} +0 -0
  462. data/spec/spec_tests/data/retryable_writes/{findOneAndUpdate-errorLabels.yml → legacy/findOneAndUpdate-errorLabels.yml} +0 -0
  463. data/spec/spec_tests/data/retryable_writes/{findOneAndUpdate-serverErrors.yml → legacy/findOneAndUpdate-serverErrors.yml} +1 -1
  464. data/spec/spec_tests/data/retryable_writes/{findOneAndUpdate.yml → legacy/findOneAndUpdate.yml} +0 -0
  465. data/spec/spec_tests/data/retryable_writes/{insertMany-errorLabels.yml → legacy/insertMany-errorLabels.yml} +0 -0
  466. data/spec/spec_tests/data/retryable_writes/{insertMany-serverErrors.yml → legacy/insertMany-serverErrors.yml} +1 -1
  467. data/spec/spec_tests/data/retryable_writes/{insertMany.yml → legacy/insertMany.yml} +0 -0
  468. data/spec/spec_tests/data/retryable_writes/{insertOne-errorLabels.yml → legacy/insertOne-errorLabels.yml} +0 -0
  469. data/spec/spec_tests/data/retryable_writes/{insertOne-serverErrors.yml → legacy/insertOne-serverErrors.yml} +5 -5
  470. data/spec/spec_tests/data/retryable_writes/{insertOne.yml → legacy/insertOne.yml} +0 -0
  471. data/spec/spec_tests/data/retryable_writes/{replaceOne-errorLabels.yml → legacy/replaceOne-errorLabels.yml} +0 -0
  472. data/spec/spec_tests/data/retryable_writes/{replaceOne-serverErrors.yml → legacy/replaceOne-serverErrors.yml} +1 -1
  473. data/spec/spec_tests/data/retryable_writes/{replaceOne.yml → legacy/replaceOne.yml} +0 -0
  474. data/spec/spec_tests/data/retryable_writes/{updateMany.yml → legacy/updateMany.yml} +0 -0
  475. data/spec/spec_tests/data/retryable_writes/{updateOne-errorLabels.yml → legacy/updateOne-errorLabels.yml} +0 -0
  476. data/spec/spec_tests/data/retryable_writes/{updateOne-serverErrors.yml → legacy/updateOne-serverErrors.yml} +1 -1
  477. data/spec/spec_tests/data/retryable_writes/{updateOne.yml → legacy/updateOne.yml} +0 -0
  478. data/spec/spec_tests/data/retryable_writes/unified/bulkWrite-serverErrors.yml +96 -0
  479. data/spec/spec_tests/data/retryable_writes/unified/handshakeError.yml +137 -0
  480. data/spec/spec_tests/data/retryable_writes/unified/insertOne-serverErrors.yml +78 -0
  481. data/spec/spec_tests/data/sdam/errors/prefer-error-code.yml +2 -2
  482. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-no-results.yml +5 -0
  483. data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-conflicts_with_loadBalanced-true-txt.yml +5 -0
  484. data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-conflicts_with_loadBalanced-true.yml +5 -0
  485. data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-zero-txt.yml +10 -0
  486. data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-zero.yml +10 -0
  487. data/spec/spec_tests/data/seed_list_discovery/replica-set/srv-service-name.yml +11 -0
  488. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-conflicts_with_replicaSet-txt.yml +5 -0
  489. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-conflicts_with_replicaSet.yml +5 -0
  490. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-equal_to_srv_records.yml +16 -0
  491. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-greater_than_srv_records.yml +15 -0
  492. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-less_than_srv_records.yml +15 -0
  493. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-zero-txt.yml +15 -0
  494. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-zero.yml +15 -0
  495. data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-equal_to_srv_records.yml +13 -0
  496. data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-greater_than_srv_records.yml +12 -0
  497. data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-less_than_srv_records.yml +10 -0
  498. data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-zero.yml +11 -0
  499. data/spec/spec_tests/data/server_selection/Unknown/read/ghost.yml +11 -0
  500. data/spec/spec_tests/data/server_selection/Unknown/write/ghost.yml +11 -0
  501. data/spec/spec_tests/data/sessions_unified/driver-sessions-server-support.yml +123 -0
  502. data/spec/spec_tests/data/sessions_unified/snapshot-sessions-not-supported-client-error.yml +9 -3
  503. data/spec/spec_tests/data/transactions/error-labels.yml +1 -1
  504. data/spec/spec_tests/data/transactions/errors-client.yml +8 -9
  505. data/spec/spec_tests/data/transactions/mongos-recovery-token.yml +1 -1
  506. data/spec/spec_tests/data/transactions/retryable-abort-errorLabels.yml +0 -2
  507. data/spec/spec_tests/data/transactions/retryable-abort.yml +7 -9
  508. data/spec/spec_tests/data/transactions/retryable-commit-errorLabels.yml +0 -2
  509. data/spec/spec_tests/data/transactions/retryable-commit.yml +7 -9
  510. data/spec/spec_tests/data/transactions/retryable-writes.yml +0 -2
  511. data/spec/spec_tests/data/unified/invalid/expectedEventsForClient-ignoreExtraEvents-type.yml +15 -0
  512. data/spec/spec_tests/data/unified/valid-fail/operation-unsupported.yml +13 -0
  513. data/spec/spec_tests/data/unified/valid-pass/expectedEventsForClient-ignoreExtraEvents.yml +78 -0
  514. data/spec/spec_tests/data/unified/valid-pass/poc-change-streams.yml +4 -1
  515. data/spec/spec_tests/data/unified/valid-pass/poc-command-monitoring.yml +3 -3
  516. data/spec/spec_tests/data/unified/valid-pass/poc-transactions.yml +3 -2
  517. data/spec/spec_tests/data/uri_options/srv-options.yml +96 -0
  518. data/spec/spec_tests/data/versioned_api/crud-api-version-1-strict.yml +6 -4
  519. data/spec/spec_tests/data/versioned_api/crud-api-version-1.yml +7 -5
  520. data/spec/spec_tests/retryable_reads_spec.rb +4 -1
  521. data/spec/spec_tests/retryable_reads_unified_spec.rb +22 -0
  522. data/spec/spec_tests/retryable_writes_spec.rb +4 -1
  523. data/spec/spec_tests/retryable_writes_unified_spec.rb +21 -0
  524. data/spec/spec_tests/seed_list_discovery_spec.rb +10 -1
  525. data/spec/spec_tests/unified_spec.rb +6 -1
  526. data/spec/stress/connection_pool_timing_spec.rb +2 -1
  527. data/spec/stress/fork_reconnect_stress_spec.rb +3 -2
  528. data/spec/support/authorization.rb +1 -1
  529. data/spec/support/certificates/atlas-ocsp-ca.crt +47 -40
  530. data/spec/support/certificates/atlas-ocsp.crt +106 -101
  531. data/spec/support/cluster_tools.rb +1 -1
  532. data/spec/support/common_shortcuts.rb +22 -0
  533. data/spec/support/crypt/corpus/corpus-encrypted.json +9515 -0
  534. data/spec/support/crypt/corpus/corpus-key-aws.json +32 -32
  535. data/spec/support/crypt/corpus/corpus-key-azure.json +33 -0
  536. data/spec/support/crypt/corpus/corpus-key-gcp.json +35 -0
  537. data/spec/support/crypt/corpus/corpus-key-kmip.json +32 -0
  538. data/spec/support/crypt/corpus/corpus-key-local.json +30 -30
  539. data/spec/support/crypt/corpus/corpus-schema.json +4399 -121
  540. data/spec/support/crypt/corpus/corpus.json +4999 -37
  541. data/spec/support/crypt/data_keys/key_document_azure.json +33 -0
  542. data/spec/support/crypt/data_keys/key_document_gcp.json +37 -0
  543. data/spec/support/crypt/data_keys/key_document_kmip.json +32 -0
  544. data/spec/support/crypt/encryptedFields.json +33 -0
  545. data/spec/support/crypt/keys/key1-document.json +30 -0
  546. data/spec/support/crypt/schema_maps/schema_map_azure.json +17 -0
  547. data/spec/support/crypt/schema_maps/schema_map_azure_key_alt_names.json +12 -0
  548. data/spec/support/crypt/schema_maps/schema_map_gcp.json +17 -0
  549. data/spec/support/crypt/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
  550. data/spec/support/crypt/schema_maps/schema_map_kmip.json +17 -0
  551. data/spec/support/crypt/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
  552. data/spec/support/crypt.rb +207 -6
  553. data/spec/support/macros.rb +18 -0
  554. data/spec/support/mongos_macros.rb +17 -0
  555. data/spec/support/shared/scram_conversation.rb +2 -1
  556. data/spec/support/shared/session.rb +13 -7
  557. data/spec/support/spec_config.rb +82 -1
  558. data/spec/support/utils.rb +25 -4
  559. data.tar.gz.sig +0 -0
  560. metadata +1468 -1214
  561. metadata.gz.sig +0 -0
  562. data/lib/mongo/operation/delete/legacy.rb +0 -64
  563. data/lib/mongo/operation/insert/legacy.rb +0 -68
  564. data/lib/mongo/operation/update/legacy/result.rb +0 -112
  565. data/lib/mongo/operation/update/legacy.rb +0 -76
  566. data/spec/mongo/dbref_spec.rb +0 -152
  567. data/spec/mongo/operation/kill_cursors_spec.rb +0 -47
  568. data/spec/spec_tests/change_streams_spec.rb +0 -93
  569. data/spec/spec_tests/data/change_streams/change-streams-errors.yml +0 -101
  570. data/spec/spec_tests/data/change_streams/change-streams-resume-allowlist.yml +0 -1173
  571. data/spec/spec_tests/data/change_streams/change-streams-resume-errorLabels.yml +0 -1105
  572. data/spec/spec_tests/data/change_streams/change-streams.yml +0 -535
  573. data/spec/spec_tests/data/crud_v2/aggregate-merge.yml +0 -103
  574. data/spec/spec_tests/data/crud_v2/aggregate-out-readConcern.yml +0 -111
  575. data/spec/spec_tests/data/crud_v2/bulkWrite-arrayFilters.yml +0 -103
  576. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint-clientError.yml +0 -63
  577. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint-serverError.yml +0 -92
  578. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint.yml +0 -103
  579. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint-clientError.yml +0 -90
  580. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint-serverError.yml +0 -147
  581. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint.yml +0 -164
  582. data/spec/spec_tests/data/crud_v2/db-aggregate.yml +0 -39
  583. data/spec/spec_tests/data/crud_v2/deleteMany-hint-clientError.yml +0 -43
  584. data/spec/spec_tests/data/crud_v2/deleteMany-hint-serverError.yml +0 -62
  585. data/spec/spec_tests/data/crud_v2/deleteMany-hint.yml +0 -58
  586. data/spec/spec_tests/data/crud_v2/deleteOne-hint-clientError.yml +0 -41
  587. data/spec/spec_tests/data/crud_v2/deleteOne-hint-serverError.yml +0 -60
  588. data/spec/spec_tests/data/crud_v2/deleteOne-hint.yml +0 -57
  589. data/spec/spec_tests/data/crud_v2/find-allowdiskuse-clientError.yml +0 -28
  590. data/spec/spec_tests/data/crud_v2/find-allowdiskuse-serverError.yml +0 -44
  591. data/spec/spec_tests/data/crud_v2/find-allowdiskuse.yml +0 -50
  592. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint-clientError.yml +0 -45
  593. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint-serverError.yml +0 -60
  594. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint.yml +0 -56
  595. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint-clientError.yml +0 -40
  596. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint-serverError.yml +0 -59
  597. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint.yml +0 -55
  598. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint-clientError.yml +0 -40
  599. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint-serverError.yml +0 -58
  600. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint.yml +0 -55
  601. data/spec/spec_tests/data/crud_v2/replaceOne-hint.yml +0 -61
  602. data/spec/spec_tests/data/crud_v2/unacknowledged-bulkWrite-delete-hint-clientError.yml +0 -60
  603. data/spec/spec_tests/data/crud_v2/unacknowledged-bulkWrite-update-hint-clientError.yml +0 -88
  604. data/spec/spec_tests/data/crud_v2/unacknowledged-deleteMany-hint-clientError.yml +0 -40
  605. data/spec/spec_tests/data/crud_v2/unacknowledged-deleteOne-hint-clientError.yml +0 -38
  606. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndDelete-hint-clientError.yml +0 -42
  607. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndReplace-hint-clientError.yml +0 -40
  608. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndUpdate-hint-clientError.yml +0 -40
  609. data/spec/spec_tests/data/crud_v2/unacknowledged-replaceOne-hint-clientError.yml +0 -40
  610. data/spec/spec_tests/data/crud_v2/unacknowledged-updateMany-hint-clientError.yml +0 -43
  611. data/spec/spec_tests/data/crud_v2/unacknowledged-updateOne-hint-clientError.yml +0 -40
  612. data/spec/spec_tests/data/crud_v2/updateMany-hint-clientError.yml +0 -45
  613. data/spec/spec_tests/data/crud_v2/updateMany-hint-serverError.yml +0 -66
  614. data/spec/spec_tests/data/crud_v2/updateMany-hint.yml +0 -65
  615. data/spec/spec_tests/data/crud_v2/updateOne-hint-clientError.yml +0 -43
  616. data/spec/spec_tests/data/crud_v2/updateOne-hint-serverError.yml +0 -62
  617. data/spec/spec_tests/data/crud_v2/updateOne-hint.yml +0 -61
  618. data/spec/spec_tests/data/crud_v2/updateWithPipelines.yml +0 -157
  619. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-4.9.yml +0 -60
  620. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-serverErrors-4.9.yml +0 -146
  621. data/spec/support/crypt/corpus/corpus_encrypted.json +0 -4152
  622. data/spec/support/session_registry.rb +0 -55
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d91b7c77d8d5e9d9298baf6aae6789f164fc9f61cb58e27c5f096ccb775fe7bd
4
- data.tar.gz: 6ea13c72698ac64aac21a29ee083fb483c56b51afbe9c2a1afd75ced4cefdded
3
+ metadata.gz: 27dd7818b5dc4a0b930ad91ec1607720ad7a02b1b6ea801499e7102ad758db17
4
+ data.tar.gz: 7c06c0a8e70f17a81529b727fcecb10c6a39c04fd36111cac51d3802b1494bf0
5
5
  SHA512:
6
- metadata.gz: 1b037dab0a527f76219b85159117c875e3b5b9a8cffe64689df71caeb344efedffa6d04a8c9232bd9a20aa1484da0b4a9690f00c126e4095931dd682328ca341
7
- data.tar.gz: 0c4b32a82ebbf64d6eccbcc0356d289e913393467c640fdf1aa7d19c2cd4150fc0a924d5815f45e59ca62a85be832012b21caf524cadda666bbd07f1d187d342
6
+ metadata.gz: 6551874d18d17670e04c13a05ec7e1ee793dfe5984933dbd476adf12603d65ff36c377681d5eb49b94b8da9523d8e196a306da8f3496b0400f6c82302db9b4ea
7
+ data.tar.gz: f337ac92bc26479b70ce26a6c88056a57ee2201c586fa134ead68ad00041368fd77edb4c07d7db7e042d1525aeca75998c51e6209b77069b752739cc68d96aae
checksums.yaml.gz.sig CHANGED
Binary file
data/README.md CHANGED
@@ -7,21 +7,17 @@ The officially supported Ruby driver for [MongoDB](https://www.mongodb.org/).
7
7
 
8
8
  The Ruby driver supports Ruby 2.5-3.0 and JRuby 9.2.
9
9
 
10
-
11
- Documentation
12
- -------------
10
+ ## Documentation
13
11
 
14
12
  High level documentation and usage examples are located
15
13
  [here](http://docs.mongodb.org/ecosystem/drivers/ruby/).
16
14
 
17
15
  API documentation for the most recent release can be found
18
- [here](https://docs.mongodb.com/ruby-driver/current/api/).
16
+ [here](https://mongodb.com/docs/ruby-driver/current/api/).
19
17
  To build API documentation for the master branch, check out the
20
18
  repository locally and run `rake docs`.
21
19
 
22
-
23
- Support
24
- -------
20
+ ## Support
25
21
 
26
22
  Commercial support for the driver is available through the
27
23
  [MongoDB Support Portal](https://support.mongodb.com/).
@@ -29,17 +25,15 @@ Commercial support for the driver is available through the
29
25
  For questions, discussions or general technical support, please visit the
30
26
  [MongoDB Community Forum](https://developer.mongodb.com/community/forums/tags/c/drivers-odms-connectors/7/ruby-driver).
31
27
 
32
- Please see [Technical Support](https://docs.mongodb.com/manual/support/) page
28
+ Please see [Technical Support](https://mongodb.com/docs/manual/support/) page
33
29
  in the documentation for other support resources.
34
30
 
35
-
36
- Bugs & Feature Requests
37
- -----------------------
31
+ ## Bugs & Feature Requests
38
32
 
39
33
  To report a bug in the driver or request a feature specific to the Ruby driver:
40
34
 
41
35
  1. Visit [our issue tracker](https://jira.mongodb.org/) and login
42
- (or create an account if you do not have one already).
36
+ (or create an account if you do not have one already).
43
37
  2. Navigate to the [RUBY project](https://jira.mongodb.org/browse/RUBY).
44
38
  3. Click 'Create Issue' and fill out all of the applicable form fields.
45
39
 
@@ -60,54 +54,44 @@ is publicly visible.
60
54
  - Provide any sensitive data or server logs.
61
55
  - Report potential security issues publicly (see 'Security Issues' below).
62
56
 
63
-
64
- Security Issues
65
- ---------------
57
+ ## Security Issues
66
58
 
67
59
  If you have identified a potential security-related issue in the Ruby driver
68
60
  (or any other MongoDB product), please report it by following the
69
61
  [instructions here](http://docs.mongodb.org/manual/tutorial/create-a-vulnerability-report).
70
62
 
71
-
72
- Product Feature Requests
73
- ------------------------
63
+ ## Product Feature Requests
74
64
 
75
65
  To request a feature which is not specific to the Ruby driver, or which
76
66
  affects more than the driver alone (for example, a feature which requires
77
67
  MongoDB server support), please submit your idea through the
78
68
  [MongoDB Feedback Forum](https://feedback.mongodb.com/forums/924286-drivers).
79
69
 
80
-
81
- Running Tests
82
- -------------
70
+ ## Running Tests
83
71
 
84
72
  Please refer to [spec/README.md](spec/README.md) for instructions on how
85
73
  to run the driver's test suite.
86
74
 
87
-
88
- Release History
89
- ---------------
75
+ ## Release History
90
76
 
91
77
  Full release notes and release history are available [on the GitHub releases
92
78
  page](https://github.com/mongodb/mongo-ruby-driver/releases).
93
79
 
80
+ ## License
94
81
 
95
- License
96
- -------
97
-
98
- Copyright (C) 2009-2020 MongoDB, Inc.
82
+ Copyright (C) 2009-2020 MongoDB, Inc.
99
83
 
100
- Licensed under the Apache License, Version 2.0 (the "License");
101
- you may not use this file except in compliance with the License.
102
- You may obtain a copy of the License at
84
+ Licensed under the Apache License, Version 2.0 (the "License");
85
+ you may not use this file except in compliance with the License.
86
+ You may obtain a copy of the License at
103
87
 
104
- http://www.apache.org/licenses/LICENSE-2.0
88
+ http://www.apache.org/licenses/LICENSE-2.0
105
89
 
106
- Unless required by applicable law or agreed to in writing, software
107
- distributed under the License is distributed on an "AS IS" BASIS,
108
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
109
- See the License for the specific language governing permissions and
110
- limitations under the License.
90
+ Unless required by applicable law or agreed to in writing, software
91
+ distributed under the License is distributed on an "AS IS" BASIS,
92
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
93
+ See the License for the specific language governing permissions and
94
+ limitations under the License.
111
95
 
112
96
  [rubygems-img]: https://badge.fury.io/rb/mongo.svg
113
97
  [rubygems-url]: http://badge.fury.io/rb/mongo
@@ -112,7 +112,12 @@ module Mongo
112
112
  reply = connection.dispatch([msg], context)
113
113
  reply_document = reply.documents.first
114
114
  validate_reply!(connection, conversation, reply_document)
115
- result = Operation::Result.new(reply, connection.description)
115
+ connection_global_id = if connection.respond_to?(:global_id)
116
+ connection.global_id
117
+ else
118
+ nil
119
+ end
120
+ result = Operation::Result.new(reply, connection.description, connection_global_id)
116
121
  connection.update_cluster_time(result)
117
122
  reply_document
118
123
  end
@@ -126,10 +131,12 @@ module Mongo
126
131
  code_name: doc[:codeName],
127
132
  message: doc[:errmsg],
128
133
  )
134
+
129
135
  raise Unauthorized.new(user,
130
136
  used_mechanism: self.class.const_get(:MECHANISM),
131
137
  message: message,
132
138
  server: connection.server,
139
+ code: doc[:code]
133
140
  )
134
141
  end
135
142
  end
data/lib/mongo/auth.rb CHANGED
@@ -30,6 +30,9 @@ require 'mongo/auth/ldap'
30
30
  require 'mongo/auth/scram'
31
31
  require 'mongo/auth/scram256'
32
32
  require 'mongo/auth/x509'
33
+ require 'mongo/error/read_write_retryable'
34
+ require 'mongo/error/labelable'
35
+
33
36
 
34
37
  module Mongo
35
38
 
@@ -127,6 +130,11 @@ module Mongo
127
130
  #
128
131
  # @since 2.0.0
129
132
  class Unauthorized < Mongo::Error::AuthError
133
+ include Error::ReadWriteRetryable
134
+ include Error::Labelable
135
+
136
+ # @return [ Integer ] The error code.
137
+ attr_reader :code
130
138
 
131
139
  # Instantiate the new error.
132
140
  #
@@ -139,11 +147,14 @@ module Mongo
139
147
  # @param [ String ] message The error message returned by the server.
140
148
  # @param [ Server ] server The server instance that authentication
141
149
  # was attempted against.
150
+ # @param [ Integer ] The error code.
142
151
  #
143
152
  # @since 2.0.0
144
153
  def initialize(user, used_mechanism: nil, message: nil,
145
- server: nil
154
+ server: nil, code: nil
146
155
  )
156
+ @code = code
157
+
147
158
  configured_bits = []
148
159
  used_bits = [
149
160
  "auth source: #{user.auth_source}",
@@ -23,6 +23,11 @@ module Mongo
23
23
  # @since 2.0.6
24
24
  class Result
25
25
 
26
+ # @return [ Boolean ] Is the result acknowledged?
27
+ def acknowledged?
28
+ @acknowledged
29
+ end
30
+
26
31
  # Constant for number removed.
27
32
  #
28
33
  # @since 2.1.0
@@ -94,10 +99,14 @@ module Mongo
94
99
  # Result.new({ 'n_inserted' => 10 })
95
100
  #
96
101
  # @param [ BSON::Document, Hash ] results The results document.
102
+ # @param [ Boolean ] acknowledged Is the result acknowledged?
97
103
  #
98
104
  # @since 2.1.0
99
- def initialize(results)
105
+ #
106
+ # @api private
107
+ def initialize(results, acknowledged)
100
108
  @results = results
109
+ @acknowledged = acknowledged
101
110
  end
102
111
 
103
112
  # Returns the number of documents inserted.
@@ -70,20 +70,18 @@ module Mongo
70
70
  end
71
71
  combine_errors!(result)
72
72
  @count += count
73
+ @acknowledged = result.acknowledged?
73
74
  end
74
75
 
75
76
  # Get the final result.
76
77
  #
77
78
  # @api private
78
79
  #
79
- # @example Get the final result.
80
- # combinator.result
81
- #
82
80
  # @return [ BulkWrite::Result ] The final result.
83
81
  #
84
82
  # @since 2.1.0
85
83
  def result
86
- BulkWrite::Result.new(results).validate!
84
+ BulkWrite::Result.new(results, @acknowledged).validate!
87
85
  end
88
86
 
89
87
  private
@@ -59,37 +59,34 @@ module Mongo
59
59
  operation_id = Monitoring.next_operation_id
60
60
  result_combiner = ResultCombiner.new
61
61
  operations = op_combiner.combine
62
+ validate_requests!
62
63
 
63
64
  client.send(:with_session, @options) do |session|
64
65
  context = Operation::Context.new(client: client, session: session)
65
66
  operations.each do |operation|
66
67
  if single_statement?(operation)
67
68
  write_concern = write_concern(session)
68
- write_with_retry(session, write_concern) do |server, txn_num|
69
- server.with_connection(service_id: context.service_id) do |connection|
70
- execute_operation(
71
- operation.keys.first,
72
- operation.values.flatten,
73
- connection,
74
- context,
75
- operation_id,
76
- result_combiner,
77
- session,
78
- txn_num)
79
- end
69
+ write_with_retry(write_concern, context: context) do |connection, txn_num, context|
70
+ execute_operation(
71
+ operation.keys.first,
72
+ operation.values.flatten,
73
+ connection,
74
+ context,
75
+ operation_id,
76
+ result_combiner,
77
+ session,
78
+ txn_num)
80
79
  end
81
80
  else
82
- nro_write_with_retry(session, write_concern) do |server|
83
- server.with_connection(service_id: context.service_id) do |connection|
84
- execute_operation(
85
- operation.keys.first,
86
- operation.values.flatten,
87
- connection,
88
- context,
89
- operation_id,
90
- result_combiner,
91
- session)
92
- end
81
+ nro_write_with_retry(write_concern, context: context) do |connection, txn_num, context|
82
+ execute_operation(
83
+ operation.keys.first,
84
+ operation.values.flatten,
85
+ connection,
86
+ context,
87
+ operation_id,
88
+ result_combiner,
89
+ session)
93
90
  end
94
91
  end
95
92
  end
@@ -179,7 +176,9 @@ module Mongo
179
176
  :max_time_ms => options[:max_time_ms],
180
177
  :options => options,
181
178
  :id_generator => client.options[:id_generator],
182
- :session => session
179
+ :session => session,
180
+ :comment => options[:comment],
181
+ :let => options[:let],
183
182
  }
184
183
  end
185
184
 
@@ -188,7 +187,7 @@ module Mongo
188
187
  validate_array_filters!(connection)
189
188
  validate_hint!(connection)
190
189
 
191
- unpin_maybe(session) do
190
+ unpin_maybe(session, connection) do
192
191
  if values.size > connection.description.max_write_batch_size
193
192
  split_execute(name, values, connection, context, operation_id, result_combiner, session, txn_num)
194
193
  else
@@ -210,7 +209,7 @@ module Mongo
210
209
  # 3.6+ servers being able to split less.
211
210
  rescue Error::MaxBSONSize, Error::MaxMessageSize => e
212
211
  raise e if values.size <= 1
213
- unpin_maybe(session) do
212
+ unpin_maybe(session, connection) do
214
213
  split_execute(name, values, connection, context, operation_id, result_combiner, session, txn_num)
215
214
  end
216
215
  end
@@ -222,7 +221,7 @@ module Mongo
222
221
  def split_execute(name, values, connection, context, operation_id, result_combiner, session, txn_num)
223
222
  execute_operation(name, values.shift(values.size / 2), connection, context, operation_id, result_combiner, session, txn_num)
224
223
 
225
- txn_num = session.next_txn_num if txn_num && !session.in_transaction?
224
+ txn_num = session.next_txn_num if txn_num
226
225
  execute_operation(name, values, connection, context, operation_id, result_combiner, session, txn_num)
227
226
  end
228
227
 
@@ -278,12 +277,93 @@ module Mongo
278
277
 
279
278
  def validate_hint!(connection)
280
279
  if op_combiner.has_hint?
281
- if write_concern && !write_concern.acknowledged?
280
+ if !can_hint?(connection) && write_concern && !write_concern.acknowledged?
282
281
  raise Error::UnsupportedOption.hint_error(unacknowledged_write: true)
283
282
  elsif !connection.features.update_delete_option_validation_enabled?
284
283
  raise Error::UnsupportedOption.hint_error
285
284
  end
286
285
  end
287
286
  end
287
+
288
+ # Loop through the requests and check if each operation is allowed to send
289
+ # a hint for each operation on the given server version.
290
+ #
291
+ # For the following operations, the client can send a hint for servers >= 4.2
292
+ # and for the rest, the client can only send it for 4.4+:
293
+ # - updateOne
294
+ # - updateMany
295
+ # - replaceOne
296
+ #
297
+ # @param [ Connection ] connection The connection object.
298
+ #
299
+ # @return [ true | false ] Whether the request is able to send hints for
300
+ # the current server version.
301
+ def can_hint?(connection)
302
+ gte_4_2 = connection.server.description.server_version_gte?('4.2')
303
+ gte_4_4 = connection.server.description.server_version_gte?('4.4')
304
+ op_combiner.requests.all? do |req|
305
+ op = req.keys.first
306
+ if req[op].keys.include?(:hint)
307
+ if [:update_one, :update_many, :replace_one].include?(op)
308
+ gte_4_2
309
+ else
310
+ gte_4_4
311
+ end
312
+ else
313
+ true
314
+ end
315
+ end
316
+ end
317
+
318
+ # Perform the request document validation required by driver specifications.
319
+ # This method validates the first key of each update request document to be
320
+ # an operator (i.e. start with $) and the first key of each replacement
321
+ # document to not be an operator (i.e. not start with $). The request document
322
+ # may be invalid without this method flagging it as such (for example an
323
+ # update or replacement document containing some keys which are operators
324
+ # and some which are not), in which case the driver expects the server to
325
+ # fail the operation with an error.
326
+ #
327
+ # @raise [ Error::InvalidUpdateDocument, Error::InvalidReplacementDocument ]
328
+ # if the document is invalid.
329
+ def validate_requests!
330
+ @requests.each do |req|
331
+ if op = req.keys.first
332
+ if [:update_one, :update_many].include?(op)
333
+ if doc = maybe_first(req.dig(op, :update))
334
+ if key = doc.keys&.first
335
+ unless key.to_s.start_with?("$")
336
+ if Mongo.validate_update_replace
337
+ raise Error::InvalidUpdateDocument.new(key: key)
338
+ else
339
+ Error::InvalidUpdateDocument.warn(Logger.logger, key)
340
+ end
341
+ end
342
+ end
343
+ end
344
+ elsif op == :replace_one
345
+ if key = req.dig(op, :replacement)&.keys&.first
346
+ if key.to_s.start_with?("$")
347
+ if Mongo.validate_update_replace
348
+ raise Error::InvalidReplacementDocument.new(key: key)
349
+ else
350
+ Error::InvalidReplacementDocument.warn(Logger.logger, key)
351
+ end
352
+ end
353
+ end
354
+ end
355
+ end
356
+ end
357
+ end
358
+
359
+ # If the given object is an array return the first element, otherwise
360
+ # return the given object.
361
+ #
362
+ # @param [ Object ] obj The given object.
363
+ #
364
+ # @return [ Object ] The first element of the array or the given object.
365
+ def maybe_first(obj)
366
+ obj.is_a?(Array) ? obj.first : obj
367
+ end
288
368
  end
289
369
  end
data/lib/mongo/client.rb CHANGED
@@ -92,6 +92,8 @@ module Mongo
92
92
  :server_api,
93
93
  :server_selection_timeout,
94
94
  :socket_timeout,
95
+ :srv_max_hosts,
96
+ :srv_service_name,
95
97
  :ssl,
96
98
  :ssl_ca_cert,
97
99
  :ssl_ca_cert_object,
@@ -340,6 +342,13 @@ module Mongo
340
342
  # for selecting a server for an operation.
341
343
  # @option options [ Float ] :socket_timeout The timeout, in seconds, to
342
344
  # execute operations on a socket.
345
+ # @option options [ Integer ] :srv_max_hosts The maximum number of mongoses
346
+ # that the driver will communicate with for sharded topologies. If this
347
+ # option is 0, then there will be no maximum number of mongoses. If the
348
+ # given URI resolves to more hosts than ``:srv_max_hosts``, the client
349
+ # will ramdomly choose an ``:srv_max_hosts`` sized subset of hosts.
350
+ # @option options [ String ] :srv_service_name The service name to use in
351
+ # the SRV DNS query.
343
352
  # @option options [ true, false ] :ssl Whether to use TLS.
344
353
  # @option options [ String ] :ssl_ca_cert The file containing concatenated
345
354
  # certificate authority certificates used to validate certs passed from the
@@ -420,9 +429,13 @@ module Mongo
420
429
  # instance containing the encryption key vault
421
430
  # - :key_vault_namespace => String, the namespace of the key vault in the
422
431
  # format database.collection
423
- # - :kms_providers => Hash, A hash of key management service configuration
424
- # information. Valid hash keys are :local or :aws. There may be more
425
- # than one kms provider specified.
432
+ # - :kms_providers => Hash, A hash of key management service (KMS) configuration
433
+ # information. Valid hash keys are :aws, :azure, :gcp, :kmip, :local.
434
+ # There may be more than one kms provider specified.
435
+ # - :kms_tls_options => Hash, A hash of TLS options to authenticate to
436
+ # KMS providers, usually used for KMIP servers. Valid hash keys
437
+ # are :aws, :azure, :gcp, :kmip, :local. There may be more than one
438
+ # kms provider specified.
426
439
  # - :schema_map => Hash | nil, JSONSchema for one or more collections
427
440
  # specifying which fields should be encrypted.
428
441
  # - Note: Schemas supplied in the schema_map only apply to configuring
@@ -433,10 +446,18 @@ module Mongo
433
446
  # JSON Schemas obtained from the server. It protects against a
434
447
  # malicious server advertising a false JSON Schema, which could trick
435
448
  # the client into sending unencrypted data that should be encrypted.
449
+ # - Note: If a collection is present on both the :encrypted_fields_map
450
+ # and :schema_map, an error will be raised.
436
451
  # - :bypass_auto_encryption => Boolean, when true, disables auto encryption;
437
452
  # defaults to false.
438
453
  # - :extra_options => Hash | nil, options related to spawning mongocryptd
439
454
  # (this part of the API is subject to change).
455
+ # - :encrypted_fields_map => Hash | nil, maps a collection namespace to
456
+ # a hash describing encrypted fields for queryable encryption.
457
+ # - Note: If a collection is present on both the encryptedFieldsMap
458
+ # and schemaMap, an error will be raised.
459
+ # - :bypass_query_analysis => Boolean | nil, when true disables automatic
460
+ # analysis of outgoing commands.
440
461
  #
441
462
  # Notes on automatic encryption:
442
463
  # - Automatic encryption is an enterprise only feature that only applies
@@ -532,7 +553,7 @@ module Mongo
532
553
  end
533
554
  =end
534
555
  @options.freeze
535
- validate_options!(addresses)
556
+ validate_options!(addresses, is_srv: uri.is_a?(URI::SRVProtocol))
536
557
  validate_authentication_options!
537
558
 
538
559
  database_options = @options.dup
@@ -885,9 +906,11 @@ module Mongo
885
906
  # which databases are returned based on user privileges when access control
886
907
  # is enabled
887
908
  #
888
- # See https://docs.mongodb.com/manual/reference/command/listDatabases/
909
+ # See https://mongodb.com/docs/manual/reference/command/listDatabases/
889
910
  # for more information and usage.
890
911
  # @option opts [ Session ] :session The session to use.
912
+ # @option options [ Object ] :comment A user-provided
913
+ # comment to attach to this command.
891
914
  #
892
915
  # @return [ Array<String> ] The names of the databases.
893
916
  #
@@ -909,9 +932,11 @@ module Mongo
909
932
  # which databases are returned based on user privileges when access control
910
933
  # is enabled
911
934
  #
912
- # See https://docs.mongodb.com/manual/reference/command/listDatabases/
935
+ # See https://mongodb.com/docs/manual/reference/command/listDatabases/
913
936
  # for more information and usage.
914
937
  # @option opts [ Session ] :session The session to use.
938
+ # @option options [ Object ] :comment A user-provided
939
+ # comment to attach to this command.
915
940
  #
916
941
  # @return [ Array<Hash> ] The info for each database.
917
942
  #
@@ -933,6 +958,8 @@ module Mongo
933
958
  # @param [ Hash ] opts The command options.
934
959
  #
935
960
  # @option opts [ Session ] :session The session to use.
961
+ # @option options [ Object ] :comment A user-provided
962
+ # comment to attach to this command.
936
963
  #
937
964
  # @return [ Array<Mongo::Database> ] The list of database objects.
938
965
  #
@@ -984,11 +1011,35 @@ module Mongo
984
1011
  #
985
1012
  # @param [ Array<Hash> ] pipeline Optional additional filter operators.
986
1013
  # @param [ Hash ] options The change stream options.
1014
+ # @option options [ String ] :full_document Allowed values: nil, 'default',
1015
+ # 'updateLookup', 'whenAvailable', 'required'.
987
1016
  #
988
- # @option options [ String ] :full_document Allowed values: 'default', 'updateLookup'.
989
- # Defaults to 'default'. When set to 'updateLookup', the change notification for partial
990
- # updates will include both a delta describing the changes to the document, as well as a copy
991
- # of the entire document that was changed from some time after the change occurred.
1017
+ # The default is to not send a value (i.e. nil), which is equivalent to
1018
+ # 'default'. By default, the change notification for partial updates will
1019
+ # include a delta describing the changes to the document.
1020
+ #
1021
+ # When set to 'updateLookup', the change notification for partial updates
1022
+ # will include both a delta describing the changes to the document as well
1023
+ # as a copy of the entire document that was changed from some time after
1024
+ # the change occurred.
1025
+ #
1026
+ # When set to 'whenAvailable', configures the change stream to return the
1027
+ # post-image of the modified document for replace and update change events
1028
+ # if the post-image for this event is available.
1029
+ #
1030
+ # When set to 'required', the same behavior as 'whenAvailable' except that
1031
+ # an error is raised if the post-image is not available.
1032
+ # @option options [ String ] :full_document_before_change Allowed values: nil,
1033
+ # 'whenAvailable', 'required', 'off'.
1034
+ #
1035
+ # The default is to not send a value (i.e. nil), which is equivalent to 'off'.
1036
+ #
1037
+ # When set to 'whenAvailable', configures the change stream to return the
1038
+ # pre-image of the modified document for replace, update, and delete change
1039
+ # events if it is available.
1040
+ #
1041
+ # When set to 'required', the same behavior as 'whenAvailable' except that
1042
+ # an error is raised if the pre-image is not available.
992
1043
  # @option options [ BSON::Document, Hash ] :resume_after Specifies the logical starting point
993
1044
  # for the new change stream.
994
1045
  # @option options [ Integer ] :max_await_time_ms The maximum amount of time for the server to
@@ -1000,6 +1051,8 @@ module Mongo
1000
1051
  # changes that occurred at or after the specified timestamp. Any command run
1001
1052
  # against the server will return a cluster time that can be used here.
1002
1053
  # Only recognized by server versions 4.0+.
1054
+ # @option options [ Object ] :comment A user-provided
1055
+ # comment to attach to this command.
1003
1056
  #
1004
1057
  # @note A change stream only allows 'majority' read concern.
1005
1058
  # @note This helper method is preferable to running a raw aggregation with a $changeStream
@@ -1088,6 +1141,14 @@ module Mongo
1088
1141
  end
1089
1142
  end
1090
1143
 
1144
+ # Returns encrypted field map hash if provided when creating the client.
1145
+ #
1146
+ # @return [ Hash | nil ] Encrypted field map hash, or nil if not set.
1147
+ # @api private
1148
+ def encrypted_fields_map
1149
+ @encrypted_fields_map ||= @options.fetch(:auto_encryption_options, {})[:encrypted_fields_map]
1150
+ end
1151
+
1091
1152
  private
1092
1153
 
1093
1154
  # Create a new encrypter object using the client's auto encryption options
@@ -1147,11 +1208,26 @@ module Mongo
1147
1208
 
1148
1209
  cluster.validate_session_support!
1149
1210
 
1150
- Session.new(cluster.session_pool.checkout, self, { implicit: true }.merge(options))
1211
+ options = {implicit: true}.update(options)
1212
+
1213
+ server_session = if options[:implicit]
1214
+ nil
1215
+ else
1216
+ cluster.session_pool.checkout
1217
+ end
1218
+
1219
+ Session.new(server_session, self, options)
1151
1220
  end
1152
1221
 
1222
+ # Auxiliary method that is called by interpreter when copying the client
1223
+ # via dup or clone.
1224
+ #
1225
+ # @param [ Mongo::Client ] original Client that is being cloned.
1226
+ #
1227
+ # @api private
1153
1228
  def initialize_copy(original)
1154
1229
  @options = original.options.dup
1230
+ @connect_lock = Mutex.new
1155
1231
  @monitoring = @cluster ? monitoring : Monitoring.new(options)
1156
1232
  @database = nil
1157
1233
  @read_preference = nil
@@ -1226,6 +1302,12 @@ module Mongo
1226
1302
  end
1227
1303
 
1228
1304
  _options[key] = compressors unless compressors.empty?
1305
+ elsif key == :srv_max_hosts
1306
+ if v && (!v.is_a?(Integer) || v < 0)
1307
+ log_warn("#{v} is not a valid integer for srv_max_hosts")
1308
+ else
1309
+ _options[key] = v
1310
+ end
1229
1311
  else
1230
1312
  _options[key] = v
1231
1313
  end
@@ -1239,7 +1321,7 @@ module Mongo
1239
1321
  # Validates all options after they are set on the client.
1240
1322
  # This method is intended to catch combinations of options which are
1241
1323
  # not allowed.
1242
- def validate_options!(addresses = nil)
1324
+ def validate_options!(addresses = nil, is_srv: nil)
1243
1325
  if options[:write] && options[:write_concern] && options[:write] != options[:write_concern]
1244
1326
  raise ArgumentError, "If :write and :write_concern are both given, they must be identical: #{options.inspect}"
1245
1327
  end
@@ -1349,6 +1431,26 @@ module Mongo
1349
1431
  end
1350
1432
  end
1351
1433
  end
1434
+
1435
+ if options[:srv_max_hosts] && options[:srv_max_hosts] > 0
1436
+ if options[:replica_set]
1437
+ raise ArgumentError, ":srv_max_hosts > 0 cannot be used with :replica_set option"
1438
+ end
1439
+
1440
+ if options[:load_balanced]
1441
+ raise ArgumentError, ":srv_max_hosts > 0 cannot be used with :load_balanced=true"
1442
+ end
1443
+ end
1444
+
1445
+ unless is_srv.nil? || is_srv
1446
+ if options[:srv_max_hosts]
1447
+ raise ArgumentError, ":srv_max_hosts cannot be used on non-SRV URI"
1448
+ end
1449
+
1450
+ if options[:srv_service_name]
1451
+ raise ArgumentError, ":srv_service_name cannot be used on non-SRV URI"
1452
+ end
1453
+ end
1352
1454
  end
1353
1455
 
1354
1456
  # Validates all authentication-related options after they are set on the client