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
@@ -1,83 +0,0 @@
1
- # Copyright (C) 2014-2015 MongoDB, Inc.
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
-
15
- module Mongo
16
- module Operation
17
- module Write
18
-
19
- module LegacyBulkMergable
20
-
21
- # Aggregate the write errors returned from this result.
22
- #
23
- # @example Aggregate the write errors.
24
- # result.aggregate_write_errors([0, 1, 2, 3])
25
- #
26
- # @param [ Array ] indexes The indexes of each operation as they
27
- # were listed in the Bulk API.
28
- #
29
- # @return [ Array ] The aggregate write errors.
30
- #
31
- # @since 2.0.0
32
- def aggregate_write_errors(indexes)
33
- @replies.each_with_index.reduce(nil) do |errors, (reply, i)|
34
- if reply_write_errors?(reply)
35
- errors ||= []
36
- errors << { 'errmsg' => reply.documents.first[Error::ERROR],
37
- 'index' => indexes[i],
38
- 'code' => reply.documents.first[Error::CODE] }
39
- end
40
- errors
41
- end
42
- end
43
-
44
- # Aggregate the write concern errors returned from this result.
45
- #
46
- # @example Aggregate the write concern errors.
47
- # result.aggregate_write_concern_errors([0, 1, 2, 3])
48
- #
49
- # @param [ Array ] indexes The indexes of each operation as they
50
- # were listed in the Bulk API.
51
- #
52
- # @return [ Array ] The aggregate write concern errors.
53
- #
54
- # @since 2.0.0
55
- def aggregate_write_concern_errors(indexes)
56
- @replies.each_with_index.reduce(nil) do |errors, (reply, i)|
57
- if error = reply_write_errors?(reply)
58
- errors ||= []
59
- if note = reply.documents.first['wnote'] || reply.documents.first['jnote']
60
- code = reply.documents.first['code'] || Error::BAD_VALUE
61
- error_string = "#{code}: #{note}"
62
- elsif error == 'timeout'
63
- code = reply.documents.first['code'] || Error::UNKNOWN_ERROR
64
- error_string = "#{code}: #{error}"
65
- end
66
- errors << { 'errmsg' => error_string,
67
- 'index' => indexes[i],
68
- 'code' => code } if error_string
69
- end
70
- errors
71
- end
72
- end
73
-
74
- private
75
-
76
- def reply_write_errors?(reply)
77
- reply.documents.first[Error::ERROR] ||
78
- reply.documents.first[Error::ERRMSG]
79
- end
80
- end
81
- end
82
- end
83
- end
@@ -1,262 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Mongo::BulkWrite do
4
-
5
- before do
6
- authorized_collection.find.delete_many
7
- end
8
-
9
- after do
10
- authorized_collection.find.delete_many
11
- end
12
-
13
- let(:bulk) do
14
- described_class.get(authorized_collection, operations, options)
15
- end
16
-
17
- describe '#get' do
18
-
19
- let(:operations) do
20
- [{ insert_one: { _id: 0 } }]
21
- end
22
-
23
- context 'When an ordered bulk write object is created' do
24
-
25
- let(:options) do
26
- { ordered: true }
27
- end
28
-
29
- it 'returns an OrderedBulkWrite object' do
30
- expect(bulk).to be_a(Mongo::BulkWrite::OrderedBulkWrite)
31
- end
32
- end
33
-
34
- context 'When an unordered bulk write object is created' do
35
-
36
- let(:options) do
37
- { ordered: false }
38
- end
39
-
40
- it 'returns an UnorderedBulkWrite object' do
41
- expect(bulk).to be_a(Mongo::BulkWrite::UnorderedBulkWrite)
42
- end
43
- end
44
-
45
- context 'When ordered is not specified in options' do
46
-
47
- let(:options) do
48
- { }
49
- end
50
-
51
- it 'returns an OrderedBulkWrite object' do
52
- expect(bulk).to be_a(Mongo::BulkWrite::OrderedBulkWrite)
53
- end
54
- end
55
- end
56
-
57
- describe 'Ordered bulk write' do
58
-
59
- let(:options) do
60
- { ordered: true }
61
- end
62
-
63
- it_behaves_like 'a bulk write object'
64
-
65
- context 'when the batch requires splitting' do
66
-
67
- context 'when the operations are the same type' do
68
-
69
- let(:error) do
70
- begin
71
- bulk.execute
72
- rescue => ex
73
- ex
74
- end
75
- end
76
-
77
- let(:operations) do
78
- [].tap do |ops|
79
- 3000.times do |i|
80
- ops << { insert_one: { _id: i } }
81
- end
82
- ops << { insert_one: { _id: 0 } }
83
- ops << { insert_one: { _id: 3001 } }
84
- end
85
- end
86
-
87
- it 'raises a BulkWriteError' do
88
- expect(error).to be_a(Mongo::Error::BulkWriteError)
89
- end
90
-
91
- it 'halts execution after first error and reports correct index' do
92
- expect(error.result[:write_errors].first['index']).to eq(3000)
93
- expect(authorized_collection.find.count).to eq(3000)
94
- end
95
- end
96
-
97
- context 'when operations are mixed types' do
98
-
99
- let(:error) do
100
- begin
101
- bulk.execute
102
- rescue => ex
103
- ex
104
- end
105
- end
106
-
107
- let(:operations) do
108
- [].tap do |ops|
109
- 2000.times do |i|
110
- ops << { insert_one: { _id: i } }
111
- end
112
- ops << { delete_one: { _id: 0 } }
113
- ops << { insert_one: { _id: 1 } }
114
- ops << { insert_one: { _id: 2000 } }
115
- end
116
- end
117
-
118
- it 'raises a BulkWriteError error' do
119
- expect(error).to be_a(Mongo::Error::BulkWriteError)
120
- end
121
-
122
- it 'halts execution after first error and reports correct index' do
123
- expect(error.result[:write_errors].first['index']).to eq(2001)
124
- expect(authorized_collection.find.count).to eq(1999)
125
- end
126
- end
127
-
128
- context 'when the operations exceed the max bson size' do
129
-
130
- let(:error) do
131
- begin
132
- bulk.execute
133
- rescue => ex
134
- ex
135
- end
136
- end
137
-
138
- let(:operations) do
139
- [].tap do |ops|
140
- 6.times do |i|
141
- ops << { insert_one: { _id: i, x: 'y'*4000000 } }
142
- end
143
- ops << { insert_one: { _id: 0 } }
144
- ops << { insert_one: { _id: 100 } }
145
- end
146
- end
147
-
148
- it 'raises a BulkWriteError error' do
149
- expect(error).to be_a(Mongo::Error::BulkWriteError)
150
- end
151
-
152
- it 'splits messages into multiple messages' do
153
- error
154
- expect(authorized_collection.find.count).to eq(6)
155
- end
156
- end
157
- end
158
- end
159
-
160
- describe 'Unordered bulk write' do
161
-
162
- let(:options) do
163
- { ordered: false }
164
- end
165
-
166
- it_behaves_like 'a bulk write object'
167
-
168
- context 'when the operations exceed the max batch size' do
169
-
170
- context 'when operations are all the same type' do
171
-
172
- let(:error) do
173
- begin
174
- bulk.execute
175
- rescue => ex
176
- ex
177
- end
178
- end
179
-
180
- let(:operations) do
181
- [].tap do |ops|
182
- 3000.times do |i|
183
- ops << { insert_one: { _id: i } }
184
- end
185
- ops << { insert_one: { _id: 0 } }
186
- ops << { insert_one: { _id: 3001 } }
187
- end
188
- end
189
-
190
- it 'raises a BulkWriteError error' do
191
- expect(error).to be_a(Mongo::Error::BulkWriteError)
192
- end
193
-
194
- it 'does not halt execution after first error' do
195
- expect(error.result[:write_errors].first['index']).to eq(3000)
196
- expect(authorized_collection.find.count).to eq(3001)
197
- end
198
- end
199
-
200
- context 'when operations are mixed types' do
201
-
202
- let(:error) do
203
- begin
204
- bulk.execute
205
- rescue => ex
206
- ex
207
- end
208
- end
209
-
210
- let(:operations) do
211
- [].tap do |ops|
212
- 2000.times do |i|
213
- ops << { insert_one: { _id: i } }
214
- end
215
- ops << { delete_one: { _id: 0 } }
216
- ops << { insert_one: { _id: 1 } }
217
- ops << { insert_one: { _id: 2000 } }
218
- end
219
- end
220
-
221
- it 'raises a BulkWriteError error' do
222
- expect(error).to be_a(Mongo::Error::BulkWriteError)
223
- end
224
-
225
- it 'does not halt execution after first error' do
226
- expect(error.result[:write_errors].first['index']).to eq(2001)
227
- expect(authorized_collection.find.count).to eq(2000)
228
- end
229
- end
230
-
231
- context 'when the operations exceed the max bson size' do
232
-
233
- let(:error) do
234
- begin
235
- bulk.execute
236
- rescue => ex
237
- ex
238
- end
239
- end
240
-
241
- let(:operations) do
242
- [].tap do |ops|
243
- 15.times do |i|
244
- ops << { insert_one: { _id: i, x: 'y'*4000000 } }
245
- end
246
- ops << { insert_one: { _id: 0 } }
247
- ops << { insert_one: { _id: 100 } }
248
- end
249
- end
250
-
251
- it 'raises a BulkWriteError error' do
252
- expect(error).to be_a(Mongo::Error::BulkWriteError)
253
- end
254
-
255
- it 'splits messages into multiple messages' do
256
- error
257
- expect(authorized_collection.find.count).to eq(16)
258
- end
259
- end
260
- end
261
- end
262
- end
@@ -1,160 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Mongo::Grid::FS do
4
-
5
- describe '#initialize' do
6
-
7
- let(:fs) do
8
- described_class.new(authorized_client.database)
9
- end
10
-
11
- let(:index) do
12
- fs.chunks_collection.indexes.get(:files_id => 1, :n => 1)
13
- end
14
-
15
- it 'sets the files collection' do
16
- expect(fs.files_collection.name).to eq('fs.files')
17
- end
18
-
19
- it 'sets the chunks collection' do
20
- expect(fs.chunks_collection.name).to eq('fs.chunks')
21
- end
22
-
23
- it 'creates the index on the chunks collection' do
24
- expect(index[:name]).to eq('files_id_1_n_1')
25
- end
26
- end
27
-
28
- describe '#find_one' do
29
-
30
- let(:fs) do
31
- described_class.new(authorized_client.database)
32
- end
33
-
34
- let(:file) do
35
- Mongo::Grid::File.new('hello world!', :filename => 'test.txt')
36
- end
37
-
38
- before do
39
- fs.insert_one(file)
40
- end
41
-
42
- after do
43
- fs.files_collection.find.delete_many
44
- fs.chunks_collection.find.delete_many
45
- end
46
-
47
- let(:from_db) do
48
- fs.find_one(:filename => 'test.txt')
49
- end
50
-
51
- it 'returns the assembled file from the db' do
52
- expect(from_db.filename).to eq(file.metadata.filename)
53
- end
54
- end
55
-
56
- describe '#insert_one' do
57
-
58
- let(:fs) do
59
- described_class.new(authorized_client.database)
60
- end
61
-
62
- let(:file) do
63
- Mongo::Grid::File.new('Hello!', :filename => 'test.txt')
64
- end
65
-
66
- context 'when inserting the file once' do
67
-
68
- let!(:result) do
69
- fs.insert_one(file)
70
- end
71
-
72
- after do
73
- fs.files_collection.find.delete_many
74
- fs.chunks_collection.find.delete_many
75
- end
76
-
77
- let(:from_db) do
78
- fs.find_one(:filename => 'test.txt')
79
- end
80
-
81
- it 'inserts the file into the database' do
82
- expect(from_db.filename).to eq(file.metadata.filename)
83
- end
84
-
85
- it 'includes the chunks and data with the file' do
86
- expect(from_db.data).to eq('Hello!')
87
- end
88
-
89
- it 'returns the file id' do
90
- expect(result).to eq(file.id)
91
- end
92
- end
93
-
94
- context 'when inserting the file more than once' do
95
-
96
- after do
97
- fs.files_collection.find.delete_many
98
- fs.chunks_collection.find.delete_many
99
- end
100
-
101
- it 'raises an error' do
102
- expect {
103
- fs.insert_one(file)
104
- fs.insert_one(file)
105
- }.to raise_error(Mongo::Error::OperationFailure)
106
- end
107
- end
108
-
109
- context 'when the file exceeds the max bson size' do
110
-
111
- let(:fs) do
112
- described_class.new(authorized_client.database)
113
- end
114
-
115
- let(:file) do
116
- str = 'y' * 16777216
117
- Mongo::Grid::File.new(str, :filename => 'large-file.txt')
118
- end
119
-
120
- before do
121
- fs.insert_one(file)
122
- end
123
-
124
- after do
125
- fs.files_collection.find.delete_many
126
- fs.chunks_collection.find.delete_many
127
- end
128
-
129
- it 'successfully inserts the file' do
130
- expect(
131
- fs.find_one(:filename => 'large-file.txt').chunks
132
- ).to eq(file.chunks)
133
- end
134
- end
135
- end
136
-
137
- describe '#delete_one' do
138
-
139
- let(:fs) do
140
- described_class.new(authorized_client.database)
141
- end
142
-
143
- let(:file) do
144
- Mongo::Grid::File.new('Hello!', :filename => 'test.txt')
145
- end
146
-
147
- before do
148
- fs.insert_one(file)
149
- fs.delete_one(file)
150
- end
151
-
152
- let(:from_db) do
153
- fs.find_one(:filename => 'test.txt')
154
- end
155
-
156
- it 'removes the file from the db' do
157
- expect(from_db).to be_nil
158
- end
159
- end
160
- end
@@ -1,63 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Mongo::Loggable do
4
-
5
- let(:operation) do
6
- Class.new do
7
- def log_message
8
- 'test'
9
- end
10
- end.new
11
- end
12
-
13
- describe '#log' do
14
-
15
- let(:loggable) do
16
- Class.new do
17
- include Mongo::Loggable
18
- end.new
19
- end
20
-
21
- let(:operation) do
22
- double('operation')
23
- end
24
-
25
- before do
26
- Mongo::Logger.level = Logger::DEBUG
27
- expect(operation).to receive(:log_message).and_return('test')
28
- expect(Mongo::Logger).to receive(:log).with(:debug, 'MONGO', 'test', anything())
29
- end
30
-
31
- context 'when a block is provided' do
32
-
33
- context 'when an exception occurs' do
34
-
35
- it 'logs the message' do
36
- expect {
37
- loggable.log(:debug, 'MONGO', [ operation ]) do
38
- raise RuntimeError
39
- end
40
- }.to raise_error(RuntimeError)
41
- end
42
- end
43
-
44
- context 'when no exception occurs' do
45
-
46
- it 'executes the block and logs the message' do
47
- expect(
48
- loggable.log(:debug, 'MONGO', [ operation ]) do
49
- 'testing'
50
- end
51
- ).to eq('testing')
52
- end
53
- end
54
- end
55
-
56
- context 'when no block is provided' do
57
-
58
- it 'logs the message' do
59
- expect(loggable.log(:debug, 'MONGO', [ operation ])).to be_nil
60
- end
61
- end
62
- end
63
- end
@@ -1,127 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Mongo::Operation::Aggregate do
4
- include_context 'operation'
5
-
6
- let(:selector) do
7
- { :aggregate => coll_name,
8
- :pipeline => [],
9
- }
10
- end
11
- let(:spec) do
12
- { :selector => selector,
13
- :options => {},
14
- :db_name => db_name
15
- }
16
- end
17
- let(:op) { described_class.new(spec) }
18
-
19
-
20
- describe '#initialize' do
21
-
22
- context 'spec' do
23
-
24
- it 'sets the spec' do
25
- expect(op.spec).to be(spec)
26
- end
27
- end
28
- end
29
-
30
- describe '#==' do
31
-
32
- context ' when two ops have different specs' do
33
- let(:other_selector) do
34
- { :aggregate => 'another_test_coll',
35
- :pipeline => [],
36
- }
37
- end
38
- let(:other_spec) do
39
- { :selector => other_selector,
40
- :options => options,
41
- :db_name => db_name,
42
- }
43
- end
44
- let(:other) { described_class.new(other_spec) }
45
-
46
- it 'returns false' do
47
- expect(op).not_to eq(other)
48
- end
49
- end
50
- end
51
-
52
- context '#merge' do
53
- let(:other_op) { described_class.new(spec) }
54
-
55
- it 'is not allowed' do
56
- expect{ op.merge(other_op) }.to raise_exception
57
- end
58
- end
59
-
60
- context '#merge!' do
61
- let(:other_op) { described_class.new(spec) }
62
-
63
- it 'is not allowed' do
64
- expect{ op.merge!(other_op) }.to raise_exception
65
- end
66
- end
67
-
68
- describe '#execute' do
69
-
70
- context 'when the aggregation fails' do
71
-
72
- let(:selector) do
73
- { :aggregate => coll_name,
74
- :pipeline => [{ '$invalid' => 'operator' }],
75
- }
76
- end
77
-
78
- it 'raises an exception' do
79
- expect {
80
- op.execute(authorized_primary.context)
81
- }.to raise_error(Mongo::Error::OperationFailure)
82
- end
83
- end
84
-
85
- context 'rerouting' do
86
-
87
- before do
88
- allow_any_instance_of(Mongo::Operation::Aggregate::Result).to receive(:validate!) do
89
- true
90
- end
91
- end
92
-
93
- context 'when out is specified and server is a secondary' do
94
- let(:selector) do
95
- { :aggregate => 'test_coll',
96
- :pipeline => [{ '$out' => 'test_coll' }],
97
- }
98
- end
99
-
100
- it 'raises an error' do
101
- allow_any_instance_of(Mongo::ServerSelector::Primary).to receive(:server) do
102
- primary_server
103
- end
104
- expect {
105
- op.execute(secondary_context)
106
- }.to raise_error(Mongo::Error::NeedPrimaryServer)
107
- end
108
- end
109
-
110
- context 'when out is specified and server is a primary' do
111
- let(:selector) do
112
- { :aggregate => 'test_coll',
113
- :pipeline => [{ '$out' => 'test_coll' }],
114
- }
115
- end
116
-
117
- it 'sends the operation to the primary' do
118
- allow_any_instance_of(Mongo::ServerSelector::Primary).to receive(:server) do
119
- primary_server
120
- end
121
- expect(primary_context).to receive(:with_connection)
122
- op.execute(primary_context)
123
- end
124
- end
125
- end
126
- end
127
- end