mongo 2.0.6 → 2.1.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 (317) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +5 -2
  3. data/lib/mongo/address/ipv4.rb +6 -1
  4. data/lib/mongo/address/unix.rb +2 -2
  5. data/lib/mongo/address.rb +18 -10
  6. data/lib/mongo/auth/cr/conversation.rb +1 -1
  7. data/lib/mongo/auth/ldap/conversation.rb +7 -3
  8. data/lib/mongo/auth/scram/conversation.rb +9 -3
  9. data/lib/mongo/auth/user/view.rb +23 -2
  10. data/lib/mongo/auth/x509/conversation.rb +1 -1
  11. data/lib/mongo/bulk_write/combineable.rb +51 -0
  12. data/lib/mongo/bulk_write/ordered_combiner.rb +55 -0
  13. data/lib/mongo/bulk_write/result.rb +191 -0
  14. data/lib/mongo/bulk_write/result_combiner.rb +117 -0
  15. data/lib/mongo/bulk_write/transformable.rb +132 -0
  16. data/lib/mongo/bulk_write/unordered_combiner.rb +52 -0
  17. data/lib/mongo/bulk_write/validatable.rb +62 -0
  18. data/lib/mongo/bulk_write.rb +159 -23
  19. data/lib/mongo/client.rb +52 -16
  20. data/lib/mongo/cluster/topology/replica_set.rb +27 -9
  21. data/lib/mongo/cluster/topology/sharded.rb +1 -1
  22. data/lib/mongo/cluster/topology/unknown.rb +5 -2
  23. data/lib/mongo/cluster.rb +42 -7
  24. data/lib/mongo/collection/view/aggregation.rb +48 -9
  25. data/lib/mongo/collection/view/immutable.rb +6 -6
  26. data/lib/mongo/collection/view/iterable.rb +18 -4
  27. data/lib/mongo/collection/view/map_reduce.rb +58 -17
  28. data/lib/mongo/collection/view/readable.rb +173 -42
  29. data/lib/mongo/collection/view/writable.rb +37 -23
  30. data/lib/mongo/collection/view.rb +2 -2
  31. data/lib/mongo/collection.rb +370 -33
  32. data/lib/mongo/cursor.rb +15 -3
  33. data/lib/mongo/database/view.rb +5 -4
  34. data/lib/mongo/database.rb +14 -4
  35. data/lib/mongo/dbref.rb +113 -0
  36. data/lib/mongo/error/closed_stream.rb +34 -0
  37. data/lib/mongo/error/extra_file_chunk.rb +34 -0
  38. data/lib/mongo/error/{invalid_uri_option.rb → file_not_found.rb} +11 -12
  39. data/lib/mongo/error/invalid_file.rb +2 -2
  40. data/lib/mongo/error/invalid_file_revision.rb +37 -0
  41. data/lib/mongo/error/invalid_uri.rb +5 -4
  42. data/lib/mongo/error/missing_file_chunk.rb +38 -0
  43. data/lib/mongo/error/operation_failure.rb +1 -1
  44. data/lib/mongo/error/parser.rb +1 -1
  45. data/lib/mongo/error/unchangeable_collection_option.rb +38 -0
  46. data/lib/mongo/error/unexpected_chunk_length.rb +39 -0
  47. data/lib/mongo/error.rb +13 -2
  48. data/lib/mongo/event/description_changed.rb +1 -1
  49. data/lib/mongo/grid/file/chunk.rb +6 -6
  50. data/lib/mongo/grid/file/{metadata.rb → info.rb} +41 -39
  51. data/lib/mongo/grid/file.rb +13 -10
  52. data/lib/mongo/grid/fs_bucket.rb +448 -0
  53. data/lib/mongo/grid/stream/read.rb +208 -0
  54. data/lib/mongo/grid/stream/write.rb +187 -0
  55. data/lib/mongo/grid/stream.rb +64 -0
  56. data/lib/mongo/grid.rb +2 -1
  57. data/lib/mongo/index/view.rb +3 -3
  58. data/lib/mongo/index.rb +5 -0
  59. data/lib/mongo/loggable.rb +34 -57
  60. data/lib/mongo/logger.rb +16 -78
  61. data/lib/mongo/monitoring/command_log_subscriber.rb +112 -0
  62. data/lib/mongo/monitoring/event/command_failed.rb +96 -0
  63. data/lib/mongo/monitoring/event/command_started.rb +89 -0
  64. data/lib/mongo/monitoring/event/command_succeeded.rb +118 -0
  65. data/lib/mongo/monitoring/event/secure.rb +58 -0
  66. data/lib/mongo/monitoring/event.rb +18 -0
  67. data/lib/mongo/monitoring/publishable.rb +106 -0
  68. data/lib/mongo/monitoring.rb +195 -0
  69. data/lib/mongo/operation/{aggregate.rb → commands/aggregate.rb} +3 -41
  70. data/lib/mongo/operation/commands/collections_info/result.rb +39 -0
  71. data/lib/mongo/operation/commands/collections_info.rb +68 -0
  72. data/lib/mongo/operation/{command.rb → commands/command.rb} +2 -18
  73. data/lib/mongo/operation/commands/indexes.rb +70 -0
  74. data/lib/mongo/operation/commands/list_collections/result.rb +112 -0
  75. data/lib/mongo/operation/commands/list_collections.rb +54 -0
  76. data/lib/mongo/operation/commands/list_indexes/result.rb +116 -0
  77. data/lib/mongo/operation/commands/list_indexes.rb +56 -0
  78. data/lib/mongo/operation/{map_reduce → commands/map_reduce}/result.rb +1 -1
  79. data/lib/mongo/operation/{map_reduce.rb → commands/map_reduce.rb} +3 -41
  80. data/lib/mongo/operation/commands/parallel_scan/result.rb +72 -0
  81. data/lib/mongo/operation/commands/parallel_scan.rb +56 -0
  82. data/lib/mongo/operation/commands/user_query.rb +69 -0
  83. data/lib/mongo/{bulk_write/ordered_bulk_write.rb → operation/commands/users_info/result.rb} +18 -30
  84. data/lib/mongo/operation/commands/users_info.rb +53 -0
  85. data/lib/mongo/operation/commands.rb +24 -0
  86. data/lib/mongo/operation/executable.rb +4 -68
  87. data/lib/mongo/operation/kill_cursors.rb +3 -3
  88. data/lib/mongo/operation/read/get_more.rb +2 -22
  89. data/lib/mongo/{bulk_write/unordered_bulk_write.rb → operation/read/query/result.rb} +20 -26
  90. data/lib/mongo/operation/read/query.rb +4 -21
  91. data/lib/mongo/operation/read.rb +0 -4
  92. data/lib/mongo/operation/{read_preferrable.rb → read_preference.rb} +3 -2
  93. data/lib/mongo/operation/result.rb +13 -1
  94. data/lib/mongo/operation/specifiable.rb +42 -0
  95. data/lib/mongo/operation/write/bulk/bulkable.rb +82 -0
  96. data/lib/mongo/operation/write/bulk/delete/result.rb +74 -0
  97. data/lib/mongo/operation/write/bulk/delete.rb +71 -0
  98. data/lib/mongo/operation/write/bulk/insert/result.rb +129 -0
  99. data/lib/mongo/operation/write/bulk/insert.rb +96 -0
  100. data/lib/mongo/operation/write/bulk/legacy_mergable.rb +87 -0
  101. data/lib/mongo/operation/write/bulk/mergable.rb +71 -0
  102. data/lib/mongo/operation/write/bulk/update/result.rb +174 -0
  103. data/lib/mongo/operation/write/bulk/update.rb +81 -0
  104. data/lib/mongo/operation/write/bulk.rb +6 -3
  105. data/lib/mongo/operation/write/command/create_index.rb +0 -1
  106. data/lib/mongo/operation/write/command/create_user.rb +0 -1
  107. data/lib/mongo/operation/write/command/delete.rb +0 -1
  108. data/lib/mongo/operation/write/command/drop_index.rb +0 -1
  109. data/lib/mongo/operation/write/command/insert.rb +0 -1
  110. data/lib/mongo/operation/write/command/remove_user.rb +0 -1
  111. data/lib/mongo/operation/write/command/update.rb +0 -1
  112. data/lib/mongo/operation/write/command/update_user.rb +0 -1
  113. data/lib/mongo/operation/write/command/writable.rb +13 -18
  114. data/lib/mongo/operation/write/create_index.rb +4 -27
  115. data/lib/mongo/operation/write/create_user.rb +4 -30
  116. data/lib/mongo/operation/write/delete.rb +6 -29
  117. data/lib/mongo/operation/write/drop_index.rb +3 -3
  118. data/lib/mongo/operation/write/gle.rb +48 -0
  119. data/lib/mongo/operation/write/idable.rb +5 -0
  120. data/lib/mongo/operation/write/insert.rb +2 -24
  121. data/lib/mongo/operation/write/remove_user.rb +4 -27
  122. data/lib/mongo/operation/write/update.rb +13 -36
  123. data/lib/mongo/operation/write/update_user.rb +4 -30
  124. data/lib/mongo/operation/write/write_command_enabled.rb +53 -0
  125. data/lib/mongo/operation/write.rb +2 -0
  126. data/lib/mongo/operation.rb +32 -4
  127. data/lib/mongo/options/mapper.rb +4 -2
  128. data/lib/mongo/options/redacted.rb +156 -0
  129. data/lib/mongo/options.rb +1 -0
  130. data/lib/mongo/protocol/delete.rb +75 -15
  131. data/lib/mongo/protocol/get_more.rb +65 -13
  132. data/lib/mongo/protocol/insert.rb +85 -13
  133. data/lib/mongo/protocol/kill_cursors.rb +59 -14
  134. data/lib/mongo/protocol/message.rb +12 -12
  135. data/lib/mongo/protocol/query.rb +163 -37
  136. data/lib/mongo/protocol/reply.rb +103 -0
  137. data/lib/mongo/protocol/serializers.rb +1 -1
  138. data/lib/mongo/protocol/update.rb +82 -14
  139. data/lib/mongo/retryable.rb +83 -0
  140. data/lib/mongo/server/connectable.rb +21 -25
  141. data/lib/mongo/server/connection.rb +75 -4
  142. data/lib/mongo/server/connection_pool/queue.rb +15 -0
  143. data/lib/mongo/server/connection_pool.rb +12 -0
  144. data/lib/mongo/server/description/features.rb +2 -1
  145. data/lib/mongo/server/description.rb +52 -1
  146. data/lib/mongo/server/monitor/connection.rb +26 -2
  147. data/lib/mongo/server/monitor.rb +19 -3
  148. data/lib/mongo/server.rb +39 -5
  149. data/lib/mongo/server_selector/selectable.rb +40 -31
  150. data/lib/mongo/server_selector.rb +19 -10
  151. data/lib/mongo/socket/ssl.rb +28 -16
  152. data/lib/mongo/socket/tcp.rb +3 -3
  153. data/lib/mongo/socket/unix.rb +5 -8
  154. data/lib/mongo/socket.rb +11 -4
  155. data/lib/mongo/uri.rb +248 -137
  156. data/lib/mongo/version.rb +1 -1
  157. data/lib/mongo.rb +5 -3
  158. data/spec/mongo/address/unix_spec.rb +1 -1
  159. data/spec/mongo/address_spec.rb +25 -0
  160. data/spec/mongo/auth/cr_spec.rb +9 -1
  161. data/spec/mongo/auth/ldap/conversation_spec.rb +43 -0
  162. data/spec/mongo/auth/ldap_spec.rb +9 -1
  163. data/spec/mongo/auth/scram_spec.rb +9 -1
  164. data/spec/mongo/auth/user/view_spec.rb +26 -1
  165. data/spec/mongo/auth/x509_spec.rb +9 -1
  166. data/spec/mongo/bulk_write/ordered_combiner_spec.rb +271 -0
  167. data/spec/mongo/bulk_write/unordered_combiner_spec.rb +239 -0
  168. data/spec/mongo/bulk_write_spec.rb +428 -0
  169. data/spec/mongo/client_spec.rb +167 -17
  170. data/spec/mongo/cluster/topology/replica_set_spec.rb +18 -9
  171. data/spec/mongo/cluster/topology/sharded_spec.rb +11 -3
  172. data/spec/mongo/cluster/topology/single_spec.rb +12 -4
  173. data/spec/mongo/cluster_spec.rb +55 -10
  174. data/spec/mongo/collection/view/aggregation_spec.rb +188 -1
  175. data/spec/mongo/collection/view/explainable_spec.rb +1 -1
  176. data/spec/mongo/collection/view/immutable_spec.rb +103 -0
  177. data/spec/mongo/collection/view/map_reduce_spec.rb +99 -4
  178. data/spec/mongo/collection/view/readable_spec.rb +238 -6
  179. data/spec/mongo/collection/view/writable_spec.rb +4 -4
  180. data/spec/mongo/collection/view_spec.rb +459 -71
  181. data/spec/mongo/collection_spec.rb +1291 -9
  182. data/spec/mongo/command_monitoring_spec.rb +51 -0
  183. data/spec/mongo/connection_string_spec.rb +115 -0
  184. data/spec/mongo/crud_spec.rb +2 -2
  185. data/spec/mongo/cursor_spec.rb +3 -3
  186. data/spec/mongo/database_spec.rb +47 -11
  187. data/spec/mongo/dbref_spec.rb +149 -0
  188. data/spec/mongo/grid/file/chunk_spec.rb +5 -5
  189. data/spec/mongo/grid/file/{metadata_spec.rb → info_spec.rb} +29 -17
  190. data/spec/mongo/grid/file_spec.rb +8 -8
  191. data/spec/mongo/grid/fs_bucket_spec.rb +1020 -0
  192. data/spec/mongo/grid/stream/read_spec.rb +275 -0
  193. data/spec/mongo/grid/stream/write_spec.rb +440 -0
  194. data/spec/mongo/grid/stream_spec.rb +48 -0
  195. data/spec/mongo/gridfs_spec.rb +50 -0
  196. data/spec/mongo/logger_spec.rb +0 -40
  197. data/spec/mongo/monitoring/command_log_subscriber_spec.rb +76 -0
  198. data/spec/mongo/monitoring/event/command_started_spec.rb +26 -0
  199. data/spec/mongo/monitoring/event/command_succeeded_spec.rb +26 -0
  200. data/spec/mongo/monitoring/event/secure_spec.rb +57 -0
  201. data/spec/mongo/monitoring_spec.rb +168 -0
  202. data/spec/mongo/operation/commands/aggregate_spec.rb +69 -0
  203. data/spec/mongo/operation/{read → commands}/collections_info_spec.rb +1 -1
  204. data/spec/mongo/operation/{command_spec.rb → commands/command_spec.rb} +0 -18
  205. data/spec/mongo/operation/{read → commands}/indexes_spec.rb +1 -1
  206. data/spec/mongo/operation/{map_reduce_spec.rb → commands/map_reduce_spec.rb} +1 -19
  207. data/spec/mongo/operation/kill_cursors_spec.rb +1 -17
  208. data/spec/mongo/operation/read/get_more_spec.rb +0 -16
  209. data/spec/mongo/operation/read/query_spec.rb +19 -16
  210. data/spec/mongo/operation/{read_preferrable_spec.rb → read_preference_spec.rb} +11 -11
  211. data/spec/mongo/operation/write/bulk/{bulk_delete_spec.rb → delete_spec.rb} +18 -29
  212. data/spec/mongo/operation/write/bulk/{bulk_insert_spec.rb → insert_spec.rb} +3 -14
  213. data/spec/mongo/operation/write/bulk/{bulk_update_spec.rb → update_spec.rb} +8 -19
  214. data/spec/mongo/operation/write/command/delete_spec.rb +0 -16
  215. data/spec/mongo/operation/write/command/insert_spec.rb +0 -16
  216. data/spec/mongo/operation/write/command/update_spec.rb +0 -16
  217. data/spec/mongo/operation/write/delete_spec.rb +4 -4
  218. data/spec/mongo/operation/write/insert_spec.rb +2 -13
  219. data/spec/mongo/operation/write/update_spec.rb +7 -7
  220. data/spec/mongo/options/redacted_spec.rb +350 -0
  221. data/spec/mongo/protocol/kill_cursors_spec.rb +5 -3
  222. data/spec/mongo/protocol/query_spec.rb +15 -30
  223. data/spec/mongo/retryable_spec.rb +147 -0
  224. data/spec/mongo/server/connection_pool/queue_spec.rb +16 -0
  225. data/spec/mongo/server/connection_pool_spec.rb +50 -6
  226. data/spec/mongo/server/connection_spec.rb +49 -4
  227. data/spec/mongo/server/description_spec.rb +49 -3
  228. data/spec/mongo/server/monitor_spec.rb +51 -0
  229. data/spec/mongo/server_discovery_and_monitoring_spec.rb +32 -59
  230. data/spec/mongo/server_selection_rtt_spec.rb +37 -57
  231. data/spec/mongo/server_selection_spec.rb +19 -9
  232. data/spec/mongo/server_selector/nearest_spec.rb +35 -27
  233. data/spec/mongo/server_selector/primary_preferred_spec.rb +32 -30
  234. data/spec/mongo/server_selector/primary_spec.rb +21 -14
  235. data/spec/mongo/server_selector/secondary_preferred_spec.rb +28 -26
  236. data/spec/mongo/server_selector/secondary_spec.rb +24 -22
  237. data/spec/mongo/server_selector_spec.rb +87 -24
  238. data/spec/mongo/server_spec.rb +94 -8
  239. data/spec/mongo/socket/ssl_spec.rb +123 -13
  240. data/spec/mongo/socket/unix_spec.rb +52 -0
  241. data/spec/mongo/uri_spec.rb +295 -67
  242. data/spec/spec_helper.rb +40 -24
  243. data/spec/support/authorization.rb +23 -9
  244. data/spec/support/certificates/client.pem +4 -4
  245. data/spec/support/command_monitoring/bulkWrite.yml +73 -0
  246. data/spec/support/command_monitoring/command.yml +42 -0
  247. data/spec/support/command_monitoring/deleteMany.yml +55 -0
  248. data/spec/support/command_monitoring/deleteOne.yml +55 -0
  249. data/spec/support/command_monitoring/find.yml +219 -0
  250. data/spec/support/command_monitoring/insertMany.yml +81 -0
  251. data/spec/support/command_monitoring/insertOne.yml +51 -0
  252. data/spec/support/command_monitoring/updateMany.yml +67 -0
  253. data/spec/support/command_monitoring/updateOne.yml +95 -0
  254. data/spec/support/command_monitoring.rb +365 -0
  255. data/spec/support/connection_string.rb +228 -0
  256. data/spec/support/connection_string_tests/invalid-uris.yml +193 -0
  257. data/spec/support/connection_string_tests/valid-auth.yml +256 -0
  258. data/spec/support/connection_string_tests/valid-host_identifiers.yml +121 -0
  259. data/spec/support/connection_string_tests/valid-options.yml +30 -0
  260. data/spec/support/connection_string_tests/valid-unix_socket-absolute.yml +197 -0
  261. data/spec/support/connection_string_tests/valid-unix_socket-relative.yml +213 -0
  262. data/spec/support/connection_string_tests/valid-warnings.yml +55 -0
  263. data/spec/support/crud/read.rb +22 -19
  264. data/spec/support/crud/write.rb +58 -27
  265. data/spec/support/crud.rb +10 -2
  266. data/spec/support/gridfs.rb +637 -0
  267. data/spec/support/gridfs_tests/delete.yml +157 -0
  268. data/spec/support/gridfs_tests/download.yml +210 -0
  269. data/spec/support/gridfs_tests/download_by_name.yml +113 -0
  270. data/spec/support/gridfs_tests/upload.yml +158 -0
  271. data/spec/support/matchers.rb +1 -1
  272. data/spec/support/sdam/rs/equal_electionids.yml +44 -0
  273. data/spec/support/sdam/rs/new_primary_new_electionid.yml +95 -0
  274. data/spec/support/sdam/rs/null_election_id.yml +144 -0
  275. data/spec/support/sdam/rs/primary_disconnect_electionid.yml +124 -0
  276. data/spec/support/sdam/rs/primary_mismatched_me.yml +37 -0
  277. data/spec/support/sdam/rs/primary_to_no_primary_mismatched_me.yml +75 -0
  278. data/spec/support/sdam/rs/secondary_mismatched_me.yml +37 -0
  279. data/spec/support/sdam/sharded/mongos_disconnect.yml +104 -0
  280. data/spec/support/sdam/single/direct_connection_rsarbiter.yml +1 -1
  281. data/spec/support/sdam/single/direct_connection_rsprimary.yml +1 -1
  282. data/spec/support/sdam/single/direct_connection_rssecondary.yml +1 -1
  283. data/spec/support/sdam/single/direct_connection_slave.yml +1 -1
  284. data/spec/support/sdam/single/direct_connection_standalone.yml +1 -1
  285. data/spec/support/sdam/single/not_ok_response.yml +0 -1
  286. data/spec/support/server_discovery_and_monitoring.rb +22 -3
  287. data/spec/support/server_selection.rb +3 -1
  288. data/spec/support/shared/bulk_write.rb +218 -22
  289. data/spec/support/shared/server_selector.rb +80 -14
  290. data.tar.gz.sig +0 -0
  291. metadata +188 -59
  292. metadata.gz.sig +0 -0
  293. data/lib/mongo/bulk_write/bulk_writable.rb +0 -196
  294. data/lib/mongo/bulk_write/deletable.rb +0 -56
  295. data/lib/mongo/bulk_write/insertable.rb +0 -48
  296. data/lib/mongo/bulk_write/replacable.rb +0 -57
  297. data/lib/mongo/bulk_write/updatable.rb +0 -68
  298. data/lib/mongo/grid/fs.rb +0 -149
  299. data/lib/mongo/operation/list_collections/result.rb +0 -114
  300. data/lib/mongo/operation/list_indexes/result.rb +0 -118
  301. data/lib/mongo/operation/read/collections_info.rb +0 -68
  302. data/lib/mongo/operation/read/indexes.rb +0 -69
  303. data/lib/mongo/operation/read/list_collections.rb +0 -76
  304. data/lib/mongo/operation/read/list_indexes.rb +0 -78
  305. data/lib/mongo/operation/write/bulk/bulk_delete/result.rb +0 -75
  306. data/lib/mongo/operation/write/bulk/bulk_delete.rb +0 -145
  307. data/lib/mongo/operation/write/bulk/bulk_insert/result.rb +0 -130
  308. data/lib/mongo/operation/write/bulk/bulk_insert.rb +0 -132
  309. data/lib/mongo/operation/write/bulk/bulk_mergable.rb +0 -67
  310. data/lib/mongo/operation/write/bulk/bulk_update/result.rb +0 -162
  311. data/lib/mongo/operation/write/bulk/bulk_update.rb +0 -154
  312. data/lib/mongo/operation/write/bulk/legacy_bulk_mergable.rb +0 -83
  313. data/spec/mongo/bulk/bulk_write_spec.rb +0 -262
  314. data/spec/mongo/grid/fs_spec.rb +0 -160
  315. data/spec/mongo/loggable_spec.rb +0 -63
  316. data/spec/mongo/operation/aggregate_spec.rb +0 -127
  317. /data/lib/mongo/operation/{aggregate → commands/aggregate}/result.rb +0 -0
@@ -0,0 +1,82 @@
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
+ gle_message = ( ordered? && write_concern.get_last_error.nil? ) ?
67
+ Mongo::WriteConcern.get(:w => 1).get_last_error :
68
+ write_concern.get_last_error
69
+ if gle_message
70
+ Protocol::Query.new(
71
+ db_name,
72
+ Database::COMMAND,
73
+ gle_message,
74
+ options.merge(limit: -1)
75
+ )
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,74 @@
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 custom behaviour of results when deleting.
22
+ #
23
+ # @since 2.0.0
24
+ class Result < Operation::Result
25
+ include Mergable
26
+
27
+ # The aggregate number of deleted docs reported in the replies.
28
+ #
29
+ # @since 2.0.0
30
+ REMOVED = 'nRemoved'.freeze
31
+
32
+ # Gets the number of documents deleted.
33
+ #
34
+ # @example Get the deleted count.
35
+ # result.n_removed
36
+ #
37
+ # @return [ Integer ] The number of documents deleted.
38
+ #
39
+ # @since 2.0.0
40
+ def n_removed
41
+ return 0 unless acknowledged?
42
+ @replies.reduce(0) do |n, reply|
43
+ n += reply.documents.first[N]
44
+ end
45
+ end
46
+ end
47
+
48
+ # Defines custom behaviour of results when deleting.
49
+ # For server versions < 2.5.5 (that don't use write commands).
50
+ #
51
+ # @since 2.0.0
52
+ class LegacyResult < Operation::Result
53
+ include LegacyMergable
54
+
55
+ # Gets the number of documents deleted.
56
+ #
57
+ # @example Get the deleted count.
58
+ # result.n_removed
59
+ #
60
+ # @return [ Integer ] The number of documents deleted.
61
+ #
62
+ # @since 2.0.0
63
+ def n_removed
64
+ return 0 unless acknowledged?
65
+ @replies.reduce(0) do |n, reply|
66
+ n += reply.documents.first[N]
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
74
+ 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
@@ -0,0 +1,129 @@
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 Insert
20
+
21
+ # Defines custom behaviour of results when inserting.
22
+ #
23
+ # @since 2.0.0
24
+ class Result < Operation::Result
25
+ include Mergable
26
+
27
+ # Get the ids of the inserted documents.
28
+ #
29
+ # @since 2.0.0
30
+ attr_reader :inserted_ids
31
+
32
+ # Initialize a new result.
33
+ #
34
+ # @example Instantiate the result.
35
+ # Result.new(replies, inserted_ids)
36
+ #
37
+ # @param [ Protocol::Reply ] replies The wire protocol replies.
38
+ # @param [ Array<Object> ] ids The ids of the inserted documents.
39
+ #
40
+ # @since 2.0.0
41
+ def initialize(replies, ids)
42
+ @replies = replies.is_a?(Protocol::Reply) ? [ replies ] : replies
43
+ @inserted_ids = ids
44
+ end
45
+
46
+ # Gets the number of documents inserted.
47
+ #
48
+ # @example Get the number of documents inserted.
49
+ # result.n_inserted
50
+ #
51
+ # @return [ Integer ] The number of documents inserted.
52
+ #
53
+ # @since 2.0.0
54
+ def n_inserted
55
+ written_count
56
+ end
57
+
58
+ # Gets the id of the document inserted.
59
+ #
60
+ # @example Get id of the document inserted.
61
+ # result.inserted_id
62
+ #
63
+ # @return [ Object ] The id of the document inserted.
64
+ #
65
+ # @since 2.0.0
66
+ def inserted_id
67
+ inserted_ids.first
68
+ end
69
+ end
70
+
71
+ # Defines custom behaviour of results when inserting.
72
+ # For server versions < 2.5.5 (that don't use write commands).
73
+ #
74
+ # @since 2.0.0
75
+ class LegacyResult < Operation::Result
76
+ include LegacyMergable
77
+
78
+ # Get the ids of the inserted documents.
79
+ #
80
+ # @since 2.0.0
81
+ attr_reader :inserted_ids
82
+
83
+ # Initialize a new result.
84
+ #
85
+ # @example Instantiate the result.
86
+ # Result.new(replies, inserted_ids)
87
+ #
88
+ # @param [ Protocol::Reply ] replies The wire protocol replies.
89
+ # @param [ Array<Object> ] ids The ids of the inserted documents.
90
+ #
91
+ # @since 2.0.0
92
+ def initialize(replies, ids)
93
+ @replies = replies.is_a?(Protocol::Reply) ? [ replies ] : replies
94
+ @inserted_ids = ids
95
+ end
96
+
97
+ # Gets the number of documents inserted.
98
+ #
99
+ # @example Get the number of documents inserted.
100
+ # result.n_inserted
101
+ #
102
+ # @return [ Integer ] The number of documents inserted.
103
+ #
104
+ # @since 2.0.0
105
+ def n_inserted
106
+ return 0 unless acknowledged?
107
+ @replies.reduce(0) do |n, reply|
108
+ n += 1 unless reply_write_errors?(reply)
109
+ n
110
+ end
111
+ end
112
+
113
+ # Gets the id of the document inserted.
114
+ #
115
+ # @example Get id of the document inserted.
116
+ # result.inserted_id
117
+ #
118
+ # @return [ Object ] The id of the document inserted.
119
+ #
120
+ # @since 2.0.0
121
+ def inserted_id
122
+ inserted_ids.first
123
+ end
124
+ end
125
+ end
126
+ end
127
+ end
128
+ end
129
+ end
@@ -0,0 +1,96 @@
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/insert/result'
16
+
17
+ module Mongo
18
+ module Operation
19
+ module Write
20
+ module Bulk
21
+
22
+ # A MongoDB bulk insert operation.
23
+ # This class should only be used by the Bulk API.
24
+ #
25
+ # @note If a server with version >= 2.5.5 is being used, a write command
26
+ # operation will be created and sent instead.
27
+ #
28
+ # @example Create the new insert operation.
29
+ # Write::BulkInsert.new({
30
+ # :documents => [{ :foo => 1 }],
31
+ # :db_name => 'test',
32
+ # :coll_name => 'test_coll',
33
+ # :write_concern => write_concern,
34
+ # :ordered => false
35
+ # })
36
+ #
37
+ # Initialization:
38
+ # param [ Hash ] spec The specifications for the insert.
39
+ #
40
+ # option spec :documents [ Array ] The documents to insert.
41
+ # option spec :db_name [ String ] The name of the database.
42
+ # option spec :coll_name [ String ] The name of the collection.
43
+ # option spec :write_concern [ Mongo::WriteConcern ] The write concern.
44
+ # option spec :ordered [ true, false ] Whether the operations should be
45
+ # executed in order.
46
+ # option spec :options [ Hash ] Options for the command, if it ends up being a
47
+ # write command.
48
+ #
49
+ # @since 2.0.0
50
+ class Insert
51
+ include Bulkable
52
+ include Specifiable
53
+ include Idable
54
+
55
+ private
56
+
57
+ def execute_write_command(context)
58
+ command_spec = spec.merge(:documents => ensure_ids(documents))
59
+ Result.new(Command::Insert.new(command_spec).execute(context), @ids)
60
+ end
61
+
62
+ def execute_message(context)
63
+ replies = []
64
+ messages.map do |m|
65
+ context.with_connection do |connection|
66
+ result = LegacyResult.new(connection.dispatch([ m, gle ].compact, operation_id), @ids)
67
+ replies << result.reply
68
+ if stop_sending?(result)
69
+ return LegacyResult.new(replies, @ids)
70
+ end
71
+ end
72
+ end
73
+ LegacyResult.new(replies.compact.empty? ? nil : replies, @ids)
74
+ end
75
+
76
+ def messages
77
+ if ordered? || gle
78
+ documents.collect do |doc|
79
+ Protocol::Insert.new(db_name, coll_name, ensure_ids([ doc ]), spec)
80
+ end
81
+ else
82
+ [
83
+ Protocol::Insert.new(
84
+ db_name,
85
+ coll_name,
86
+ ensure_ids(documents),
87
+ spec.merge({ :flags => [:continue_on_error] })
88
+ )
89
+ ]
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,87 @@
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
+ # This module contains common functionality for merging results from
21
+ # writes during a bulk operation. Used for server versions < 2.6.
22
+ #
23
+ # @since 2.0.0
24
+ module LegacyMergable
25
+
26
+ # Aggregate the write errors returned from this result.
27
+ #
28
+ # @example Aggregate the write errors.
29
+ # result.aggregate_write_errors(0)
30
+ #
31
+ # @param [ Integer ] count The number of documents already executed.
32
+ #
33
+ # @return [ Array ] The aggregate write errors.
34
+ #
35
+ # @since 2.0.0
36
+ def aggregate_write_errors(count)
37
+ @replies.each_with_index.reduce(nil) do |errors, (reply, i)|
38
+ if reply_write_errors?(reply)
39
+ errors ||= []
40
+ errors << { 'errmsg' => reply.documents.first[Error::ERROR],
41
+ 'index' => count + i,
42
+ 'code' => reply.documents.first[Error::CODE] }
43
+ end
44
+ errors
45
+ end
46
+ end
47
+
48
+ # Aggregate the write concern errors returned from this result.
49
+ #
50
+ # @example Aggregate the write concern errors.
51
+ # result.aggregate_write_concern_errors(4)
52
+ #
53
+ # @param [ Integer ] count The number of documents already executed.
54
+ #
55
+ # @return [ Array ] The aggregate write concern errors.
56
+ #
57
+ # @since 2.0.0
58
+ def aggregate_write_concern_errors(count)
59
+ @replies.each_with_index.reduce(nil) do |errors, (reply, i)|
60
+ if error = reply_write_errors?(reply)
61
+ errors ||= []
62
+ if note = reply.documents.first['wnote'] || reply.documents.first['jnote']
63
+ code = reply.documents.first['code'] || Error::BAD_VALUE
64
+ error_string = "#{code}: #{note}"
65
+ elsif error == 'timeout'
66
+ code = reply.documents.first['code'] || Error::UNKNOWN_ERROR
67
+ error_string = "#{code}: #{error}"
68
+ end
69
+ errors << { 'errmsg' => error_string,
70
+ 'index' => count + i,
71
+ 'code' => code } if error_string
72
+ end
73
+ errors
74
+ end
75
+ end
76
+
77
+ private
78
+
79
+ def reply_write_errors?(reply)
80
+ reply.documents.first[Error::ERROR] ||
81
+ reply.documents.first[Error::ERRMSG]
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
87
+ 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
+ module Mongo
16
+ module Operation
17
+ module Write
18
+ module Bulk
19
+
20
+ # This module contains common functionality for merging results from
21
+ # write commands during a bulk operation. Used for server versions >= 2.6.
22
+ #
23
+ # @since 2.0.0
24
+ module Mergable
25
+
26
+ # Aggregate the write errors returned from this result.
27
+ #
28
+ # @example Aggregate the write errors.
29
+ # result.aggregate_write_errors(0)
30
+ #
31
+ # @param [ Integer ] count The number of documents already executed.
32
+ #
33
+ # @return [ Array ] The aggregate write errors.
34
+ #
35
+ # @since 2.0.0
36
+ def aggregate_write_errors(count)
37
+ @replies.reduce(nil) do |errors, reply|
38
+ if write_errors = reply.documents.first[Error::WRITE_ERRORS]
39
+ wes = write_errors.collect do |we|
40
+ we.merge!('index' => count + we['index'])
41
+ end
42
+ (errors || []) << wes if wes
43
+ end
44
+ end
45
+ end
46
+
47
+ # Aggregate the write concern errors returned from this result.
48
+ #
49
+ # @example Aggregate the write concern errors.
50
+ # result.aggregate_write_concern_errors(100)
51
+ #
52
+ # @param [ Integer ] count The number of documents already executed.
53
+ #
54
+ # @return [ Array ] The aggregate write concern errors.
55
+ #
56
+ # @since 2.0.0
57
+ def aggregate_write_concern_errors(count)
58
+ @replies.each_with_index.reduce(nil) do |errors, (reply, i)|
59
+ if write_concern_errors = reply.documents.first[Error::WRITE_CONCERN_ERRORS]
60
+ (errors || []) << write_concern_errors.reduce(nil) do |errs, wce|
61
+ wce.merge!('index' => count + wce['index'])
62
+ (errs || []) << write_concern_error
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end