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
@@ -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
64
  selector = delete[:q]
88
- opts = ( delete[:limit] || 0 ) <= 0 ? {} : { :flags => [ :single_remove ] }
65
+ opts = (delete[: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)
@@ -29,37 +29,14 @@ module Mongo
29
29
  #
30
30
  # @since 2.0.0
31
31
  class RemoveUser
32
- include Executable
32
+ include GLE
33
+ include WriteCommandEnabled
33
34
  include Specifiable
34
35
 
35
- # Execute the remove user operation.
36
- #
37
- # @example Execute the operation.
38
- # operation.execute(context)
39
- #
40
- # @param [ Mongo::Server::Context ] context The context for this operation.
41
- #
42
- # @return [ Result ] The operation result.
43
- #
44
- # @since 2.0.0
45
- def execute(context)
46
- if context.features.write_command_enabled?
47
- execute_write_command(context)
48
- else
49
- execute_message(context)
50
- end
51
- end
52
-
53
36
  private
54
37
 
55
- def execute_write_command(context)
56
- Result.new(Command::RemoveUser.new(spec).execute(context)).validate!
57
- end
58
-
59
- def execute_message(context)
60
- context.with_connection do |connection|
61
- Result.new(connection.dispatch([ message, gle ].compact)).validate!
62
- end
38
+ def write_command_op
39
+ Command::RemoveUser.new(spec)
63
40
  end
64
41
 
65
42
  def message
@@ -51,44 +51,16 @@ module Mongo
51
51
  #
52
52
  # @since 2.0.0
53
53
  class Update
54
- include Executable
54
+ include GLE
55
+ include WriteCommandEnabled
55
56
  include Specifiable
56
57
 
57
- # Execute the update operation.
58
- #
59
- # @example Execute the operation.
60
- # operation.execute(context)
61
- #
62
- # @param [ Mongo::Server::Context ] context The context for this operation.
63
- #
64
- # @return [ Result ] The operation result.
65
- #
66
- # @since 2.0.0
67
- def execute(context)
68
- if context.features.write_command_enabled?
69
- execute_write_command(context)
70
- else
71
- execute_message(context)
72
- end
73
- end
74
-
75
58
  private
76
59
 
77
- def execute_write_command(context)
60
+ def write_command_op
78
61
  s = spec.merge(:updates => [ update ])
79
62
  s.delete(:update)
80
- Result.new(Command::Update.new(s).execute(context)).validate!
81
- end
82
-
83
- def execute_message(context)
84
- context.with_connection do |connection|
85
- LegacyResult.new(connection.dispatch([ message, gle ].compact)).validate!
86
- end
87
- end
88
-
89
- def initialize_copy(original)
90
- @spec = original.spec.dup
91
- @spec[:updates] = original.spec[:updates].dup
63
+ Command::Update.new(s)
92
64
  end
93
65
 
94
66
  def message