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
@@ -126,12 +126,18 @@ module Mongo
126
126
  # information hash per collection, depends on the MongoDB server
127
127
  # version that fulfills the request.
128
128
  #
129
+ # @param [ Hash ] options
130
+ #
131
+ # @option options [ Hash ] :filter A filter on the collections returned.
132
+ # See https://docs.mongodb.com/manual/reference/command/listCollections/
133
+ # for more information and usage.
134
+ #
129
135
  # @return [ Array<Hash> ] Array of information hashes, one for each
130
136
  # collection in the database.
131
137
  #
132
138
  # @since 2.0.5
133
- def list_collections
134
- View.new(self).list_collections
139
+ def list_collections(**options)
140
+ View.new(self).list_collections(**options)
135
141
  end
136
142
 
137
143
  # Get all the non-system collections that belong to this database.
@@ -170,12 +176,13 @@ module Mongo
170
176
 
171
177
  client.send(:with_session, opts) do |session|
172
178
  server = selector.select_server(cluster, nil, session)
173
- Operation::Command.new({
179
+ op = Operation::Command.new(
174
180
  :selector => operation.dup,
175
181
  :db_name => name,
176
182
  :read => selector,
177
183
  :session => session
178
- }).execute(server)
184
+ )
185
+ op.execute(server, client: client)
179
186
  end
180
187
  end
181
188
 
@@ -206,7 +213,7 @@ module Mongo
206
213
  :db_name => name,
207
214
  :read => preference,
208
215
  :session => session
209
- }).execute(server)
216
+ }).execute(server, client: client)
210
217
  end
211
218
  end
212
219
  end
@@ -231,7 +238,7 @@ module Mongo
231
238
  db_name: name,
232
239
  write_concern: write_concern,
233
240
  session: session
234
- }).execute(next_primary(nil, session))
241
+ }).execute(next_primary(nil, session), client: client)
235
242
  end
236
243
  end
237
244
 
@@ -78,12 +78,18 @@ module Mongo
78
78
  # @example Get info on each collection.
79
79
  # database.list_collections
80
80
  #
81
+ # @param [ Hash ] options
82
+ #
83
+ # @option options [ Hash ] :filter A filter on the collections returned.
84
+ # See https://docs.mongodb.com/manual/reference/command/listCollections/
85
+ # for more information and usage.
86
+ #
81
87
  # @return [ Array<Hash> ] Info for each collection in the database.
82
88
  #
83
89
  # @since 2.0.5
84
- def list_collections
90
+ def list_collections(**options)
85
91
  session = client.send(:get_session)
86
- collections_info(session, ServerSelector.primary)
92
+ collections_info(session, ServerSelector.primary, **options)
87
93
  end
88
94
 
89
95
  # Create the new database view.
@@ -157,7 +163,10 @@ module Mongo
157
163
  cursor: batch_size ? { batchSize: batch_size } : {} },
158
164
  db_name: @database.name,
159
165
  session: session
160
- }.tap { |spec| spec[:selector][:nameOnly] = true if options[:name_only] }
166
+ }.tap do |spec|
167
+ spec[:selector][:nameOnly] = true if options[:name_only]
168
+ spec[:selector][:filter] = options[:filter] if options[:filter]
169
+ end
161
170
  end
162
171
 
163
172
  def initial_query_op(session, options = {})
@@ -165,7 +174,7 @@ module Mongo
165
174
  end
166
175
 
167
176
  def send_initial_query(server, session, options = {})
168
- initial_query_op(session, options).execute(server)
177
+ initial_query_op(session, options).execute(server, client: client)
169
178
  end
170
179
  end
171
180
  end
@@ -100,8 +100,15 @@ module Mongo
100
100
  # @see http://bsonspec.org/#/specification
101
101
  #
102
102
  # @since 2.0.0
103
- def from_bson(buffer)
104
- decoded = super
103
+ def from_bson(buffer, **options)
104
+ # bson-ruby 4.8.0 changes #from_bson API to take **options.
105
+ # However older bsons fail if invoked with a plain super here,
106
+ # even if options are empty.
107
+ decoded = if options.empty?
108
+ super(buffer)
109
+ else
110
+ super
111
+ end
105
112
  if ref = decoded[COLLECTION]
106
113
  decoded = DBRef.new(ref, decoded[ID], decoded[DATABASE])
107
114
  end
@@ -152,6 +152,7 @@ require 'mongo/error/change_stream_resumable'
152
152
  require 'mongo/error/bulk_write_error'
153
153
  require 'mongo/error/closed_stream'
154
154
  require 'mongo/error/connection_check_out_timeout'
155
+ require 'mongo/error/crypt_error'
155
156
  require 'mongo/error/extra_file_chunk'
156
157
  require 'mongo/error/file_not_found'
157
158
  require 'mongo/error/operation_failure'
@@ -159,6 +160,7 @@ require 'mongo/error/invalid_address'
159
160
  require 'mongo/error/invalid_bulk_operation'
160
161
  require 'mongo/error/invalid_bulk_operation_type'
161
162
  require 'mongo/error/invalid_collection_name'
163
+ require 'mongo/error/invalid_cursor_operation'
162
164
  require 'mongo/error/invalid_database_name'
163
165
  require 'mongo/error/invalid_document'
164
166
  require 'mongo/error/invalid_file'
@@ -177,10 +179,12 @@ require 'mongo/error/invalid_update_document'
177
179
  require 'mongo/error/invalid_uri'
178
180
  require 'mongo/error/invalid_write_concern'
179
181
  require 'mongo/error/insufficient_iteration_count'
182
+ require 'mongo/error/kms_error'
180
183
  require 'mongo/error/lint_error'
181
184
  require 'mongo/error/max_bson_size'
182
185
  require 'mongo/error/max_message_size'
183
186
  require 'mongo/error/mismatched_domain'
187
+ require 'mongo/error/mongocryptd_spawn_error'
184
188
  require 'mongo/error/multi_index_drop'
185
189
  require 'mongo/error/need_primary_server'
186
190
  require 'mongo/error/no_server_available'
@@ -189,7 +193,7 @@ require 'mongo/error/session_ended'
189
193
  require 'mongo/error/pool_closed_error'
190
194
  require 'mongo/error/socket_error'
191
195
  require 'mongo/error/socket_timeout_error'
192
- require 'mongo/error/failed_stringprep_validation'
196
+ require 'mongo/error/failed_string_prep_validation'
193
197
  require 'mongo/error/unchangeable_collection_option'
194
198
  require 'mongo/error/unexpected_chunk_length'
195
199
  require 'mongo/error/unexpected_response'
@@ -0,0 +1,31 @@
1
+ # Copyright (C) 2020 MongoDB Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module Mongo
16
+ class Error
17
+
18
+ # An error related to client-side encryption.
19
+ class CryptError < Mongo::Error
20
+ # Create a new CryptError
21
+ #
22
+ # @param [ Integer | nil ] code The optional libmongocrypt error code
23
+ # @param [ String ] message The error message
24
+ def initialize(message, code: nil)
25
+ msg = message
26
+ msg += " (libmongocrypt error code #{code})" if code
27
+ super(msg)
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,27 @@
1
+ # Copyright (C) 2019 MongoDB, Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module Mongo
16
+ class Error
17
+
18
+ # Exception raised when an unsupported operation is attempted on a cursor.
19
+ #
20
+ # Examples:
21
+ # - Attempting to iterate a regular cursor more than once.
22
+ # - Attempting to call try_next on a caching cursor after it had been
23
+ # iterated completely the first time.
24
+ class InvalidCursorOperation < Error
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,22 @@
1
+ # Copyright (C) 2020 MongoDB Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module Mongo
16
+ class Error
17
+
18
+ # A KMS-related error during client-side encryption.
19
+ class KmsError < CryptError
20
+ end
21
+ end
22
+ end
@@ -24,16 +24,27 @@ module Mongo
24
24
  # The message is constant.
25
25
  #
26
26
  # @since 2.0.0
27
- MESSAGE = "Document exceeds allowed max BSON size.".freeze
27
+ MESSAGE = "The document exceeds maximum allowed BSON size".freeze
28
28
 
29
29
  # Instantiate the new exception.
30
30
  #
31
31
  # @example Instantiate the exception.
32
32
  # Mongo::Error::MaxBSONSize.new(max)
33
33
  #
34
+ # @param [ String | Numeric ] max_size_or_msg The message to use or
35
+ # the maximum size to insert into the predefined message. The
36
+ # Numeric argument type is deprecated.
37
+ #
34
38
  # @since 2.0.0
35
- def initialize(max_size = nil)
36
- super(max_size ? MESSAGE + " The max is #{max_size}." : MESSAGE)
39
+ def initialize(max_size_or_msg = nil)
40
+ if max_size_or_msg.is_a?(Numeric)
41
+ msg = "#{MESSAGE}. The maximum allowed size is #{max_size_or_msg}"
42
+ elsif max_size_or_msg
43
+ msg = max_size_or_msg
44
+ else
45
+ msg = MESSAGE
46
+ end
47
+ super(msg)
37
48
  end
38
49
  end
39
50
  end
@@ -0,0 +1,22 @@
1
+ # Copyright (C) 2020 MongoDB Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module Mongo
16
+ class Error
17
+
18
+ # An error related to spawning mongocryptd for client-side encryption.
19
+ class MongocryptdSpawnError < CryptError
20
+ end
21
+ end
22
+ end
@@ -32,9 +32,14 @@ module Mongo
32
32
  #
33
33
  # @since 2.0.0
34
34
  def initialize(server_selector, cluster=nil, msg=nil)
35
- msg ||= "No #{server_selector.name} server is available in cluster: #{cluster.summary} " +
36
- "with timeout=#{server_selector.server_selection_timeout}, " +
37
- "LT=#{server_selector.local_threshold}"
35
+ unless msg
36
+ msg = "No #{server_selector.name} server is available"
37
+ if cluster
38
+ msg += " in cluster: #{cluster.summary}"
39
+ end
40
+ msg += " with timeout=#{server_selector.server_selection_timeout}, " +
41
+ "LT=#{server_selector.local_threshold}"
42
+ end
38
43
 
39
44
  super(msg)
40
45
  end
@@ -39,6 +39,7 @@ module Mongo
39
39
  {:code_name => 'HostUnreachable', :code => 6},
40
40
  {:code_name => 'NetworkTimeout', :code => 89},
41
41
  {:code_name => 'SocketException', :code => 9001},
42
+ {:code_name => 'ExceededTimeLimit', :code => 262}
42
43
  ].freeze
43
44
 
44
45
  # These are magic error messages that could indicate a master change.
@@ -104,11 +104,6 @@ module Mongo
104
104
  # chunk objects and assemble the data. If we have an IO object, then
105
105
  # it's the original file data and we must split it into chunks and set
106
106
  # the original data itself.
107
- #
108
- # @param [ IO, String, Array<BSON::Document> ] value The file object,
109
- # file contents or chunk documents.
110
- #
111
- # @return [ Array<Grid::File::Chunk> ] Array of chunks.
112
107
  def initialize_chunks!(value)
113
108
  if value.is_a?(Array)
114
109
  @chunks = value.map{ |doc| Chunk.new(doc) }
@@ -151,7 +151,6 @@ module Mongo
151
151
  # @return [ String ] The assembled data.
152
152
  #
153
153
  # @since 2.0.0
154
- # @api private
155
154
  def assemble(chunks)
156
155
  chunks.reduce(''){ |data, chunk| data << chunk.data.data }
157
156
  end
@@ -168,7 +167,6 @@ module Mongo
168
167
  # @return [ Array<Chunk> ] The chunks of the data.
169
168
  #
170
169
  # @since 2.0.0
171
- # @api private
172
170
  def split(io, file_info, offset = 0)
173
171
  io = StringIO.new(io) if io.is_a?(String)
174
172
  parts = Enumerator.new { |y| y << io.read(file_info.chunk_size) until io.eof? }
@@ -254,7 +254,8 @@ module Mongo
254
254
  BSON::Document.new(
255
255
  :_id => BSON::ObjectId.new,
256
256
  :chunkSize => Chunk::DEFAULT_SIZE,
257
- :uploadDate => Time.now.utc,
257
+ # MongoDB stores times with millisecond precision
258
+ :uploadDate => Time.now.utc.round(3),
258
259
  :contentType => DEFAULT_CONTENT_TYPE
259
260
  )
260
261
  end
@@ -177,7 +177,7 @@ module Mongo
177
177
  #
178
178
  # @since 2.0.0
179
179
  def prefix
180
- @options[:fs_name] || @options[:bucket_name] || DEFAULT_ROOT
180
+ @options[:fs_name] || @options[:bucket_name]|| DEFAULT_ROOT
181
181
  end
182
182
 
183
183
  # Remove a single file from the GridFS.
@@ -230,8 +230,7 @@ module Mongo
230
230
  #
231
231
  # @since 2.1.0
232
232
  def open_download_stream(id, options = nil)
233
- options = Hash[(options || {}).map { |k, v| [k.to_sym, v] }]
234
- read_stream(id, **options).tap do |stream|
233
+ read_stream(id, options).tap do |stream|
235
234
  if block_given?
236
235
  begin
237
236
  yield stream
@@ -349,15 +348,15 @@ module Mongo
349
348
  download_to_stream(open_download_stream_by_name(filename, opts).file_id, io)
350
349
  end
351
350
 
352
- # Opens an upload stream to GridFS to which the contents of a file or
353
- # blob can be written.
351
+ # Opens an upload stream to GridFS to which the contents of a user file came be written.
354
352
  #
355
- # @param [ String ] filename The name of the file in GridFS.
353
+ # @example Open a stream to which the contents of a file came be written.
354
+ # fs.open_upload_stream('a-file.txt')
355
+ #
356
+ # @param [ String ] filename The filename of the file to upload.
356
357
  # @param [ Hash ] opts The options for the write stream.
357
358
  #
358
- # @option opts [ Object ] :file_id An optional unique file id.
359
- # A BSON::ObjectId is automatically generated if a file id is not
360
- # provided.
359
+ # @option opts [ Object ] :file_id An optional unique file id. An ObjectId is generated otherwise.
361
360
  # @option opts [ Integer ] :chunk_size Override the default chunk size.
362
361
  # @option opts [ Hash ] :metadata User data for the 'metadata' field of the files
363
362
  # collection document.
@@ -376,8 +375,7 @@ module Mongo
376
375
  #
377
376
  # @since 2.1.0
378
377
  def open_upload_stream(filename, opts = {})
379
- opts = Hash[opts.map { |k, v| [k.to_sym, v] }]
380
- write_stream(filename, **opts).tap do |stream|
378
+ write_stream(filename, opts).tap do |stream|
381
379
  if block_given?
382
380
  begin
383
381
  yield stream
@@ -464,12 +462,12 @@ module Mongo
464
462
  #
465
463
  # @option opts [ BSON::Document ] :file_info_doc For internal
466
464
  # driver use only. A BSON document to use as file information.
467
- def read_stream(id, **opts)
468
- Stream.get(self, Stream::READ_MODE, { file_id: id }.update(options).update(opts))
465
+ def read_stream(id, opts = nil)
466
+ Stream.get(self, Stream::READ_MODE, { file_id: id }.update(options).update(opts || {}))
469
467
  end
470
468
 
471
- def write_stream(filename, **opts)
472
- Stream.get(self, Stream::WRITE_MODE, { filename: filename }.update(options).update(opts))
469
+ def write_stream(filename, opts)
470
+ Stream.get(self, Stream::WRITE_MODE, { filename: filename }.merge!(options).merge!(opts))
473
471
  end
474
472
 
475
473
  def chunks_name
@@ -82,12 +82,12 @@ module Mongo
82
82
  @open = true
83
83
  end
84
84
 
85
- # Write to the GridFS bucket from the source stream or a string.
85
+ # Write to the GridFS bucket from the source stream.
86
86
  #
87
87
  # @example Write to GridFS.
88
88
  # stream.write(io)
89
89
  #
90
- # @param [ String | IO ] io The string or IO object to upload from.
90
+ # @param [ IO ] io The source io stream to upload from.
91
91
  #
92
92
  # @return [ Stream::Write ] self The write stream itself.
93
93
  #
@@ -95,13 +95,7 @@ module Mongo
95
95
  def write(io)
96
96
  ensure_open!
97
97
  @indexes ||= ensure_indexes!
98
- @length += if io.respond_to?(:bytesize)
99
- # String objects
100
- io.bytesize
101
- else
102
- # IO objects
103
- io.size
104
- end
98
+ @length += io.size
105
99
  chunks = File::Chunk.split(io, file_info, @n)
106
100
  @n += chunks.size
107
101
  chunks_collection.insert_many(chunks) unless chunks.empty?