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
@@ -27,13 +27,13 @@ module Mongo
27
27
  #
28
28
  # @since 2.0.0
29
29
  class KillCursors
30
- include Executable
31
30
  include Specifiable
31
+ include Executable
32
32
 
33
33
  private
34
34
 
35
- def message
36
- Protocol::KillCursors.new(cursor_ids)
35
+ def message(context)
36
+ Protocol::KillCursors.new(coll_name, db_name, cursor_ids)
37
37
  end
38
38
  end
39
39
  end
@@ -14,7 +14,3 @@
14
14
 
15
15
  require 'mongo/operation/read/query'
16
16
  require 'mongo/operation/read/get_more'
17
- require 'mongo/operation/read/indexes'
18
- require 'mongo/operation/read/list_indexes'
19
- require 'mongo/operation/read/list_collections'
20
- require 'mongo/operation/read/collections_info'
@@ -38,32 +38,12 @@ module Mongo
38
38
  #
39
39
  # @since 2.0.0
40
40
  class GetMore
41
- include Executable
42
41
  include Specifiable
43
-
44
- # Execute the get more operation.
45
- #
46
- # @example Execute the operation.
47
- # operation.execute(context)
48
- #
49
- # @param [ Mongo::Server::Context ] context The context for this operation.
50
- #
51
- # @return [ Result ] The operation response, if there is one.
52
- #
53
- # @since 2.0.0
54
- def execute(context)
55
- execute_message(context)
56
- end
42
+ include Executable
57
43
 
58
44
  private
59
45
 
60
- def execute_message(context)
61
- context.with_connection do |connection|
62
- Result.new(connection.dispatch([ message ]))
63
- end
64
- end
65
-
66
- def message
46
+ def message(context)
67
47
  Protocol::GetMore.new(db_name, coll_name, to_return, cursor_id)
68
48
  end
69
49
  end
@@ -38,31 +38,12 @@ module Mongo
38
38
  #
39
39
  # @since 2.0.0
40
40
  class Query
41
- include Executable
42
41
  include Specifiable
43
- include ReadPreferrable
44
-
45
- # Execute the operation.
46
- # The context gets a connection on which the operation
47
- # is sent in the block.
48
- #
49
- # @param [ Server::Context ] context The context for this operation.
50
- #
51
- # @return [ Result ] The operation response, if there is one.
52
- #
53
- # @since 2.0.0
54
- def execute(context)
55
- execute_message(context)
56
- end
42
+ include Executable
43
+ include ReadPreference
57
44
 
58
45
  private
59
46
 
60
- def execute_message(context)
61
- context.with_connection do |connection|
62
- Result.new(connection.dispatch([ message(context) ])).validate!
63
- end
64
- end
65
-
66
47
  def query_coll
67
48
  coll_name
68
49
  end
@@ -15,10 +15,11 @@
15
15
  module Mongo
16
16
  module Operation
17
17
 
18
- # Adds behaviour for queries that need to take read preference into account.
18
+ # Adds behaviour for updating the options and the selector for operations
19
+ # that need to take read preference into account.
19
20
  #
20
21
  # @since 2.0.0
21
- module ReadPreferrable
22
+ module ReadPreference
22
23
 
23
24
  # The constant for slave ok flags.
24
25
  #
@@ -410,6 +410,30 @@ module Mongo
410
410
  def read
411
411
  @spec[READ] || ServerSelector.get
412
412
  end
413
+
414
+ # Whether the operation is ordered.
415
+ #
416
+ # @example Get the ordered value, true is the default.
417
+ # specifiable.ordered?
418
+ #
419
+ # @return [ true, false ] Whether the operation is ordered.
420
+ #
421
+ # @since 2.1.0
422
+ def ordered?
423
+ !!(@spec.fetch(:ordered, true))
424
+ end
425
+
426
+ # The namespace, consisting of the db name and collection name.
427
+ #
428
+ # @example Get the namespace.
429
+ # specifiable.namespace
430
+ #
431
+ # @return [ String ] The namespace.
432
+ #
433
+ # @since 2.1.0
434
+ def namespace
435
+ "#{db_name}.#{coll_name}"
436
+ end
413
437
  end
414
438
  end
415
439
  end
@@ -12,7 +12,9 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ require 'mongo/operation/write/write_command_enabled'
15
16
  require 'mongo/operation/write/idable'
17
+ require 'mongo/operation/write/gle'
16
18
  require 'mongo/operation/write/bulk'
17
19
  require 'mongo/operation/write/delete'
18
20
  require 'mongo/operation/write/insert'
@@ -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'
@@ -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,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[:limit] || 0 ) <= 0 ? {} : { :flags => [ :single_remove ] }
64
+ Protocol::Delete.new(db_name, coll_name, del[:q], opts)
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
71
+ 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,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