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
@@ -30,7 +30,6 @@ module Mongo
30
30
  # @since 2.0.0
31
31
  class DropIndex
32
32
  include Specifiable
33
- include Executable
34
33
  include Writable
35
34
 
36
35
  private
@@ -30,7 +30,6 @@ module Mongo
30
30
  # @since 2.0.0
31
31
  class Insert
32
32
  include Specifiable
33
- include Executable
34
33
  include Writable
35
34
 
36
35
  private
@@ -43,9 +42,11 @@ module Mongo
43
42
  def selector
44
43
  { insert: coll_name,
45
44
  documents: documents,
46
- writeConcern: write_concern.options,
47
45
  ordered: ordered?
48
- }
46
+ }.tap do |cmd|
47
+ cmd.merge!(writeConcern: write_concern.options) if write_concern
48
+ cmd.merge!(:bypassDocumentValidation => true) if bypass_document_validation
49
+ end
49
50
  end
50
51
  end
51
52
  end
@@ -22,7 +22,6 @@ module Mongo
22
22
  # @since 2.0.0
23
23
  class RemoveUser
24
24
  include Specifiable
25
- include Executable
26
25
  include Writable
27
26
 
28
27
  private
@@ -31,13 +31,13 @@ module Mongo
31
31
  # :db_name => 'test',
32
32
  # :coll_name => 'test_coll',
33
33
  # :write_concern => write_concern,
34
- # :ordered => true
34
+ # :ordered => true,
35
+ # :bypass_document_validation => true
35
36
  # })
36
37
  #
37
38
  # @since 2.0.0
38
39
  class Update
39
40
  include Specifiable
40
- include Executable
41
41
  include Writable
42
42
 
43
43
  private
@@ -48,9 +48,11 @@ module Mongo
48
48
  def selector
49
49
  { update: coll_name,
50
50
  updates: updates,
51
- writeConcern: write_concern.options,
52
51
  ordered: ordered?
53
- }
52
+ }.tap do |cmd|
53
+ cmd.merge!(writeConcern: write_concern.options) if write_concern
54
+ cmd.merge!(:bypassDocumentValidation => true) if bypass_document_validation
55
+ end
54
56
  end
55
57
  end
56
58
  end
@@ -23,7 +23,6 @@ module Mongo
23
23
  # @since 2.0.0
24
24
  class UpdateUser
25
25
  include Specifiable
26
- include Executable
27
26
  include Writable
28
27
 
29
28
  private
@@ -17,35 +17,30 @@ module Mongo
17
17
  module Write
18
18
  module Command
19
19
 
20
- # Provides common behavior for all write commands.
20
+ # Provides common behavior for write commands.
21
+ # Assigns an operation id when executed.
21
22
  #
22
23
  # @since 2.0.0
23
24
  module Writable
24
25
  include Limited
25
26
 
26
- private
27
-
28
- # Whether this operation may be executed on a secondary server.
27
+ # Execute the operation.
28
+ # The context gets a connection on which the operation
29
+ # is sent in the block.
29
30
  #
30
- # @return [ false ] A write command may not be executed on a secondary.
31
- def secondary_ok?
32
- false
33
- end
34
-
35
- # Whether the batch writes should be applied in the same order the
36
- # items appear, ie. sequentially.
37
- # If ordered is false, the server applies the batch items in no particular
38
- # order, and possibly in parallel. Execution halts after the first error.
39
- # The default value is true, which means the batch items are applied
40
- # sequentially.
31
+ # @param [ Mongo::Server::Context ] context The context for this operation.
41
32
  #
42
- # @return [ true, false ] Whether batch items are applied sequentially.
33
+ # @return [ Result ] The operation response, if there is one.
43
34
  #
44
35
  # @since 2.0.0
45
- def ordered?
46
- @spec.fetch(:ordered, true)
36
+ def execute(context)
37
+ context.with_connection do |connection|
38
+ connection.dispatch([ message ], operation_id)
39
+ end
47
40
  end
48
41
 
42
+ private
43
+
49
44
  # The wire protocol message for this write operation.
50
45
  #
51
46
  # @return [ Mongo::Protocol::Query ] Wire protocol message.
@@ -42,37 +42,14 @@ module Mongo
42
42
  #
43
43
  # @since 2.0.0
44
44
  class CreateIndex
45
- include Executable
45
+ include GLE
46
+ include WriteCommandEnabled
46
47
  include Specifiable
47
48
 
48
- # Execute the ensure index operation.
49
- #
50
- # @example Execute the operation.
51
- # operation.execute(context)
52
- #
53
- # @param [ Mongo::Server::Context ] context The context for this operation.
54
- #
55
- # @return [ Result ] The result of the operation.
56
- #
57
- # @since 2.0.0
58
- def execute(context)
59
- if context.features.write_command_enabled?
60
- execute_write_command(context)
61
- else
62
- execute_message(context)
63
- end
64
- end
65
-
66
49
  private
67
50
 
68
- def execute_write_command(context)
69
- Result.new(Command::CreateIndex.new(spec).execute(context)).validate!
70
- end
71
-
72
- def execute_message(context)
73
- context.with_connection do |connection|
74
- Result.new(connection.dispatch([ message, gle ].compact)).validate!
75
- end
51
+ def write_command_op
52
+ Command::CreateIndex.new(spec)
76
53
  end
77
54
 
78
55
  def index_documents
@@ -30,40 +30,14 @@ module Mongo
30
30
  #
31
31
  # @since 2.0.0
32
32
  class CreateUser
33
- include Executable
33
+ include GLE
34
+ include WriteCommandEnabled
34
35
  include Specifiable
35
36
 
36
- # Execute the operation.
37
- #
38
- # @note Creating users behaves different on 2.7+, 2.6.x, and
39
- # 2.4- so we need to break this out into separate operations.
40
- #
41
- # @example Execute the operation.
42
- # operation.execute(context)
43
- #
44
- # @param [ Mongo::Server::Context ] context The context for this operation.
45
- #
46
- # @return [ Result ] The operation result.
47
- #
48
- # @since 2.0.0
49
- def execute(context)
50
- if context.features.write_command_enabled?
51
- execute_write_command(context)
52
- else
53
- execute_message(context)
54
- end
55
- end
56
-
57
37
  private
58
38
 
59
- def execute_write_command(context)
60
- Result.new(Command::CreateUser.new(spec).execute(context)).validate!
61
- end
62
-
63
- def execute_message(context)
64
- context.with_connection do |connection|
65
- Result.new(connection.dispatch([ message, gle ].compact)).validate!
66
- end
39
+ def write_command_op
40
+ Command::CreateUser.new(spec)
67
41
  end
68
42
 
69
43
  def message
@@ -48,44 +48,21 @@ module Mongo
48
48
  #
49
49
  # @since 2.0.0
50
50
  class Delete
51
- include Executable
51
+ include GLE
52
+ include WriteCommandEnabled
52
53
  include Specifiable
53
54
 
54
- # Execute the delete operation.
55
- #
56
- # @example Execute the operation.
57
- # operation.execute(context)
58
- #
59
- # @param [ Mongo::Server::Context ] context The context for this operation.
60
- #
61
- # @return [ Result ] The result.
62
- #
63
- # @since 2.0.0
64
- def execute(context)
65
- if context.features.write_command_enabled?
66
- execute_write_command(context)
67
- else
68
- execute_message(context)
69
- end
70
- end
71
-
72
55
  private
73
56
 
74
- def execute_write_command(context)
57
+ def write_command_op
75
58
  s = spec.merge(:deletes => [ delete ])
76
59
  s.delete(:delete)
77
- Result.new(Command::Delete.new(s).execute(context)).validate!
78
- end
79
-
80
- def execute_message(context)
81
- context.with_connection do |connection|
82
- Result.new(connection.dispatch([ message, gle ].compact)).validate!
83
- end
60
+ Command::Delete.new(s)
84
61
  end
85
62
 
86
63
  def message
87
- selector = delete[:q]
88
- opts = ( delete[:limit] || 0 ) <= 0 ? {} : { :flags => [ :single_remove ] }
64
+ selector = delete[Operation::Q]
65
+ opts = (delete[Operation::LIMIT] || 0) <= 0 ? {} : { :flags => [ :single_remove ] }
89
66
  Protocol::Delete.new(db_name, coll_name, selector, opts)
90
67
  end
91
68
  end
@@ -35,7 +35,7 @@ module Mongo
35
35
  #
36
36
  # @since 2.0.0
37
37
  class DropIndex
38
- include Executable
38
+ include WriteCommandEnabled
39
39
  include Specifiable
40
40
 
41
41
  # Execute the drop index operation.
@@ -54,8 +54,8 @@ module Mongo
54
54
 
55
55
  private
56
56
 
57
- def execute_write_command(context)
58
- Result.new(Command::DropIndex.new(spec).execute(context)).validate!
57
+ def write_command_op
58
+ Command::DropIndex.new(spec)
59
59
  end
60
60
  end
61
61
  end
@@ -0,0 +1,49 @@
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 Write
18
+
19
+ # This module contains common functionality for operations that need to
20
+ # be followed by a GLE message.
21
+ #
22
+ # @since 2.1.0
23
+ module GLE
24
+
25
+ private
26
+
27
+ def execute_message(context)
28
+ context.with_connection do |connection|
29
+ result_class = self.class.const_defined?(:LegacyResult, false) ? self.class::LegacyResult :
30
+ self.class.const_defined?(:Result, false) ? self.class::Result : Result
31
+ result_class.new(connection.dispatch([ message, gle ].compact)).validate!
32
+ end
33
+ end
34
+
35
+ def gle
36
+ wc = write_concern || WriteConcern.get(WriteConcern::DEFAULT)
37
+ if gle_message = wc.get_last_error
38
+ Protocol::Query.new(
39
+ db_name,
40
+ Database::COMMAND,
41
+ gle_message,
42
+ options.merge(limit: -1)
43
+ )
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -15,8 +15,30 @@
15
15
  module Mongo
16
16
  module Operation
17
17
  module Write
18
+
19
+ # This module provides functionality to ensure that documents contain
20
+ # an id field. Used by insert operations (Bulk, legacy, write command inserts).
21
+ #
22
+ # @since 2.1.0
18
23
  module Idable
19
24
 
25
+ # The option for a custom id generator.
26
+ #
27
+ # @since 2.2.0
28
+ ID_GENERATOR = :id_generator.freeze
29
+
30
+ # Get the id generator.
31
+ #
32
+ # @example Get the id generator.
33
+ # idable.id_generator
34
+ #
35
+ # @return [ IdGenerator ] The default or custom id generator.
36
+ #
37
+ # @since 2.2.0
38
+ def id_generator
39
+ @id_generator ||= (spec[ID_GENERATOR] || ObjectIdGenerator.new)
40
+ end
41
+
20
42
  private
21
43
 
22
44
  def id(doc)
@@ -30,7 +52,7 @@ module Mongo
30
52
  def ensure_ids(documents)
31
53
  @ids ||= []
32
54
  documents.collect do |doc|
33
- doc_with_id = has_id?(doc) ? doc : doc.merge(_id: BSON::ObjectId.new)
55
+ doc_with_id = has_id?(doc) ? doc : doc.merge(_id: id_generator.generate)
34
56
  @ids << id(doc_with_id)
35
57
  doc_with_id
36
58
  end
@@ -38,4 +60,4 @@ module Mongo
38
60
  end
39
61
  end
40
62
  end
41
- end
63
+ end
@@ -43,28 +43,11 @@ module Mongo
43
43
  #
44
44
  # @since 2.0.0
45
45
  class Insert
46
- include Executable
46
+ include GLE
47
+ include WriteCommandEnabled
47
48
  include Specifiable
48
49
  include Idable
49
50
 
50
- # Execute the insert operation.
51
- #
52
- # @example Execute the operation.
53
- # operation.execute(context)
54
- #
55
- # @param [ Mongo::Server::Context ] context The context for this operation.
56
- #
57
- # @return [ Result ] The operation result.
58
- #
59
- # @since 2.0.0
60
- def execute(context)
61
- if context.features.write_command_enabled?
62
- execute_write_command(context)
63
- else
64
- execute_message(context)
65
- end
66
- end
67
-
68
51
  private
69
52
 
70
53
  def execute_write_command(context)
@@ -78,11 +61,6 @@ module Mongo
78
61
  end
79
62
  end
80
63
 
81
- def initialize_copy(original)
82
- @spec = original.spec.dup
83
- @spec[:documents] = original.spec[:documents].dup
84
- end
85
-
86
64
  def message
87
65
  opts = !!options[:continue_on_error] ? { :flags => [:continue_on_error] } : {}
88
66
  Protocol::Insert.new(db_name, coll_name, ensure_ids(documents), opts)
@@ -29,37 +29,14 @@ module Mongo
29
29
  #
30
30
  # @since 2.0.0
31
31
  class RemoveUser
32
- include Executable
32
+ include GLE
33
+ include WriteCommandEnabled
33
34
  include Specifiable
34
35
 
35
- # Execute the remove user operation.
36
- #
37
- # @example Execute the operation.
38
- # operation.execute(context)
39
- #
40
- # @param [ Mongo::Server::Context ] context The context for this operation.
41
- #
42
- # @return [ Result ] The operation result.
43
- #
44
- # @since 2.0.0
45
- def execute(context)
46
- if context.features.write_command_enabled?
47
- execute_write_command(context)
48
- else
49
- execute_message(context)
50
- end
51
- end
52
-
53
36
  private
54
37
 
55
- def execute_write_command(context)
56
- Result.new(Command::RemoveUser.new(spec).execute(context)).validate!
57
- end
58
-
59
- def execute_message(context)
60
- context.with_connection do |connection|
61
- Result.new(connection.dispatch([ message, gle ].compact)).validate!
62
- end
38
+ def write_command_op
39
+ Command::RemoveUser.new(spec)
63
40
  end
64
41
 
65
42
  def message
@@ -51,52 +51,29 @@ module Mongo
51
51
  #
52
52
  # @since 2.0.0
53
53
  class Update
54
- include Executable
54
+ include GLE
55
+ include WriteCommandEnabled
55
56
  include Specifiable
56
57
 
57
- # Execute the update operation.
58
- #
59
- # @example Execute the operation.
60
- # operation.execute(context)
61
- #
62
- # @param [ Mongo::Server::Context ] context The context for this operation.
63
- #
64
- # @return [ Result ] The operation result.
65
- #
66
- # @since 2.0.0
67
- def execute(context)
68
- if context.features.write_command_enabled?
69
- execute_write_command(context)
70
- else
71
- execute_message(context)
72
- end
73
- end
74
-
75
58
  private
76
59
 
77
- def execute_write_command(context)
60
+ def write_command_op
78
61
  s = spec.merge(:updates => [ update ])
79
62
  s.delete(:update)
80
- Result.new(Command::Update.new(s).execute(context)).validate!
81
- end
82
-
83
- def execute_message(context)
84
- context.with_connection do |connection|
85
- LegacyResult.new(connection.dispatch([ message, gle ].compact)).validate!
86
- end
87
- end
88
-
89
- def initialize_copy(original)
90
- @spec = original.spec.dup
91
- @spec[:updates] = original.spec[:updates].dup
63
+ Command::Update.new(s)
92
64
  end
93
65
 
94
66
  def message
95
67
  flags = []
96
- flags << :multi_update if update[:multi]
97
- flags << :upsert if update[:upsert]
98
- Protocol::Update.new(db_name, coll_name, update[:q], update[:u],
99
- flags.empty? ? {} : { flags: flags })
68
+ flags << :multi_update if update[Operation::MULTI]
69
+ flags << :upsert if update[Operation::UPSERT]
70
+ Protocol::Update.new(
71
+ db_name,
72
+ coll_name,
73
+ update[Operation::Q],
74
+ update[Operation::U],
75
+ flags.empty? ? {} : { flags: flags }
76
+ )
100
77
  end
101
78
  end
102
79
  end
@@ -30,40 +30,14 @@ module Mongo
30
30
  #
31
31
  # @since 2.0.0
32
32
  class UpdateUser
33
- include Executable
33
+ include GLE
34
+ include WriteCommandEnabled
34
35
  include Specifiable
35
36
 
36
- # Execute the operation.
37
- #
38
- # @note Updating users behaves different on 2.7+, 2.6.x, and
39
- # 2.4- so we need to break this out into separate operations.
40
- #
41
- # @example Execute the operation.
42
- # operation.execute(context)
43
- #
44
- # @param [ Mongo::Server::Context ] context The context for this operation.
45
- #
46
- # @return [ Result ] The operation result.
47
- #
48
- # @since 2.0.0
49
- def execute(context)
50
- if context.features.write_command_enabled?
51
- execute_write_command(context)
52
- else
53
- execute_message(context)
54
- end
55
- end
56
-
57
37
  private
58
38
 
59
- def execute_write_command(context)
60
- Result.new(Command::UpdateUser.new(spec).execute(context)).validate!
61
- end
62
-
63
- def execute_message(context)
64
- context.with_connection do |connection|
65
- Result.new(connection.dispatch([ message, gle ].compact)).validate!
66
- end
39
+ def write_command_op
40
+ Command::UpdateUser.new(spec)
67
41
  end
68
42
 
69
43
  def message
@@ -0,0 +1,53 @@
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 Write
18
+
19
+ # This module contains common functionality for operations that send either
20
+ # a write command or a specific wire protocol message, depending on server version.
21
+ # For server versions >= 2.6, a write command is sent.
22
+ #
23
+ # @since 2.1.0
24
+ module WriteCommandEnabled
25
+
26
+ # Execute the operation.
27
+ #
28
+ # @example Execute the operation.
29
+ # operation.execute(context)
30
+ #
31
+ # @param [ Mongo::Server::Context ] context The context for this operation.
32
+ #
33
+ # @return [ Result ] The operation result.
34
+ #
35
+ # @since 2.1.0
36
+ def execute(context)
37
+ if context.features.write_command_enabled?
38
+ execute_write_command(context)
39
+ else
40
+ execute_message(context)
41
+ end
42
+ end
43
+
44
+ private
45
+
46
+ def execute_write_command(context)
47
+ result_class = self.class.const_defined?(:Result, false) ? self.class::Result : Result
48
+ result_class.new(write_command_op.execute(context)).validate!
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -12,7 +12,9 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ require 'mongo/operation/write/write_command_enabled'
15
16
  require 'mongo/operation/write/idable'
17
+ require 'mongo/operation/write/gle'
16
18
  require 'mongo/operation/write/bulk'
17
19
  require 'mongo/operation/write/delete'
18
20
  require 'mongo/operation/write/insert'