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,174 @@
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 Update
20
+
21
+ # Defines custom behaviour of results when updating.
22
+ #
23
+ # @since 2.0.0
24
+ class Result < Operation::Result
25
+ include Mergable
26
+
27
+ # The number of modified docs field in the result.
28
+ #
29
+ # @since 2.0.0
30
+ MODIFIED = 'nModified'.freeze
31
+
32
+ # The upserted docs field in the result.
33
+ #
34
+ # @since 2.0.0
35
+ UPSERTED = 'upserted'.freeze
36
+
37
+ # Gets the number of documents upserted.
38
+ #
39
+ # @example Get the upserted count.
40
+ # result.n_upserted
41
+ #
42
+ # @return [ Integer ] The number of documents upserted.
43
+ #
44
+ # @since 2.0.0
45
+ def n_upserted
46
+ return 0 unless acknowledged?
47
+ @replies.reduce(0) do |n, reply|
48
+ if upsert?(reply)
49
+ n += 1
50
+ else
51
+ n += 0
52
+ end
53
+ end
54
+ end
55
+
56
+ # Gets the number of documents matched.
57
+ #
58
+ # @example Get the matched count.
59
+ # result.n_matched
60
+ #
61
+ # @return [ Integer ] The number of documents matched.
62
+ #
63
+ # @since 2.0.0
64
+ def n_matched
65
+ return 0 unless acknowledged?
66
+ @replies.reduce(0) do |n, reply|
67
+ if upsert?(reply)
68
+ n += 0
69
+ else
70
+ n += reply.documents.first[N]
71
+ end
72
+ end
73
+ end
74
+
75
+ # Gets the number of documents modified.
76
+ #
77
+ # @example Get the modified count.
78
+ # result.n_modified
79
+ #
80
+ # @return [ Integer ] The number of documents modified.
81
+ #
82
+ # @since 2.0.0
83
+ def n_modified
84
+ return 0 unless acknowledged?
85
+ @replies.reduce(0) do |n, reply|
86
+ n += reply.documents.first[MODIFIED] || 0
87
+ end
88
+ end
89
+
90
+ # Get the upserted documents.
91
+ #
92
+ # @example Get upserted documents.
93
+ # result.upserted
94
+ #
95
+ # @return [ Array<BSON::Document> ] The upserted document info
96
+ #
97
+ # @since 2.1.0
98
+ def upserted
99
+ reply.documents.first[UPSERTED] || []
100
+ end
101
+
102
+ private
103
+
104
+ def upsert?(reply)
105
+ upserted.any?
106
+ end
107
+ end
108
+
109
+ # Defines custom behaviour of results when updating.
110
+ # For server versions < 2.5.5 (that don't use write commands).
111
+ #
112
+ # @since 2.0.0
113
+ class LegacyResult < Operation::Result
114
+ include LegacyMergable
115
+
116
+ # The updated existing field in the result.
117
+ #
118
+ # @since 2.0.0
119
+ UPDATED_EXISTING = 'updatedExisting'.freeze
120
+
121
+ # Gets the number of documents upserted.
122
+ #
123
+ # @example Get the upserted count.
124
+ # result.n_upserted
125
+ #
126
+ # @return [ Integer ] The number of documents upserted.
127
+ #
128
+ # @since 2.0.0
129
+ def n_upserted
130
+ return 0 unless acknowledged?
131
+ @replies.reduce(0) do |n, reply|
132
+ if upsert?(reply)
133
+ n += reply.documents.first[N]
134
+ else
135
+ n
136
+ end
137
+ end
138
+ end
139
+
140
+ # Gets the number of documents matched.
141
+ #
142
+ # @example Get the matched count.
143
+ # result.n_matched
144
+ #
145
+ # @return [ Integer ] The number of documents matched.
146
+ #
147
+ # @since 2.0.0
148
+ def n_matched
149
+ return 0 unless acknowledged?
150
+ @replies.reduce(0) do |n, reply|
151
+ if upsert?(reply)
152
+ n
153
+ else
154
+ n += reply.documents.first[N]
155
+ end
156
+ end
157
+ end
158
+ alias :n_modified :n_matched
159
+
160
+ private
161
+
162
+ def upsert?(reply)
163
+ !updated_existing?(reply) && reply.documents.first[N] == 1
164
+ end
165
+
166
+ def updated_existing?(reply)
167
+ reply.documents.first[UPDATED_EXISTING]
168
+ end
169
+ end
170
+ end
171
+ end
172
+ end
173
+ end
174
+ end
@@ -0,0 +1,81 @@
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/update/result'
16
+
17
+ module Mongo
18
+ module Operation
19
+ module Write
20
+ module Bulk
21
+
22
+ # A MongoDB bulk update operation.
23
+ #
24
+ # @note If the server version is >= 2.5.5, a write command operation
25
+ # will be created and sent instead.
26
+ #
27
+ # @example Create the update operation.
28
+ # Write::BulkUpdate.new({
29
+ # :updates => [
30
+ # {
31
+ # :q => { :foo => 1 },
32
+ # :u => { :$set => { :bar => 1 }},
33
+ # :multi => true,
34
+ # :upsert => false
35
+ # }
36
+ # ],
37
+ # :db_name => 'test',
38
+ # :coll_name => 'test_coll',
39
+ # :write_concern => write_concern,
40
+ # :ordered => false
41
+ # })
42
+ #
43
+ # Initialization:
44
+ # param [ Hash ] spec The specifications for the update.
45
+ #
46
+ # option spec :updates [ Array ] The update documents.
47
+ # option spec :db_name [ String ] The name of the database on which
48
+ # the query should be run.
49
+ # option spec :coll_name [ String ] The name of the collection on which
50
+ # the query should be run.
51
+ # option spec :write_concern [ Mongo::WriteConcern ] The write concern.
52
+ # option spec :ordered [ true, false ] Whether the operations should be
53
+ # executed in order.
54
+ # option spec :options [ Hash ] Options for the command, if it ends up being a
55
+ # write command.
56
+ #
57
+ # @since 2.0.0
58
+ class Update
59
+ include Bulkable
60
+ include Specifiable
61
+
62
+ private
63
+
64
+ def execute_write_command(context)
65
+ Result.new(Command::Update.new(spec).execute(context))
66
+ end
67
+
68
+
69
+ def messages
70
+ updates.collect do |u|
71
+ opts = { :flags => [] }
72
+ opts[:flags] << :multi_update if !!u[Operation::MULTI]
73
+ opts[:flags] << :upsert if !!u[Operation::UPSERT]
74
+ Protocol::Update.new(db_name, coll_name, u[Operation::Q], u[Operation::U], opts)
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
@@ -12,6 +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/bulk/bulk_delete'
16
- require 'mongo/operation/write/bulk/bulk_insert'
17
- require 'mongo/operation/write/bulk/bulk_update'
15
+ require 'mongo/operation/write/bulk/mergable'
16
+ require 'mongo/operation/write/bulk/legacy_mergable'
17
+ require 'mongo/operation/write/bulk/bulkable'
18
+ require 'mongo/operation/write/bulk/delete'
19
+ require 'mongo/operation/write/bulk/insert'
20
+ require 'mongo/operation/write/bulk/update'
@@ -29,7 +29,6 @@ module Mongo
29
29
  # @since 2.0.0
30
30
  class CreateIndex
31
31
  include Specifiable
32
- include Executable
33
32
  include Writable
34
33
 
35
34
  private
@@ -23,7 +23,6 @@ module Mongo
23
23
  # @since 2.0.0
24
24
  class CreateUser
25
25
  include Specifiable
26
- include Executable
27
26
  include Writable
28
27
 
29
28
  private
@@ -31,7 +31,6 @@ module Mongo
31
31
  # @since 2.0.0
32
32
  class Delete
33
33
  include Specifiable
34
- include Executable
35
34
  include Writable
36
35
 
37
36
  private
@@ -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
@@ -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
@@ -37,7 +37,6 @@ module Mongo
37
37
  # @since 2.0.0
38
38
  class Update
39
39
  include Specifiable
40
- include Executable
41
40
  include Writable
42
41
 
43
42
  private
@@ -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,48 @@
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 = defined?(self.class::LegacyResult) ? self.class::LegacyResult :
30
+ defined?(self.class::Result) ? self.class::Result : Result
31
+ result_class.new(connection.dispatch([ message, gle ].compact)).validate!
32
+ end
33
+ end
34
+
35
+ def gle
36
+ if gle_message = write_concern.get_last_error
37
+ Protocol::Query.new(
38
+ db_name,
39
+ Database::COMMAND,
40
+ gle_message,
41
+ options.merge(limit: -1)
42
+ )
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -15,6 +15,11 @@
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
 
20
25
  private
@@ -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)