mongo 2.1.0.beta → 2.1.0.rc0

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 (253) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/Rakefile +2 -2
  5. data/lib/mongo.rb +2 -3
  6. data/lib/mongo/address.rb +7 -5
  7. data/lib/mongo/address/unix.rb +2 -2
  8. data/lib/mongo/auth/ldap/conversation.rb +6 -2
  9. data/lib/mongo/auth/scram/conversation.rb +8 -2
  10. data/lib/mongo/auth/user/view.rb +21 -0
  11. data/lib/mongo/bulk_write.rb +155 -23
  12. data/lib/mongo/bulk_write/combineable.rb +51 -0
  13. data/lib/mongo/bulk_write/ordered_combiner.rb +55 -0
  14. data/lib/mongo/bulk_write/result.rb +61 -8
  15. data/lib/mongo/bulk_write/result_combiner.rb +117 -0
  16. data/lib/mongo/bulk_write/transformable.rb +117 -0
  17. data/lib/mongo/bulk_write/unordered_combiner.rb +52 -0
  18. data/lib/mongo/bulk_write/validatable.rb +62 -0
  19. data/lib/mongo/client.rb +7 -3
  20. data/lib/mongo/cluster.rb +3 -3
  21. data/lib/mongo/cluster/topology/replica_set.rb +8 -6
  22. data/lib/mongo/cluster/topology/unknown.rb +5 -2
  23. data/lib/mongo/collection.rb +75 -4
  24. data/lib/mongo/collection/view.rb +1 -2
  25. data/lib/mongo/collection/view/aggregation.rb +13 -8
  26. data/lib/mongo/collection/view/immutable.rb +6 -6
  27. data/lib/mongo/collection/view/iterable.rb +13 -4
  28. data/lib/mongo/collection/view/map_reduce.rb +22 -17
  29. data/lib/mongo/collection/view/readable.rb +121 -70
  30. data/lib/mongo/cursor.rb +5 -1
  31. data/lib/mongo/database.rb +3 -3
  32. data/lib/mongo/database/view.rb +1 -1
  33. data/lib/mongo/error.rb +7 -0
  34. data/lib/mongo/{bulk_write/unordered_bulk_write.rb → error/closed_stream.rb} +12 -21
  35. data/lib/mongo/{bulk_write/ordered_bulk_write.rb → error/extra_file_chunk.rb} +13 -27
  36. data/lib/mongo/error/file_not_found.rb +37 -0
  37. data/lib/mongo/error/invalid_file.rb +2 -2
  38. data/lib/mongo/error/invalid_file_revision.rb +37 -0
  39. data/lib/mongo/error/invalid_uri.rb +5 -4
  40. data/lib/mongo/error/missing_file_chunk.rb +38 -0
  41. data/lib/mongo/error/operation_failure.rb +1 -1
  42. data/lib/mongo/error/unchangeable_collection_option.rb +38 -0
  43. data/lib/mongo/error/unexpected_chunk_length.rb +39 -0
  44. data/lib/mongo/grid.rb +2 -1
  45. data/lib/mongo/grid/file.rb +12 -9
  46. data/lib/mongo/grid/file/chunk.rb +6 -6
  47. data/lib/mongo/grid/file/{metadata.rb → info.rb} +41 -39
  48. data/lib/mongo/grid/fs_bucket.rb +441 -0
  49. data/lib/mongo/grid/stream.rb +64 -0
  50. data/lib/mongo/grid/stream/read.rb +208 -0
  51. data/lib/mongo/grid/stream/write.rb +187 -0
  52. data/lib/mongo/index/view.rb +1 -1
  53. data/lib/mongo/loggable.rb +34 -57
  54. data/lib/mongo/logger.rb +16 -78
  55. data/lib/mongo/monitoring.rb +1 -5
  56. data/lib/mongo/monitoring/command_log_subscriber.rb +35 -17
  57. data/lib/mongo/monitoring/event/command_succeeded.rb +20 -1
  58. data/lib/mongo/monitoring/publishable.rb +22 -12
  59. data/lib/mongo/operation.rb +3 -6
  60. data/lib/mongo/operation/commands.rb +24 -0
  61. data/lib/mongo/operation/{aggregate.rb → commands/aggregate.rb} +3 -41
  62. data/lib/mongo/operation/{aggregate → commands/aggregate}/result.rb +0 -0
  63. data/lib/mongo/operation/commands/collections_info.rb +66 -0
  64. data/lib/mongo/operation/{command.rb → commands/command.rb} +2 -18
  65. data/lib/mongo/operation/commands/indexes.rb +70 -0
  66. data/lib/mongo/operation/commands/list_collections.rb +54 -0
  67. data/lib/mongo/operation/commands/list_collections/result.rb +112 -0
  68. data/lib/mongo/operation/commands/list_indexes.rb +56 -0
  69. data/lib/mongo/operation/commands/list_indexes/result.rb +115 -0
  70. data/lib/mongo/operation/{map_reduce.rb → commands/map_reduce.rb} +3 -41
  71. data/lib/mongo/operation/{map_reduce → commands/map_reduce}/result.rb +0 -0
  72. data/lib/mongo/operation/{parallel_scan.rb → commands/parallel_scan.rb} +3 -23
  73. data/lib/mongo/operation/{parallel_scan → commands/parallel_scan}/result.rb +0 -0
  74. data/lib/mongo/operation/commands/user_query.rb +69 -0
  75. data/lib/mongo/operation/commands/users_info.rb +53 -0
  76. data/lib/mongo/operation/commands/users_info/result.rb +36 -0
  77. data/lib/mongo/operation/executable.rb +4 -68
  78. data/lib/mongo/operation/kill_cursors.rb +3 -3
  79. data/lib/mongo/operation/read.rb +0 -4
  80. data/lib/mongo/operation/read/get_more.rb +2 -22
  81. data/lib/mongo/operation/read/query.rb +2 -21
  82. data/lib/mongo/operation/{read_preferrable.rb → read_preference.rb} +3 -2
  83. data/lib/mongo/operation/specifiable.rb +24 -0
  84. data/lib/mongo/operation/write.rb +2 -0
  85. data/lib/mongo/operation/write/bulk.rb +6 -3
  86. data/lib/mongo/operation/write/bulk/bulkable.rb +82 -0
  87. data/lib/mongo/operation/write/bulk/delete.rb +71 -0
  88. data/lib/mongo/operation/write/bulk/delete/result.rb +74 -0
  89. data/lib/mongo/operation/write/bulk/insert.rb +96 -0
  90. data/lib/mongo/operation/write/bulk/insert/result.rb +129 -0
  91. data/lib/mongo/operation/write/bulk/legacy_mergable.rb +87 -0
  92. data/lib/mongo/operation/write/bulk/mergable.rb +71 -0
  93. data/lib/mongo/operation/write/bulk/update.rb +81 -0
  94. data/lib/mongo/operation/write/bulk/update/result.rb +174 -0
  95. data/lib/mongo/operation/write/command/create_index.rb +0 -1
  96. data/lib/mongo/operation/write/command/create_user.rb +0 -1
  97. data/lib/mongo/operation/write/command/delete.rb +0 -1
  98. data/lib/mongo/operation/write/command/drop_index.rb +0 -1
  99. data/lib/mongo/operation/write/command/insert.rb +0 -1
  100. data/lib/mongo/operation/write/command/remove_user.rb +0 -1
  101. data/lib/mongo/operation/write/command/update.rb +0 -1
  102. data/lib/mongo/operation/write/command/update_user.rb +0 -1
  103. data/lib/mongo/operation/write/command/writable.rb +13 -18
  104. data/lib/mongo/operation/write/create_index.rb +4 -27
  105. data/lib/mongo/operation/write/create_user.rb +4 -30
  106. data/lib/mongo/operation/write/delete.rb +5 -28
  107. data/lib/mongo/operation/write/drop_index.rb +3 -3
  108. data/lib/mongo/operation/write/gle.rb +48 -0
  109. data/lib/mongo/operation/write/idable.rb +5 -0
  110. data/lib/mongo/operation/write/insert.rb +2 -24
  111. data/lib/mongo/operation/write/remove_user.rb +4 -27
  112. data/lib/mongo/operation/write/update.rb +4 -32
  113. data/lib/mongo/operation/write/update_user.rb +4 -30
  114. data/lib/mongo/operation/write/write_command_enabled.rb +53 -0
  115. data/lib/mongo/options/mapper.rb +4 -2
  116. data/lib/mongo/protocol/delete.rb +68 -3
  117. data/lib/mongo/protocol/get_more.rb +54 -2
  118. data/lib/mongo/protocol/insert.rb +59 -1
  119. data/lib/mongo/protocol/kill_cursors.rb +53 -4
  120. data/lib/mongo/protocol/message.rb +12 -12
  121. data/lib/mongo/protocol/query.rb +139 -65
  122. data/lib/mongo/protocol/reply.rb +69 -1
  123. data/lib/mongo/protocol/update.rb +70 -1
  124. data/lib/mongo/server/connection.rb +11 -3
  125. data/lib/mongo/server/description.rb +29 -0
  126. data/lib/mongo/server/description/features.rb +2 -1
  127. data/lib/mongo/server/monitor.rb +2 -2
  128. data/lib/mongo/server_selector.rb +14 -10
  129. data/lib/mongo/server_selector/selectable.rb +24 -22
  130. data/lib/mongo/socket.rb +6 -3
  131. data/lib/mongo/socket/tcp.rb +2 -2
  132. data/lib/mongo/socket/unix.rb +5 -8
  133. data/lib/mongo/uri.rb +243 -139
  134. data/lib/mongo/version.rb +1 -1
  135. data/spec/mongo/address/unix_spec.rb +1 -1
  136. data/spec/mongo/address_spec.rb +25 -0
  137. data/spec/mongo/auth/ldap/conversation_spec.rb +43 -0
  138. data/spec/mongo/auth/user/view_spec.rb +26 -1
  139. data/spec/mongo/bulk_write/ordered_combiner_spec.rb +271 -0
  140. data/spec/mongo/bulk_write/unordered_combiner_spec.rb +239 -0
  141. data/spec/mongo/bulk_write_spec.rb +332 -166
  142. data/spec/mongo/client_spec.rb +25 -0
  143. data/spec/mongo/cluster/topology/replica_set_spec.rb +2 -0
  144. data/spec/mongo/collection/view/aggregation_spec.rb +65 -0
  145. data/spec/mongo/collection/view/immutable_spec.rb +103 -0
  146. data/spec/mongo/collection/view/map_reduce_spec.rb +98 -3
  147. data/spec/mongo/collection/view/readable_spec.rb +17 -30
  148. data/spec/mongo/collection/view_spec.rb +233 -7
  149. data/spec/mongo/collection_spec.rb +360 -18
  150. data/spec/mongo/command_monitoring_spec.rb +51 -0
  151. data/spec/mongo/connection_string_spec.rb +137 -0
  152. data/spec/mongo/database_spec.rb +27 -11
  153. data/spec/mongo/grid/file/chunk_spec.rb +5 -5
  154. data/spec/mongo/grid/file/{metadata_spec.rb → info_spec.rb} +29 -17
  155. data/spec/mongo/grid/file_spec.rb +8 -8
  156. data/spec/mongo/grid/fs_bucket_spec.rb +1020 -0
  157. data/spec/mongo/grid/stream/read_spec.rb +275 -0
  158. data/spec/mongo/grid/stream/write_spec.rb +440 -0
  159. data/spec/mongo/grid/stream_spec.rb +48 -0
  160. data/spec/mongo/gridfs_spec.rb +50 -0
  161. data/spec/mongo/logger_spec.rb +0 -40
  162. data/spec/mongo/monitoring/command_log_subscriber_spec.rb +76 -0
  163. data/spec/mongo/operation/{aggregate_spec.rb → commands/aggregate_spec.rb} +0 -42
  164. data/spec/mongo/operation/{read → commands}/collections_info_spec.rb +1 -1
  165. data/spec/mongo/operation/{command_spec.rb → commands/command_spec.rb} +0 -0
  166. data/spec/mongo/operation/{read → commands}/indexes_spec.rb +1 -1
  167. data/spec/mongo/operation/{map_reduce_spec.rb → commands/map_reduce_spec.rb} +0 -18
  168. data/spec/mongo/operation/kill_cursors_spec.rb +1 -1
  169. data/spec/mongo/operation/{read_preferrable_spec.rb → read_preference_spec.rb} +11 -11
  170. data/spec/mongo/operation/write/bulk/{bulk_delete_spec.rb → delete_spec.rb} +1 -12
  171. data/spec/mongo/operation/write/bulk/{bulk_insert_spec.rb → insert_spec.rb} +1 -12
  172. data/spec/mongo/operation/write/bulk/{bulk_update_spec.rb → update_spec.rb} +1 -12
  173. data/spec/mongo/operation/write/insert_spec.rb +0 -11
  174. data/spec/mongo/protocol/kill_cursors_spec.rb +5 -3
  175. data/spec/mongo/server/description_spec.rb +42 -0
  176. data/spec/mongo/server/monitor_spec.rb +21 -0
  177. data/spec/mongo/server_discovery_and_monitoring_spec.rb +1 -0
  178. data/spec/mongo/server_selection_spec.rb +3 -3
  179. data/spec/mongo/server_selector/nearest_spec.rb +34 -27
  180. data/spec/mongo/server_selector/primary_preferred_spec.rb +31 -30
  181. data/spec/mongo/server_selector/primary_spec.rb +14 -13
  182. data/spec/mongo/server_selector/secondary_preferred_spec.rb +27 -26
  183. data/spec/mongo/server_selector/secondary_spec.rb +23 -22
  184. data/spec/mongo/server_selector_spec.rb +87 -24
  185. data/spec/mongo/socket/unix_spec.rb +52 -0
  186. data/spec/mongo/uri_spec.rb +251 -39
  187. data/spec/spec_helper.rb +11 -4
  188. data/spec/support/authorization.rb +4 -5
  189. data/spec/support/command_monitoring.rb +365 -0
  190. data/spec/support/command_monitoring/bulkWrite.yml +73 -0
  191. data/spec/support/command_monitoring/command.yml +42 -0
  192. data/spec/support/command_monitoring/deleteMany.yml +55 -0
  193. data/spec/support/command_monitoring/deleteOne.yml +55 -0
  194. data/spec/support/command_monitoring/find.yml +219 -0
  195. data/spec/support/command_monitoring/insertMany.yml +81 -0
  196. data/spec/support/command_monitoring/insertOne.yml +51 -0
  197. data/spec/support/command_monitoring/updateMany.yml +67 -0
  198. data/spec/support/command_monitoring/updateOne.yml +95 -0
  199. data/spec/support/connection_string.rb +228 -0
  200. data/spec/support/connection_string_tests/invalid-uris.yml +193 -0
  201. data/spec/support/connection_string_tests/valid-auth.yml +256 -0
  202. data/spec/support/connection_string_tests/valid-host_identifiers.yml +121 -0
  203. data/spec/support/connection_string_tests/valid-options.yml +30 -0
  204. data/spec/support/connection_string_tests/valid-unix_socket-absolute.yml +197 -0
  205. data/spec/support/connection_string_tests/valid-unix_socket-relative.yml +213 -0
  206. data/spec/support/connection_string_tests/valid-warnings.yml +55 -0
  207. data/spec/support/crud.rb +3 -1
  208. data/spec/support/crud/read.rb +14 -10
  209. data/spec/support/crud/write.rb +36 -9
  210. data/spec/support/gridfs.rb +637 -0
  211. data/spec/support/gridfs_tests/delete.yml +157 -0
  212. data/spec/support/gridfs_tests/download.yml +210 -0
  213. data/spec/support/gridfs_tests/download_by_name.yml +113 -0
  214. data/spec/support/gridfs_tests/upload.yml +158 -0
  215. data/spec/support/sdam/rs/equal_electionids.yml +1 -2
  216. data/spec/support/sdam/rs/new_primary_new_electionid.yml +0 -3
  217. data/spec/support/sdam/rs/primary_mismatched_me.yml +37 -0
  218. data/spec/support/sdam/rs/primary_to_no_primary_mismatched_me.yml +75 -0
  219. data/spec/support/sdam/rs/secondary_mismatched_me.yml +37 -0
  220. data/spec/support/sdam/single/direct_connection_rsarbiter.yml +1 -1
  221. data/spec/support/sdam/single/direct_connection_rsprimary.yml +1 -1
  222. data/spec/support/sdam/single/direct_connection_rssecondary.yml +1 -1
  223. data/spec/support/sdam/single/direct_connection_slave.yml +1 -1
  224. data/spec/support/sdam/single/direct_connection_standalone.yml +1 -1
  225. data/spec/support/sdam/single/not_ok_response.yml +0 -1
  226. data/spec/support/server_discovery_and_monitoring.rb +3 -1
  227. data/spec/support/server_selection.rb +3 -1
  228. data/spec/support/shared/bulk_write.rb +192 -0
  229. data/spec/support/shared/server_selector.rb +21 -12
  230. metadata +147 -57
  231. metadata.gz.sig +0 -0
  232. data/lib/mongo/bulk_write/bulk_writable.rb +0 -252
  233. data/lib/mongo/bulk_write/deletable.rb +0 -57
  234. data/lib/mongo/bulk_write/insertable.rb +0 -49
  235. data/lib/mongo/bulk_write/replacable.rb +0 -58
  236. data/lib/mongo/bulk_write/updatable.rb +0 -69
  237. data/lib/mongo/grid/fs.rb +0 -146
  238. data/lib/mongo/operation/list_collections/result.rb +0 -114
  239. data/lib/mongo/operation/list_indexes/result.rb +0 -118
  240. data/lib/mongo/operation/read/collections_info.rb +0 -68
  241. data/lib/mongo/operation/read/indexes.rb +0 -69
  242. data/lib/mongo/operation/read/list_collections.rb +0 -76
  243. data/lib/mongo/operation/read/list_indexes.rb +0 -78
  244. data/lib/mongo/operation/write/bulk/bulk_delete.rb +0 -145
  245. data/lib/mongo/operation/write/bulk/bulk_delete/result.rb +0 -75
  246. data/lib/mongo/operation/write/bulk/bulk_insert.rb +0 -132
  247. data/lib/mongo/operation/write/bulk/bulk_insert/result.rb +0 -130
  248. data/lib/mongo/operation/write/bulk/bulk_mergable.rb +0 -67
  249. data/lib/mongo/operation/write/bulk/bulk_update.rb +0 -154
  250. data/lib/mongo/operation/write/bulk/bulk_update/result.rb +0 -174
  251. data/lib/mongo/operation/write/bulk/legacy_bulk_mergable.rb +0 -83
  252. data/spec/mongo/grid/fs_spec.rb +0 -160
  253. data/spec/mongo/loggable_spec.rb +0 -63
@@ -1,132 +0,0 @@
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/bulk_insert/result'
16
-
17
- module Mongo
18
- module Operation
19
- module Write
20
-
21
- # A MongoDB bulk insert operation.
22
- # This class should only be used by the Bulk API.
23
- #
24
- # @note If a server with version >= 2.5.5 is being used, a write command
25
- # operation will be created and sent instead.
26
- #
27
- # @example Create the new insert operation.
28
- # Write::BulkInsert.new({
29
- # :documents => [{ :foo => 1 }],
30
- # :db_name => 'test',
31
- # :coll_name => 'test_coll',
32
- # :write_concern => write_concern,
33
- # :ordered => false
34
- # })
35
- #
36
- # Initialization:
37
- # param [ Hash ] spec The specifications for the insert.
38
- #
39
- # option spec :documents [ Array ] The documents to insert.
40
- # option spec :db_name [ String ] The name of the database.
41
- # option spec :coll_name [ String ] The name of the collection.
42
- # option spec :write_concern [ Mongo::WriteConcern ] The write concern.
43
- # option spec :ordered [ true, false ] Whether the operations should be
44
- # executed in order.
45
- # option spec :options [ Hash ] Options for the command, if it ends up being a
46
- # write command.
47
- #
48
- # @since 2.0.0
49
- class BulkInsert
50
- include Specifiable
51
- include Idable
52
-
53
- # Execute the bulk insert operation.
54
- #
55
- # @example Execute the operation.
56
- # operation.execute(context)
57
- #
58
- # @param [ Mongo::Server::Context ] context The context for this operation.
59
- #
60
- # @return [ Result ] The operation result.
61
- #
62
- # @since 2.0.0
63
- def execute(context)
64
- if context.features.write_command_enabled?
65
- execute_write_command(context)
66
- else
67
- execute_message(context)
68
- end
69
- end
70
-
71
- private
72
-
73
- def execute_write_command(context)
74
- command_spec = spec.merge(:documents => ensure_ids(documents))
75
- Result.new(Command::Insert.new(command_spec).execute(context), @ids)
76
- end
77
-
78
- def execute_message(context)
79
- replies = []
80
- messages.map do |m|
81
- context.with_connection do |connection|
82
- result = LegacyResult.new(connection.dispatch([ m, gle ].compact, operation_id), @ids)
83
- replies << result.reply
84
- if stop_sending?(result)
85
- return LegacyResult.new(replies, @ids)
86
- end
87
- end
88
- end
89
- LegacyResult.new(replies.compact.empty? ? nil : replies, @ids)
90
- end
91
-
92
- def stop_sending?(result)
93
- ordered? && !result.successful?
94
- end
95
-
96
- # @todo put this somewhere else
97
- def ordered?
98
- @spec.fetch(:ordered, true)
99
- end
100
-
101
- def initialize_copy(original)
102
- @spec = original.spec.dup
103
- @spec[DOCUMENTS] = original.spec[DOCUMENTS].clone
104
- end
105
-
106
- def gle
107
- gle_message = ( ordered? && write_concern.get_last_error.nil? ) ?
108
- Mongo::WriteConcern.get(:w => 1).get_last_error :
109
- write_concern.get_last_error
110
- if gle_message
111
- Protocol::Query.new(
112
- db_name,
113
- Database::COMMAND,
114
- gle_message,
115
- options.merge(limit: -1)
116
- )
117
- end
118
- end
119
-
120
- def messages
121
- if ordered? || gle
122
- documents.collect do |doc|
123
- Protocol::Insert.new(db_name, coll_name, ensure_ids([ doc ]), options)
124
- end
125
- else
126
- [ Protocol::Insert.new(db_name, coll_name, ensure_ids(documents), { :flags => [:continue_on_error] }) ]
127
- end
128
- end
129
- end
130
- end
131
- end
132
- end
@@ -1,130 +0,0 @@
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/bulk_mergable'
16
- require 'mongo/operation/write/bulk/legacy_bulk_mergable'
17
-
18
- module Mongo
19
- module Operation
20
- module Write
21
- class BulkInsert
22
-
23
- # Defines custom behaviour of results when inserting.
24
- #
25
- # @since 2.0.0
26
- class Result < Operation::Result
27
- include BulkMergable
28
-
29
- # Get the ids of the inserted documents.
30
- #
31
- # @since 2.0.0
32
- attr_reader :inserted_ids
33
-
34
- # Initialize a new result.
35
- #
36
- # @example Instantiate the result.
37
- # Result.new(replies, inserted_ids)
38
- #
39
- # @param [ Protocol::Reply ] replies The wire protocol replies.
40
- # @param [ Array<Object> ] ids The ids of the inserted documents.
41
- #
42
- # @since 2.0.0
43
- def initialize(replies, ids)
44
- @replies = replies.is_a?(Protocol::Reply) ? [ replies ] : replies
45
- @inserted_ids = ids
46
- end
47
-
48
- # Gets the number of documents inserted.
49
- #
50
- # @example Get the number of documents inserted.
51
- # result.n_inserted
52
- #
53
- # @return [ Integer ] The number of documents inserted.
54
- #
55
- # @since 2.0.0
56
- def n_inserted
57
- written_count
58
- end
59
-
60
- # Gets the id of the document inserted.
61
- #
62
- # @example Get id of the document inserted.
63
- # result.inserted_id
64
- #
65
- # @return [ Object ] The id of the document inserted.
66
- #
67
- # @since 2.0.0
68
- def inserted_id
69
- inserted_ids.first
70
- end
71
- end
72
-
73
- # Defines custom behaviour of results when inserting.
74
- # For server versions < 2.5.5 (that don't use write commands).
75
- #
76
- # @since 2.0.0
77
- class LegacyResult < Operation::Result
78
- include LegacyBulkMergable
79
-
80
- # Get the ids of the inserted documents.
81
- #
82
- # @since 2.0.0
83
- attr_reader :inserted_ids
84
-
85
- # Initialize a new result.
86
- #
87
- # @example Instantiate the result.
88
- # Result.new(replies, inserted_ids)
89
- #
90
- # @param [ Protocol::Reply ] replies The wire protocol replies.
91
- # @param [ Array<Object> ] ids The ids of the inserted documents.
92
- #
93
- # @since 2.0.0
94
- def initialize(replies, ids)
95
- @replies = replies.is_a?(Protocol::Reply) ? [ replies ] : replies
96
- @inserted_ids = ids
97
- end
98
-
99
- # Gets the number of documents inserted.
100
- #
101
- # @example Get the number of documents inserted.
102
- # result.n_inserted
103
- #
104
- # @return [ Integer ] The number of documents inserted.
105
- #
106
- # @since 2.0.0
107
- def n_inserted
108
- return 0 unless acknowledged?
109
- @replies.reduce(0) do |n, reply|
110
- n += 1 unless reply_write_errors?(reply)
111
- n
112
- end
113
- end
114
-
115
- # Gets the id of the document inserted.
116
- #
117
- # @example Get id of the document inserted.
118
- # result.inserted_id
119
- #
120
- # @return [ Object ] The id of the document inserted.
121
- #
122
- # @since 2.0.0
123
- def inserted_id
124
- inserted_ids.first
125
- end
126
- end
127
- end
128
- end
129
- end
130
- end
@@ -1,67 +0,0 @@
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
- module BulkMergable
20
-
21
- # Aggregate the write errors returned from this result.
22
- #
23
- # @example Aggregate the write errors.
24
- # result.aggregate_write_errors([0, 1, 2, 3])
25
- #
26
- # @param [ Array ] indexes The indexes of each operation as they
27
- # were listed in the Bulk API.
28
- #
29
- # @return [ Array ] The aggregate write errors.
30
- #
31
- # @since 2.0.0
32
- def aggregate_write_errors(indexes)
33
- @replies.reduce(nil) do |errors, reply|
34
- if reply.documents.first['writeErrors']
35
- write_errors = reply.documents.first[Error::WRITE_ERRORS].collect do |we|
36
- we.merge!('index' => indexes[we['index']])
37
- end
38
- (errors || []) << write_errors if write_errors
39
- end
40
- end
41
- end
42
-
43
- # Aggregate the write concern errors returned from this result.
44
- #
45
- # @example Aggregate the write concern errors.
46
- # result.aggregate_write_concern_errors([0, 1, 2, 3])
47
- #
48
- # @param [ Array ] indexes The indexes of each operation as they
49
- # were listed in the Bulk API.
50
- #
51
- # @return [ Array ] The aggregate write concern errors.
52
- #
53
- # @since 2.0.0
54
- def aggregate_write_concern_errors(indexes)
55
- @replies.each_with_index.reduce(nil) do |errors, (reply, i)|
56
- if write_concern_errors = reply.documents.first[Error::WRITE_CONCERN_ERRORS]
57
- (errors || []) << write_concern_errors.reduce(nil) do |errs, wce|
58
- wce.merge!('index' => indexes[wce['index']])
59
- (errs || []) << write_concern_error
60
- end
61
- end
62
- end
63
- end
64
- end
65
- end
66
- end
67
- end
@@ -1,154 +0,0 @@
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/bulk_update/result'
16
-
17
- module Mongo
18
- module Operation
19
- module Write
20
-
21
- # A MongoDB bulk update operation.
22
- #
23
- # @note If the server version is >= 2.5.5, a write command operation
24
- # will be created and sent instead.
25
- #
26
- # @example Create the update operation.
27
- # Write::BulkUpdate.new({
28
- # :updates => [
29
- # {
30
- # :q => { :foo => 1 },
31
- # :u => { :$set => { :bar => 1 }},
32
- # :multi => true,
33
- # :upsert => false
34
- # }
35
- # ],
36
- # :db_name => 'test',
37
- # :coll_name => 'test_coll',
38
- # :write_concern => write_concern,
39
- # :ordered => false
40
- # })
41
- #
42
- # Initialization:
43
- # param [ Hash ] spec The specifications for the update.
44
- #
45
- # option spec :updates [ Array ] The update documents.
46
- # option spec :db_name [ String ] The name of the database on which
47
- # the query should be run.
48
- # option spec :coll_name [ String ] The name of the collection on which
49
- # the query should be run.
50
- # option spec :write_concern [ Mongo::WriteConcern ] The write concern.
51
- # option spec :ordered [ true, false ] Whether the operations should be
52
- # executed in order.
53
- # option spec :options [ Hash ] Options for the command, if it ends up being a
54
- # write command.
55
- #
56
- # @since 2.0.0
57
- class BulkUpdate
58
- include Executable
59
- include Specifiable
60
-
61
- # Execute the update operation.
62
- #
63
- # @example Execute the operation.
64
- # operation.execute(context)
65
- #
66
- # @param [ Mongo::Server::Context ] context The context for this operation.
67
- #
68
- # @return [ Result ] The operation result.
69
- #
70
- # @since 2.0.0
71
- def execute(context)
72
- if context.features.write_command_enabled?
73
- execute_write_command(context)
74
- else
75
- execute_message(context)
76
- end
77
- end
78
-
79
- # Set the write concern on this operation.
80
- #
81
- # @example Set a write concern.
82
- # new_op = operation.write_concern(:w => 2)
83
- #
84
- # @param [ Hash ] wc The write concern.
85
- #
86
- # @since 2.0.0
87
- def write_concern(wc = nil)
88
- if wc
89
- self.class.new(spec.merge(write_concern: WriteConcern.get(wc)))
90
- else
91
- spec[WRITE_CONCERN]
92
- end
93
- end
94
-
95
- private
96
-
97
- def execute_write_command(context)
98
- Result.new(Command::Update.new(spec).execute(context))
99
- end
100
-
101
- def execute_message(context)
102
- replies = messages.map do |m|
103
- context.with_connection do |connection|
104
- result = LegacyResult.new(connection.dispatch([ m, gle ].compact, operation_id))
105
- if stop_sending?(result)
106
- return result
107
- else
108
- result.reply
109
- end
110
- end
111
- end
112
- LegacyResult.new(replies.compact.empty? ? nil : replies)
113
- end
114
-
115
- def stop_sending?(result)
116
- ordered? && !result.successful?
117
- end
118
-
119
- # @todo put this somewhere else
120
- def ordered?
121
- @spec.fetch(:ordered, true)
122
- end
123
-
124
- def gle
125
- gle_message = ( ordered? && write_concern.get_last_error.nil? ) ?
126
- Mongo::WriteConcern.get(:w => 1).get_last_error :
127
- write_concern.get_last_error
128
- if gle_message
129
- Protocol::Query.new(
130
- db_name,
131
- Database::COMMAND,
132
- gle_message,
133
- options.merge(limit: -1)
134
- )
135
- end
136
- end
137
-
138
- def initialize_copy(original)
139
- @spec = original.spec.dup
140
- @spec[UPDATES] = original.spec[UPDATES].dup
141
- end
142
-
143
- def messages
144
- updates.collect do |u|
145
- opts = { :flags => [] }
146
- opts[:flags] << :multi_update if !!u[:multi]
147
- opts[:flags] << :upsert if !!u[:upsert]
148
- Protocol::Update.new(db_name, coll_name, u[:q], u[:u], opts)
149
- end
150
- end
151
- end
152
- end
153
- end
154
- end