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
@@ -0,0 +1,26 @@
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
+ require 'mongo/operation/commands/command'
16
+ require 'mongo/operation/commands/find'
17
+ require 'mongo/operation/commands/get_more'
18
+ require 'mongo/operation/commands/parallel_scan'
19
+ require 'mongo/operation/commands/aggregate'
20
+ require 'mongo/operation/commands/map_reduce'
21
+ require 'mongo/operation/commands/collections_info'
22
+ require 'mongo/operation/commands/indexes'
23
+ require 'mongo/operation/commands/list_collections'
24
+ require 'mongo/operation/commands/list_indexes'
25
+ require 'mongo/operation/commands/user_query'
26
+ require 'mongo/operation/commands/users_info'
@@ -15,8 +15,8 @@
15
15
  module Mongo
16
16
  module Operation
17
17
 
18
- # This module contains common functionality for defining an operation
19
- # and executing it, given a certain context.
18
+ # This module provides the #execute method that many operations use.
19
+ # It makes sure to instantiate the appropriate Result class for the operation's response.
20
20
  #
21
21
  # @since 2.0.0
22
22
  module Executable
@@ -32,72 +32,8 @@ module Mongo
32
32
  # @since 2.0.0
33
33
  def execute(context)
34
34
  context.with_connection do |connection|
35
- connection.dispatch([ message ], operation_id)
36
- end
37
- end
38
-
39
- # Merge this operation with another operation, returning a new one.
40
- # Requires that the collection and database of the two ops are the same.
41
- #
42
- # @param[ Object ] The other operation.
43
- #
44
- # @return [ Object ] A new operation merging this one and another.
45
- #
46
- # @since 2.0.0
47
- def merge(other)
48
- # @todo: use specific exception
49
- raise Exception, "Cannot merge" unless self.class == other.class &&
50
- coll_name == other.coll_name &&
51
- db_name == other.db_name
52
- dup.merge!(other)
53
- end
54
-
55
- # Get the full namespace that this operates on.
56
- #
57
- # @example Get the namespace.
58
- # executable.namespace
59
- #
60
- # @return [ String ] The namespace.
61
- #
62
- # @since 2.0.0
63
- def namespace
64
- "#{db_name}.#{coll_name}"
65
- end
66
-
67
- # If an operation including this module doesn't define #merge!, neither
68
- # #merge nor #merge! will be allowed.
69
- #
70
- # @param[ Object ] The other operation.
71
- #
72
- # @raise [ Exception ] Merging is not supported for this operation.
73
- #
74
- # @since 2.0.0
75
- def merge!(other)
76
- raise Exception, "Merging not allowed for this operation type"
77
- end
78
-
79
- private
80
-
81
- # If it's ok that this operation be sent to a secondary server.
82
- #
83
- # @return [ true, false ] Whether it's ok for this op to go to a secondary.
84
- #
85
- # @since 2.0.0
86
- def secondary_ok?
87
- true
88
- end
89
-
90
- # Gets the legacy get last error command as a wire protocol query.
91
- #
92
- # @since 2.0.0
93
- def gle
94
- if gle_message = write_concern.get_last_error
95
- Protocol::Query.new(
96
- db_name,
97
- Database::COMMAND,
98
- gle_message,
99
- options.merge(limit: -1)
100
- )
35
+ result_class = self.class.const_defined?(:Result, false) ? self.class::Result : Result
36
+ result_class.new(connection.dispatch([ message(context) ], operation_id)).validate!
101
37
  end
102
38
  end
103
39
  end
@@ -27,13 +27,13 @@ module Mongo
27
27
  #
28
28
  # @since 2.0.0
29
29
  class KillCursors
30
- include Executable
31
30
  include Specifiable
31
+ include Executable
32
32
 
33
33
  private
34
34
 
35
- def message
36
- Protocol::KillCursors.new(cursor_ids)
35
+ def message(context)
36
+ Protocol::KillCursors.new(coll_name, db_name, cursor_ids)
37
37
  end
38
38
  end
39
39
  end
@@ -0,0 +1,36 @@
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
+
18
+ # The default generator of ids for documents.
19
+ #
20
+ # @since 2.2.0
21
+ class ObjectIdGenerator
22
+
23
+ # Generate a nwe id.
24
+ #
25
+ # @example Generate the id.
26
+ # object_id_generator.generate
27
+ #
28
+ # @return [ BSON::ObjectId ] The new id.
29
+ #
30
+ # @since 2.2.0
31
+ def generate
32
+ BSON::ObjectId.new
33
+ end
34
+ end
35
+ end
36
+ end
@@ -38,32 +38,12 @@ module Mongo
38
38
  #
39
39
  # @since 2.0.0
40
40
  class GetMore
41
- include Executable
42
41
  include Specifiable
43
-
44
- # Execute the get more operation.
45
- #
46
- # @example Execute the operation.
47
- # operation.execute(context)
48
- #
49
- # @param [ Mongo::Server::Context ] context The context for this operation.
50
- #
51
- # @return [ Result ] The operation response, if there is one.
52
- #
53
- # @since 2.0.0
54
- def execute(context)
55
- execute_message(context)
56
- end
42
+ include Executable
57
43
 
58
44
  private
59
45
 
60
- def execute_message(context)
61
- context.with_connection do |connection|
62
- Result.new(connection.dispatch([ message ]))
63
- end
64
- end
65
-
66
- def message
46
+ def message(context)
67
47
  Protocol::GetMore.new(db_name, coll_name, to_return, cursor_id)
68
48
  end
69
49
  end
@@ -0,0 +1,40 @@
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 Read
18
+ class Query
19
+
20
+ # Defines custom behaviour of results for a query.
21
+ #
22
+ # @since 2.1.0
23
+ class Result < Operation::Result
24
+
25
+ # Determine if the query was a success.
26
+ #
27
+ # @example Was the query successful?
28
+ # result.successful?
29
+ #
30
+ # @return [ true, false ] If the query was successful.
31
+ #
32
+ # @since 2.0.0
33
+ def successful?
34
+ !query_failure?
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -12,6 +12,8 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ require 'mongo/operation/read/query/result'
16
+
15
17
  module Mongo
16
18
  module Operation
17
19
  module Read
@@ -38,31 +40,12 @@ module Mongo
38
40
  #
39
41
  # @since 2.0.0
40
42
  class Query
41
- include Executable
42
43
  include Specifiable
43
- include ReadPreferrable
44
-
45
- # Execute the operation.
46
- # The context gets a connection on which the operation
47
- # is sent in the block.
48
- #
49
- # @param [ Server::Context ] context The context for this operation.
50
- #
51
- # @return [ Result ] The operation response, if there is one.
52
- #
53
- # @since 2.0.0
54
- def execute(context)
55
- execute_message(context)
56
- end
44
+ include Executable
45
+ include ReadPreference
57
46
 
58
47
  private
59
48
 
60
- def execute_message(context)
61
- context.with_connection do |connection|
62
- Result.new(connection.dispatch([ message(context) ])).validate!
63
- end
64
- end
65
-
66
49
  def query_coll
67
50
  coll_name
68
51
  end
@@ -14,7 +14,3 @@
14
14
 
15
15
  require 'mongo/operation/read/query'
16
16
  require 'mongo/operation/read/get_more'
17
- require 'mongo/operation/read/indexes'
18
- require 'mongo/operation/read/list_indexes'
19
- require 'mongo/operation/read/list_collections'
20
- require 'mongo/operation/read/collections_info'
@@ -15,10 +15,11 @@
15
15
  module Mongo
16
16
  module Operation
17
17
 
18
- # Adds behaviour for queries that need to take read preference into account.
18
+ # Adds behaviour for updating the options and the selector for operations
19
+ # that need to take read preference into account.
19
20
  #
20
21
  # @since 2.0.0
21
- module ReadPreferrable
22
+ module ReadPreference
22
23
 
23
24
  # The constant for slave ok flags.
24
25
  #
@@ -22,6 +22,31 @@ module Mongo
22
22
  extend Forwardable
23
23
  include Enumerable
24
24
 
25
+ # The field name for the cursor document in an aggregation.
26
+ #
27
+ # @since 2.2.0
28
+ CURSOR = 'cursor'.freeze
29
+
30
+ # The cursor id field in the cursor document.
31
+ #
32
+ # @since 2.2.0
33
+ CURSOR_ID = 'id'.freeze
34
+
35
+ # The field name for the first batch of a cursor.
36
+ #
37
+ # @since 2.2.0
38
+ FIRST_BATCH = 'firstBatch'.freeze
39
+
40
+ # The field name for the next batch of a cursor.
41
+ #
42
+ # @since 2.2.0
43
+ NEXT_BATCH = 'nextBatch'.freeze
44
+
45
+ # The namespace field in the cursor document.
46
+ #
47
+ # @since 2.2.0
48
+ NAMESPACE = 'ns'.freeze
49
+
25
50
  # The number of documents updated in the write.
26
51
  #
27
52
  # @since 2.0.0
@@ -32,6 +57,11 @@ module Mongo
32
57
  # @since 2.0.0
33
58
  OK = 'ok'.freeze
34
59
 
60
+ # The result field constant.
61
+ #
62
+ # @since 2.2.0
63
+ RESULT = 'result'.freeze
64
+
35
65
  # @return [ Array<Protocol::Reply> ] replies The wrapped wire protocol replies.
36
66
  attr_reader :replies
37
67
 
@@ -190,12 +220,24 @@ module Mongo
190
220
  def successful?
191
221
  return true if !acknowledged?
192
222
  if first_document.has_key?(OK)
193
- first_document[OK] == 1 && parser.message.empty?
223
+ ok? && parser.message.empty?
194
224
  else
195
225
  !query_failure? && parser.message.empty?
196
226
  end
197
227
  end
198
228
 
229
+ # Check the first document's ok field.
230
+ #
231
+ # @example Check the ok field.
232
+ # result.ok?
233
+ #
234
+ # @return [ true, false ] If the command returned ok.
235
+ #
236
+ # @since 2.1.0
237
+ def ok?
238
+ first_document[OK] == 1
239
+ end
240
+
199
241
  # Validate the result by checking for any errors.
200
242
  #
201
243
  # @note This only checks for errors with writes since authentication is
@@ -86,6 +86,11 @@ module Mongo
86
86
  # @since 2.0.0
87
87
  OPTIONS = :options.freeze
88
88
 
89
+ # The read concern option.
90
+ #
91
+ # @since 2.2.0
92
+ READ_CONCERN = :read_concern.freeze
93
+
89
94
  # The field for a selector.
90
95
  #
91
96
  # @since 2.0.0
@@ -126,6 +131,11 @@ module Mongo
126
131
  # @since 2.0.0
127
132
  READ = :read.freeze
128
133
 
134
+ # Whether to bypass document level validation.
135
+ #
136
+ # @since 2.2.0
137
+ BYPASS_DOC_VALIDATION = :bypass_document_validation.freeze
138
+
129
139
  # @return [ Hash ] spec The specification for the operation.
130
140
  attr_reader :spec
131
141
 
@@ -317,6 +327,30 @@ module Mongo
317
327
  spec[OPTIONS] || {}
318
328
  end
319
329
 
330
+ # Get the read concern from the spec.
331
+ #
332
+ # @example Get the read concern.
333
+ # specifiable.read_concern
334
+ #
335
+ # @return [ Hash ] The read concern.
336
+ #
337
+ # @since 2.2.0
338
+ def read_concern
339
+ spec[READ_CONCERN]
340
+ end
341
+
342
+ # Whether or not to bypass document level validation.
343
+ #
344
+ # @example Get the bypass_document_validation option.
345
+ # specifiable.bypass_documentation_validation.
346
+ #
347
+ # @return [ true, false ] Whether to bypass document level validation.
348
+ #
349
+ # @since 2.2.0
350
+ def bypass_document_validation
351
+ spec[BYPASS_DOC_VALIDATION]
352
+ end
353
+
320
354
  # The selector for from the specification.
321
355
  #
322
356
  # @example Get a selector specification.
@@ -396,7 +430,7 @@ module Mongo
396
430
  #
397
431
  # @since 2.0.0
398
432
  def write_concern
399
- @spec[WRITE_CONCERN] || WriteConcern.get(WriteConcern::DEFAULT)
433
+ @spec[WRITE_CONCERN]
400
434
  end
401
435
 
402
436
  # The read preference for this operation.
@@ -410,6 +444,30 @@ module Mongo
410
444
  def read
411
445
  @spec[READ] || ServerSelector.get
412
446
  end
447
+
448
+ # Whether the operation is ordered.
449
+ #
450
+ # @example Get the ordered value, true is the default.
451
+ # specifiable.ordered?
452
+ #
453
+ # @return [ true, false ] Whether the operation is ordered.
454
+ #
455
+ # @since 2.1.0
456
+ def ordered?
457
+ !!(@spec.fetch(:ordered, true))
458
+ end
459
+
460
+ # The namespace, consisting of the db name and collection name.
461
+ #
462
+ # @example Get the namespace.
463
+ # specifiable.namespace
464
+ #
465
+ # @return [ String ] The namespace.
466
+ #
467
+ # @since 2.1.0
468
+ def namespace
469
+ "#{db_name}.#{coll_name}"
470
+ end
413
471
  end
414
472
  end
415
473
  end
@@ -0,0 +1,83 @@
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
+ module Bulk
19
+
20
+ # Provides common behavior for bulk write operations.
21
+ # Note that #validate! is not called on operation results because they are merged
22
+ # at a higher level.
23
+ #
24
+ # @since 2.1.0
25
+ module Bulkable
26
+
27
+ # Execute the bulk operation.
28
+ #
29
+ # @example Execute the operation.
30
+ # operation.execute(context)
31
+ #
32
+ # @param [ Mongo::Server::Context ] context The context for this operation.
33
+ #
34
+ # @return [ Result ] The operation result.
35
+ #
36
+ # @since 2.0.0
37
+ def execute(context)
38
+ if context.features.write_command_enabled?
39
+ execute_write_command(context)
40
+ else
41
+ execute_message(context)
42
+ end
43
+ end
44
+
45
+ private
46
+
47
+ def execute_message(context)
48
+ replies = messages.map do |m|
49
+ context.with_connection do |connection|
50
+ result = self.class::LegacyResult.new(connection.dispatch([ m, gle ].compact, operation_id))
51
+ if stop_sending?(result)
52
+ return result
53
+ else
54
+ result.reply
55
+ end
56
+ end
57
+ end
58
+ self.class::LegacyResult.new(replies.compact.empty? ? nil : replies)
59
+ end
60
+
61
+ def stop_sending?(result)
62
+ ordered? && !result.successful?
63
+ end
64
+
65
+ def gle
66
+ wc = write_concern || WriteConcern.get(WriteConcern::DEFAULT)
67
+ gle_message = ( ordered? && wc.get_last_error.nil? ) ?
68
+ Mongo::WriteConcern.get(Mongo::WriteConcern::DEFAULT).get_last_error :
69
+ wc.get_last_error
70
+ if gle_message
71
+ Protocol::Query.new(
72
+ db_name,
73
+ Database::COMMAND,
74
+ gle_message,
75
+ options.merge(limit: -1)
76
+ )
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,67 @@
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
+ module Bulk
19
+ class Delete
20
+
21
+ # Defines common r_removed aggreation behaviour.
22
+ #
23
+ # @since 2.2.0
24
+ module Aggregatable
25
+
26
+ # Gets the number of documents deleted.
27
+ #
28
+ # @example Get the deleted count.
29
+ # result.n_removed
30
+ #
31
+ # @return [ Integer ] The number of documents deleted.
32
+ #
33
+ # @since 2.0.0
34
+ def n_removed
35
+ return 0 unless acknowledged?
36
+ @replies.reduce(0) do |n, reply|
37
+ n += reply.documents.first[Result::N]
38
+ end
39
+ end
40
+ end
41
+
42
+ # Defines custom behaviour of results when deleting.
43
+ #
44
+ # @since 2.0.0
45
+ class Result < Operation::Result
46
+ include Mergable
47
+ include Aggregatable
48
+
49
+ # The aggregate number of deleted docs reported in the replies.
50
+ #
51
+ # @since 2.0.0
52
+ REMOVED = 'nRemoved'.freeze
53
+ end
54
+
55
+ # Defines custom behaviour of results when deleting.
56
+ # For server versions < 2.5.5 (that don't use write commands).
57
+ #
58
+ # @since 2.0.0
59
+ class LegacyResult < Operation::Result
60
+ include LegacyMergable
61
+ include Aggregatable
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,71 @@
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
+ require 'mongo/operation/write/bulk/delete/result'
16
+
17
+ module Mongo
18
+ module Operation
19
+ module Write
20
+ module Bulk
21
+
22
+ # A MongoDB bulk delete operation.
23
+ #
24
+ # @note If a server with version >= 2.5.5 is selected, a write command
25
+ # operation will be created and sent instead.
26
+ #
27
+ # @example Create the delete operation.
28
+ # Write::Bulk::Delete.new({
29
+ # :deletes => [{ :q => { :foo => 1 }, :limit => 1 }],
30
+ # :db_name => 'test',
31
+ # :coll_name => 'test_coll',
32
+ # :write_concern => write_concern
33
+ # })
34
+ #
35
+ # Initialization:
36
+ # param [ Hash ] spec The specifications for the delete.
37
+ #
38
+ # option spec :deletes [ Array ] The delete documents.
39
+ # option spec :db_name [ String ] The name of the database on which
40
+ # the delete should be executed.
41
+ # option spec :coll_name [ String ] The name of the collection on which
42
+ # the delete should be executed.
43
+ # option spec :write_concern [ Mongo::WriteConcern ] The write concern
44
+ # for this operation.
45
+ # option spec :ordered [ true, false ] Whether the operations should be
46
+ # executed in order.
47
+ # option spec :options [Hash] Options for the command, if it ends up being a
48
+ # write command.
49
+ #
50
+ # @since 2.0.0
51
+ class Delete
52
+ include Bulkable
53
+ include Specifiable
54
+
55
+ private
56
+
57
+ def execute_write_command(context)
58
+ Result.new(Command::Delete.new(spec).execute(context))
59
+ end
60
+
61
+ def messages
62
+ deletes.collect do |del|
63
+ opts = ( del[Operation::LIMIT] || 0 ) <= 0 ? {} : { :flags => [ :single_remove ] }
64
+ Protocol::Delete.new(db_name, coll_name, del[Operation::Q], opts)
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end