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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b6616ddb03b3417535c99796a74defa18bb90777
4
- data.tar.gz: 300c32fe7122805036f67b387f0bb68648a8b759
3
+ metadata.gz: 0b03a2e7ce5246f9d38690f731f53d29a5469d30
4
+ data.tar.gz: aaca95e6f570d466155c87d4c549a4f3c5bc0341
5
5
  SHA512:
6
- metadata.gz: 8046a19889e6f15481690eca65e8696834925bb7c1727a387af1d29e22fc63cb2d2640d5ddebf48e80d641e518dfc5a753d3a79713f655cccbbdba94215da1f3
7
- data.tar.gz: 50f48316c5d9b17cb516467609667b5792472dbd0cbd43accc70c62a99ead9bdee595679f9d9b564db865606bbb55d7fc81176dd1669e0abd5c696803bd01132
6
+ metadata.gz: f6fa180a5c94bcb5d7a809d170c8ec12ec28d0d6035575ef0cc677b9f4c68ec81c26411948f071945b2b2d829b192e0312f29416d2c3a589830c5ee40f90b133
7
+ data.tar.gz: fce85899375de257592434225cd1db4e3d3971e8b85b6ec111ef30c967e0fa0e817569b843dc0f3c342d7e58749c259a8111cc2b9d741ef321dc335a1ad08bab
checksums.yaml.gz.sig CHANGED
Binary file
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- MongoDB Ruby Driver [![Build Status][travis-img]][travis-url] [![Code Climate][codeclimate-img]][codeclimate-url] [![Coverage Status][coveralls-img]][coveralls-url] [![Gem Version][rubygems-img]][rubygems-url]
1
+ MongoDB Ruby Driver [![Build Status][travis-img]][travis-url] [![Code Climate][codeclimate-img]][codeclimate-url] [![Gem Version][rubygems-img]][rubygems-url]
2
2
  -----
3
3
  The officially supported Ruby driver for [MongoDB](http://www.mongodb.org).
4
4
 
@@ -40,6 +40,15 @@ When reporting an issue, please keep in mind that all information in JIRA for al
40
40
  * Provide any sensitive data or server logs.
41
41
  * Report potential security issues publicly (see 'Security Issues').
42
42
 
43
+ Running Tests
44
+ -----
45
+
46
+ The driver uses RSpec as it's primary testing tool. To run all tests simple run `rspec`.
47
+
48
+ To run a test at a specific location (where `42` is the line number), use:
49
+
50
+ rspec path/to/spec.rb:42
51
+
43
52
  Security Issues
44
53
  -----
45
54
 
@@ -74,5 +83,3 @@ License
74
83
  [travis-url]: http://travis-ci.org/mongodb/mongo-ruby-driver?branch=master
75
84
  [codeclimate-img]: https://codeclimate.com/github/mongodb/mongo-ruby-driver.png?branch=master
76
85
  [codeclimate-url]: https://codeclimate.com/github/mongodb/mongo-ruby-driver?branch=master
77
- [coveralls-img]: https://coveralls.io/repos/mongodb/mongo-ruby-driver/badge.png?branch=master
78
- [coveralls-url]: https://coveralls.io/r/mongodb/mongo-ruby-driver?branch=master
data/Rakefile CHANGED
@@ -19,13 +19,7 @@ RSpec::Core::RakeTask.new(:spec)
19
19
  task :default => :spec
20
20
 
21
21
  namespace :spec do
22
- if RUBY_VERSION > '1.9' && RUBY_VERSION < '2.2'
23
- require 'coveralls/rake/task'
24
- Coveralls::RakeTask.new
25
- task :ci => [:spec, 'coveralls:push']
26
- else
27
- task :ci => [:spec]
28
- end
22
+ task :ci => [:spec]
29
23
  end
30
24
 
31
25
  task :release => :spec do
@@ -35,6 +35,11 @@ module Mongo
35
35
  # @since 2.0.0
36
36
  MATCH = Regexp.new('/\./').freeze
37
37
 
38
+ # Split value constant.
39
+ #
40
+ # @since 2.1.0
41
+ SPLIT = ':'.freeze
42
+
38
43
  # Parse an IPv4 address into its host and port.
39
44
  #
40
45
  # @example Parse the address.
@@ -46,7 +51,7 @@ module Mongo
46
51
  #
47
52
  # @since 2.0.0
48
53
  def self.parse(address)
49
- parts = address.split(':')
54
+ parts = address.split(SPLIT)
50
55
  host = parts[0]
51
56
  port = (parts[1] || 27017).to_i
52
57
  [ host, port ]
@@ -60,7 +60,7 @@ module Mongo
60
60
  # Get a socket for the provided address type, given the options.
61
61
  #
62
62
  # @example Get a Unix socket.
63
- # ipv4.socket(5)
63
+ # address.socket(5)
64
64
  #
65
65
  # @param [ Float ] timeout The socket timeout.
66
66
  # @param [ Hash ] ssl_options SSL options - ignored.
@@ -69,7 +69,7 @@ module Mongo
69
69
  #
70
70
  # @since 2.0.0
71
71
  def socket(timeout, ssl_options = {})
72
- Socket::Unix.new(host, timeout, Socket::AF_UNIX)
72
+ Socket::Unix.new(host, timeout)
73
73
  end
74
74
  end
75
75
  end
data/lib/mongo/address.rb CHANGED
@@ -28,10 +28,16 @@ module Mongo
28
28
  # Mapping from socket family to resolver class.
29
29
  #
30
30
  # @since 2.0.0
31
- FAMILY_MAP = { ::Socket::PF_UNIX => Unix,
32
- ::Socket::AF_INET6 => IPv6,
33
- ::Socket::AF_INET => IPv4
34
- }
31
+ FAMILY_MAP = {
32
+ ::Socket::PF_UNIX => Unix,
33
+ ::Socket::AF_INET6 => IPv6,
34
+ ::Socket::AF_INET => IPv4
35
+ }.freeze
36
+
37
+ # The localhost constant.
38
+ #
39
+ # @since 2.1.0
40
+ LOCALHOST = 'localhost'.freeze
35
41
 
36
42
  # @return [ String ] seed The seed address.
37
43
  attr_reader :seed
@@ -57,6 +63,20 @@ module Mongo
57
63
  host == other.host && port == other.port
58
64
  end
59
65
 
66
+ # Check equality for hashing.
67
+ #
68
+ # @example Check hashing equality.
69
+ # address.eql?(other)
70
+ #
71
+ # @param [ Object ] other The other object.
72
+ #
73
+ # @return [ true, false ] If the objects are equal.
74
+ #
75
+ # @since 2.2.0
76
+ def eql?(other)
77
+ self == other
78
+ end
79
+
60
80
  # Calculate the hash value for the address.
61
81
  #
62
82
  # @example Calculate the hash value.
@@ -144,14 +164,16 @@ module Mongo
144
164
  private
145
165
 
146
166
  def initialize_resolver!(timeout, ssl_options)
147
- family = (host == 'localhost') ? ::Socket::AF_INET : ::Socket::AF_UNSPEC
167
+ return Unix.new(seed.downcase) if seed.downcase =~ Unix::MATCH
168
+
169
+ family = (host == LOCALHOST) ? ::Socket::AF_INET : ::Socket::AF_UNSPEC
148
170
  error = nil
149
- ::Socket.getaddrinfo(host, nil, family, ::Socket::SOCK_STREAM).detect do |info|
171
+ ::Socket.getaddrinfo(host, nil, family, ::Socket::SOCK_STREAM).each do |info|
150
172
  begin
151
- return FAMILY_MAP[info[4]].new(info[3], port, host).tap do |res|
152
- res.socket(timeout, ssl_options).connect!
153
- end
154
- rescue IOError, SystemCallError => e
173
+ res = FAMILY_MAP[info[4]].new(info[3], port, host)
174
+ res.socket(timeout, ssl_options).connect!.close
175
+ return res
176
+ rescue IOError, SystemCallError, Error::SocketError => e
155
177
  error = e
156
178
  end
157
179
  end
@@ -111,7 +111,7 @@ module Mongo
111
111
  private
112
112
 
113
113
  def validate!(reply)
114
- raise Unauthorized.new(user) if reply.documents[0]['ok'] != 1
114
+ raise Unauthorized.new(user) if reply.documents[0][Operation::Result::OK] != 1
115
115
  @nonce = reply.documents[0][Auth::NONCE]
116
116
  @reply = reply
117
117
  end
@@ -25,7 +25,7 @@ module Mongo
25
25
  # The login message.
26
26
  #
27
27
  # @since 2.0.0
28
- LOGIN = { authenticate: 1, digestPassword: false }.freeze
28
+ LOGIN = { saslStart: 1, autoAuthorize: 1 }.freeze
29
29
 
30
30
  # @return [ Protocol::Reply ] reply The current reply in the
31
31
  # conversation.
@@ -63,7 +63,7 @@ module Mongo
63
63
  Protocol::Query.new(
64
64
  Auth::EXTERNAL,
65
65
  Database::COMMAND,
66
- LOGIN.merge(user: user.name, password: user.password, mechanism: LDAP::MECHANISM),
66
+ LOGIN.merge(payload: payload, mechanism: LDAP::MECHANISM),
67
67
  limit: -1
68
68
  )
69
69
  end
@@ -82,8 +82,12 @@ module Mongo
82
82
 
83
83
  private
84
84
 
85
+ def payload
86
+ BSON::Binary.new("\x00#{user.name}\x00#{user.password}")
87
+ end
88
+
85
89
  def validate!(reply)
86
- raise Unauthorized.new(user) if reply.documents[0]['ok'] != 1
90
+ raise Unauthorized.new(user) if reply.documents[0][Operation::Result::OK] != 1
87
91
  @reply = reply
88
92
  end
89
93
  end
@@ -417,7 +417,7 @@ module Mongo
417
417
  #
418
418
  # @since 2.0.0
419
419
  def without_proof
420
- @withoout_proof ||= "c=biws,r=#{rnonce}"
420
+ @without_proof ||= "c=biws,r=#{rnonce}"
421
421
  end
422
422
 
423
423
  # XOR operation for two strings.
@@ -429,9 +429,15 @@ module Mongo
429
429
  first.bytes.zip(second.bytes).map{ |(a,b)| (a ^ b).chr }.join('')
430
430
  end
431
431
 
432
+ def compare_digest(a, b)
433
+ check = a.bytesize ^ b.bytesize
434
+ a.bytes.zip(b.bytes){ |x, y| check |= x ^ y.to_i }
435
+ check == 0
436
+ end
437
+
432
438
  def validate_final_message!(reply)
433
439
  validate!(reply)
434
- unless verifier == server_signature
440
+ unless compare_digest(verifier, server_signature)
435
441
  raise Error::InvalidSignature.new(verifier, server_signature)
436
442
  end
437
443
  end
@@ -442,7 +448,7 @@ module Mongo
442
448
  end
443
449
 
444
450
  def validate!(reply)
445
- raise Unauthorized.new(user) unless reply.documents[0]['ok'] == 1
451
+ raise Unauthorized.new(user) unless reply.documents[0][Operation::Result::OK] == 1
446
452
  @reply = reply
447
453
  end
448
454
  end
@@ -90,13 +90,34 @@ module Mongo
90
90
  def update(user_or_name, options = {})
91
91
  user = generate(user_or_name, options)
92
92
  Operation::Write::UpdateUser.new(
93
- user: user,
94
- db_name: database.name
93
+ user: user,
94
+ db_name: database.name
95
95
  ).execute(next_primary.context)
96
96
  end
97
97
 
98
+ # Get info for a particular user in the database.
99
+ #
100
+ # @example Get a particular user's info.
101
+ # view.info('emily')
102
+ #
103
+ # @param [ String ] name The user name.
104
+ #
105
+ # @return [ Hash ] A document containing information on a particular user.
106
+ #
107
+ # @since 2.1.0
108
+ def info(name)
109
+ user_query(name).documents
110
+ end
111
+
98
112
  private
99
113
 
114
+ def user_query(name)
115
+ Operation::Commands::UserQuery.new(
116
+ user_name: name,
117
+ db_name: database.name
118
+ ).execute(next_primary.context)
119
+ end
120
+
100
121
  def generate(user, options)
101
122
  user.is_a?(String) ? Auth::User.new({ user: user }.merge(options)) : user
102
123
  end
@@ -83,7 +83,7 @@ module Mongo
83
83
  private
84
84
 
85
85
  def validate!(reply)
86
- raise Unauthorized.new(user) if reply.documents[0]['ok'] != 1
86
+ raise Unauthorized.new(user) if reply.documents[0][Operation::Result::OK] != 1
87
87
  @reply = reply
88
88
  end
89
89
  end
@@ -0,0 +1,51 @@
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
+ class BulkWrite
17
+
18
+ # Defines behaviour around combiners
19
+ #
20
+ # @api private
21
+ #
22
+ # @since 2.1.0
23
+ module Combineable
24
+
25
+ # @return [ Array<Hash, BSON::Document> ] requests The provided requests.
26
+ attr_reader :requests
27
+
28
+ # Create the ordered combiner.
29
+ #
30
+ # @api private
31
+ #
32
+ # @example Create the ordered combiner.
33
+ # OrderedCombiner.new([{ insert_one: { _id: 0 }}])
34
+ #
35
+ # @param [ Array<Hash, BSON::Document> ] requests The bulk requests.
36
+ #
37
+ # @since 2.1.0
38
+ def initialize(requests)
39
+ @requests = requests
40
+ end
41
+
42
+ private
43
+
44
+ def combine_requests(ops)
45
+ requests.reduce(ops) do |operations, request|
46
+ add(operations, request.keys.first, request.values.first)
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,55 @@
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
+ class BulkWrite
17
+
18
+ # Combines groups of bulk write operations in order.
19
+ #
20
+ # @api private
21
+ #
22
+ # @since 2.1.0
23
+ class OrderedCombiner
24
+ include Transformable
25
+ include Validatable
26
+ include Combineable
27
+
28
+ # Combine the requests in order.
29
+ #
30
+ # @api private
31
+ #
32
+ # @example Combine the requests.
33
+ # combiner.combine
34
+ #
35
+ # @return [ Array<Hash> ] The combined requests.
36
+ #
37
+ # @since 2.1.0
38
+ def combine
39
+ combine_requests([])
40
+ end
41
+
42
+ private
43
+
44
+ def add(operations, name, document)
45
+ operations.push({ name => []}) if next_group?(name, operations)
46
+ operations[-1][name].push(transform(name, document))
47
+ operations
48
+ end
49
+
50
+ def next_group?(name, operations)
51
+ !operations[-1] || !operations[-1].key?(name)
52
+ end
53
+ end
54
+ end
55
+ end
@@ -13,13 +13,66 @@
13
13
  # limitations under the License.
14
14
 
15
15
  module Mongo
16
- module BulkWrite
16
+ class BulkWrite
17
17
 
18
18
  # Wraps a series of bulk write operations in a result object.
19
19
  #
20
20
  # @since 2.0.6
21
21
  class Result
22
22
 
23
+ # Constant for number removed.
24
+ #
25
+ # @since 2.1.0
26
+ REMOVED_COUNT = 'n_removed'.freeze
27
+
28
+ # Constant for number inserted.
29
+ #
30
+ # @since 2.1.0
31
+ INSERTED_COUNT = 'n_inserted'.freeze
32
+
33
+ # Constant for inserted ids.
34
+ #
35
+ # @since 2.1.0
36
+ INSERTED_IDS = 'inserted_ids'.freeze
37
+
38
+ # Constant for number matched.
39
+ #
40
+ # @since 2.1.0
41
+ MATCHED_COUNT = 'n_matched'.freeze
42
+
43
+ # Constant for number modified.
44
+ #
45
+ # @since 2.1.0
46
+ MODIFIED_COUNT = 'n_modified'.freeze
47
+
48
+ # Constant for upserted.
49
+ #
50
+ # @since 2.1.0
51
+ UPSERTED = 'upserted'.freeze
52
+
53
+ # Constant for number upserted.
54
+ #
55
+ # @since 2.1.0
56
+ UPSERTED_COUNT = 'n_upserted'.freeze
57
+
58
+ # Constant for upserted ids.
59
+ #
60
+ # @since 2.1.0
61
+ UPSERTED_IDS = 'upserted_ids'.freeze
62
+
63
+ # The fields contained in the result document returned from executing the
64
+ # operations.
65
+ #
66
+ # @since 2.1.0.
67
+ FIELDS = [
68
+ INSERTED_COUNT,
69
+ REMOVED_COUNT,
70
+ MODIFIED_COUNT,
71
+ UPSERTED_COUNT,
72
+ MATCHED_COUNT,
73
+ Operation::Result::N
74
+ ].freeze
75
+
23
76
  # Returns the number of documents deleted.
24
77
  #
25
78
  # @example Get the number of deleted documents.
@@ -29,7 +82,7 @@ module Mongo
29
82
  #
30
83
  # @since 2.1.0
31
84
  def deleted_count
32
- @results[BulkWritable::REMOVED_COUNT]
85
+ @results[REMOVED_COUNT]
33
86
  end
34
87
 
35
88
  # Create the new result object from the results document.
@@ -53,7 +106,7 @@ module Mongo
53
106
  #
54
107
  # @since 2.1.0
55
108
  def inserted_count
56
- @results[BulkWritable::INSERTED_COUNT]
109
+ @results[INSERTED_COUNT]
57
110
  end
58
111
 
59
112
  # Get the inserted document ids, if the operation has inserts.
@@ -65,7 +118,7 @@ module Mongo
65
118
  #
66
119
  # @since 2.1.0
67
120
  def inserted_ids
68
- @results[BulkWritable::INSERTED_IDS]
121
+ @results[INSERTED_IDS]
69
122
  end
70
123
 
71
124
  # Returns the number of documents matched.
@@ -77,7 +130,7 @@ module Mongo
77
130
  #
78
131
  # @since 2.1.0
79
132
  def matched_count
80
- @results[BulkWritable::MATCHED_COUNT]
133
+ @results[MATCHED_COUNT]
81
134
  end
82
135
 
83
136
  # Returns the number of documents modified.
@@ -89,7 +142,7 @@ module Mongo
89
142
  #
90
143
  # @since 2.1.0
91
144
  def modified_count
92
- @results[BulkWritable::MODIFIED_COUNT]
145
+ @results[MODIFIED_COUNT]
93
146
  end
94
147
 
95
148
  # Returns the number of documents upserted.
@@ -101,7 +154,7 @@ module Mongo
101
154
  #
102
155
  # @since 2.1.0
103
156
  def upserted_count
104
- @results[BulkWritable::UPSERTED_COUNT]
157
+ @results[UPSERTED_COUNT]
105
158
  end
106
159
 
107
160
  # Get the upserted document ids, if the operation has inserts.
@@ -113,7 +166,7 @@ module Mongo
113
166
  #
114
167
  # @since 2.1.0
115
168
  def upserted_ids
116
- @results[BulkWritable::UPSERTED_IDS]
169
+ @results[UPSERTED_IDS]
117
170
  end
118
171
 
119
172
  # Validates the bulk write result.
@@ -0,0 +1,117 @@
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
+ class BulkWrite
17
+
18
+ # Combines bulk write results together.
19
+ #
20
+ # @api private
21
+ #
22
+ # @since 2.1.0
23
+ class ResultCombiner
24
+
25
+ # @return [ Integer ] count The count of documents in the entire batch.
26
+ attr_reader :count
27
+
28
+ # @return [ Hash ] results The results hash.
29
+ attr_reader :results
30
+
31
+ # Create the new result combiner.
32
+ #
33
+ # @api private
34
+ #
35
+ # @example Create the result combiner.
36
+ # ResultCombiner.new
37
+ #
38
+ # @since 2.1.0
39
+ def initialize
40
+ @results = {}
41
+ @count = 0
42
+ end
43
+
44
+ # Combines a result into the overall results.
45
+ #
46
+ # @api private
47
+ #
48
+ # @example Combine the result.
49
+ # combiner.combine!(result, count)
50
+ #
51
+ # @param [ Operation::Result ] result The result to combine.
52
+ # @param [ Integer ] count The count of requests in the batch.
53
+ #
54
+ # @since 2.1.0
55
+ def combine!(result, count)
56
+ combine_counts!(result)
57
+ combine_ids!(result)
58
+ combine_errors!(result)
59
+ @count += count
60
+ end
61
+
62
+ # Get the final result.
63
+ #
64
+ # @api private
65
+ #
66
+ # @example Get the final result.
67
+ # combinator.result
68
+ #
69
+ # @return [ BulkWrite::Result ] The final result.
70
+ #
71
+ # @since 2.1.0
72
+ def result
73
+ BulkWrite::Result.new(results).validate!
74
+ end
75
+
76
+ private
77
+
78
+ def combine_counts!(result)
79
+ Result::FIELDS.each do |field|
80
+ if result.respond_to?(field)
81
+ results.merge!(field => (results[field] || 0) + result.send(field))
82
+ end
83
+ end
84
+ end
85
+
86
+ def combine_ids!(result)
87
+ if result.respond_to?(Result::INSERTED_IDS)
88
+ results.merge!(Result::INSERTED_IDS => result.inserted_ids)
89
+ end
90
+ if result.respond_to?(Result::UPSERTED)
91
+ results.merge!(Result::UPSERTED_IDS => result.upserted.map{ |doc| doc['_id'] })
92
+ end
93
+ end
94
+
95
+ def combine_errors!(result)
96
+ combine_write_errors!(result)
97
+ combine_write_concern_errors!(result)
98
+ end
99
+
100
+ def combine_write_errors!(result)
101
+ if write_errors = result.aggregate_write_errors(count)
102
+ results.merge!(
103
+ Error::WRITE_ERRORS => ((results[Error::WRITE_ERRORS] || []) << write_errors).flatten
104
+ )
105
+ else
106
+ result.validate!
107
+ end
108
+ end
109
+
110
+ def combine_write_concern_errors!(result)
111
+ if write_concern_errors = result.aggregate_write_concern_errors(count)
112
+ results.merge!(Error::WRITE_CONCERN_ERRORS => write_concern_errors)
113
+ end
114
+ end
115
+ end
116
+ end
117
+ end