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
@@ -0,0 +1,72 @@
1
+
2
+ # Copyright (C) 2009-2014 MongoDB, Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ module Mongo
17
+ module Operation
18
+ class ParallelScan
19
+
20
+ # Defines custom behaviour of results in a parallel scan.
21
+ #
22
+ # @since 2.0.0
23
+ class Result < Operation::Result
24
+
25
+ # Get the name of the cursor field.
26
+ #
27
+ # @since 2.0.0
28
+ CURSOR = 'cursor'.freeze
29
+
30
+ # The name of the cursors field in the result.
31
+ #
32
+ # @since 2.0.0
33
+ CURSORS = 'cursors'.freeze
34
+
35
+ # Get the name of the id field.
36
+ #
37
+ # @since 2.0.0
38
+ ID = 'id'.freeze
39
+
40
+ # Get all the cursor ids from the result.
41
+ #
42
+ # @example Get the cursor ids.
43
+ # result.cursor_ids
44
+ #
45
+ # @return [ Array<Integer> ] The cursor ids.
46
+ #
47
+ # @since 2.0.0
48
+ def cursor_ids
49
+ documents.map{ |doc| doc[CURSOR][ID] }
50
+ end
51
+
52
+ # Get the documents from parallel scan.
53
+ #
54
+ # @example Get the documents.
55
+ # result.documents
56
+ #
57
+ # @return [ Array<BSON::Document> ] The documents.
58
+ #
59
+ # @since 2.0.0
60
+ def documents
61
+ reply.documents[0][CURSORS]
62
+ end
63
+
64
+ private
65
+
66
+ def first
67
+ @first ||= reply.documents[0] || {}
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,56 @@
1
+ # Copyright (C) 2009-2014 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/parallel_scan/result'
16
+
17
+ module Mongo
18
+ module Operation
19
+
20
+ # A MongoDB parallel scan operation.
21
+ #
22
+ # @example Create the parallel scan operation.
23
+ # ParallelScan.new({
24
+ # :db_name => 'test_db',
25
+ # :coll_name = > 'test_collection',
26
+ # :cursor_count => 5
27
+ # })
28
+ #
29
+ # Initialization:
30
+ # param [ Hash ] spec The specifications for the operation.
31
+ #
32
+ # option spec :db_name [ String ] The name of the database on which
33
+ # the operation should be executed.
34
+ # option spec :coll_name [ String ] The collection to scan.
35
+ # option spec :cursor_count [ Integer ] The number of cursors to use.
36
+ # option spec :options [ Hash ] Options for the command.
37
+ #
38
+ # @since 2.0.0
39
+ class ParallelScan
40
+ include Specifiable
41
+ include Limited
42
+ include ReadPreference
43
+ include Executable
44
+
45
+ private
46
+
47
+ def selector
48
+ { :parallelCollectionScan => coll_name, :numCursors => cursor_count }
49
+ end
50
+
51
+ def query_coll
52
+ Database::COMMAND
53
+ end
54
+ end
55
+ end
56
+ 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
@@ -13,36 +13,24 @@
13
13
  # limitations under the License.
14
14
 
15
15
  module Mongo
16
-
17
- module BulkWrite
18
-
19
- class OrderedBulkWrite
20
-
21
- include BulkWritable
22
-
23
- private
24
-
25
- def ordered?
26
- true
27
- end
28
-
29
- def merged_ops
30
- merge_consecutive_ops(@operations)
31
- end
32
-
33
- def process(result, indexes)
34
- combine_results(result, indexes)
35
- raise Error::BulkWriteError.new(@results) if stop?
36
- end
37
-
38
- def stop?
39
- @results.keys.include?(:write_errors)
40
- end
41
-
42
- def finalize
43
- raise Error::BulkWriteError.new(@results) if @results[:write_concern_errors]
44
- @results
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
45
33
  end
46
34
  end
47
35
  end
48
- end
36
+ 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,24 @@
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/command'
16
+ require 'mongo/operation/commands/parallel_scan'
17
+ require 'mongo/operation/commands/aggregate'
18
+ require 'mongo/operation/commands/map_reduce'
19
+ require 'mongo/operation/commands/collections_info'
20
+ require 'mongo/operation/commands/indexes'
21
+ require 'mongo/operation/commands/list_collections'
22
+ require 'mongo/operation/commands/list_indexes'
23
+ require 'mongo/operation/commands/user_query'
24
+ require 'mongo/operation/commands/users_info'
@@ -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 ])
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
@@ -27,13 +27,13 @@ module Mongo
27
27
  #
28
28
  # @since 2.0.0
29
29
  class KillCursors
30
- include Executable
31
30
  include Specifiable
31
+ include Executable
32
32
 
33
33
  private
34
34
 
35
- def message
36
- Protocol::KillCursors.new(cursor_ids)
35
+ def message(context)
36
+ Protocol::KillCursors.new(coll_name, db_name, cursor_ids)
37
37
  end
38
38
  end
39
39
  end
@@ -38,32 +38,12 @@ module Mongo
38
38
  #
39
39
  # @since 2.0.0
40
40
  class GetMore
41
- include Executable
42
41
  include Specifiable
43
-
44
- # Execute the get more operation.
45
- #
46
- # @example Execute the operation.
47
- # operation.execute(context)
48
- #
49
- # @param [ Mongo::Server::Context ] context The context for this operation.
50
- #
51
- # @return [ Result ] The operation response, if there is one.
52
- #
53
- # @since 2.0.0
54
- def execute(context)
55
- execute_message(context)
56
- end
42
+ include Executable
57
43
 
58
44
  private
59
45
 
60
- def execute_message(context)
61
- context.with_connection do |connection|
62
- Result.new(connection.dispatch([ message ]))
63
- end
64
- end
65
-
66
- def message
46
+ def message(context)
67
47
  Protocol::GetMore.new(db_name, coll_name, to_return, cursor_id)
68
48
  end
69
49
  end
@@ -13,34 +13,28 @@
13
13
  # limitations under the License.
14
14
 
15
15
  module Mongo
16
-
17
- module BulkWrite
18
-
19
- class UnorderedBulkWrite
20
-
21
- include BulkWritable
22
-
23
- private
24
-
25
- def ordered?
26
- false
27
- end
28
-
29
- def merged_ops
30
- merge_consecutive_ops(merge_ops_by_type)
31
- end
32
-
33
- def process(result, indexes)
34
- combine_results(result, indexes)
35
- end
36
-
37
- def finalize
38
- @results.tap do |results|
39
- if results[:write_errors] || results[:write_concern_errors]
40
- raise Error::BulkWriteError.new(results)
16
+ module Operation
17
+ module Read
18
+ class Query
19
+
20
+ # Defines custom behaviour of results for a query.
21
+ #
22
+ # @since 2.1.0
23
+ class Result < Operation::Result
24
+
25
+ # Determine if the query was a success.
26
+ #
27
+ # @example Was the query successful?
28
+ # result.successful?
29
+ #
30
+ # @return [ true, false ] If the query was successful.
31
+ #
32
+ # @since 2.0.0
33
+ def successful?
34
+ !query_failure?
41
35
  end
42
36
  end
43
37
  end
44
38
  end
45
39
  end
46
- end
40
+ end
@@ -12,6 +12,8 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ require 'mongo/operation/read/query/result'
16
+
15
17
  module Mongo
16
18
  module Operation
17
19
  module Read
@@ -38,31 +40,12 @@ module Mongo
38
40
  #
39
41
  # @since 2.0.0
40
42
  class Query
41
- include Executable
42
43
  include Specifiable
43
- include ReadPreferrable
44
-
45
- # Execute the operation.
46
- # The context gets a connection on which the operation
47
- # is sent in the block.
48
- #
49
- # @param [ Server::Context ] context The context for this operation.
50
- #
51
- # @return [ Result ] The operation response, if there is one.
52
- #
53
- # @since 2.0.0
54
- def execute(context)
55
- execute_message(context)
56
- end
44
+ include Executable
45
+ include ReadPreference
57
46
 
58
47
  private
59
48
 
60
- def execute_message(context)
61
- context.with_connection do |connection|
62
- Result.new(connection.dispatch([ message(context) ])).validate!
63
- end
64
- end
65
-
66
49
  def query_coll
67
50
  coll_name
68
51
  end
@@ -14,7 +14,3 @@
14
14
 
15
15
  require 'mongo/operation/read/query'
16
16
  require 'mongo/operation/read/get_more'
17
- require 'mongo/operation/read/indexes'
18
- require 'mongo/operation/read/list_indexes'
19
- require 'mongo/operation/read/list_collections'
20
- require 'mongo/operation/read/collections_info'
@@ -15,10 +15,11 @@
15
15
  module Mongo
16
16
  module Operation
17
17
 
18
- # Adds behaviour for queries that need to take read preference into account.
18
+ # Adds behaviour for updating the options and the selector for operations
19
+ # that need to take read preference into account.
19
20
  #
20
21
  # @since 2.0.0
21
- module ReadPreferrable
22
+ module ReadPreference
22
23
 
23
24
  # The constant for slave ok flags.
24
25
  #
@@ -190,12 +190,24 @@ module Mongo
190
190
  def successful?
191
191
  return true if !acknowledged?
192
192
  if first_document.has_key?(OK)
193
- first_document[OK] == 1 && parser.message.empty?
193
+ ok? && parser.message.empty?
194
194
  else
195
195
  !query_failure? && parser.message.empty?
196
196
  end
197
197
  end
198
198
 
199
+ # Check the first document's ok field.
200
+ #
201
+ # @example Check the ok field.
202
+ # result.ok?
203
+ #
204
+ # @return [ true, false ] If the command returned ok.
205
+ #
206
+ # @since 2.1.0
207
+ def ok?
208
+ first_document[OK] == 1
209
+ end
210
+
199
211
  # Validate the result by checking for any errors.
200
212
  #
201
213
  # @note This only checks for errors with writes since authentication is
@@ -76,6 +76,11 @@ module Mongo
76
76
  # @since 2.0.0
77
77
  INDEX_NAME = :index_name.freeze
78
78
 
79
+ # The operation id constant.
80
+ #
81
+ # @since 2.1.0
82
+ OPERATION_ID = :operation_id.freeze
83
+
79
84
  # The field for options.
80
85
  #
81
86
  # @since 2.0.0
@@ -287,6 +292,19 @@ module Mongo
287
292
  @spec = spec
288
293
  end
289
294
 
295
+ # Get the operation id for the operation. Used for linking operations in
296
+ # monitoring.
297
+ #
298
+ # @example Get the operation id.
299
+ # specifiable.operation_id
300
+ #
301
+ # @return [ Integer ] The operation id.
302
+ #
303
+ # @since 2.1.0
304
+ def operation_id
305
+ spec[OPERATION_ID]
306
+ end
307
+
290
308
  # Get the options for the operation.
291
309
  #
292
310
  # @example Get the options.
@@ -392,6 +410,30 @@ module Mongo
392
410
  def read
393
411
  @spec[READ] || ServerSelector.get
394
412
  end
413
+
414
+ # Whether the operation is ordered.
415
+ #
416
+ # @example Get the ordered value, true is the default.
417
+ # specifiable.ordered?
418
+ #
419
+ # @return [ true, false ] Whether the operation is ordered.
420
+ #
421
+ # @since 2.1.0
422
+ def ordered?
423
+ !!(@spec.fetch(:ordered, true))
424
+ end
425
+
426
+ # The namespace, consisting of the db name and collection name.
427
+ #
428
+ # @example Get the namespace.
429
+ # specifiable.namespace
430
+ #
431
+ # @return [ String ] The namespace.
432
+ #
433
+ # @since 2.1.0
434
+ def namespace
435
+ "#{db_name}.#{coll_name}"
436
+ end
395
437
  end
396
438
  end
397
439
  end