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
@@ -0,0 +1,115 @@
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
+ class ListIndexes
18
+
19
+ # Defines custom behaviour of results when using the
20
+ # listIndexes command.
21
+ #
22
+ # @since 2.0.0
23
+ class Result < Operation::Result
24
+
25
+ # The field name for the cursor document in a listIndexes result.
26
+ #
27
+ # @since 2.0.0
28
+ CURSOR = 'cursor'.freeze
29
+
30
+ # The cursor id field in the cursor document.
31
+ #
32
+ # @since 2.0.0
33
+ CURSOR_ID = 'id'.freeze
34
+
35
+ # The namespace field in the cursor document.
36
+ #
37
+ # @since 2.0.0
38
+ NAMESPACE = 'ns'.freeze
39
+
40
+ # The field name for the first batch of a cursor.
41
+ #
42
+ # @since 2.0.0
43
+ FIRST_BATCH = 'firstBatch'.freeze
44
+
45
+ # Get the cursor id for the result.
46
+ #
47
+ # @example Get the cursor id.
48
+ # result.cursor_id
49
+ #
50
+ # @note Even though the wire protocol has a cursor_id field for all
51
+ # messages of type reply, it is always zero when using the
52
+ # listIndexes command and must be retrieved from the cursor
53
+ # document itself.
54
+ #
55
+ # @return [ Integer ] The cursor id.
56
+ #
57
+ # @since 2.0.0
58
+ def cursor_id
59
+ cursor_document ? cursor_document[CURSOR_ID] : super
60
+ end
61
+
62
+ # Get the namespace for the cursor.
63
+ #
64
+ # @example Get the namespace.
65
+ # result.namespace
66
+ #
67
+ # @return [ String ] The namespace.
68
+ #
69
+ # @since 2.0.0
70
+ def namespace
71
+ cursor_document ? cursor_document[NAMESPACE] : super
72
+ end
73
+
74
+ # Get the documents for the listIndexes result. This is the 'firstBatch'
75
+ # field in the 'cursor' field of the first document returned.
76
+ #
77
+ # @example Get the documents.
78
+ # result.documents
79
+ #
80
+ # @return [ Array<BSON::Document> ] The documents.
81
+ #
82
+ # @since 2.0.0
83
+ def documents
84
+ cursor_document[FIRST_BATCH]
85
+ end
86
+
87
+ # Validate the result. In the case where the database or collection
88
+ # does not exist on the server we will get an error, and it's better
89
+ # to raise a meaningful exception here than the ambiguous one when
90
+ # the error occurs.
91
+ #
92
+ # @example Validate the result.
93
+ # result.validate!
94
+ #
95
+ # @raise [ NoNamespace ] If the ns doesn't exist.
96
+ #
97
+ # @return [ Result ] Self if successful.
98
+ #
99
+ # @since 2.0.0
100
+ def validate!
101
+ !successful? ? raise(Error::OperationFailure.new(parser.message)) : self
102
+ end
103
+
104
+ private
105
+
106
+ def cursor_document
107
+ @cursor_document ||= first_document[CURSOR]
108
+ end
109
+
110
+ def first_document
111
+ @first_document ||= reply.documents[0]
112
+ end
113
+ end end
114
+ end
115
+ end
@@ -12,11 +12,10 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- require 'mongo/operation/map_reduce/result'
15
+ require 'mongo/operation/commands/map_reduce/result'
16
16
 
17
17
  module Mongo
18
18
  module Operation
19
-
20
19
  # A MongoDB map reduce operation.
21
20
  #
22
21
  # @note A map/reduce operation can behave like a read and
@@ -43,50 +42,13 @@ module Mongo
43
42
  #
44
43
  # @since 2.0.0
45
44
  class MapReduce
46
- include Executable
47
45
  include Specifiable
48
46
  include Limited
49
- include ReadPreferrable
50
-
51
- # The error message for needing a primary.
52
- #
53
- # @since 2.0.
54
- ERROR_MESSAGE = "If 'out' is specified as a collection, the primary server must be used.".freeze
55
-
56
- # Execute the map/reduce operation.
57
- #
58
- # @example Execute the operation.
59
- # operation.execute(context)
60
- #
61
- # @param [ Server::Context ] context The context for this operation.
62
- #
63
- # @return [ Result ] The operation response, if there is one.
64
- #
65
- # @since 2.0.0
66
- def execute(context)
67
- unless valid_context?(context)
68
- raise Error::NeedPrimaryServer.new(ERROR_MESSAGE)
69
- end
70
- execute_message(context)
71
- end
47
+ include ReadPreference
48
+ include Executable
72
49
 
73
50
  private
74
51
 
75
- def valid_context?(context)
76
- context.standalone? || context.mongos? || context.primary? || secondary_ok?
77
- end
78
-
79
- def execute_message(context)
80
- context.with_connection do |connection|
81
- Result.new(connection.dispatch([ message(context) ])).validate!
82
- end
83
- end
84
-
85
- def secondary_ok?
86
- selector[:out].respond_to?(:keys) &&
87
- selector[:out].keys.first.to_s.downcase == 'inline'
88
- end
89
-
90
52
  def query_coll
91
53
  Database::COMMAND
92
54
  end
@@ -12,7 +12,7 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- require 'mongo/operation/parallel_scan/result'
15
+ require 'mongo/operation/commands/parallel_scan/result'
16
16
 
17
17
  module Mongo
18
18
  module Operation
@@ -37,33 +37,13 @@ module Mongo
37
37
  #
38
38
  # @since 2.0.0
39
39
  class ParallelScan
40
- include Executable
41
40
  include Specifiable
42
41
  include Limited
43
- include ReadPreferrable
44
-
45
- # Execute the parallel scan operation.
46
- #
47
- # @example Execute the operation.
48
- # operation.execute(context)
49
- #
50
- # @param [ Mongo::Server::Context ] context The context for this operation.
51
- #
52
- # @return [ Result ] The operation response, if there is one.
53
- #
54
- # @since 2.0.0
55
- def execute(context)
56
- execute_message(context)
57
- end
42
+ include ReadPreference
43
+ include Executable
58
44
 
59
45
  private
60
46
 
61
- def execute_message(context)
62
- context.with_connection do |connection|
63
- Result.new(connection.dispatch([ message(context) ])).validate!
64
- end
65
- end
66
-
67
47
  def selector
68
48
  { :parallelCollectionScan => coll_name, :numCursors => cursor_count }
69
49
  end
@@ -0,0 +1,69 @@
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
+
18
+ # A MongoDB operation to get info of a particular user in a database.
19
+ #
20
+ # @example Create the user query operation.
21
+ # Read::UserQuery.new(:name => 'emily', :db_name => 'test-db')
22
+ #
23
+ # Initialization:
24
+ # param [ Hash ] spec The specifications for the user query operation.
25
+ #
26
+ # option spec :user_name [ String ] The name of the user.
27
+ # option spec :db_name [ String ] The name of the database where the user exists.
28
+ # option spec :options [ Hash ] Options for the operation.
29
+ #
30
+ # @since 2.1.0
31
+ class UserQuery
32
+ include Executable
33
+ include Specifiable
34
+
35
+ # Execute the operation.
36
+ # The context gets a connection on which the operation
37
+ # is sent in the block.
38
+ #
39
+ # @param [ Mongo::Server::Context ] context The context for this operation.
40
+ #
41
+ # @return [ Result ] The operation response, if there is one.
42
+ #
43
+ # @since 2.1.0
44
+ def execute(context)
45
+ if context.features.users_info_enabled?
46
+ UsersInfo.new(spec).execute(context)
47
+ else
48
+ context.with_connection do |connection|
49
+ Result.new(connection.dispatch([ message(context) ])).validate!
50
+ end
51
+ end
52
+ end
53
+
54
+ private
55
+
56
+ def selector
57
+ { :user => user_name }
58
+ end
59
+
60
+ def query_coll
61
+ Auth::User::COLLECTION
62
+ end
63
+
64
+ def message(context)
65
+ Protocol::Query.new(db_name, query_coll, selector, options)
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,53 @@
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/commands/users_info/result'
16
+
17
+ module Mongo
18
+ module Operation
19
+
20
+ # A MongoDB operation to get info of a particular user in a database.
21
+ #
22
+ # @example Create the users info operation.
23
+ # Read::UsersInfo.new(:name => 'emily', :db_name => 'test-db')
24
+ #
25
+ # Initialization:
26
+ # param [ Hash ] spec The specifications for the users info operation.
27
+ #
28
+ # option spec :user_name [ String ] The name of the user.
29
+ # option spec :db_name [ String ] The name of the database where the user exists.
30
+ # option spec :options [ Hash ] Options for the operation.
31
+ #
32
+ # @since 2.1.0
33
+ class UsersInfo
34
+ include Executable
35
+ include Specifiable
36
+ include Limited
37
+
38
+ private
39
+
40
+ def selector
41
+ { :usersInfo => user_name }
42
+ end
43
+
44
+ def query_coll
45
+ Database::COMMAND
46
+ end
47
+
48
+ def message(context)
49
+ Protocol::Query.new(db_name, query_coll, selector, options)
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,36 @@
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
+ class UsersInfo
18
+
19
+ # Defines custom behaviour of results when using the
20
+ # usersInfo command.
21
+ #
22
+ # @since 2.1.0
23
+ class Result < Operation::Result
24
+
25
+ # The field name for the users document in a usersInfo result.
26
+ #
27
+ # @since 2.1.0
28
+ USERS = 'users'.freeze
29
+
30
+ def documents
31
+ reply.documents.first[USERS]
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -15,8 +15,8 @@
15
15
  module Mongo
16
16
  module Operation
17
17
 
18
- # This module contains common functionality for defining an operation
19
- # and executing it, given a certain context.
18
+ # This module provides the #execute method that many operations use.
19
+ # It makes sure to instantiate the appropriate Result class for the operation's response.
20
20
  #
21
21
  # @since 2.0.0
22
22
  module Executable
@@ -32,72 +32,8 @@ module Mongo
32
32
  # @since 2.0.0
33
33
  def execute(context)
34
34
  context.with_connection do |connection|
35
- connection.dispatch([ message ], operation_id)
36
- end
37
- end
38
-
39
- # Merge this operation with another operation, returning a new one.
40
- # Requires that the collection and database of the two ops are the same.
41
- #
42
- # @param[ Object ] The other operation.
43
- #
44
- # @return [ Object ] A new operation merging this one and another.
45
- #
46
- # @since 2.0.0
47
- def merge(other)
48
- # @todo: use specific exception
49
- raise Exception, "Cannot merge" unless self.class == other.class &&
50
- coll_name == other.coll_name &&
51
- db_name == other.db_name
52
- dup.merge!(other)
53
- end
54
-
55
- # Get the full namespace that this operates on.
56
- #
57
- # @example Get the namespace.
58
- # executable.namespace
59
- #
60
- # @return [ String ] The namespace.
61
- #
62
- # @since 2.0.0
63
- def namespace
64
- "#{db_name}.#{coll_name}"
65
- end
66
-
67
- # If an operation including this module doesn't define #merge!, neither
68
- # #merge nor #merge! will be allowed.
69
- #
70
- # @param[ Object ] The other operation.
71
- #
72
- # @raise [ Exception ] Merging is not supported for this operation.
73
- #
74
- # @since 2.0.0
75
- def merge!(other)
76
- raise Exception, "Merging not allowed for this operation type"
77
- end
78
-
79
- private
80
-
81
- # If it's ok that this operation be sent to a secondary server.
82
- #
83
- # @return [ true, false ] Whether it's ok for this op to go to a secondary.
84
- #
85
- # @since 2.0.0
86
- def secondary_ok?
87
- true
88
- end
89
-
90
- # Gets the legacy get last error command as a wire protocol query.
91
- #
92
- # @since 2.0.0
93
- def gle
94
- if gle_message = write_concern.get_last_error
95
- Protocol::Query.new(
96
- db_name,
97
- Database::COMMAND,
98
- gle_message,
99
- options.merge(limit: -1)
100
- )
35
+ result_class = defined?(self.class::Result) ? self.class::Result : Result
36
+ result_class.new(connection.dispatch([ message(context) ], operation_id)).validate!
101
37
  end
102
38
  end
103
39
  end