mongo 2.11.6 → 2.12.0.rc0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (327) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +2 -2
  3. data.tar.gz.sig +0 -0
  4. data/CONTRIBUTING.md +1 -1
  5. data/lib/mongo.rb +3 -0
  6. data/lib/mongo/address.rb +13 -2
  7. data/lib/mongo/auth.rb +1 -0
  8. data/lib/mongo/auth/credential_cache.rb +51 -0
  9. data/lib/mongo/auth/scram/conversation.rb +20 -16
  10. data/lib/mongo/auth/user.rb +0 -8
  11. data/lib/mongo/auth/user/view.rb +4 -4
  12. data/lib/mongo/background_thread.rb +1 -1
  13. data/lib/mongo/bulk_write.rb +5 -5
  14. data/lib/mongo/client.rb +126 -11
  15. data/lib/mongo/client_encryption.rb +103 -0
  16. data/lib/mongo/cluster.rb +2 -2
  17. data/lib/mongo/cluster/reapers/cursor_reaper.rb +18 -6
  18. data/lib/mongo/cluster/sdam_flow.rb +54 -58
  19. data/lib/mongo/cluster/srv_monitor.rb +1 -1
  20. data/lib/mongo/collection.rb +3 -3
  21. data/lib/mongo/collection/view.rb +1 -1
  22. data/lib/mongo/collection/view/aggregation.rb +1 -1
  23. data/lib/mongo/collection/view/change_stream.rb +12 -3
  24. data/lib/mongo/collection/view/iterable.rb +14 -5
  25. data/lib/mongo/collection/view/map_reduce.rb +2 -2
  26. data/lib/mongo/collection/view/readable.rb +7 -9
  27. data/lib/mongo/collection/view/writable.rb +7 -7
  28. data/lib/mongo/crypt.rb +33 -0
  29. data/lib/mongo/crypt/auto_decryption_context.rb +42 -0
  30. data/lib/mongo/crypt/auto_encrypter.rb +169 -0
  31. data/lib/mongo/crypt/auto_encryption_context.rb +44 -0
  32. data/lib/mongo/crypt/binary.rb +155 -0
  33. data/lib/mongo/crypt/binding.rb +1162 -0
  34. data/lib/mongo/crypt/context.rb +135 -0
  35. data/lib/mongo/crypt/data_key_context.rb +162 -0
  36. data/lib/mongo/crypt/encryption_io.rb +283 -0
  37. data/lib/mongo/crypt/explicit_decryption_context.rb +40 -0
  38. data/lib/mongo/crypt/explicit_encrypter.rb +117 -0
  39. data/lib/mongo/crypt/explicit_encryption_context.rb +89 -0
  40. data/lib/mongo/crypt/handle.rb +293 -0
  41. data/lib/mongo/crypt/hooks.rb +90 -0
  42. data/lib/mongo/crypt/kms_context.rb +67 -0
  43. data/lib/mongo/crypt/status.rb +131 -0
  44. data/lib/mongo/cursor.rb +64 -32
  45. data/lib/mongo/database.rb +13 -6
  46. data/lib/mongo/database/view.rb +13 -4
  47. data/lib/mongo/dbref.rb +9 -2
  48. data/lib/mongo/error.rb +5 -1
  49. data/lib/mongo/error/crypt_error.rb +31 -0
  50. data/lib/mongo/error/{failed_stringprep_validation.rb → failed_string_prep_validation.rb} +0 -0
  51. data/lib/mongo/error/invalid_cursor_operation.rb +27 -0
  52. data/lib/mongo/error/kms_error.rb +22 -0
  53. data/lib/mongo/error/max_bson_size.rb +14 -3
  54. data/lib/mongo/error/mongocryptd_spawn_error.rb +22 -0
  55. data/lib/mongo/error/no_server_available.rb +8 -3
  56. data/lib/mongo/error/operation_failure.rb +1 -0
  57. data/lib/mongo/grid/file.rb +0 -5
  58. data/lib/mongo/grid/file/chunk.rb +0 -2
  59. data/lib/mongo/grid/file/info.rb +2 -1
  60. data/lib/mongo/grid/fs_bucket.rb +13 -15
  61. data/lib/mongo/grid/stream/write.rb +3 -9
  62. data/lib/mongo/index/view.rb +3 -3
  63. data/lib/mongo/monitoring/event/command_started.rb +6 -1
  64. data/lib/mongo/operation/collections_info.rb +6 -3
  65. data/lib/mongo/operation/delete/op_msg.rb +1 -1
  66. data/lib/mongo/operation/find/op_msg.rb +4 -1
  67. data/lib/mongo/operation/get_more/op_msg.rb +4 -1
  68. data/lib/mongo/operation/insert/command.rb +2 -2
  69. data/lib/mongo/operation/insert/legacy.rb +2 -2
  70. data/lib/mongo/operation/insert/op_msg.rb +3 -3
  71. data/lib/mongo/operation/result.rb +36 -27
  72. data/lib/mongo/operation/shared/executable.rb +10 -8
  73. data/lib/mongo/operation/shared/executable_no_validate.rb +2 -2
  74. data/lib/mongo/operation/shared/op_msg_or_command.rb +2 -2
  75. data/lib/mongo/operation/shared/op_msg_or_find_command.rb +2 -2
  76. data/lib/mongo/operation/shared/op_msg_or_list_indexes_command.rb +2 -2
  77. data/lib/mongo/operation/shared/write.rb +17 -10
  78. data/lib/mongo/operation/update/op_msg.rb +1 -1
  79. data/lib/mongo/protocol/compressed.rb +6 -5
  80. data/lib/mongo/protocol/insert.rb +3 -1
  81. data/lib/mongo/protocol/message.rb +72 -8
  82. data/lib/mongo/protocol/msg.rb +191 -37
  83. data/lib/mongo/protocol/query.rb +7 -9
  84. data/lib/mongo/protocol/serializers.rb +6 -2
  85. data/lib/mongo/server.rb +10 -4
  86. data/lib/mongo/server/connection.rb +20 -9
  87. data/lib/mongo/server/connection_base.rb +81 -12
  88. data/lib/mongo/server/connection_common.rb +61 -0
  89. data/lib/mongo/server/connection_pool.rb +37 -1
  90. data/lib/mongo/server/description.rb +9 -11
  91. data/lib/mongo/server/monitor.rb +2 -0
  92. data/lib/mongo/server/monitor/connection.rb +3 -18
  93. data/lib/mongo/server/pending_connection.rb +2 -1
  94. data/lib/mongo/session.rb +2 -2
  95. data/lib/mongo/session/session_pool.rb +8 -3
  96. data/lib/mongo/socket.rb +29 -16
  97. data/lib/mongo/socket/ssl.rb +23 -8
  98. data/lib/mongo/socket/tcp.rb +12 -3
  99. data/lib/mongo/timeout.rb +49 -0
  100. data/lib/mongo/uri.rb +30 -1
  101. data/lib/mongo/version.rb +1 -1
  102. data/mongo.gemspec +1 -1
  103. data/spec/README.md +134 -7
  104. data/spec/integration/auth_spec.rb +53 -0
  105. data/spec/integration/{client_options_spec.rb → client_authentication_options_spec.rb} +10 -10
  106. data/spec/integration/client_construction_spec.rb +76 -1
  107. data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +351 -0
  108. data/spec/integration/client_side_encryption/auto_encryption_command_monitoring_spec.rb +301 -0
  109. data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +71 -0
  110. data/spec/integration/client_side_encryption/auto_encryption_old_wire_version_spec.rb +76 -0
  111. data/spec/integration/client_side_encryption/auto_encryption_reconnect_spec.rb +216 -0
  112. data/spec/integration/client_side_encryption/auto_encryption_spec.rb +600 -0
  113. data/spec/integration/client_side_encryption/bson_size_limit_spec.rb +183 -0
  114. data/spec/integration/client_side_encryption/bypass_mongocryptd_spawn_spec.rb +74 -0
  115. data/spec/integration/client_side_encryption/client_close_spec.rb +59 -0
  116. data/spec/integration/client_side_encryption/corpus_spec.rb +228 -0
  117. data/spec/integration/client_side_encryption/custom_endpoint_spec.rb +132 -0
  118. data/spec/integration/client_side_encryption/data_key_spec.rb +163 -0
  119. data/spec/integration/client_side_encryption/explicit_encryption_spec.rb +114 -0
  120. data/spec/integration/client_side_encryption/external_key_vault_spec.rb +137 -0
  121. data/spec/integration/client_side_encryption/views_spec.rb +42 -0
  122. data/spec/integration/client_update_spec.rb +120 -0
  123. data/spec/integration/command_monitoring_spec.rb +3 -1
  124. data/spec/integration/command_spec.rb +44 -10
  125. data/spec/integration/connection_spec.rb +57 -0
  126. data/spec/integration/reconnect_spec.rb +7 -6
  127. data/spec/integration/size_limit_spec.rb +94 -0
  128. data/spec/integration/srv_monitoring_spec.rb +14 -6
  129. data/spec/lite_spec_helper.rb +31 -22
  130. data/spec/mongo/auth/cr_spec.rb +8 -0
  131. data/spec/mongo/auth/ldap_spec.rb +5 -1
  132. data/spec/mongo/auth/scram/conversation_spec.rb +5 -6
  133. data/spec/mongo/auth/scram/negotiation_spec.rb +74 -75
  134. data/spec/mongo/auth/scram_spec.rb +45 -35
  135. data/spec/mongo/auth/x509_spec.rb +5 -1
  136. data/spec/mongo/client_construction_spec.rb +206 -3
  137. data/spec/mongo/client_encryption_spec.rb +408 -0
  138. data/spec/mongo/cluster/cursor_reaper_spec.rb +12 -8
  139. data/spec/mongo/cluster/socket_reaper_spec.rb +14 -3
  140. data/spec/mongo/collection/view/aggregation_spec.rb +0 -2
  141. data/spec/mongo/collection/view/change_stream_spec.rb +7 -7
  142. data/spec/mongo/collection/view/map_reduce_spec.rb +3 -3
  143. data/spec/mongo/collection/view_spec.rb +1 -1
  144. data/spec/mongo/collection_spec.rb +4 -33
  145. data/spec/mongo/crypt/auto_decryption_context_spec.rb +90 -0
  146. data/spec/mongo/crypt/auto_encrypter_spec.rb +182 -0
  147. data/spec/mongo/crypt/auto_encryption_context_spec.rb +107 -0
  148. data/spec/mongo/crypt/binary_spec.rb +115 -0
  149. data/spec/mongo/crypt/binding/binary_spec.rb +56 -0
  150. data/spec/mongo/crypt/binding/context_spec.rb +257 -0
  151. data/spec/mongo/crypt/binding/helpers_spec.rb +46 -0
  152. data/spec/mongo/crypt/binding/mongocrypt_spec.rb +144 -0
  153. data/spec/mongo/crypt/binding/status_spec.rb +99 -0
  154. data/spec/mongo/crypt/binding/version_spec.rb +22 -0
  155. data/spec/mongo/crypt/binding_unloaded_spec.rb +20 -0
  156. data/spec/mongo/crypt/data_key_context_spec.rb +213 -0
  157. data/spec/mongo/crypt/encryption_io_spec.rb +136 -0
  158. data/spec/mongo/crypt/explicit_decryption_context_spec.rb +72 -0
  159. data/spec/mongo/crypt/explicit_encryption_context_spec.rb +170 -0
  160. data/spec/mongo/crypt/handle_spec.rb +198 -0
  161. data/spec/mongo/crypt/helpers/mongo_crypt_spec_helper.rb +108 -0
  162. data/spec/mongo/crypt/status_spec.rb +152 -0
  163. data/spec/mongo/cursor_spec.rb +24 -4
  164. data/spec/mongo/database_spec.rb +20 -0
  165. data/spec/mongo/error/crypt_error_spec.rb +26 -0
  166. data/spec/mongo/error/max_bson_size_spec.rb +35 -0
  167. data/spec/mongo/error/no_server_available_spec.rb +11 -1
  168. data/spec/mongo/error/operation_failure_spec.rb +6 -6
  169. data/spec/mongo/operation/aggregate_spec.rb +1 -1
  170. data/spec/mongo/operation/collections_info_spec.rb +1 -1
  171. data/spec/mongo/operation/command_spec.rb +3 -3
  172. data/spec/mongo/operation/create_index_spec.rb +3 -3
  173. data/spec/mongo/operation/create_user_spec.rb +3 -3
  174. data/spec/mongo/operation/delete/bulk_spec.rb +6 -6
  175. data/spec/mongo/operation/delete/op_msg_spec.rb +1 -6
  176. data/spec/mongo/operation/delete_spec.rb +7 -7
  177. data/spec/mongo/operation/drop_index_spec.rb +2 -2
  178. data/spec/mongo/operation/find/legacy_spec.rb +1 -1
  179. data/spec/mongo/operation/get_more_spec.rb +1 -1
  180. data/spec/mongo/operation/indexes_spec.rb +1 -1
  181. data/spec/mongo/operation/insert/bulk_spec.rb +7 -7
  182. data/spec/mongo/operation/insert/op_msg_spec.rb +3 -6
  183. data/spec/mongo/operation/insert_spec.rb +12 -12
  184. data/spec/mongo/operation/map_reduce_spec.rb +2 -2
  185. data/spec/mongo/operation/remove_user_spec.rb +3 -3
  186. data/spec/mongo/operation/update/bulk_spec.rb +6 -6
  187. data/spec/mongo/operation/update/op_msg_spec.rb +3 -6
  188. data/spec/mongo/operation/update_spec.rb +7 -7
  189. data/spec/mongo/operation/update_user_spec.rb +1 -1
  190. data/spec/mongo/protocol/compressed_spec.rb +2 -3
  191. data/spec/mongo/protocol/delete_spec.rb +9 -8
  192. data/spec/mongo/protocol/get_more_spec.rb +9 -8
  193. data/spec/mongo/protocol/insert_spec.rb +9 -8
  194. data/spec/mongo/protocol/kill_cursors_spec.rb +6 -5
  195. data/spec/mongo/protocol/msg_spec.rb +57 -53
  196. data/spec/mongo/protocol/query_spec.rb +12 -12
  197. data/spec/mongo/protocol/registry_spec.rb +1 -1
  198. data/spec/mongo/protocol/reply_spec.rb +1 -1
  199. data/spec/mongo/protocol/update_spec.rb +10 -9
  200. data/spec/mongo/server/connection_pool_spec.rb +1 -1
  201. data/spec/mongo/server/connection_spec.rb +28 -7
  202. data/spec/mongo/socket_spec.rb +1 -1
  203. data/spec/mongo/timeout_spec.rb +85 -0
  204. data/spec/mongo/uri/srv_protocol_spec.rb +2 -2
  205. data/spec/mongo/uri_spec.rb +52 -5
  206. data/spec/mongo/write_concern_spec.rb +13 -1
  207. data/spec/{support → runners}/auth.rb +14 -1
  208. data/spec/{support → runners}/change_streams.rb +1 -1
  209. data/spec/{support → runners}/change_streams/operation.rb +0 -0
  210. data/spec/{support → runners}/cmap.rb +1 -1
  211. data/spec/{support → runners}/cmap/verifier.rb +0 -0
  212. data/spec/{support → runners}/command_monitoring.rb +0 -0
  213. data/spec/runners/connection_string.rb +358 -4
  214. data/spec/{support → runners}/crud.rb +9 -9
  215. data/spec/{support → runners}/crud/context.rb +0 -0
  216. data/spec/{support → runners}/crud/operation.rb +7 -3
  217. data/spec/{support → runners}/crud/outcome.rb +0 -0
  218. data/spec/{support → runners}/crud/requirement.rb +1 -1
  219. data/spec/{support → runners}/crud/spec.rb +12 -1
  220. data/spec/{support → runners}/crud/test.rb +0 -0
  221. data/spec/{support → runners}/crud/test_base.rb +0 -0
  222. data/spec/{support → runners}/crud/verifier.rb +10 -12
  223. data/spec/{support → runners}/gridfs.rb +0 -0
  224. data/spec/{support → runners}/sdam_monitoring.rb +0 -0
  225. data/spec/{support → runners}/server_discovery_and_monitoring.rb +0 -0
  226. data/spec/{support → runners}/server_selection.rb +0 -0
  227. data/spec/{support → runners}/server_selection_rtt.rb +0 -0
  228. data/spec/{support → runners}/transactions.rb +4 -4
  229. data/spec/{support → runners}/transactions/context.rb +0 -0
  230. data/spec/{support → runners}/transactions/operation.rb +0 -0
  231. data/spec/{support → runners}/transactions/spec.rb +0 -0
  232. data/spec/{support → runners}/transactions/test.rb +37 -5
  233. data/spec/spec_helper.rb +0 -5
  234. data/spec/spec_tests/auth_spec.rb +3 -3
  235. data/spec/spec_tests/client_side_encryption_spec.rb +13 -0
  236. data/spec/spec_tests/connection_string_spec.rb +1 -1
  237. data/spec/spec_tests/data/auth/connection-string.yml +13 -0
  238. data/spec/spec_tests/data/client_side_encryption/aggregate.yml +134 -0
  239. data/spec/spec_tests/data/client_side_encryption/badQueries.yml +526 -0
  240. data/spec/spec_tests/data/client_side_encryption/badSchema.yml +73 -0
  241. data/spec/spec_tests/data/client_side_encryption/basic.yml +116 -0
  242. data/spec/spec_tests/data/client_side_encryption/bulk.yml +85 -0
  243. data/spec/spec_tests/data/client_side_encryption/bypassAutoEncryption.yml +100 -0
  244. data/spec/spec_tests/data/client_side_encryption/bypassedCommand.yml +42 -0
  245. data/spec/spec_tests/data/client_side_encryption/count.yml +61 -0
  246. data/spec/spec_tests/data/client_side_encryption/countDocuments.yml +59 -0
  247. data/spec/spec_tests/data/client_side_encryption/delete.yml +105 -0
  248. data/spec/spec_tests/data/client_side_encryption/distinct.yml +73 -0
  249. data/spec/spec_tests/data/client_side_encryption/explain.yml +64 -0
  250. data/spec/spec_tests/data/client_side_encryption/find.yml +119 -0
  251. data/spec/spec_tests/data/client_side_encryption/findOneAndDelete.yml +57 -0
  252. data/spec/spec_tests/data/client_side_encryption/findOneAndReplace.yml +57 -0
  253. data/spec/spec_tests/data/client_side_encryption/findOneAndUpdate.yml +57 -0
  254. data/spec/spec_tests/data/client_side_encryption/getMore.yml +68 -0
  255. data/spec/spec_tests/data/client_side_encryption/insert.yml +102 -0
  256. data/spec/spec_tests/data/client_side_encryption/keyAltName.yml +71 -0
  257. data/spec/spec_tests/data/client_side_encryption/localKMS.yml +54 -0
  258. data/spec/spec_tests/data/client_side_encryption/localSchema.yml +72 -0
  259. data/spec/spec_tests/data/client_side_encryption/malformedCiphertext.yml +69 -0
  260. data/spec/spec_tests/data/client_side_encryption/maxWireVersion.yml +20 -0
  261. data/spec/spec_tests/data/client_side_encryption/missingKey.yml +49 -0
  262. data/spec/spec_tests/data/client_side_encryption/replaceOne.yml +61 -0
  263. data/spec/spec_tests/data/client_side_encryption/types.yml +527 -0
  264. data/spec/spec_tests/data/client_side_encryption/unsupportedCommand.yml +25 -0
  265. data/spec/spec_tests/data/client_side_encryption/updateMany.yml +77 -0
  266. data/spec/spec_tests/data/client_side_encryption/updateOne.yml +168 -0
  267. data/spec/spec_tests/data/read_write_concern/connection-string/write-concern.yml +1 -4
  268. data/spec/spec_tests/data/retryable_writes/insertOne-serverErrors.yml +21 -0
  269. data/spec/spec_tests/data/sdam/rs/incompatible_ghost.yml +2 -4
  270. data/spec/spec_tests/data/sdam/rs/incompatible_other.yml +1 -1
  271. data/spec/spec_tests/data/sdam/rs/primary_mismatched_me_not_removed.yml +73 -0
  272. data/spec/spec_tests/data/sdam/rs/primary_to_no_primary_mismatched_me.yml +1 -2
  273. data/spec/spec_tests/data/sdam/rs/repeated.yml +101 -0
  274. data/spec/spec_tests/data/sdam/rs/{primary_address_change.yml → ruby_primary_address_change.yml} +2 -0
  275. data/spec/spec_tests/data/sdam/rs/{secondary_wrong_set_name_with_primary_second.yml → ruby_secondary_wrong_set_name_with_primary_second.yml} +0 -0
  276. data/spec/spec_tests/data/sdam/sharded/ruby_discovered_single_mongos.yml +27 -0
  277. data/spec/spec_tests/data/sdam/sharded/{primary_address_change.yml → ruby_primary_different_address.yml} +1 -1
  278. data/spec/spec_tests/data/sdam/sharded/{primary_mismatched_me.yml → ruby_primary_mismatched_me.yml} +1 -1
  279. data/spec/spec_tests/data/sdam/single/{primary_address_change.yml → ruby_primary_different_address.yml} +1 -1
  280. data/spec/spec_tests/data/sdam/single/{primary_mismatched_me.yml → ruby_primary_mismatched_me.yml} +1 -1
  281. data/spec/spec_tests/data/sdam_monitoring/{replica_set_with_primary_change.yml → replica_set_primary_address_change.yml} +27 -5
  282. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_me_mismatch.yml +26 -74
  283. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_removal.yml +20 -16
  284. data/spec/spec_tests/data/sdam_monitoring/standalone_suppress_equal_description_changes.yml +73 -0
  285. data/spec/spec_tests/data/transactions/pin-mongos.yml +2 -3
  286. data/spec/spec_tests/data/uri_options/auth-options.yml +10 -0
  287. data/spec/spec_tests/data/uri_options/tls-options.yml +75 -4
  288. data/spec/spec_tests/read_write_concern_connection_string_spec.rb +1 -1
  289. data/spec/spec_tests/uri_options_spec.rb +6 -8
  290. data/spec/stress/connection_pool_timing_spec.rb +6 -3
  291. data/spec/support/certificates/README.md +4 -0
  292. data/spec/support/certificates/server-second-level-bundle.pem +77 -77
  293. data/spec/support/certificates/server-second-level.crt +52 -52
  294. data/spec/support/certificates/server-second-level.key +25 -25
  295. data/spec/support/certificates/server-second-level.pem +77 -77
  296. data/spec/support/client_registry.rb +19 -3
  297. data/spec/support/cluster_config.rb +9 -1
  298. data/spec/support/common_shortcuts.rb +12 -0
  299. data/spec/support/constraints.rb +16 -0
  300. data/spec/support/crypt.rb +140 -0
  301. data/spec/support/crypt/corpus/corpus-key-aws.json +33 -0
  302. data/spec/support/crypt/corpus/corpus-key-local.json +31 -0
  303. data/spec/support/crypt/corpus/corpus-schema.json +2057 -0
  304. data/spec/support/crypt/corpus/corpus.json +3657 -0
  305. data/spec/support/crypt/corpus/corpus_encrypted.json +4152 -0
  306. data/spec/support/crypt/data_keys/key_document_aws.json +34 -0
  307. data/spec/support/crypt/data_keys/key_document_local.json +31 -0
  308. data/spec/support/crypt/external/external-key.json +31 -0
  309. data/spec/support/crypt/external/external-schema.json +19 -0
  310. data/spec/support/crypt/limits/limits-doc.json +102 -0
  311. data/spec/support/crypt/limits/limits-key.json +31 -0
  312. data/spec/support/crypt/limits/limits-schema.json +1405 -0
  313. data/spec/support/crypt/schema_maps/schema_map_aws.json +17 -0
  314. data/spec/support/crypt/schema_maps/schema_map_aws_key_alt_names.json +12 -0
  315. data/spec/support/crypt/schema_maps/schema_map_local.json +18 -0
  316. data/spec/support/crypt/schema_maps/schema_map_local_key_alt_names.json +12 -0
  317. data/spec/support/lite_constraints.rb +17 -1
  318. data/spec/support/matchers.rb +19 -0
  319. data/spec/support/shared/protocol.rb +2 -0
  320. data/spec/support/spec_config.rb +43 -13
  321. data/spec/support/utils.rb +132 -10
  322. metadata +277 -81
  323. metadata.gz.sig +0 -0
  324. data/spec/integration/grid_fs_bucket_spec.rb +0 -48
  325. data/spec/integration/zlib_compression_spec.rb +0 -25
  326. data/spec/spec_tests/data/sdam/sharded/single_mongos.yml +0 -33
  327. data/spec/support/connection_string.rb +0 -354
@@ -158,7 +158,7 @@ module Mongo
158
158
  session: session
159
159
  }
160
160
  spec[:write_concern] = write_concern if server.features.collation_enabled?
161
- Operation::CreateIndex.new(spec).execute(server)
161
+ Operation::CreateIndex.new(spec).execute(server, client: client)
162
162
  end
163
163
  end
164
164
 
@@ -236,7 +236,7 @@ module Mongo
236
236
  }
237
237
  server = next_primary(nil, session)
238
238
  spec[:write_concern] = write_concern if server.features.collation_enabled?
239
- Operation::DropIndex.new(spec).execute(server)
239
+ Operation::DropIndex.new(spec).execute(server, client: client)
240
240
  end
241
241
  end
242
242
 
@@ -272,7 +272,7 @@ module Mongo
272
272
  end
273
273
 
274
274
  def send_initial_query(server, session)
275
- initial_query_op(session).execute(server)
275
+ initial_query_op(session).execute(server, client: client)
276
276
  end
277
277
 
278
278
  def with_generated_names(models, server)
@@ -99,7 +99,12 @@ module Mongo
99
99
  address,
100
100
  payload[:request_id],
101
101
  operation_id,
102
- payload[:command],
102
+ # All op_msg payloads have a $db field. Legacy payloads do not
103
+ # have a $db field. To emulate op_msg when publishing command
104
+ # monitoring events for legacy servers, add $db to the payload,
105
+ # copying the database name. Note that the database name is also
106
+ # available as a top-level attribute on the command started event.
107
+ payload[:command].merge('$db' => payload[:database_name]),
103
108
  socket_object_id: socket_object_id,
104
109
  connection_id: connection_id,
105
110
  )
@@ -31,17 +31,20 @@ module Mongo
31
31
  # Execute the operation.
32
32
  #
33
33
  # @example
34
- # operation.execute(server)
34
+ # operation.execute(server, client: nil)
35
35
  #
36
36
  # @param [ Mongo::Server ] server The server to send the operation to.
37
+ # @param [ Mongo::Client ] client The client that will be used to
38
+ # perform auto-encryption if it is necessary to encrypt the command
39
+ # being executed (optional).
37
40
  #
38
41
  # @return [ Mongo::Operation::CollectionsInfo::Result,
39
42
  # Mongo::Operation::ListCollections::Result ] The operation result.
40
43
  #
41
44
  # @since 2.0.0
42
- def execute(server)
45
+ def execute(server, client:)
43
46
  if server.features.list_collections_enabled?
44
- return Operation::ListCollections.new(spec).execute(server)
47
+ return Operation::ListCollections.new(spec).execute(server, client: client)
45
48
  end
46
49
 
47
50
  super
@@ -36,7 +36,7 @@ module Mongo
36
36
  end
37
37
 
38
38
  def message(server)
39
- section = { type: 1, payload: { identifier: IDENTIFIER, sequence: send(IDENTIFIER) } }
39
+ section = Protocol::Msg::Section1.new(IDENTIFIER, send(IDENTIFIER))
40
40
  Protocol::Msg.new(flags, {}, command(server), section)
41
41
  end
42
42
  end
@@ -19,9 +19,12 @@ module Mongo
19
19
  # Execute the operation.
20
20
  #
21
21
  # @example
22
- # operation.execute(server)
22
+ # operation.execute(server, client: nil)
23
23
  #
24
24
  # @param [ Mongo::Server ] server The server to send the operation to.
25
+ # @param [ Mongo::Client ] client The client that will be used to
26
+ # perform auto-encryption if it is necessary to encrypt the command
27
+ # being executed (optional).
25
28
  #
26
29
  # @return [ Mongo::Operation::Find::Result ] The operation result.
27
30
  #
@@ -19,9 +19,12 @@ module Mongo
19
19
  # Execute the operation.
20
20
  #
21
21
  # @example
22
- # operation.execute(server)
22
+ # operation.execute(server, client: nil)
23
23
  #
24
24
  # @param [ Mongo::Server ] server The server to send the operation to.
25
+ # @param [ Mongo::Client ] client The client that will be used to
26
+ # perform auto-encryption if it is necessary to encrypt the command
27
+ # being executed (optional).
25
28
  #
26
29
  # @return [ Mongo::Operation::GetMore::Result ] The operation result.
27
30
  #
@@ -32,8 +32,8 @@ module Mongo
32
32
 
33
33
  private
34
34
 
35
- def get_result(server)
36
- Result.new(dispatch_message(server), @ids)
35
+ def get_result(server, client)
36
+ Result.new(dispatch_message(server, client), @ids)
37
37
  end
38
38
 
39
39
  def selector(server)
@@ -30,8 +30,8 @@ module Mongo
30
30
 
31
31
  private
32
32
 
33
- def get_result(server)
34
- Result.new(dispatch_message(server), @ids)
33
+ def get_result(server, client)
34
+ Result.new(dispatch_message(server, client), @ids)
35
35
  end
36
36
 
37
37
  def selector
@@ -30,9 +30,9 @@ module Mongo
30
30
 
31
31
  private
32
32
 
33
- def get_result(server)
33
+ def get_result(server, client)
34
34
  # This is a Mongo::Operation::Insert::Result
35
- Result.new(dispatch_message(server), @ids)
35
+ Result.new(dispatch_message(server, client), @ids)
36
36
  end
37
37
 
38
38
  def selector(server)
@@ -42,7 +42,7 @@ module Mongo
42
42
  end
43
43
 
44
44
  def message(server)
45
- section = { type: 1, payload: { identifier: IDENTIFIER, sequence: send(IDENTIFIER) } }
45
+ section = Protocol::Msg::Section1.new(IDENTIFIER, send(IDENTIFIER))
46
46
  Protocol::Msg.new(flags, { validating_keys: true }, command(server), section)
47
47
  end
48
48
  end
@@ -18,7 +18,13 @@ require 'mongo/operation/shared/result/use_legacy_error_parser'
18
18
  module Mongo
19
19
  module Operation
20
20
 
21
- # Result wrapper for operations.
21
+ # Result wrapper for wire protocol replies.
22
+ #
23
+ # An operation has zero or one replies. The only operations producing zero
24
+ # replies are unacknowledged writes; all other operations produce one reply.
25
+ # This class provides an object that can be operated on (for example, to
26
+ # check whether an operation succeeded) even when the operation did not
27
+ # produce a reply (in which case it is assumed to have succeeded).
22
28
  #
23
29
  # @since 2.0.0
24
30
  class Result
@@ -67,17 +73,33 @@ module Mongo
67
73
 
68
74
  # Initialize a new result.
69
75
  #
70
- # @example Instantiate the result.
71
- # Result.new(replies)
76
+ # For an unkacknowledged write, pass nil in replies.
72
77
  #
73
- # @param [ Protocol::Reply ] replies The wire protocol replies.
78
+ # For all other operations, replies must be a Protocol::Message instance
79
+ # or an array containing a single Protocol::Message instance.
74
80
  #
75
- # @since 2.0.0
81
+ # @param [ Protocol::Message | Array<Protocol::Message> | nil ] replies
82
+ # The wire protocol replies.
83
+ #
84
+ # @api private
76
85
  def initialize(replies)
77
- @replies = [ *replies ] if replies
86
+ if replies
87
+ if replies.is_a?(Array)
88
+ if replies.length != 1
89
+ raise ArgumentError, "Only one (or zero) reply is supported, given #{replies.length}"
90
+ end
91
+ reply = replies.first
92
+ else
93
+ reply = replies
94
+ end
95
+ unless reply.is_a?(Protocol::Message)
96
+ raise ArgumentError, "Argument must be a Message instance, but is a #{reply.class}: #{reply.inspect}"
97
+ end
98
+ @replies = [ reply ]
99
+ end
78
100
  end
79
101
 
80
- # @return [ Array<Protocol::Reply> ] replies The wrapped wire protocol replies.
102
+ # @return [ Array<Protocol::Message> ] replies The wrapped wire protocol replies.
81
103
  attr_reader :replies
82
104
 
83
105
  # @api private
@@ -99,19 +121,6 @@ module Mongo
99
121
  !!@replies
100
122
  end
101
123
 
102
- # Determine if this result is a collection of multiple replies from the
103
- # server.
104
- #
105
- # @example Is the result for multiple replies?
106
- # result.multiple?
107
- #
108
- # @return [ true, false ] If the result is for multiple replies.
109
- #
110
- # @since 2.0.0
111
- def multiple?
112
- replies.size > 1
113
- end
114
-
115
124
  # Get the cursor id if the response is acknowledged.
116
125
  #
117
126
  # @note Cursor ids of 0 indicate there is no cursor on the server.
@@ -146,7 +155,7 @@ module Mongo
146
155
  # @since 2.0.0
147
156
  def documents
148
157
  if acknowledged?
149
- replies.flat_map{ |reply| reply.documents }
158
+ replies.flat_map(&:documents)
150
159
  else
151
160
  []
152
161
  end
@@ -180,12 +189,12 @@ module Mongo
180
189
  "#<#{self.class.name}:0x#{object_id} documents=#{documents}>"
181
190
  end
182
191
 
183
- # Get the first reply from the result.
192
+ # Get the reply from the result.
184
193
  #
185
- # @example Get the first reply.
186
- # result.reply
194
+ # Returns nil if there is no reply (i.e. the operation was an
195
+ # unacknowledged write).
187
196
  #
188
- # @return [ Protocol::Reply ] The first reply.
197
+ # @return [ Protocol::Message ] The first reply.
189
198
  #
190
199
  # @since 2.0.0
191
200
  def reply
@@ -206,7 +215,7 @@ module Mongo
206
215
  # @since 2.0.0
207
216
  def returned_count
208
217
  if acknowledged?
209
- multiple? ? aggregate_returned_count : reply.number_returned
218
+ reply.number_returned
210
219
  else
211
220
  0
212
221
  end
@@ -308,7 +317,7 @@ module Mongo
308
317
  # @since 2.0.0
309
318
  def written_count
310
319
  if acknowledged?
311
- multiple? ? aggregate_written_count : (first_document[N] || 0)
320
+ first_document[N] || 0
312
321
  else
313
322
  0
314
323
  end
@@ -22,11 +22,11 @@ module Mongo
22
22
 
23
23
  include ResponseHandling
24
24
 
25
- def do_execute(server)
25
+ def do_execute(server, client)
26
26
  unpin_maybe(session) do
27
27
  add_error_labels do
28
28
  add_server_diagnostics(server) do
29
- get_result(server).tap do |result|
29
+ get_result(server, client).tap do |result|
30
30
  process_result(result, server)
31
31
  end
32
32
  end
@@ -34,8 +34,8 @@ module Mongo
34
34
  end
35
35
  end
36
36
 
37
- def execute(server)
38
- do_execute(server).tap do |result|
37
+ def execute(server, client:)
38
+ do_execute(server, client).tap do |result|
39
39
  validate_result(result, server)
40
40
  end
41
41
  end
@@ -46,14 +46,16 @@ module Mongo
46
46
  Result
47
47
  end
48
48
 
49
- def get_result(server)
50
- result_class.new(dispatch_message(server))
49
+ def get_result(server, client)
50
+ result_class.new(dispatch_message(server, client))
51
51
  end
52
52
 
53
53
  # Returns a Protocol::Message or nil
54
- def dispatch_message(server)
54
+ def dispatch_message(server, client)
55
55
  server.with_connection do |connection|
56
- connection.dispatch([ build_message(server) ], operation_id)
56
+ message = build_message(server)
57
+ message = message.maybe_encrypt(server, client)
58
+ connection.dispatch([ message ], operation_id, client)
57
59
  end
58
60
  end
59
61
 
@@ -21,8 +21,8 @@ module Mongo
21
21
  # @api private
22
22
  module ExecutableNoValidate
23
23
 
24
- def execute(server)
25
- do_execute(server)
24
+ def execute(server, client:)
25
+ do_execute(server, client)
26
26
  end
27
27
  end
28
28
  end
@@ -22,9 +22,9 @@ module Mongo
22
22
  module OpMsgOrCommand
23
23
  include PolymorphicLookup
24
24
 
25
- def execute(server)
25
+ def execute(server, client:)
26
26
  operation = final_operation(server)
27
- operation.execute(server)
27
+ operation.execute(server, client: client)
28
28
  end
29
29
 
30
30
  private
@@ -23,9 +23,9 @@ module Mongo
23
23
  module OpMsgOrFindCommand
24
24
  include PolymorphicLookup
25
25
 
26
- def execute(server)
26
+ def execute(server, client:)
27
27
  operation = final_operation(server)
28
- operation.execute(server)
28
+ operation.execute(server, client: client)
29
29
  end
30
30
 
31
31
  private
@@ -23,9 +23,9 @@ module Mongo
23
23
  module OpMsgOrListIndexesCommand
24
24
  include PolymorphicLookup
25
25
 
26
- def execute(server)
26
+ def execute(server, client:)
27
27
  operation = final_operation(server)
28
- operation.execute(server)
28
+ operation.execute(server, client: client)
29
29
  end
30
30
 
31
31
  private
@@ -25,42 +25,49 @@ module Mongo
25
25
  # Execute the operation.
26
26
  #
27
27
  # @example
28
- # operation.execute(server)
28
+ # operation.execute(server, client: nil)
29
29
  #
30
30
  # @param [ Mongo::Server ] server The server to send the operation to.
31
+ # @param [ Mongo::Client ] client The client that will be used to
32
+ # perform auto-encryption if it is necessary to encrypt the command
33
+ # being executed (optional).
31
34
  #
32
35
  # @return [ Mongo::Operation::Result ] The operation result.
33
36
  #
34
37
  # @since 2.5.2
35
- def execute(server)
38
+ def execute(server, client:)
36
39
  validate!
37
- result = if server.features.op_msg_enabled?
38
- self.class::OpMsg.new(spec).execute(server)
40
+ op = if server.features.op_msg_enabled?
41
+ self.class::OpMsg.new(spec)
39
42
  elsif !acknowledged_write?
40
- self.class::Legacy.new(spec).execute(server)
43
+ self.class::Legacy.new(spec)
41
44
  else
42
- self.class::Command.new(spec).execute(server)
45
+ self.class::Command.new(spec)
43
46
  end
47
+ result = op.execute(server, client: client)
44
48
  validate_result(result, server)
45
49
  end
46
50
 
47
51
  # Execute the bulk write operation.
48
52
  #
49
53
  # @example
50
- # operation.bulk_execute(server)
54
+ # operation.bulk_execute(server, client: nil)
51
55
  #
52
56
  # @param [ Mongo::Server ] server The server to send the operation to.
57
+ # @param [ Mongo::Client ] client The client that will be used to
58
+ # perform auto-encryption if it is necessary to encrypt the command
59
+ # being executed (optional).
53
60
  #
54
61
  # @return [ Mongo::Operation::Delete::BulkResult,
55
62
  # Mongo::Operation::Insert::BulkResult,
56
63
  # Mongo::Operation::Update::BulkResult ] The bulk result.
57
64
  #
58
65
  # @since 2.5.2
59
- def bulk_execute(server)
66
+ def bulk_execute(server, client:)
60
67
  if server.features.op_msg_enabled?
61
- self.class::OpMsg.new(spec).execute(server).bulk_result
68
+ self.class::OpMsg.new(spec).execute(server, client: client).bulk_result
62
69
  else
63
- self.class::Command.new(spec).execute(server).bulk_result
70
+ self.class::Command.new(spec).execute(server, client: client).bulk_result
64
71
  end
65
72
  end
66
73
 
@@ -36,7 +36,7 @@ module Mongo
36
36
  end
37
37
 
38
38
  def message(server)
39
- section = { type: 1, payload: { identifier: IDENTIFIER, sequence: send(IDENTIFIER) } }
39
+ section = Protocol::Msg::Section1.new(IDENTIFIER, send(IDENTIFIER))
40
40
  Protocol::Msg.new(flags, {}, command(server), section)
41
41
  end
42
42
  end
@@ -60,15 +60,13 @@ module Mongo
60
60
  @request_id = message.request_id
61
61
  end
62
62
 
63
- # Inflate an OP_COMRESSED message and return the original message.
64
- #
65
- # @example Inflate a compressed message.
66
- # message.inflate!
63
+ # Inflates an OP_COMRESSED message and returns the original message.
67
64
  #
68
65
  # @return [ Protocol::Message ] The inflated message.
69
66
  #
70
67
  # @since 2.5.0
71
- def inflate!
68
+ # @api private
69
+ def maybe_inflate
72
70
  message = Registry.get(@original_op_code).allocate
73
71
  uncompressed_message = Zlib::Inflate.inflate(@compressed_message)
74
72
 
@@ -81,6 +79,9 @@ module Mongo
81
79
  Message.deserialize_field(message, buf, field)
82
80
  end
83
81
  end
82
+ if message.is_a?(Msg)
83
+ message.fix_after_deserialization
84
+ end
84
85
  message
85
86
  end
86
87