mongo 2.1.0.beta → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (342) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +10 -3
  4. data/Rakefile +1 -7
  5. data/lib/mongo/address/ipv4.rb +6 -1
  6. data/lib/mongo/address/unix.rb +2 -2
  7. data/lib/mongo/address.rb +32 -10
  8. data/lib/mongo/auth/cr/conversation.rb +1 -1
  9. data/lib/mongo/auth/ldap/conversation.rb +7 -3
  10. data/lib/mongo/auth/scram/conversation.rb +9 -3
  11. data/lib/mongo/auth/user/view.rb +23 -2
  12. data/lib/mongo/auth/x509/conversation.rb +1 -1
  13. data/lib/mongo/bulk_write/combineable.rb +51 -0
  14. data/lib/mongo/bulk_write/ordered_combiner.rb +55 -0
  15. data/lib/mongo/bulk_write/result.rb +61 -8
  16. data/lib/mongo/bulk_write/result_combiner.rb +117 -0
  17. data/lib/mongo/bulk_write/transformable.rb +132 -0
  18. data/lib/mongo/bulk_write/unordered_combiner.rb +52 -0
  19. data/lib/mongo/bulk_write/validatable.rb +62 -0
  20. data/lib/mongo/bulk_write.rb +164 -23
  21. data/lib/mongo/client.rb +75 -18
  22. data/lib/mongo/cluster/topology/replica_set.rb +8 -6
  23. data/lib/mongo/cluster/topology/unknown.rb +5 -2
  24. data/lib/mongo/cluster.rb +85 -5
  25. data/lib/mongo/collection/view/aggregation.rb +19 -45
  26. data/lib/mongo/collection/view/builder/aggregation.rb +98 -0
  27. data/lib/mongo/collection/view/builder/find_command.rb +111 -0
  28. data/lib/mongo/collection/view/builder/flags.rb +62 -0
  29. data/lib/mongo/collection/view/builder/map_reduce.rb +134 -0
  30. data/lib/mongo/collection/view/builder/modifiers.rb +80 -0
  31. data/lib/mongo/collection/view/builder/op_query.rb +83 -0
  32. data/lib/mongo/collection/view/builder.rb +20 -0
  33. data/lib/mongo/collection/view/explainable.rb +15 -0
  34. data/lib/mongo/collection/view/immutable.rb +4 -11
  35. data/lib/mongo/collection/view/iterable.rb +40 -5
  36. data/lib/mongo/collection/view/map_reduce.rb +67 -37
  37. data/lib/mongo/collection/view/readable.rb +114 -100
  38. data/lib/mongo/collection/view/writable.rb +46 -22
  39. data/lib/mongo/collection/view.rb +25 -22
  40. data/lib/mongo/collection.rb +130 -12
  41. data/lib/mongo/cursor/builder/get_more_command.rb +71 -0
  42. data/lib/mongo/cursor/builder/kill_cursors_command.rb +62 -0
  43. data/lib/mongo/cursor/builder/op_get_more.rb +61 -0
  44. data/lib/mongo/cursor/builder/op_kill_cursors.rb +56 -0
  45. data/lib/mongo/cursor/builder.rb +18 -0
  46. data/lib/mongo/cursor.rb +76 -21
  47. data/lib/mongo/database/view.rb +11 -6
  48. data/lib/mongo/database.rb +16 -6
  49. data/lib/mongo/dbref.rb +9 -9
  50. data/lib/mongo/{bulk_write/unordered_bulk_write.rb → error/closed_stream.rb} +12 -21
  51. data/lib/mongo/{bulk_write/ordered_bulk_write.rb → error/extra_file_chunk.rb} +13 -27
  52. data/lib/mongo/error/file_not_found.rb +37 -0
  53. data/lib/mongo/error/invalid_file.rb +2 -2
  54. data/lib/mongo/error/invalid_file_revision.rb +37 -0
  55. data/lib/mongo/error/invalid_uri.rb +5 -4
  56. data/lib/mongo/error/invalid_write_concern.rb +35 -0
  57. data/lib/mongo/error/missing_file_chunk.rb +38 -0
  58. data/lib/mongo/error/operation_failure.rb +33 -2
  59. data/lib/mongo/error/unchangeable_collection_option.rb +38 -0
  60. data/lib/mongo/error/unexpected_chunk_length.rb +39 -0
  61. data/lib/mongo/error.rb +8 -0
  62. data/lib/mongo/grid/file/chunk.rb +9 -9
  63. data/lib/mongo/grid/file/{metadata.rb → info.rb} +41 -39
  64. data/lib/mongo/grid/file.rb +12 -9
  65. data/lib/mongo/grid/fs_bucket.rb +448 -0
  66. data/lib/mongo/grid/stream/read.rb +208 -0
  67. data/lib/mongo/grid/stream/write.rb +187 -0
  68. data/lib/mongo/grid/stream.rb +64 -0
  69. data/lib/mongo/grid.rb +2 -1
  70. data/lib/mongo/index/view.rb +7 -4
  71. data/lib/mongo/index.rb +5 -0
  72. data/lib/mongo/loggable.rb +34 -57
  73. data/lib/mongo/logger.rb +16 -78
  74. data/lib/mongo/monitoring/command_log_subscriber.rb +38 -14
  75. data/lib/mongo/monitoring/event/command_started.rb +2 -1
  76. data/lib/mongo/monitoring/event/command_succeeded.rb +24 -2
  77. data/lib/mongo/monitoring/event/secure.rb +58 -0
  78. data/lib/mongo/monitoring/event.rb +1 -0
  79. data/lib/mongo/monitoring/publishable.rb +22 -12
  80. data/lib/mongo/monitoring.rb +1 -5
  81. data/lib/mongo/operation/commands/aggregate/result.rb +89 -0
  82. data/lib/mongo/operation/commands/aggregate.rb +64 -0
  83. data/lib/mongo/operation/commands/collections_info/result.rb +41 -0
  84. data/lib/mongo/operation/{read → commands}/collections_info.rb +5 -3
  85. data/lib/mongo/operation/commands/command.rb +47 -0
  86. data/lib/mongo/operation/commands/find/result.rb +62 -0
  87. data/lib/mongo/operation/commands/find.rb +27 -0
  88. data/lib/mongo/operation/commands/get_more/result.rb +62 -0
  89. data/lib/mongo/operation/commands/get_more.rb +27 -0
  90. data/lib/mongo/operation/{read → commands}/indexes.rb +9 -6
  91. data/lib/mongo/operation/{list_collections → commands/list_collections}/result.rb +1 -21
  92. data/lib/mongo/operation/{read → commands}/list_collections.rb +4 -32
  93. data/lib/mongo/operation/{list_indexes → commands/list_indexes}/result.rb +1 -21
  94. data/lib/mongo/operation/{read → commands}/list_indexes.rb +3 -33
  95. data/lib/mongo/operation/commands/map_reduce/result.rb +119 -0
  96. data/lib/mongo/operation/commands/map_reduce.rb +49 -0
  97. data/lib/mongo/operation/commands/parallel_scan/result.rb +64 -0
  98. data/lib/mongo/operation/commands/parallel_scan.rb +52 -0
  99. data/lib/mongo/operation/commands/user_query.rb +71 -0
  100. data/lib/mongo/operation/commands/users_info/result.rb +38 -0
  101. data/lib/mongo/operation/commands/users_info.rb +48 -0
  102. data/lib/mongo/operation/commands.rb +26 -0
  103. data/lib/mongo/operation/executable.rb +4 -68
  104. data/lib/mongo/operation/kill_cursors.rb +3 -3
  105. data/lib/mongo/operation/object_id_generator.rb +36 -0
  106. data/lib/mongo/operation/read/get_more.rb +2 -22
  107. data/lib/mongo/operation/read/query/result.rb +40 -0
  108. data/lib/mongo/operation/read/query.rb +4 -21
  109. data/lib/mongo/operation/read.rb +0 -4
  110. data/lib/mongo/operation/{read_preferrable.rb → read_preference.rb} +3 -2
  111. data/lib/mongo/operation/result.rb +43 -1
  112. data/lib/mongo/operation/specifiable.rb +59 -1
  113. data/lib/mongo/operation/write/bulk/bulkable.rb +83 -0
  114. data/lib/mongo/operation/write/bulk/delete/result.rb +67 -0
  115. data/lib/mongo/operation/write/bulk/delete.rb +71 -0
  116. data/lib/mongo/operation/write/bulk/insert/result.rb +129 -0
  117. data/lib/mongo/operation/write/bulk/insert.rb +96 -0
  118. data/lib/mongo/operation/write/bulk/legacy_mergable.rb +87 -0
  119. data/lib/mongo/operation/write/bulk/mergable.rb +71 -0
  120. data/lib/mongo/operation/write/bulk/update/result.rb +174 -0
  121. data/lib/mongo/operation/write/bulk/update.rb +81 -0
  122. data/lib/mongo/operation/write/bulk.rb +6 -3
  123. data/lib/mongo/operation/write/command/create_index.rb +0 -1
  124. data/lib/mongo/operation/write/command/create_user.rb +0 -1
  125. data/lib/mongo/operation/write/command/delete.rb +3 -3
  126. data/lib/mongo/operation/write/command/drop_index.rb +0 -1
  127. data/lib/mongo/operation/write/command/insert.rb +4 -3
  128. data/lib/mongo/operation/write/command/remove_user.rb +0 -1
  129. data/lib/mongo/operation/write/command/update.rb +6 -4
  130. data/lib/mongo/operation/write/command/update_user.rb +0 -1
  131. data/lib/mongo/operation/write/command/writable.rb +13 -18
  132. data/lib/mongo/operation/write/create_index.rb +4 -27
  133. data/lib/mongo/operation/write/create_user.rb +4 -30
  134. data/lib/mongo/operation/write/delete.rb +6 -29
  135. data/lib/mongo/operation/write/drop_index.rb +3 -3
  136. data/lib/mongo/operation/write/gle.rb +49 -0
  137. data/lib/mongo/operation/write/idable.rb +24 -2
  138. data/lib/mongo/operation/write/insert.rb +2 -24
  139. data/lib/mongo/operation/write/remove_user.rb +4 -27
  140. data/lib/mongo/operation/write/update.rb +13 -36
  141. data/lib/mongo/operation/write/update_user.rb +4 -30
  142. data/lib/mongo/operation/write/write_command_enabled.rb +53 -0
  143. data/lib/mongo/operation/write.rb +2 -0
  144. data/lib/mongo/operation.rb +33 -5
  145. data/lib/mongo/options/mapper.rb +26 -2
  146. data/lib/mongo/options/redacted.rb +156 -0
  147. data/lib/mongo/options.rb +1 -0
  148. data/lib/mongo/protocol/bit_vector.rb +11 -9
  149. data/lib/mongo/protocol/delete.rb +78 -3
  150. data/lib/mongo/protocol/get_more.rb +59 -2
  151. data/lib/mongo/protocol/insert.rb +73 -1
  152. data/lib/mongo/protocol/kill_cursors.rb +66 -4
  153. data/lib/mongo/protocol/message.rb +44 -20
  154. data/lib/mongo/protocol/query.rb +153 -65
  155. data/lib/mongo/protocol/reply.rb +92 -1
  156. data/lib/mongo/protocol/serializers.rb +49 -40
  157. data/lib/mongo/protocol/update.rb +93 -1
  158. data/lib/mongo/retryable.rb +101 -0
  159. data/lib/mongo/server/connectable.rb +28 -8
  160. data/lib/mongo/server/connection.rb +52 -10
  161. data/lib/mongo/server/connection_pool/queue.rb +15 -0
  162. data/lib/mongo/server/connection_pool.rb +12 -15
  163. data/lib/mongo/server/description/features.rb +4 -2
  164. data/lib/mongo/server/description.rb +39 -3
  165. data/lib/mongo/server/monitor/connection.rb +49 -28
  166. data/lib/mongo/server/monitor.rb +3 -14
  167. data/lib/mongo/server.rb +31 -4
  168. data/lib/mongo/server_selector/selectable.rb +58 -32
  169. data/lib/mongo/server_selector.rb +19 -10
  170. data/lib/mongo/socket/ssl.rb +4 -1
  171. data/lib/mongo/socket/tcp.rb +2 -2
  172. data/lib/mongo/socket/unix.rb +5 -8
  173. data/lib/mongo/socket.rb +11 -4
  174. data/lib/mongo/uri.rb +245 -139
  175. data/lib/mongo/version.rb +1 -1
  176. data/lib/mongo/write_concern.rb +21 -6
  177. data/lib/mongo.rb +4 -4
  178. data/mongo.gemspec +1 -2
  179. data/spec/mongo/address/unix_spec.rb +1 -1
  180. data/spec/mongo/address_spec.rb +25 -0
  181. data/spec/mongo/auth/ldap/conversation_spec.rb +43 -0
  182. data/spec/mongo/auth/user/view_spec.rb +26 -1
  183. data/spec/mongo/bulk_write/ordered_combiner_spec.rb +284 -0
  184. data/spec/mongo/bulk_write/unordered_combiner_spec.rb +239 -0
  185. data/spec/mongo/bulk_write_spec.rb +385 -161
  186. data/spec/mongo/client_spec.rb +193 -23
  187. data/spec/mongo/cluster/topology/replica_set_spec.rb +2 -0
  188. data/spec/mongo/collection/view/aggregation_spec.rb +65 -0
  189. data/spec/mongo/collection/view/builder/find_command_spec.rb +167 -0
  190. data/spec/mongo/collection/view/builder/flags_spec.rb +106 -0
  191. data/spec/mongo/collection/view/builder/modifiers_spec.rb +210 -0
  192. data/spec/mongo/collection/view/builder/op_query_spec.rb +154 -0
  193. data/spec/mongo/collection/view/explainable_spec.rb +1 -2
  194. data/spec/mongo/collection/view/immutable_spec.rb +54 -0
  195. data/spec/mongo/collection/view/map_reduce_spec.rb +104 -9
  196. data/spec/mongo/collection/view/readable_spec.rb +109 -112
  197. data/spec/mongo/collection/view_spec.rb +119 -487
  198. data/spec/mongo/collection_spec.rb +1002 -33
  199. data/spec/mongo/command_monitoring_spec.rb +64 -0
  200. data/spec/mongo/connection_string_spec.rb +115 -0
  201. data/spec/mongo/cursor/builder/get_more_command_spec.rb +160 -0
  202. data/spec/mongo/cursor/builder/op_get_more_spec.rb +52 -0
  203. data/spec/mongo/cursor_spec.rb +10 -60
  204. data/spec/mongo/database_spec.rb +81 -12
  205. data/spec/mongo/dbref_spec.rb +4 -4
  206. data/spec/mongo/grid/file/chunk_spec.rb +6 -6
  207. data/spec/mongo/grid/file/{metadata_spec.rb → info_spec.rb} +29 -17
  208. data/spec/mongo/grid/file_spec.rb +8 -8
  209. data/spec/mongo/grid/fs_bucket_spec.rb +1020 -0
  210. data/spec/mongo/grid/stream/read_spec.rb +275 -0
  211. data/spec/mongo/grid/stream/write_spec.rb +440 -0
  212. data/spec/mongo/grid/stream_spec.rb +48 -0
  213. data/spec/mongo/gridfs_spec.rb +50 -0
  214. data/spec/mongo/index/view_spec.rb +41 -0
  215. data/spec/mongo/logger_spec.rb +0 -40
  216. data/spec/mongo/monitoring/command_log_subscriber_spec.rb +76 -0
  217. data/spec/mongo/monitoring/event/command_started_spec.rb +26 -0
  218. data/spec/mongo/monitoring/event/command_succeeded_spec.rb +26 -0
  219. data/spec/mongo/monitoring/event/secure_spec.rb +57 -0
  220. data/spec/mongo/operation/{aggregate → commands/aggregate}/result_spec.rb +1 -1
  221. data/spec/mongo/operation/commands/aggregate_spec.rb +69 -0
  222. data/spec/mongo/operation/{read → commands}/collections_info_spec.rb +1 -1
  223. data/spec/mongo/operation/{command_spec.rb → commands/command_spec.rb} +1 -19
  224. data/spec/mongo/operation/{read → commands}/indexes_spec.rb +1 -1
  225. data/spec/mongo/operation/{map_reduce_spec.rb → commands/map_reduce_spec.rb} +1 -19
  226. data/spec/mongo/operation/kill_cursors_spec.rb +1 -17
  227. data/spec/mongo/operation/read/get_more_spec.rb +0 -16
  228. data/spec/mongo/operation/read/query_spec.rb +19 -16
  229. data/spec/mongo/operation/{read_preferrable_spec.rb → read_preference_spec.rb} +11 -11
  230. data/spec/mongo/operation/result_spec.rb +19 -0
  231. data/spec/mongo/operation/write/bulk/{bulk_delete_spec.rb → delete_spec.rb} +17 -28
  232. data/spec/mongo/operation/write/bulk/{bulk_insert_spec.rb → insert_spec.rb} +1 -12
  233. data/spec/mongo/operation/write/bulk/{bulk_update_spec.rb → update_spec.rb} +7 -18
  234. data/spec/mongo/operation/write/command/delete_spec.rb +18 -9
  235. data/spec/mongo/operation/write/command/insert_spec.rb +18 -9
  236. data/spec/mongo/operation/write/command/update_spec.rb +18 -9
  237. data/spec/mongo/operation/write/delete_spec.rb +3 -3
  238. data/spec/mongo/operation/write/insert_spec.rb +0 -11
  239. data/spec/mongo/operation/write/update_spec.rb +6 -6
  240. data/spec/mongo/options/redacted_spec.rb +350 -0
  241. data/spec/mongo/protocol/delete_spec.rb +4 -4
  242. data/spec/mongo/protocol/get_more_spec.rb +4 -4
  243. data/spec/mongo/protocol/insert_spec.rb +3 -3
  244. data/spec/mongo/protocol/kill_cursors_spec.rb +8 -6
  245. data/spec/mongo/protocol/query_spec.rb +21 -7
  246. data/spec/mongo/protocol/update_spec.rb +5 -5
  247. data/spec/mongo/retryable_spec.rb +221 -0
  248. data/spec/mongo/server/connection_pool/queue_spec.rb +16 -0
  249. data/spec/mongo/server/connection_pool_spec.rb +42 -6
  250. data/spec/mongo/server/connection_spec.rb +86 -1
  251. data/spec/mongo/server/description/features_spec.rb +25 -0
  252. data/spec/mongo/server/description_spec.rb +42 -0
  253. data/spec/mongo/server/monitor_spec.rb +44 -0
  254. data/spec/mongo/server_discovery_and_monitoring_spec.rb +25 -59
  255. data/spec/mongo/server_selection_rtt_spec.rb +37 -57
  256. data/spec/mongo/server_selection_spec.rb +5 -3
  257. data/spec/mongo/server_selector/nearest_spec.rb +35 -27
  258. data/spec/mongo/server_selector/primary_preferred_spec.rb +32 -30
  259. data/spec/mongo/server_selector/primary_spec.rb +21 -14
  260. data/spec/mongo/server_selector/secondary_preferred_spec.rb +28 -26
  261. data/spec/mongo/server_selector/secondary_spec.rb +24 -22
  262. data/spec/mongo/server_selector_spec.rb +87 -24
  263. data/spec/mongo/server_spec.rb +78 -15
  264. data/spec/mongo/socket/ssl_spec.rb +101 -57
  265. data/spec/mongo/socket/unix_spec.rb +52 -0
  266. data/spec/mongo/uri_spec.rb +271 -59
  267. data/spec/mongo/write_concern_spec.rb +126 -0
  268. data/spec/spec_helper.rb +29 -23
  269. data/spec/support/authorization.rb +4 -5
  270. data/spec/support/command_monitoring/bulkWrite.yml +73 -0
  271. data/spec/support/command_monitoring/command.yml +42 -0
  272. data/spec/support/command_monitoring/deleteMany.yml +55 -0
  273. data/spec/support/command_monitoring/deleteOne.yml +55 -0
  274. data/spec/support/command_monitoring/find.yml +268 -0
  275. data/spec/support/command_monitoring/insertMany.yml +81 -0
  276. data/spec/support/command_monitoring/insertOne.yml +51 -0
  277. data/spec/support/command_monitoring/updateMany.yml +67 -0
  278. data/spec/support/command_monitoring/updateOne.yml +95 -0
  279. data/spec/support/command_monitoring.rb +373 -0
  280. data/spec/support/connection_string.rb +228 -0
  281. data/spec/support/connection_string_tests/invalid-uris.yml +193 -0
  282. data/spec/support/connection_string_tests/valid-auth.yml +256 -0
  283. data/spec/support/connection_string_tests/valid-host_identifiers.yml +121 -0
  284. data/spec/support/connection_string_tests/valid-options.yml +30 -0
  285. data/spec/support/connection_string_tests/valid-unix_socket-absolute.yml +197 -0
  286. data/spec/support/connection_string_tests/valid-unix_socket-relative.yml +213 -0
  287. data/spec/support/connection_string_tests/valid-warnings.yml +55 -0
  288. data/spec/support/crud/read.rb +14 -10
  289. data/spec/support/crud/write.rb +36 -9
  290. data/spec/support/crud.rb +10 -2
  291. data/spec/support/gridfs.rb +637 -0
  292. data/spec/support/gridfs_tests/delete.yml +157 -0
  293. data/spec/support/gridfs_tests/download.yml +210 -0
  294. data/spec/support/gridfs_tests/download_by_name.yml +113 -0
  295. data/spec/support/gridfs_tests/upload.yml +158 -0
  296. data/spec/support/matchers.rb +2 -2
  297. data/spec/support/sdam/rs/equal_electionids.yml +1 -2
  298. data/spec/support/sdam/rs/new_primary_new_electionid.yml +0 -3
  299. data/spec/support/sdam/rs/primary_mismatched_me.yml +37 -0
  300. data/spec/support/sdam/rs/primary_to_no_primary_mismatched_me.yml +75 -0
  301. data/spec/support/sdam/rs/rsother_discovered.yml +24 -3
  302. data/spec/support/sdam/rs/secondary_mismatched_me.yml +37 -0
  303. data/spec/support/sdam/rs/stepdown_change_set_name.yml +59 -0
  304. data/spec/support/sdam/single/direct_connection_rsarbiter.yml +1 -1
  305. data/spec/support/sdam/single/direct_connection_rsprimary.yml +1 -1
  306. data/spec/support/sdam/single/direct_connection_rssecondary.yml +1 -1
  307. data/spec/support/sdam/single/direct_connection_slave.yml +1 -1
  308. data/spec/support/sdam/single/direct_connection_standalone.yml +1 -1
  309. data/spec/support/sdam/single/not_ok_response.yml +0 -1
  310. data/spec/support/server_discovery_and_monitoring.rb +3 -1
  311. data/spec/support/server_selection.rb +3 -1
  312. data/spec/support/shared/bulk_write.rb +192 -0
  313. data/spec/support/shared/protocol.rb +5 -5
  314. data/spec/support/shared/server_selector.rb +78 -13
  315. data/spec/support/travis.rb +1 -1
  316. data.tar.gz.sig +0 -0
  317. metadata +211 -72
  318. metadata.gz.sig +0 -0
  319. data/lib/mongo/bulk_write/bulk_writable.rb +0 -252
  320. data/lib/mongo/bulk_write/deletable.rb +0 -57
  321. data/lib/mongo/bulk_write/insertable.rb +0 -49
  322. data/lib/mongo/bulk_write/replacable.rb +0 -58
  323. data/lib/mongo/bulk_write/updatable.rb +0 -69
  324. data/lib/mongo/grid/fs.rb +0 -146
  325. data/lib/mongo/operation/aggregate/result.rb +0 -103
  326. data/lib/mongo/operation/aggregate.rb +0 -108
  327. data/lib/mongo/operation/command.rb +0 -61
  328. data/lib/mongo/operation/map_reduce/result.rb +0 -122
  329. data/lib/mongo/operation/map_reduce.rb +0 -95
  330. data/lib/mongo/operation/parallel_scan/result.rb +0 -72
  331. data/lib/mongo/operation/parallel_scan.rb +0 -76
  332. data/lib/mongo/operation/write/bulk/bulk_delete/result.rb +0 -75
  333. data/lib/mongo/operation/write/bulk/bulk_delete.rb +0 -145
  334. data/lib/mongo/operation/write/bulk/bulk_insert/result.rb +0 -130
  335. data/lib/mongo/operation/write/bulk/bulk_insert.rb +0 -132
  336. data/lib/mongo/operation/write/bulk/bulk_mergable.rb +0 -67
  337. data/lib/mongo/operation/write/bulk/bulk_update/result.rb +0 -174
  338. data/lib/mongo/operation/write/bulk/bulk_update.rb +0 -154
  339. data/lib/mongo/operation/write/bulk/legacy_bulk_mergable.rb +0 -83
  340. data/spec/mongo/grid/fs_spec.rb +0 -160
  341. data/spec/mongo/loggable_spec.rb +0 -63
  342. data/spec/mongo/operation/aggregate_spec.rb +0 -127
@@ -16,11 +16,39 @@ require 'mongo/operation/result'
16
16
  require 'mongo/operation/executable'
17
17
  require 'mongo/operation/specifiable'
18
18
  require 'mongo/operation/limited'
19
- require 'mongo/operation/read_preferrable'
19
+ require 'mongo/operation/object_id_generator'
20
+ require 'mongo/operation/read_preference'
20
21
  require 'mongo/operation/read'
21
22
  require 'mongo/operation/write'
22
- require 'mongo/operation/aggregate'
23
- require 'mongo/operation/command'
23
+ require 'mongo/operation/commands'
24
24
  require 'mongo/operation/kill_cursors'
25
- require 'mongo/operation/map_reduce'
26
- require 'mongo/operation/parallel_scan'
25
+
26
+ module Mongo
27
+ module Operation
28
+
29
+ # The q field constant.
30
+ #
31
+ # @since 2.1.0
32
+ Q = 'q'.freeze
33
+
34
+ # The u field constant.
35
+ #
36
+ # @since 2.1.0
37
+ U = 'u'.freeze
38
+
39
+ # The limit field constant.
40
+ #
41
+ # @since 2.1.0
42
+ LIMIT = 'limit'.freeze
43
+
44
+ # The multi field constant.
45
+ #
46
+ # @since 2.1.0
47
+ MULTI = 'multi'.freeze
48
+
49
+ # The upsert field constant.
50
+ #
51
+ # @since 2.1.0
52
+ UPSERT = 'upsert'.freeze
53
+ end
54
+ end
@@ -34,8 +34,32 @@ module Mongo
34
34
  #
35
35
  # @since 2.0.0
36
36
  def transform(options, mappings)
37
- options.reduce({}) do |transformed, (key, value)|
38
- transformed[mappings[key] || key] = value
37
+ map = transform_keys_to_strings(mappings)
38
+ opts = transform_keys_to_strings(options)
39
+ opts.reduce({}) do |transformed, (key, value)|
40
+ transformed[map[key]] = value if map[key]
41
+ transformed
42
+ end
43
+ end
44
+
45
+ # Transforms the provided options to a new set of options given the
46
+ # provided mapping. Expects BSON::Documents in and out so no explicit
47
+ # string conversion needs to happen.
48
+ #
49
+ # @example Transform the options.
50
+ # Mapper.transform_documents({ name: 1 }, { :name => :nombre })
51
+ #
52
+ # @param [ BSON::Document ] options The options to transform
53
+ # @param [ BSON::Document ] mappings The key mappings.
54
+ # @param [ BSON::Document ] document The output document.
55
+ #
56
+ # @return [ BSON::Document ] The transformed options.
57
+ #
58
+ # @since 2.0.0
59
+ def transform_documents(options, mappings, document = BSON::Document.new)
60
+ options.reduce(document) do |transformed, (key, value)|
61
+ name = mappings[key]
62
+ transformed[name] = value if name && !value.nil?
39
63
  transformed
40
64
  end
41
65
  end
@@ -0,0 +1,156 @@
1
+ # Copyright (C) 2015 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
+ module Options
17
+
18
+ # Class for wrapping options that could be sensitive.
19
+ # When printed, the sensitive values will be redacted.
20
+ #
21
+ # @since 2.1.0
22
+ class Redacted < BSON::Document
23
+
24
+ # The options whose values will be redacted.
25
+ #
26
+ # @since 2.1.0
27
+ SENSITIVE_OPTIONS = [ :password,
28
+ :pwd ].freeze
29
+
30
+ # The replacement string used in place of the value for sensitive keys.
31
+ #
32
+ # @since 2.1.0
33
+ STRING_REPLACEMENT = '<REDACTED>'.freeze
34
+
35
+ # Get a string representation of the options.
36
+ #
37
+ # @return [ String ] The string representation of the options.
38
+ #
39
+ # @since 2.1.0
40
+ def inspect
41
+ redacted_string(:inspect)
42
+ end
43
+
44
+ # Get a string representation of the options.
45
+ #
46
+ # @return [ String ] The string representation of the options.
47
+ #
48
+ # @since 2.1.0
49
+ def to_s
50
+ redacted_string(:to_s)
51
+ end
52
+
53
+ # Whether these options contain a given key.
54
+ #
55
+ # @example Determine if the options contain a given key.
56
+ # options.has_key?(:name)
57
+ #
58
+ # @param [ String, Symbol ] key The key to check for existence.
59
+ #
60
+ # @return [ true, false ] If the options contain the given key.
61
+ #
62
+ # @since 2.1.0
63
+ def has_key?(key)
64
+ super(convert_key(key))
65
+ end
66
+ alias_method :key?, :has_key?
67
+
68
+ # Returns a new options object consisting of pairs for which the block returns false.
69
+ #
70
+ # @example Get a new options object with pairs for which the block returns false.
71
+ # new_options = options.reject { |k, v| k == 'database' }
72
+ #
73
+ # @yieldparam [ String, Object ] The key as a string and its value.
74
+ #
75
+ # @return [ Options::Redacted ] A new options object.
76
+ #
77
+ # @since 2.1.0
78
+ def reject(&block)
79
+ new_options = dup
80
+ new_options.reject!(&block) || new_options
81
+ end
82
+
83
+ # Only keeps pairs for which the block returns false.
84
+ #
85
+ # @example Remove pairs from this object for which the block returns true.
86
+ # options.reject! { |k, v| k == 'database' }
87
+ #
88
+ # @yieldparam [ String, Object ] The key as a string and its value.
89
+ #
90
+ # @return [ Options::Redacted, nil ] This object or nil if no changes were made.
91
+ #
92
+ # @since 2.1.0
93
+ def reject!
94
+ if block_given?
95
+ n_keys = keys.size
96
+ keys.each do |key|
97
+ delete(key) if yield(key, self[key])
98
+ end
99
+ n_keys == keys.size ? nil : self
100
+ else
101
+ to_enum
102
+ end
103
+ end
104
+
105
+ # Returns a new options object consisting of pairs for which the block returns true.
106
+ #
107
+ # @example Get a new options object with pairs for which the block returns true.
108
+ # ssl_options = options.select { |k, v| k =~ /ssl/ }
109
+ #
110
+ # @yieldparam [ String, Object ] The key as a string and its value.
111
+ #
112
+ # @return [ Options::Redacted ] A new options object.
113
+ #
114
+ # @since 2.1.0
115
+ def select(&block)
116
+ new_options = dup
117
+ new_options.select!(&block) || new_options
118
+ end
119
+
120
+ # Only keeps pairs for which the block returns true.
121
+ #
122
+ # @example Remove pairs from this object for which the block does not return true.
123
+ # options.select! { |k, v| k =~ /ssl/ }
124
+ #
125
+ # @yieldparam [ String, Object ] The key as a string and its value.
126
+ #
127
+ # @return [ Options::Redacted, nil ] This object or nil if no changes were made.
128
+ #
129
+ # @since 2.1.0
130
+ def select!
131
+ if block_given?
132
+ n_keys = keys.size
133
+ keys.each do |key|
134
+ delete(key) unless yield(key, self[key])
135
+ end
136
+ n_keys == keys.size ? nil : self
137
+ else
138
+ to_enum
139
+ end
140
+ end
141
+
142
+ private
143
+
144
+ def redacted_string(method)
145
+ '{' + reduce([]) do |list, (k, v)|
146
+ list << "#{k.send(method)}=>#{redact(k, v, method)}"
147
+ end.join(', ') + '}'
148
+ end
149
+
150
+ def redact(k, v, method)
151
+ return STRING_REPLACEMENT if SENSITIVE_OPTIONS.include?(k.to_sym)
152
+ v.send(method)
153
+ end
154
+ end
155
+ end
156
+ end
data/lib/mongo/options.rb CHANGED
@@ -13,3 +13,4 @@
13
13
  # limitations under the License.
14
14
 
15
15
  require 'mongo/options/mapper'
16
+ require 'mongo/options/redacted'
@@ -24,7 +24,7 @@ module Mongo
24
24
 
25
25
  # Initializes a BitVector with a layout
26
26
  #
27
- # @param layout [Array<Symbol>] the array of fields in the bit vector
27
+ # @param layout [ Array<Symbol> ] the array of fields in the bit vector
28
28
  def initialize(layout)
29
29
  @masks = {}
30
30
  layout.each_with_index do |field, index|
@@ -34,21 +34,23 @@ module Mongo
34
34
 
35
35
  # Serializes vector by encoding each symbol according to its mask
36
36
  #
37
- # @param buffer [IO] Buffer to receive the serialized vector
38
- # @param value [Array<Symbol>] Array of flags to encode
39
- # @return [IO] Buffer that received the serialized vector
37
+ # @param buffer [ String ] Buffer to receive the serialized vector
38
+ # @param value [ Array<Symbol> ] Array of flags to encode
39
+ #
40
+ # @return [ String ] Buffer that received the serialized vector
40
41
  def serialize(buffer, value)
41
42
  bits = 0
42
43
  value.each { |flag| bits |= @masks[flag] }
43
- buffer << [bits].pack(INT32_PACK)
44
+ buffer.put_int32(bits)
44
45
  end
45
46
 
46
47
  # Deserializes vector by decoding the symbol according to its mask
47
48
  #
48
- # @param io [IO] Stream containing the vector to be deserialized
49
- # @return [Array<Symbol>] Flags contained in the vector
50
- def deserialize(io)
51
- vector = io.read(4).unpack(INT32_PACK).first
49
+ # @param [ String ] buffer Buffer containing the vector to be deserialized.
50
+ #
51
+ # @return [ Array<Symbol> ] Flags contained in the vector
52
+ def deserialize(buffer)
53
+ vector = buffer.get_int32
52
54
  flags = []
53
55
  @masks.each do |flag, mask|
54
56
  flags << flag if mask & vector != 0
@@ -43,8 +43,9 @@ module Mongo
43
43
  def initialize(database, collection, selector, options = {})
44
44
  @database = database
45
45
  @namespace = "#{database}.#{collection}"
46
- @selector = selector
47
- @flags = options[:flags] || []
46
+ @selector = selector
47
+ @flags = options[:flags] || []
48
+ @upconverter = Upconverter.new(collection, selector, options)
48
49
  end
49
50
 
50
51
  # Return the event payload for monitoring.
@@ -56,11 +57,18 @@ module Mongo
56
57
  #
57
58
  # @since 2.1.0
58
59
  def payload
59
- { command_name: 'delete', database_name: @database, command: selector, request_id: request_id }
60
+ {
61
+ command_name: 'delete',
62
+ database_name: @database,
63
+ command: upconverter.command,
64
+ request_id: request_id
65
+ }
60
66
  end
61
67
 
62
68
  private
63
69
 
70
+ attr_reader :upconverter
71
+
64
72
  # The operation code required to specify a Delete message.
65
73
  # @return [Fixnum] the operation code.
66
74
  def op_code
@@ -84,6 +92,73 @@ module Mongo
84
92
  # @!attribute
85
93
  # @return [Hash] The selector for this Delete message.
86
94
  field :selector, Document
95
+
96
+ # Converts legacy delete messages to the appropriare OP_COMMAND style
97
+ # message.
98
+ #
99
+ # @since 2.1.0
100
+ class Upconverter
101
+
102
+ # The delete command constant.
103
+ #
104
+ # @since 2.2.0
105
+ DELETE = 'delete'.freeze
106
+
107
+ # The deletes command constant.
108
+ #
109
+ # @since 2.2.0
110
+ DELETES = 'deletes'.freeze
111
+
112
+ # @return [ String ] collection The name of the collection.
113
+ attr_reader :collection
114
+
115
+ # @return [ BSON::Document, Hash ] filter The query filter or command.
116
+ attr_reader :filter
117
+
118
+ # @return [ Hash ] options The options.
119
+ attr_reader :options
120
+
121
+ # Instantiate the upconverter.
122
+ #
123
+ # @example Instantiate the upconverter.
124
+ # Upconverter.new('users', { name: 'test' })
125
+ #
126
+ # @param [ String ] collection The name of the collection.
127
+ # @param [ BSON::Document, Hash ] filter The filter or command.
128
+ #
129
+ # @since 2.1.0
130
+ def initialize(collection, filter, options)
131
+ @collection = collection
132
+ @filter = filter
133
+ @options = options
134
+ end
135
+
136
+ # Get the upconverted command.
137
+ #
138
+ # @example Get the command.
139
+ # upconverter.command
140
+ #
141
+ # @return [ BSON::Document ] The upconverted command.
142
+ #
143
+ # @since 2.1.0
144
+ def command
145
+ document = BSON::Document.new
146
+ document.store(DELETE, collection)
147
+ document.store(DELETES, [ BSON::Document.new(Message::Q => filter, Message::LIMIT => limit) ])
148
+ document.store(Message::ORDERED, true)
149
+ document
150
+ end
151
+
152
+ private
153
+
154
+ def limit
155
+ if options.key?(:flags)
156
+ options[:flags].include?(:single_remove) ? 1 : 0
157
+ else
158
+ 0
159
+ end
160
+ end
161
+ end
87
162
  end
88
163
  end
89
164
  end
@@ -41,6 +41,7 @@ module Mongo
41
41
  @namespace = "#{database}.#{collection}"
42
42
  @number_to_return = number_to_return
43
43
  @cursor_id = cursor_id
44
+ @upconverter = Upconverter.new(collection, cursor_id, number_to_return)
44
45
  end
45
46
 
46
47
  # Return the event payload for monitoring.
@@ -53,9 +54,9 @@ module Mongo
53
54
  # @since 2.1.0
54
55
  def payload
55
56
  {
56
- command_name: 'getmore',
57
+ command_name: 'getMore',
57
58
  database_name: @database,
58
- command: { cursor_id: cursor_id, number_to_return: number_to_return },
59
+ command: upconverter.command,
59
60
  request_id: request_id
60
61
  }
61
62
  end
@@ -74,6 +75,8 @@ module Mongo
74
75
 
75
76
  private
76
77
 
78
+ attr_reader :upconverter
79
+
77
80
  # The operation code required to specify a GetMore message.
78
81
  # @return [Fixnum] the operation code.
79
82
  def op_code
@@ -94,6 +97,60 @@ module Mongo
94
97
  # @!attribute
95
98
  # @return [Fixnum] The cursor id to get more documents from.
96
99
  field :cursor_id, Int64
100
+
101
+ # Converts legacy getmore messages to the appropriare OP_COMMAND style
102
+ # message.
103
+ #
104
+ # @since 2.1.0
105
+ class Upconverter
106
+
107
+ # The get more constant.
108
+ #
109
+ # @since 2.2.0
110
+ GET_MORE = 'getMore'.freeze
111
+
112
+ # @return [ String ] collection The name of the collection.
113
+ attr_reader :collection
114
+
115
+ # @return [ Integer ] cursor_id The cursor id.
116
+ attr_reader :cursor_id
117
+
118
+ # @return [ Integer ] number_to_return The number of docs to return.
119
+ attr_reader :number_to_return
120
+
121
+ # Instantiate the upconverter.
122
+ #
123
+ # @example Instantiate the upconverter.
124
+ # Upconverter.new('users', 1, 1)
125
+ #
126
+ # @param [ String ] collection The name of the collection.
127
+ # @param [ Integer ] cursor_id The cursor id.
128
+ # @param [ Integer ] number_to_return The number of documents to
129
+ # return.
130
+ #
131
+ # @since 2.1.0
132
+ def initialize(collection, cursor_id, number_to_return)
133
+ @collection = collection
134
+ @cursor_id = cursor_id
135
+ @number_to_return = number_to_return
136
+ end
137
+
138
+ # Get the upconverted command.
139
+ #
140
+ # @example Get the command.
141
+ # upconverter.command
142
+ #
143
+ # @return [ BSON::Document ] The upconverted command.
144
+ #
145
+ # @since 2.1.0
146
+ def command
147
+ document = BSON::Document.new
148
+ document.store(GET_MORE, cursor_id)
149
+ document.store(Message::BATCH_SIZE, number_to_return)
150
+ document.store(Message::COLLECTION, collection)
151
+ document
152
+ end
153
+ end
97
154
  end
98
155
  end
99
156
  end
@@ -53,6 +53,7 @@ module Mongo
53
53
  @namespace = "#{database}.#{collection}"
54
54
  @documents = documents
55
55
  @flags = options[:flags] || []
56
+ @upconverter = Upconverter.new(collection, documents, options)
56
57
  end
57
58
 
58
59
  # Return the event payload for monitoring.
@@ -64,11 +65,18 @@ module Mongo
64
65
  #
65
66
  # @since 2.1.0
66
67
  def payload
67
- { command_name: 'insert', database_name: @database, command: documents, request_id: request_id }
68
+ {
69
+ command_name: 'insert',
70
+ database_name: @database,
71
+ command: upconverter.command,
72
+ request_id: request_id
73
+ }
68
74
  end
69
75
 
70
76
  private
71
77
 
78
+ attr_reader :upconverter
79
+
72
80
  # The operation code required to specify an Insert message.
73
81
  # @return [Fixnum] the operation code.
74
82
  def op_code
@@ -89,6 +97,70 @@ module Mongo
89
97
  # @!attribute
90
98
  # @return [Array<Hash>] The documents to insert.
91
99
  field :documents, Document, true
100
+
101
+ # Converts legacy insert messages to the appropriare OP_COMMAND style
102
+ # message.
103
+ #
104
+ # @since 2.1.0
105
+ class Upconverter
106
+
107
+ # Insert field constant.
108
+ #
109
+ # @since 2.1.0
110
+ INSERT = 'insert'.freeze
111
+
112
+ # Documents field constant.
113
+ #
114
+ # @since 2.1.0
115
+ DOCUMENTS = 'documents'.freeze
116
+
117
+ # Write concern field constant.
118
+ #
119
+ # @since 2.1.0
120
+ WRITE_CONCERN = 'writeConcern'.freeze
121
+
122
+ # @return [ String ] collection The name of the collection.
123
+ attr_reader :collection
124
+
125
+ # @return [ Array<BSON::Document> ] documents The documents to insert.
126
+ attr_reader :documents
127
+
128
+ # @return [ Hash ] options The options.
129
+ attr_reader :options
130
+
131
+ # Instantiate the upconverter.
132
+ #
133
+ # @example Instantiate the upconverter.
134
+ # Upconverter.new('users', documents)
135
+ #
136
+ # @param [ String ] collection The name of the collection.
137
+ # @param [ Array<BSON::Document> ] documents The documents.
138
+ # @param [ Hash ] options The options.
139
+ #
140
+ # @since 2.1.0
141
+ def initialize(collection, documents, options)
142
+ @collection = collection
143
+ @documents = documents
144
+ @options = options
145
+ end
146
+
147
+ # Get the upconverted command.
148
+ #
149
+ # @example Get the command.
150
+ # upconverter.command
151
+ #
152
+ # @return [ BSON::Document ] The upconverted command.
153
+ #
154
+ # @since 2.1.0
155
+ def command
156
+ document = BSON::Document.new
157
+ document.store(INSERT, collection)
158
+ document.store(DOCUMENTS, documents)
159
+ document.store(Message::ORDERED, options.fetch(:ordered, true))
160
+ document.merge!(WRITE_CONCERN => options[:write_concern].options) if options[:write_concern]
161
+ document
162
+ end
163
+ end
92
164
  end
93
165
  end
94
166
  end
@@ -28,11 +28,14 @@ module Mongo
28
28
  # @example Kill the cursor on the server with id 1.
29
29
  # KillCursors.new([1])
30
30
  #
31
- # @param cursor_ids [Array<Fixnum>] The cursor ids to kill.
32
- # @param options [Hash] The additional kill cursors options.
33
- def initialize(cursor_ids, options = {})
31
+ # @param [ Mongo::Database ] collection The collection.
32
+ # @param [ Mongo::Database ] database The database.
33
+ # @param [ Array<Fixnum> ] cursor_ids The cursor ids to kill.
34
+ def initialize(collection, database, cursor_ids)
35
+ @database = database
34
36
  @cursor_ids = cursor_ids
35
37
  @id_count = @cursor_ids.size
38
+ @upconverter = Upconverter.new(collection, cursor_ids)
36
39
  end
37
40
 
38
41
  # Return the event payload for monitoring.
@@ -44,11 +47,18 @@ module Mongo
44
47
  #
45
48
  # @since 2.1.0
46
49
  def payload
47
- { command_name: 'killcursors', command: { cursor_ids: cursor_ids }, request_id: request_id }
50
+ {
51
+ command_name: 'killCursors',
52
+ database_name: @database,
53
+ command: upconverter.command,
54
+ request_id: request_id
55
+ }
48
56
  end
49
57
 
50
58
  private
51
59
 
60
+ attr_reader :upconverter
61
+
52
62
  # The operation code required to specify +KillCursors+ message.
53
63
  # @return [Fixnum] the operation code.
54
64
  def op_code
@@ -65,6 +75,58 @@ module Mongo
65
75
  # @!attribute
66
76
  # @return [Array<Fixnum>] Cursors to kill.
67
77
  field :cursor_ids, Int64, true
78
+
79
+ # Converts legacy insert messages to the appropriare OP_COMMAND style
80
+ # message.
81
+ #
82
+ # @since 2.1.0
83
+ class Upconverter
84
+
85
+ # The kill cursors constant.
86
+ #
87
+ # @since 2.2.0
88
+ KILL_CURSORS = 'killCursors'.freeze
89
+
90
+ # The cursors constant.
91
+ #
92
+ # @since 2.2.0
93
+ CURSORS = 'cursors'.freeze
94
+
95
+ # @return [ String ] collection The name of the collection.
96
+ attr_reader :collection
97
+
98
+ # @return [ Array<Integer> ] cursor_ids The cursor ids.
99
+ attr_reader :cursor_ids
100
+
101
+ # Instantiate the upconverter.
102
+ #
103
+ # @example Instantiate the upconverter.
104
+ # Upconverter.new('users', [ 1, 2, 3 ])
105
+ #
106
+ # @param [ String ] collection The name of the collection.
107
+ # @param [ Array<Integer> ] cursor_ids The cursor ids.
108
+ #
109
+ # @since 2.1.0
110
+ def initialize(collection, cursor_ids)
111
+ @collection = collection
112
+ @cursor_ids = cursor_ids
113
+ end
114
+
115
+ # Get the upconverted command.
116
+ #
117
+ # @example Get the command.
118
+ # upconverter.command
119
+ #
120
+ # @return [ BSON::Document ] The upconverted command.
121
+ #
122
+ # @since 2.1.0
123
+ def command
124
+ document = BSON::Document.new
125
+ document.store(KILL_CURSORS, collection)
126
+ document.store(CURSORS, cursor_ids)
127
+ document
128
+ end
129
+ end
68
130
  end
69
131
  end
70
132
  end