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
@@ -20,6 +20,7 @@ module Mongo
20
20
  #
21
21
  # @since 2.1.0
22
22
  class CommandSucceeded
23
+ include Secure
23
24
 
24
25
  # @return [ Server::Address ] address The server address.
25
26
  attr_reader :address
@@ -61,7 +62,7 @@ module Mongo
61
62
  @address = address
62
63
  @request_id = request_id
63
64
  @operation_id = operation_id
64
- @reply = reply
65
+ @reply = redacted(command_name, reply)
65
66
  @duration = duration
66
67
  end
67
68
 
@@ -86,10 +87,31 @@ module Mongo
86
87
  address,
87
88
  command_payload[:request_id],
88
89
  operation_id,
89
- reply_payload ? reply_payload[:reply] : nil,
90
+ generate_reply(command_payload, reply_payload),
90
91
  duration
91
92
  )
92
93
  end
94
+
95
+ private
96
+
97
+ def self.generate_reply(command_payload, reply_payload)
98
+ if reply_payload
99
+ reply = reply_payload[:reply]
100
+ if cursor = reply[:cursor]
101
+ if !cursor.key?(Collection::NS)
102
+ cursor.merge!(Collection::NS => namespace(command_payload))
103
+ end
104
+ end
105
+ reply
106
+ else
107
+ BSON::Document.new(Operation::Result::OK => 1)
108
+ end
109
+ end
110
+
111
+ def self.namespace(payload)
112
+ command = payload[:command]
113
+ "#{payload[:database_name]}.#{command[:collection] || command.values.first}"
114
+ end
93
115
  end
94
116
  end
95
117
  end
@@ -0,0 +1,58 @@
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 Monitoring
17
+ module Event
18
+
19
+ # Provides behaviour to redact sensitive information from commands and
20
+ # replies.
21
+ #
22
+ # @since 2.1.0
23
+ module Secure
24
+
25
+ # The list of commands that has the data redacted for security.
26
+ #
27
+ # @since 2.1.0
28
+ REDACTED_COMMANDS = [
29
+ 'authenticate',
30
+ 'saslStart',
31
+ 'saslContinue',
32
+ 'getnonce',
33
+ 'createUser',
34
+ 'updateUser',
35
+ 'copydbgetnonce',
36
+ 'copydbsaslstart',
37
+ 'copydb'
38
+ ].freeze
39
+
40
+ # Redact secure information from the document if it's command is in the
41
+ # list.
42
+ #
43
+ # @example Get the redacted document.
44
+ # secure.redacted(command_name, document)
45
+ #
46
+ # @param [ String, Symbol ] command_name The command name.
47
+ # @param [ BSON::Document ] document The document.
48
+ #
49
+ # @return [ BSON::Document ] The redacted document.
50
+ #
51
+ # @since 2.1.0
52
+ def redacted(command_name, document)
53
+ REDACTED_COMMANDS.include?(command_name.to_s) ? BSON::Document.new : document
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -12,6 +12,7 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ require 'mongo/monitoring/event/secure'
15
16
  require 'mongo/monitoring/event/command_started'
16
17
  require 'mongo/monitoring/event/command_succeeded'
17
18
  require 'mongo/monitoring/event/command_failed'
@@ -37,14 +37,20 @@ module Mongo
37
37
  # @since 2.1.0
38
38
  def publish_command(messages, operation_id = Monitoring.next_operation_id)
39
39
  start = Time.now
40
- payload = messages.first.payload
40
+ message = messages.first
41
+ message.set_request_id
42
+ payload = message.payload
43
+ send_duration = duration(start)
41
44
  command_started(address, operation_id, payload)
45
+ receive_start = Time.now
42
46
  begin
43
47
  result = yield(messages)
44
- command_completed(result, address, operation_id, payload, start)
48
+ total_duration = duration(receive_start) + send_duration
49
+ command_completed(result, address, operation_id, payload, total_duration)
45
50
  result
46
51
  rescue Exception => e
47
- command_failed(address, operation_id, payload, e.message, start)
52
+ total_duration = duration(receive_start) + send_duration
53
+ command_failed(address, operation_id, payload, e.message, total_duration)
48
54
  raise e
49
55
  end
50
56
  end
@@ -58,17 +64,17 @@ module Mongo
58
64
  )
59
65
  end
60
66
 
61
- def command_completed(result, address, operation_id, payload, start)
67
+ def command_completed(result, address, operation_id, payload, duration)
62
68
  document = result ? (result.documents || []).first : nil
63
- parser = Error::Parser.new(document)
64
- if parser.message.empty?
65
- command_succeeded(result, address, operation_id, payload, start)
69
+ if error?(document)
70
+ parser = Error::Parser.new(document)
71
+ command_failed(address, operation_id, payload, parser.message, duration)
66
72
  else
67
- command_failed(address, operation_id, payload, parser.message, start)
73
+ command_succeeded(result, address, operation_id, payload, duration)
68
74
  end
69
75
  end
70
76
 
71
- def command_succeeded(result, address, operation_id, payload, start)
77
+ def command_succeeded(result, address, operation_id, payload, duration)
72
78
  monitoring.succeeded(
73
79
  Monitoring::COMMAND,
74
80
  Event::CommandSucceeded.generate(
@@ -76,21 +82,25 @@ module Mongo
76
82
  operation_id,
77
83
  payload,
78
84
  result ? result.payload : nil,
79
- duration(start)
85
+ duration
80
86
  )
81
87
  )
82
88
  end
83
89
 
84
- def command_failed(address, operation_id, payload, message, start)
90
+ def command_failed(address, operation_id, payload, message, duration)
85
91
  monitoring.failed(
86
92
  Monitoring::COMMAND,
87
- Event::CommandFailed.generate(address, operation_id, payload, message, duration(start))
93
+ Event::CommandFailed.generate(address, operation_id, payload, message, duration)
88
94
  )
89
95
  end
90
96
 
91
97
  def duration(start)
92
98
  Time.now - start
93
99
  end
100
+
101
+ def error?(document)
102
+ document && (document['ok'] == 0 || document.key?('$err'))
103
+ end
94
104
  end
95
105
  end
96
106
  end
@@ -83,11 +83,6 @@ module Mongo
83
83
  end
84
84
  end
85
85
 
86
- # Adds our internal command logging to the global subscribers.
87
- #
88
- # @since 2.1.0
89
- Global.subscribe(COMMAND, CommandLogSubscriber.new)
90
-
91
86
  # Initialize the monitoring.
92
87
  #
93
88
  # @api private
@@ -105,6 +100,7 @@ module Mongo
105
100
  subscribe(topic, subscriber)
106
101
  end
107
102
  end
103
+ subscribe(COMMAND, CommandLogSubscriber.new(options))
108
104
  end
109
105
  end
110
106
 
@@ -0,0 +1,89 @@
1
+ # Copyright (C) 2014-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 Operation
17
+ module Commands
18
+
19
+ # Aggregate result wrapper.
20
+ #
21
+ # @since 2.0.0
22
+ class Aggregate
23
+
24
+ # Defines custom behaviour of results in an aggregation context.
25
+ #
26
+ # @since 2.0.0
27
+ class Result < Operation::Result
28
+
29
+ # The field name for the aggregation explain information.
30
+ #
31
+ # @since 2.0.5
32
+ EXPLAIN = 'stages'.freeze
33
+
34
+ # The legacy field name for the aggregation explain information.
35
+ #
36
+ # @since 2.0.5
37
+ EXPLAIN_LEGACY = 'serverPipeline'.freeze
38
+
39
+ # Get the cursor id for the result.
40
+ #
41
+ # @example Get the cursor id.
42
+ # result.cursor_id
43
+ #
44
+ # @note Even though the wire protocol has a cursor_id field for all
45
+ # messages of type reply, it is always zero when using the
46
+ # aggregation framework and must be retrieved from the cursor
47
+ # document itself. Wahnsinn!
48
+ #
49
+ # @return [ Integer ] The cursor id.
50
+ #
51
+ # @since 2.0.0
52
+ def cursor_id
53
+ cursor_document ? cursor_document[CURSOR_ID] : super
54
+ end
55
+
56
+ # Get the documents for the aggregation result. This is either the
57
+ # first document's 'result' field, or if a cursor option was selected
58
+ # it is the 'firstBatch' field in the 'cursor' field of the first
59
+ # document returned.
60
+ #
61
+ # @example Get the documents.
62
+ # result.documents
63
+ #
64
+ # @return [ Array<BSON::Document> ] The documents.
65
+ #
66
+ # @since 2.0.0
67
+ def documents
68
+ reply.documents[0][RESULT] || explain_document ||
69
+ cursor_document[FIRST_BATCH]
70
+ end
71
+
72
+ private
73
+
74
+ def explain_document
75
+ first_document[EXPLAIN] || first_document[EXPLAIN_LEGACY]
76
+ end
77
+
78
+ def cursor_document
79
+ @cursor_document ||= reply.documents[0][CURSOR]
80
+ end
81
+
82
+ def first_document
83
+ @first_document ||= reply.documents[0]
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,64 @@
1
+ # Copyright (C) 2014-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 Operation
17
+ module Commands
18
+
19
+ # A MongoDB aggregate operation.
20
+ #
21
+ # @note An aggregate operation can behave like a read and return a
22
+ # result set, or can behave like a write operation and
23
+ # output results to a user-specified collection.
24
+ #
25
+ # @example Create the aggregate operation.
26
+ # Aggregate.new({
27
+ # :selector => {
28
+ # :aggregate => 'test_coll', :pipeline => [{ '$out' => 'test-out' }]
29
+ # },
30
+ # :db_name => 'test_db'
31
+ # })
32
+ #
33
+ # Initialization:
34
+ # param [ Hash ] spec The specifications for the operation.
35
+ #
36
+ # option spec :selector [ Hash ] The aggregate selector.
37
+ # option spec :db_name [ String ] The name of the database on which
38
+ # the operation should be executed.
39
+ # option spec :options [ Hash ] Options for the aggregate command.
40
+ #
41
+ # @since 2.0.0
42
+ class Aggregate < Command
43
+
44
+ private
45
+
46
+ def filter_selector(context)
47
+ return selector if context.features.write_command_enabled?
48
+ selector.reject{ |option, value| option.to_s == 'cursor' }
49
+ end
50
+
51
+ def update_selector(context)
52
+ if context.mongos? && read_pref = read.to_mongos
53
+ sel = selector[:$query] ? filter_selector(context) : { :$query => filter_selector(context) }
54
+ sel.merge(:$readPreference => read_pref)
55
+ else
56
+ filter_selector(context)
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+
64
+ require 'mongo/operation/commands/aggregate/result'
@@ -0,0 +1,41 @@
1
+ # Copyright (C) 2014-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 Operation
17
+ module Commands
18
+ class CollectionsInfo
19
+
20
+ # Defines custom behaviour of results when query the system.namespaces
21
+ # collection.
22
+ #
23
+ # @since 2.1.0
24
+ class Result < Operation::Result
25
+
26
+ # Get the namespace for the cursor.
27
+ #
28
+ # @example Get the namespace.
29
+ # result.namespace
30
+ #
31
+ # @return [ String ] The namespace.
32
+ #
33
+ # @since 2.1.0
34
+ def namespace
35
+ Database::NAMESPACES
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -12,9 +12,11 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ require 'mongo/operation/commands/collections_info/result'
16
+
15
17
  module Mongo
16
18
  module Operation
17
- module Read
19
+ module Commands
18
20
 
19
21
  # A MongoDB operation to get a list of collection names in a database.
20
22
  #
@@ -30,9 +32,9 @@ module Mongo
30
32
  #
31
33
  # @since 2.0.0
32
34
  class CollectionsInfo
33
- include Executable
34
35
  include Specifiable
35
- include ReadPreferrable
36
+ include ReadPreference
37
+ include Executable
36
38
 
37
39
  # Execute the operation.
38
40
  # The context gets a connection on which the operation
@@ -0,0 +1,47 @@
1
+ # Copyright (C) 2014-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 Operation
17
+ module Commands
18
+
19
+ # A MongoDB command operation.
20
+ #
21
+ # @example Create the command operation.
22
+ # Mongo::Operation::Command.new({ :selector => { :isMaster => 1 } })
23
+ #
24
+ # Initialization:
25
+ # param [ Hash ] spec The specifications for the command.
26
+ #
27
+ # option spec :selector [ Hash ] The command selector.
28
+ # option spec :db_name [ String ] The name of the database on which
29
+ # the command should be executed.
30
+ # option spec :options [ Hash ] Options for the command.
31
+ #
32
+ # @since 2.0.0
33
+ class Command
34
+ include Specifiable
35
+ include Limited
36
+ include ReadPreference
37
+ include Executable
38
+
39
+ private
40
+
41
+ def query_coll
42
+ Database::COMMAND
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,62 @@
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 Operation
17
+ module Commands
18
+ class Find
19
+
20
+ # Defines custom behaviour of results in find command.
21
+ #
22
+ # @since 2.2.0
23
+ class Result < Operation::Result
24
+
25
+ # Get the cursor id.
26
+ #
27
+ # @example Get the cursor id.
28
+ # result.cursor_id
29
+ #
30
+ # @return [ Integer ] The cursor id.
31
+ #
32
+ # @since 2.2.0
33
+ def cursor_id
34
+ cursor_document ? cursor_document[CURSOR_ID] : super
35
+ end
36
+
37
+ # Get the documents in the result.
38
+ #
39
+ # @example Get the documents.
40
+ # result.documents
41
+ #
42
+ # @return [ Array<BSON::Document> ] The documents.
43
+ #
44
+ # @since 2.2.0
45
+ def documents
46
+ cursor_document[FIRST_BATCH]
47
+ end
48
+
49
+ private
50
+
51
+ def cursor_document
52
+ @cursor_document ||= reply.documents[0][CURSOR]
53
+ end
54
+
55
+ def first_document
56
+ @first_document ||= reply.documents[0]
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,27 @@
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 Operation
17
+ module Commands
18
+
19
+ # Encapsulates behaviour for executing a find command.
20
+ #
21
+ # @since 2.2.0
22
+ class Find < Command; end
23
+ end
24
+ end
25
+ end
26
+
27
+ require 'mongo/operation/commands/find/result'
@@ -0,0 +1,62 @@
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 Operation
17
+ module Commands
18
+ class GetMore
19
+
20
+ # Defines custom behaviour of results for the get more command.
21
+ #
22
+ # @since 2.2.0
23
+ class Result < Operation::Result
24
+
25
+ # Get the cursor id.
26
+ #
27
+ # @example Get the cursor id.
28
+ # result.cursor_id
29
+ #
30
+ # @return [ Integer ] The cursor id.
31
+ #
32
+ # @since 2.2.0
33
+ def cursor_id
34
+ cursor_document ? cursor_document[CURSOR_ID] : super
35
+ end
36
+
37
+ # Get the documents in the result.
38
+ #
39
+ # @example Get the documents.
40
+ # result.documents
41
+ #
42
+ # @return [ Array<BSON::Document> ] The documents.
43
+ #
44
+ # @since 2.2.0
45
+ def documents
46
+ cursor_document[NEXT_BATCH]
47
+ end
48
+
49
+ private
50
+
51
+ def cursor_document
52
+ @cursor_document ||= reply.documents[0][CURSOR]
53
+ end
54
+
55
+ def first_document
56
+ @first_document ||= reply.documents[0]
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,27 @@
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 Operation
17
+ module Commands
18
+
19
+ # Encapsulates behaviour for executing a getmore command.
20
+ #
21
+ # @since 2.2.0
22
+ class GetMore < Command; end
23
+ end
24
+ end
25
+ end
26
+
27
+ require 'mongo/operation/commands/get_more/result'