mongo 2.0.6 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (317) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +5 -2
  3. data/lib/mongo/address/ipv4.rb +6 -1
  4. data/lib/mongo/address/unix.rb +2 -2
  5. data/lib/mongo/address.rb +18 -10
  6. data/lib/mongo/auth/cr/conversation.rb +1 -1
  7. data/lib/mongo/auth/ldap/conversation.rb +7 -3
  8. data/lib/mongo/auth/scram/conversation.rb +9 -3
  9. data/lib/mongo/auth/user/view.rb +23 -2
  10. data/lib/mongo/auth/x509/conversation.rb +1 -1
  11. data/lib/mongo/bulk_write/combineable.rb +51 -0
  12. data/lib/mongo/bulk_write/ordered_combiner.rb +55 -0
  13. data/lib/mongo/bulk_write/result.rb +191 -0
  14. data/lib/mongo/bulk_write/result_combiner.rb +117 -0
  15. data/lib/mongo/bulk_write/transformable.rb +132 -0
  16. data/lib/mongo/bulk_write/unordered_combiner.rb +52 -0
  17. data/lib/mongo/bulk_write/validatable.rb +62 -0
  18. data/lib/mongo/bulk_write.rb +159 -23
  19. data/lib/mongo/client.rb +52 -16
  20. data/lib/mongo/cluster/topology/replica_set.rb +27 -9
  21. data/lib/mongo/cluster/topology/sharded.rb +1 -1
  22. data/lib/mongo/cluster/topology/unknown.rb +5 -2
  23. data/lib/mongo/cluster.rb +42 -7
  24. data/lib/mongo/collection/view/aggregation.rb +48 -9
  25. data/lib/mongo/collection/view/immutable.rb +6 -6
  26. data/lib/mongo/collection/view/iterable.rb +18 -4
  27. data/lib/mongo/collection/view/map_reduce.rb +58 -17
  28. data/lib/mongo/collection/view/readable.rb +173 -42
  29. data/lib/mongo/collection/view/writable.rb +37 -23
  30. data/lib/mongo/collection/view.rb +2 -2
  31. data/lib/mongo/collection.rb +370 -33
  32. data/lib/mongo/cursor.rb +15 -3
  33. data/lib/mongo/database/view.rb +5 -4
  34. data/lib/mongo/database.rb +14 -4
  35. data/lib/mongo/dbref.rb +113 -0
  36. data/lib/mongo/error/closed_stream.rb +34 -0
  37. data/lib/mongo/error/extra_file_chunk.rb +34 -0
  38. data/lib/mongo/error/{invalid_uri_option.rb → file_not_found.rb} +11 -12
  39. data/lib/mongo/error/invalid_file.rb +2 -2
  40. data/lib/mongo/error/invalid_file_revision.rb +37 -0
  41. data/lib/mongo/error/invalid_uri.rb +5 -4
  42. data/lib/mongo/error/missing_file_chunk.rb +38 -0
  43. data/lib/mongo/error/operation_failure.rb +1 -1
  44. data/lib/mongo/error/parser.rb +1 -1
  45. data/lib/mongo/error/unchangeable_collection_option.rb +38 -0
  46. data/lib/mongo/error/unexpected_chunk_length.rb +39 -0
  47. data/lib/mongo/error.rb +13 -2
  48. data/lib/mongo/event/description_changed.rb +1 -1
  49. data/lib/mongo/grid/file/chunk.rb +6 -6
  50. data/lib/mongo/grid/file/{metadata.rb → info.rb} +41 -39
  51. data/lib/mongo/grid/file.rb +13 -10
  52. data/lib/mongo/grid/fs_bucket.rb +448 -0
  53. data/lib/mongo/grid/stream/read.rb +208 -0
  54. data/lib/mongo/grid/stream/write.rb +187 -0
  55. data/lib/mongo/grid/stream.rb +64 -0
  56. data/lib/mongo/grid.rb +2 -1
  57. data/lib/mongo/index/view.rb +3 -3
  58. data/lib/mongo/index.rb +5 -0
  59. data/lib/mongo/loggable.rb +34 -57
  60. data/lib/mongo/logger.rb +16 -78
  61. data/lib/mongo/monitoring/command_log_subscriber.rb +112 -0
  62. data/lib/mongo/monitoring/event/command_failed.rb +96 -0
  63. data/lib/mongo/monitoring/event/command_started.rb +89 -0
  64. data/lib/mongo/monitoring/event/command_succeeded.rb +118 -0
  65. data/lib/mongo/monitoring/event/secure.rb +58 -0
  66. data/lib/mongo/monitoring/event.rb +18 -0
  67. data/lib/mongo/monitoring/publishable.rb +106 -0
  68. data/lib/mongo/monitoring.rb +195 -0
  69. data/lib/mongo/operation/{aggregate.rb → commands/aggregate.rb} +3 -41
  70. data/lib/mongo/operation/commands/collections_info/result.rb +39 -0
  71. data/lib/mongo/operation/commands/collections_info.rb +68 -0
  72. data/lib/mongo/operation/{command.rb → commands/command.rb} +2 -18
  73. data/lib/mongo/operation/commands/indexes.rb +70 -0
  74. data/lib/mongo/operation/commands/list_collections/result.rb +112 -0
  75. data/lib/mongo/operation/commands/list_collections.rb +54 -0
  76. data/lib/mongo/operation/commands/list_indexes/result.rb +116 -0
  77. data/lib/mongo/operation/commands/list_indexes.rb +56 -0
  78. data/lib/mongo/operation/{map_reduce → commands/map_reduce}/result.rb +1 -1
  79. data/lib/mongo/operation/{map_reduce.rb → commands/map_reduce.rb} +3 -41
  80. data/lib/mongo/operation/commands/parallel_scan/result.rb +72 -0
  81. data/lib/mongo/operation/commands/parallel_scan.rb +56 -0
  82. data/lib/mongo/operation/commands/user_query.rb +69 -0
  83. data/lib/mongo/{bulk_write/ordered_bulk_write.rb → operation/commands/users_info/result.rb} +18 -30
  84. data/lib/mongo/operation/commands/users_info.rb +53 -0
  85. data/lib/mongo/operation/commands.rb +24 -0
  86. data/lib/mongo/operation/executable.rb +4 -68
  87. data/lib/mongo/operation/kill_cursors.rb +3 -3
  88. data/lib/mongo/operation/read/get_more.rb +2 -22
  89. data/lib/mongo/{bulk_write/unordered_bulk_write.rb → operation/read/query/result.rb} +20 -26
  90. data/lib/mongo/operation/read/query.rb +4 -21
  91. data/lib/mongo/operation/read.rb +0 -4
  92. data/lib/mongo/operation/{read_preferrable.rb → read_preference.rb} +3 -2
  93. data/lib/mongo/operation/result.rb +13 -1
  94. data/lib/mongo/operation/specifiable.rb +42 -0
  95. data/lib/mongo/operation/write/bulk/bulkable.rb +82 -0
  96. data/lib/mongo/operation/write/bulk/delete/result.rb +74 -0
  97. data/lib/mongo/operation/write/bulk/delete.rb +71 -0
  98. data/lib/mongo/operation/write/bulk/insert/result.rb +129 -0
  99. data/lib/mongo/operation/write/bulk/insert.rb +96 -0
  100. data/lib/mongo/operation/write/bulk/legacy_mergable.rb +87 -0
  101. data/lib/mongo/operation/write/bulk/mergable.rb +71 -0
  102. data/lib/mongo/operation/write/bulk/update/result.rb +174 -0
  103. data/lib/mongo/operation/write/bulk/update.rb +81 -0
  104. data/lib/mongo/operation/write/bulk.rb +6 -3
  105. data/lib/mongo/operation/write/command/create_index.rb +0 -1
  106. data/lib/mongo/operation/write/command/create_user.rb +0 -1
  107. data/lib/mongo/operation/write/command/delete.rb +0 -1
  108. data/lib/mongo/operation/write/command/drop_index.rb +0 -1
  109. data/lib/mongo/operation/write/command/insert.rb +0 -1
  110. data/lib/mongo/operation/write/command/remove_user.rb +0 -1
  111. data/lib/mongo/operation/write/command/update.rb +0 -1
  112. data/lib/mongo/operation/write/command/update_user.rb +0 -1
  113. data/lib/mongo/operation/write/command/writable.rb +13 -18
  114. data/lib/mongo/operation/write/create_index.rb +4 -27
  115. data/lib/mongo/operation/write/create_user.rb +4 -30
  116. data/lib/mongo/operation/write/delete.rb +6 -29
  117. data/lib/mongo/operation/write/drop_index.rb +3 -3
  118. data/lib/mongo/operation/write/gle.rb +48 -0
  119. data/lib/mongo/operation/write/idable.rb +5 -0
  120. data/lib/mongo/operation/write/insert.rb +2 -24
  121. data/lib/mongo/operation/write/remove_user.rb +4 -27
  122. data/lib/mongo/operation/write/update.rb +13 -36
  123. data/lib/mongo/operation/write/update_user.rb +4 -30
  124. data/lib/mongo/operation/write/write_command_enabled.rb +53 -0
  125. data/lib/mongo/operation/write.rb +2 -0
  126. data/lib/mongo/operation.rb +32 -4
  127. data/lib/mongo/options/mapper.rb +4 -2
  128. data/lib/mongo/options/redacted.rb +156 -0
  129. data/lib/mongo/options.rb +1 -0
  130. data/lib/mongo/protocol/delete.rb +75 -15
  131. data/lib/mongo/protocol/get_more.rb +65 -13
  132. data/lib/mongo/protocol/insert.rb +85 -13
  133. data/lib/mongo/protocol/kill_cursors.rb +59 -14
  134. data/lib/mongo/protocol/message.rb +12 -12
  135. data/lib/mongo/protocol/query.rb +163 -37
  136. data/lib/mongo/protocol/reply.rb +103 -0
  137. data/lib/mongo/protocol/serializers.rb +1 -1
  138. data/lib/mongo/protocol/update.rb +82 -14
  139. data/lib/mongo/retryable.rb +83 -0
  140. data/lib/mongo/server/connectable.rb +21 -25
  141. data/lib/mongo/server/connection.rb +75 -4
  142. data/lib/mongo/server/connection_pool/queue.rb +15 -0
  143. data/lib/mongo/server/connection_pool.rb +12 -0
  144. data/lib/mongo/server/description/features.rb +2 -1
  145. data/lib/mongo/server/description.rb +52 -1
  146. data/lib/mongo/server/monitor/connection.rb +26 -2
  147. data/lib/mongo/server/monitor.rb +19 -3
  148. data/lib/mongo/server.rb +39 -5
  149. data/lib/mongo/server_selector/selectable.rb +40 -31
  150. data/lib/mongo/server_selector.rb +19 -10
  151. data/lib/mongo/socket/ssl.rb +28 -16
  152. data/lib/mongo/socket/tcp.rb +3 -3
  153. data/lib/mongo/socket/unix.rb +5 -8
  154. data/lib/mongo/socket.rb +11 -4
  155. data/lib/mongo/uri.rb +248 -137
  156. data/lib/mongo/version.rb +1 -1
  157. data/lib/mongo.rb +5 -3
  158. data/spec/mongo/address/unix_spec.rb +1 -1
  159. data/spec/mongo/address_spec.rb +25 -0
  160. data/spec/mongo/auth/cr_spec.rb +9 -1
  161. data/spec/mongo/auth/ldap/conversation_spec.rb +43 -0
  162. data/spec/mongo/auth/ldap_spec.rb +9 -1
  163. data/spec/mongo/auth/scram_spec.rb +9 -1
  164. data/spec/mongo/auth/user/view_spec.rb +26 -1
  165. data/spec/mongo/auth/x509_spec.rb +9 -1
  166. data/spec/mongo/bulk_write/ordered_combiner_spec.rb +271 -0
  167. data/spec/mongo/bulk_write/unordered_combiner_spec.rb +239 -0
  168. data/spec/mongo/bulk_write_spec.rb +428 -0
  169. data/spec/mongo/client_spec.rb +167 -17
  170. data/spec/mongo/cluster/topology/replica_set_spec.rb +18 -9
  171. data/spec/mongo/cluster/topology/sharded_spec.rb +11 -3
  172. data/spec/mongo/cluster/topology/single_spec.rb +12 -4
  173. data/spec/mongo/cluster_spec.rb +55 -10
  174. data/spec/mongo/collection/view/aggregation_spec.rb +188 -1
  175. data/spec/mongo/collection/view/explainable_spec.rb +1 -1
  176. data/spec/mongo/collection/view/immutable_spec.rb +103 -0
  177. data/spec/mongo/collection/view/map_reduce_spec.rb +99 -4
  178. data/spec/mongo/collection/view/readable_spec.rb +238 -6
  179. data/spec/mongo/collection/view/writable_spec.rb +4 -4
  180. data/spec/mongo/collection/view_spec.rb +459 -71
  181. data/spec/mongo/collection_spec.rb +1291 -9
  182. data/spec/mongo/command_monitoring_spec.rb +51 -0
  183. data/spec/mongo/connection_string_spec.rb +115 -0
  184. data/spec/mongo/crud_spec.rb +2 -2
  185. data/spec/mongo/cursor_spec.rb +3 -3
  186. data/spec/mongo/database_spec.rb +47 -11
  187. data/spec/mongo/dbref_spec.rb +149 -0
  188. data/spec/mongo/grid/file/chunk_spec.rb +5 -5
  189. data/spec/mongo/grid/file/{metadata_spec.rb → info_spec.rb} +29 -17
  190. data/spec/mongo/grid/file_spec.rb +8 -8
  191. data/spec/mongo/grid/fs_bucket_spec.rb +1020 -0
  192. data/spec/mongo/grid/stream/read_spec.rb +275 -0
  193. data/spec/mongo/grid/stream/write_spec.rb +440 -0
  194. data/spec/mongo/grid/stream_spec.rb +48 -0
  195. data/spec/mongo/gridfs_spec.rb +50 -0
  196. data/spec/mongo/logger_spec.rb +0 -40
  197. data/spec/mongo/monitoring/command_log_subscriber_spec.rb +76 -0
  198. data/spec/mongo/monitoring/event/command_started_spec.rb +26 -0
  199. data/spec/mongo/monitoring/event/command_succeeded_spec.rb +26 -0
  200. data/spec/mongo/monitoring/event/secure_spec.rb +57 -0
  201. data/spec/mongo/monitoring_spec.rb +168 -0
  202. data/spec/mongo/operation/commands/aggregate_spec.rb +69 -0
  203. data/spec/mongo/operation/{read → commands}/collections_info_spec.rb +1 -1
  204. data/spec/mongo/operation/{command_spec.rb → commands/command_spec.rb} +0 -18
  205. data/spec/mongo/operation/{read → commands}/indexes_spec.rb +1 -1
  206. data/spec/mongo/operation/{map_reduce_spec.rb → commands/map_reduce_spec.rb} +1 -19
  207. data/spec/mongo/operation/kill_cursors_spec.rb +1 -17
  208. data/spec/mongo/operation/read/get_more_spec.rb +0 -16
  209. data/spec/mongo/operation/read/query_spec.rb +19 -16
  210. data/spec/mongo/operation/{read_preferrable_spec.rb → read_preference_spec.rb} +11 -11
  211. data/spec/mongo/operation/write/bulk/{bulk_delete_spec.rb → delete_spec.rb} +18 -29
  212. data/spec/mongo/operation/write/bulk/{bulk_insert_spec.rb → insert_spec.rb} +3 -14
  213. data/spec/mongo/operation/write/bulk/{bulk_update_spec.rb → update_spec.rb} +8 -19
  214. data/spec/mongo/operation/write/command/delete_spec.rb +0 -16
  215. data/spec/mongo/operation/write/command/insert_spec.rb +0 -16
  216. data/spec/mongo/operation/write/command/update_spec.rb +0 -16
  217. data/spec/mongo/operation/write/delete_spec.rb +4 -4
  218. data/spec/mongo/operation/write/insert_spec.rb +2 -13
  219. data/spec/mongo/operation/write/update_spec.rb +7 -7
  220. data/spec/mongo/options/redacted_spec.rb +350 -0
  221. data/spec/mongo/protocol/kill_cursors_spec.rb +5 -3
  222. data/spec/mongo/protocol/query_spec.rb +15 -30
  223. data/spec/mongo/retryable_spec.rb +147 -0
  224. data/spec/mongo/server/connection_pool/queue_spec.rb +16 -0
  225. data/spec/mongo/server/connection_pool_spec.rb +50 -6
  226. data/spec/mongo/server/connection_spec.rb +49 -4
  227. data/spec/mongo/server/description_spec.rb +49 -3
  228. data/spec/mongo/server/monitor_spec.rb +51 -0
  229. data/spec/mongo/server_discovery_and_monitoring_spec.rb +32 -59
  230. data/spec/mongo/server_selection_rtt_spec.rb +37 -57
  231. data/spec/mongo/server_selection_spec.rb +19 -9
  232. data/spec/mongo/server_selector/nearest_spec.rb +35 -27
  233. data/spec/mongo/server_selector/primary_preferred_spec.rb +32 -30
  234. data/spec/mongo/server_selector/primary_spec.rb +21 -14
  235. data/spec/mongo/server_selector/secondary_preferred_spec.rb +28 -26
  236. data/spec/mongo/server_selector/secondary_spec.rb +24 -22
  237. data/spec/mongo/server_selector_spec.rb +87 -24
  238. data/spec/mongo/server_spec.rb +94 -8
  239. data/spec/mongo/socket/ssl_spec.rb +123 -13
  240. data/spec/mongo/socket/unix_spec.rb +52 -0
  241. data/spec/mongo/uri_spec.rb +295 -67
  242. data/spec/spec_helper.rb +40 -24
  243. data/spec/support/authorization.rb +23 -9
  244. data/spec/support/certificates/client.pem +4 -4
  245. data/spec/support/command_monitoring/bulkWrite.yml +73 -0
  246. data/spec/support/command_monitoring/command.yml +42 -0
  247. data/spec/support/command_monitoring/deleteMany.yml +55 -0
  248. data/spec/support/command_monitoring/deleteOne.yml +55 -0
  249. data/spec/support/command_monitoring/find.yml +219 -0
  250. data/spec/support/command_monitoring/insertMany.yml +81 -0
  251. data/spec/support/command_monitoring/insertOne.yml +51 -0
  252. data/spec/support/command_monitoring/updateMany.yml +67 -0
  253. data/spec/support/command_monitoring/updateOne.yml +95 -0
  254. data/spec/support/command_monitoring.rb +365 -0
  255. data/spec/support/connection_string.rb +228 -0
  256. data/spec/support/connection_string_tests/invalid-uris.yml +193 -0
  257. data/spec/support/connection_string_tests/valid-auth.yml +256 -0
  258. data/spec/support/connection_string_tests/valid-host_identifiers.yml +121 -0
  259. data/spec/support/connection_string_tests/valid-options.yml +30 -0
  260. data/spec/support/connection_string_tests/valid-unix_socket-absolute.yml +197 -0
  261. data/spec/support/connection_string_tests/valid-unix_socket-relative.yml +213 -0
  262. data/spec/support/connection_string_tests/valid-warnings.yml +55 -0
  263. data/spec/support/crud/read.rb +22 -19
  264. data/spec/support/crud/write.rb +58 -27
  265. data/spec/support/crud.rb +10 -2
  266. data/spec/support/gridfs.rb +637 -0
  267. data/spec/support/gridfs_tests/delete.yml +157 -0
  268. data/spec/support/gridfs_tests/download.yml +210 -0
  269. data/spec/support/gridfs_tests/download_by_name.yml +113 -0
  270. data/spec/support/gridfs_tests/upload.yml +158 -0
  271. data/spec/support/matchers.rb +1 -1
  272. data/spec/support/sdam/rs/equal_electionids.yml +44 -0
  273. data/spec/support/sdam/rs/new_primary_new_electionid.yml +95 -0
  274. data/spec/support/sdam/rs/null_election_id.yml +144 -0
  275. data/spec/support/sdam/rs/primary_disconnect_electionid.yml +124 -0
  276. data/spec/support/sdam/rs/primary_mismatched_me.yml +37 -0
  277. data/spec/support/sdam/rs/primary_to_no_primary_mismatched_me.yml +75 -0
  278. data/spec/support/sdam/rs/secondary_mismatched_me.yml +37 -0
  279. data/spec/support/sdam/sharded/mongos_disconnect.yml +104 -0
  280. data/spec/support/sdam/single/direct_connection_rsarbiter.yml +1 -1
  281. data/spec/support/sdam/single/direct_connection_rsprimary.yml +1 -1
  282. data/spec/support/sdam/single/direct_connection_rssecondary.yml +1 -1
  283. data/spec/support/sdam/single/direct_connection_slave.yml +1 -1
  284. data/spec/support/sdam/single/direct_connection_standalone.yml +1 -1
  285. data/spec/support/sdam/single/not_ok_response.yml +0 -1
  286. data/spec/support/server_discovery_and_monitoring.rb +22 -3
  287. data/spec/support/server_selection.rb +3 -1
  288. data/spec/support/shared/bulk_write.rb +218 -22
  289. data/spec/support/shared/server_selector.rb +80 -14
  290. data.tar.gz.sig +0 -0
  291. metadata +188 -59
  292. metadata.gz.sig +0 -0
  293. data/lib/mongo/bulk_write/bulk_writable.rb +0 -196
  294. data/lib/mongo/bulk_write/deletable.rb +0 -56
  295. data/lib/mongo/bulk_write/insertable.rb +0 -48
  296. data/lib/mongo/bulk_write/replacable.rb +0 -57
  297. data/lib/mongo/bulk_write/updatable.rb +0 -68
  298. data/lib/mongo/grid/fs.rb +0 -149
  299. data/lib/mongo/operation/list_collections/result.rb +0 -114
  300. data/lib/mongo/operation/list_indexes/result.rb +0 -118
  301. data/lib/mongo/operation/read/collections_info.rb +0 -68
  302. data/lib/mongo/operation/read/indexes.rb +0 -69
  303. data/lib/mongo/operation/read/list_collections.rb +0 -76
  304. data/lib/mongo/operation/read/list_indexes.rb +0 -78
  305. data/lib/mongo/operation/write/bulk/bulk_delete/result.rb +0 -75
  306. data/lib/mongo/operation/write/bulk/bulk_delete.rb +0 -145
  307. data/lib/mongo/operation/write/bulk/bulk_insert/result.rb +0 -130
  308. data/lib/mongo/operation/write/bulk/bulk_insert.rb +0 -132
  309. data/lib/mongo/operation/write/bulk/bulk_mergable.rb +0 -67
  310. data/lib/mongo/operation/write/bulk/bulk_update/result.rb +0 -162
  311. data/lib/mongo/operation/write/bulk/bulk_update.rb +0 -154
  312. data/lib/mongo/operation/write/bulk/legacy_bulk_mergable.rb +0 -83
  313. data/spec/mongo/bulk/bulk_write_spec.rb +0 -262
  314. data/spec/mongo/grid/fs_spec.rb +0 -160
  315. data/spec/mongo/loggable_spec.rb +0 -63
  316. data/spec/mongo/operation/aggregate_spec.rb +0 -127
  317. /data/lib/mongo/operation/{aggregate → commands/aggregate}/result.rb +0 -0
@@ -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/aggregate/result'
15
+ require 'mongo/operation/commands/aggregate/result'
16
16
 
17
17
  module Mongo
18
18
  module Operation
@@ -41,51 +41,13 @@ module Mongo
41
41
  #
42
42
  # @since 2.0.0
43
43
  class Aggregate
44
- include Executable
45
44
  include Specifiable
46
45
  include Limited
47
- include ReadPreferrable
48
-
49
- # The need primary error message.
50
- #
51
- # @since 2.0.0
52
- ERROR_MESSAGE = "The pipeline contains the '$out' operator so the primary must be used.".freeze
53
-
54
- # Execute the operation.
55
- # The context gets a connection on which the operation
56
- # is sent in the block.
57
- # If the aggregation will be written to an output collection and the
58
- # server is not primary, the operation will be rerouted to the primary
59
- # with a warning.
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
46
+ include Executable
47
+ include ReadPreference
72
48
 
73
49
  private
74
50
 
75
- def execute_message(context)
76
- context.with_connection do |connection|
77
- Result.new(connection.dispatch([ message(context) ])).validate!
78
- end
79
- end
80
-
81
- def valid_context?(context)
82
- context.standalone? || context.mongos? || context.primary? || secondary_ok?
83
- end
84
-
85
- def secondary_ok?
86
- selector[:pipeline].none? { |op| op.key?('$out') || op.key?(:$out) }
87
- end
88
-
89
51
  def query_coll
90
52
  Database::COMMAND
91
53
  end
@@ -0,0 +1,39 @@
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 CollectionsInfo
18
+
19
+ # Defines custom behaviour of results when query the system.namespaces
20
+ # collection.
21
+ #
22
+ # @since 2.1.0
23
+ class Result < Operation::Result
24
+
25
+ # Get the namespace for the cursor.
26
+ #
27
+ # @example Get the namespace.
28
+ # result.namespace
29
+ #
30
+ # @return [ String ] The namespace.
31
+ #
32
+ # @since 2.1.0
33
+ def namespace
34
+ Database::NAMESPACES
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,68 @@
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/collections_info/result'
16
+
17
+ module Mongo
18
+ module Operation
19
+
20
+ # A MongoDB operation to get a list of collection names in a database.
21
+ #
22
+ # @example Create the collection names operation.
23
+ # Read::CollectionNames.new(:db_name => 'test-db')
24
+ #
25
+ # Initialization:
26
+ # param [ Hash ] spec The specifications for the collection names operation.
27
+ #
28
+ # option spec :db_name [ String ] The name of the database whose collection
29
+ # names is requested.
30
+ # option spec :options [ Hash ] Options for the operation.
31
+ #
32
+ # @since 2.0.0
33
+ class CollectionsInfo
34
+ include Specifiable
35
+ include ReadPreference
36
+ include Executable
37
+
38
+ # Execute the operation.
39
+ # The context gets a connection on which the operation
40
+ # is sent in the block.
41
+ #
42
+ # @param [ Mongo::Server::Context ] context The context for this operation.
43
+ #
44
+ # @return [ Result ] The operation response, if there is one.
45
+ #
46
+ # @since 2.0.0
47
+ def execute(context)
48
+ if context.features.list_collections_enabled?
49
+ ListCollections.new(spec).execute(context)
50
+ else
51
+ context.with_connection do |connection|
52
+ Result.new(connection.dispatch([ message(context) ])).validate!
53
+ end
54
+ end
55
+ end
56
+
57
+ private
58
+
59
+ def selector
60
+ { :name => { '$not' => /system\.|\$/ } }
61
+ end
62
+
63
+ def query_coll
64
+ Database::NAMESPACES
65
+ end
66
+ end
67
+ end
68
+ end
@@ -30,26 +30,10 @@ module Mongo
30
30
  #
31
31
  # @since 2.0.0
32
32
  class Command
33
- include Executable
34
33
  include Specifiable
35
34
  include Limited
36
- include ReadPreferrable
37
-
38
- # Execute the command operation.
39
- #
40
- # @example Execute the operation.
41
- # operation.execute(context)
42
- #
43
- # @param [ Server::Context ] context The context for this operation.
44
- #
45
- # @return [ Result ] The operation result.
46
- #
47
- # @since 2.0.0
48
- def execute(context)
49
- context.with_connection do |connection|
50
- Result.new(connection.dispatch([ message(context) ])).validate!
51
- end
52
- end
35
+ include ReadPreference
36
+ include Executable
53
37
 
54
38
  private
55
39
 
@@ -0,0 +1,70 @@
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 get indexes operation.
19
+ #
20
+ # Initialize the get indexes operation.
21
+ #
22
+ # @example Instantiate the operation.
23
+ # Read::Indexes.new(:db_name => 'test', :coll_name => 'test_coll')
24
+ #
25
+ # Initialization:
26
+ # param [ Hash ] spec The specifications for the insert.
27
+ #
28
+ # option spec :db_name [ String ] The name of the database.
29
+ # option spec :coll_name [ String ] The name of the collection.
30
+ #
31
+ # @since 2.0.0
32
+ class Indexes
33
+ include Specifiable
34
+ include ReadPreference
35
+
36
+ # Execute the operation.
37
+ # The context gets a connection on which the operation
38
+ # is sent in the block.
39
+ #
40
+ # @param [ Mongo::Server::Context ] context The context for this operation.
41
+ #
42
+ # @return [ Result ] The indexes operation response.
43
+ #
44
+ # @since 2.0.0
45
+ def execute(context)
46
+ if context.features.list_indexes_enabled?
47
+ ListIndexes.new(spec).execute(context)
48
+ else
49
+ execute_message(context)
50
+ end
51
+ end
52
+
53
+ private
54
+
55
+ def execute_message(context)
56
+ context.with_connection do |connection|
57
+ Result.new(connection.dispatch([ message(context) ]))
58
+ end
59
+ end
60
+
61
+ def selector
62
+ { ns: namespace }
63
+ end
64
+
65
+ def query_coll
66
+ Index::COLLECTION
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,112 @@
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 ListCollections
18
+
19
+ # Defines custom behaviour of results when using the
20
+ # listCollections command.
21
+ #
22
+ # @since 2.0.0
23
+ class Result < Operation::Result
24
+
25
+ # The field name for the cursor document in a listCollections 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
+ # listCollections 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 listCollections result. It 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 an unauthorized client tries
88
+ # to run the command we need to generate the proper error.
89
+ #
90
+ # @example Validate the result.
91
+ # result.validate!
92
+ #
93
+ # @return [ Result ] Self if successful.
94
+ #
95
+ # @since 2.0.0
96
+ def validate!
97
+ !successful? ? raise(Error::OperationFailure.new(parser.message)) : self
98
+ end
99
+
100
+ private
101
+
102
+ def cursor_document
103
+ @cursor_document ||= first_document[CURSOR]
104
+ end
105
+
106
+ def first_document
107
+ @first_document ||= reply.documents[0]
108
+ end
109
+ end
110
+ end
111
+ end
112
+ end
@@ -0,0 +1,54 @@
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/list_collections/result'
16
+
17
+ module Mongo
18
+ module Operation
19
+
20
+ # A MongoDB listCollections command operation.
21
+ #
22
+ # @example Create the listCollections command operation.
23
+ # Mongo::Operation::Read::ListCollections.new(db_name: 'test')
24
+ #
25
+ # @note A command is actually a query on the virtual '$cmd' collection.
26
+ #
27
+ # Initialization:
28
+ # param [ Hash ] spec The specifications for the command.
29
+ #
30
+ # option spec :db_name [ String ] The name of the database whose list of
31
+ # collection names is requested.
32
+ # option spec :options [ Hash ] Options for the command.
33
+ #
34
+ # @since 2.0.0
35
+ class ListCollections
36
+ include Specifiable
37
+ include Limited
38
+ include Executable
39
+ include ReadPreference
40
+
41
+ private
42
+
43
+ def query_coll
44
+ Database::COMMAND
45
+ end
46
+
47
+ def selector
48
+ (spec[SELECTOR] || {}).merge(
49
+ listCollections: 1, filter: { name: { '$not' => /system\.|\$/ }}
50
+ )
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,116 @@
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
114
+ end
115
+ end
116
+ end
@@ -0,0 +1,56 @@
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/list_indexes/result'
16
+
17
+ module Mongo
18
+ module Operation
19
+
20
+ # A MongoDB listIndexes command operation.
21
+ #
22
+ # @example Create the listIndexes command operation.
23
+ # Mongo::Operation::Read::ListIndexes.new({ db_name: 'test', coll_name: 'example' })
24
+ #
25
+ # @note A command is actually a query on the virtual '$cmd' collection.
26
+ #
27
+ # Initialization:
28
+ # param [ Hash ] spec The specifications for the command.
29
+ #
30
+ # option spec :coll_name [ Hash ] The name of the collection whose index
31
+ # info is requested.
32
+ # option spec :db_name [ String ] The name of the database on which
33
+ # the command should be executed.
34
+ # option spec :options [ Hash ] Options for the command.
35
+ #
36
+ # @since 2.0.0
37
+ class ListIndexes
38
+ include Specifiable
39
+ include Limited
40
+ include Executable
41
+ include ReadPreference
42
+
43
+ private
44
+
45
+ def query_coll
46
+ Database::COMMAND
47
+ end
48
+
49
+ def selector
50
+ (spec[SELECTOR] || {}).merge(listIndexes: coll_name)
51
+ end
52
+ end
53
+ end
54
+ end
55
+
56
+
@@ -16,7 +16,7 @@ module Mongo
16
16
  module Operation
17
17
  class MapReduce
18
18
 
19
- # Defines custom behaviour of results in an aggregation context.
19
+ # Defines custom behaviour of results for a map reduce operation.
20
20
  #
21
21
  # @since 2.0.0
22
22
  class Result < Operation::Result
@@ -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