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,196 +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
- require 'mongo/bulk_write/insertable'
16
- require 'mongo/bulk_write/deletable'
17
- require 'mongo/bulk_write/updatable'
18
- require 'mongo/bulk_write/replacable'
19
-
20
- module Mongo
21
- module BulkWrite
22
-
23
- # Defines shared behaviour between ordered and unordered bulk operations.
24
- #
25
- # @since 2.0.0
26
- module BulkWritable
27
- include Insertable
28
- include Deletable
29
- include Updatable
30
- include Replacable
31
- extend Forwardable
32
-
33
- # Delegate various methods to the collection.
34
- def_delegators :@collection, :database, :cluster, :next_primary
35
-
36
- # The fields contained in the result document returned from executing the
37
- # operations.
38
- #
39
- # @since 2.0.0.
40
- RESULT_FIELDS = [ :n_inserted,
41
- :n_removed,
42
- :n_modified,
43
- :n_upserted,
44
- :n_matched ]
45
-
46
-
47
- # Initialize a bulk write object.
48
- #
49
- # @example Initialize a bulk write object.
50
- # Mongo::BulkWrite::OrderedBulkWrite.new(collection, operations, options)
51
- # Mongo::BulkWrite::UnorderedBulkWrite.new(collection, operations, options)
52
- #
53
- # @param [ Mongo::Collection ] collection The collection the operations will
54
- # be executed on.
55
- # @param [ Array<Hash> ] operations The operations to be executed.
56
- # @param [ Hash ] options The options.
57
- #
58
- # @option options [ Hash ] :write_concern The write concern to use for this
59
- # bulk write.
60
- #
61
- # @since 2.0.0
62
- def initialize(collection, operations, options)
63
- @collection = collection
64
- @operations = operations
65
- @options = options
66
- end
67
-
68
- # Execute the bulk operations.
69
- #
70
- # @example Execute the operations.
71
- # bulk.execute
72
- #
73
- # @return [ Hash ] The results from the bulk write.
74
- #
75
- # @since 2.0.0
76
- def execute
77
- server = next_primary
78
- validate_operations!
79
- merged_ops.each do |op|
80
- validate_type!(op.keys.first)
81
- execute_op(op, server)
82
- end
83
- finalize
84
- end
85
-
86
- private
87
-
88
- def valid_doc?(doc)
89
- doc.respond_to?(:keys) ||
90
- doc.respond_to?(:document)
91
- end
92
-
93
- def write_concern
94
- @write_concern ||= WriteConcern.get(@options[:write_concern]) ||
95
- @collection.write_concern
96
- end
97
-
98
- def validate_operations!
99
- unless @operations && @operations.size > 0
100
- raise ArgumentError.new('Operations cannot be empty')
101
- end
102
- end
103
-
104
- def validate_type!(type)
105
- unless respond_to?(type, true)
106
- raise Error::InvalidBulkOperationType.new(type)
107
- end
108
- end
109
-
110
- def max_write_batches(op, server)
111
- type = op.keys.first
112
- ops = []
113
- while op[type].size > server.max_write_batch_size
114
- ops << { type => op[type].shift(server.max_write_batch_size),
115
- :indexes => op[:indexes].shift(server.max_write_batch_size) }
116
- end
117
- ops << op
118
- end
119
-
120
- def split(op, type)
121
- n = op[type].size/2
122
- [ { type => op[type].shift(n),
123
- :indexes => op[:indexes].shift(n) },
124
- { type => op[type],
125
- :indexes => op[:indexes] }
126
- ]
127
- end
128
-
129
- def execute_op(operation, server)
130
- ops = max_write_batches(operation, server)
131
-
132
- until ops.empty?
133
- op = ops.shift
134
- type = op.keys.first
135
- begin
136
- process(send(type, op, server), op[:indexes])
137
- rescue Error::MaxBSONSize, Error::MaxMessageSize => ex
138
- raise ex if op[type].size < 2
139
- ops = split(op, type) + ops
140
- end
141
- end
142
- end
143
-
144
- def merge_consecutive_ops(ops)
145
- ops.each_with_index.inject([]) do |merged, (op, i)|
146
- type = op.keys.first
147
- op[:indexes] ||= [ i ]
148
- previous = merged.last
149
- if previous && previous.keys.first == type
150
- merged[-1].merge!(type => previous[type] << op[type],
151
- :indexes => previous[:indexes] + op[:indexes])
152
- merged
153
- else
154
- merged << { type => [ op[type] ].flatten,
155
- :indexes => op[:indexes] }
156
- end
157
- end
158
- end
159
-
160
- def merge_ops_by_type
161
- indexes = {}
162
- ops_hash = @operations.each_with_index.inject({}) do |merged, (op, i)|
163
- type = op.keys.first
164
- merged.merge!(op) { |type, v1, v2| ([v1] << v2).flatten }
165
- indexes[type] = (indexes[type] || []).push(i)
166
- merged
167
- end
168
- ops_hash.keys.reduce([]) do |ops_list, type|
169
- ops_list << { type => ops_hash[type], :indexes => indexes[type] }
170
- end
171
- end
172
-
173
- def combine_results(result, indexes)
174
- @results ||= {}
175
- write_errors = result.aggregate_write_errors(indexes)
176
-
177
- # The Bulk API only returns the first write concern error encountered.
178
- @write_concern_errors ||= result.aggregate_write_concern_errors(indexes)
179
-
180
- @results.tap do |results|
181
- RESULT_FIELDS.each do |field|
182
- results.merge!(
183
- field => (results[field] || 0) + result.send(field)
184
- ) if result.respond_to?(field)
185
- end
186
-
187
- results.merge!(
188
- write_errors: ((results[:write_errors] || []) << write_errors).flatten
189
- ) if write_errors
190
-
191
- results.merge!(write_concern_errors: @write_concern_errors) if @write_concern_errors
192
- end
193
- end
194
- end
195
- end
196
- end
@@ -1,56 +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 BulkWrite
17
-
18
- # Defines behavior for validating and combining delete bulk write operations.
19
- #
20
- # @since 2.0.0.
21
- module Deletable
22
-
23
- private
24
-
25
- def validate_delete_op!(type, d)
26
- raise Error::InvalidBulkOperation.new(type, d) unless valid_doc?(d)
27
- end
28
-
29
- def deletes(ops, type)
30
- limit = (type == :delete_one) ? 1 : 0
31
- ops.collect do |d|
32
- validate_delete_op!(type, d)
33
- { q: d, limit: limit }
34
- end
35
- end
36
-
37
- def delete(ops, type, server)
38
- Operation::Write::BulkDelete.new(
39
- :deletes => deletes(ops, type),
40
- :db_name => database.name,
41
- :coll_name => @collection.name,
42
- :write_concern => write_concern,
43
- :ordered => ordered?
44
- ).execute(server.context)
45
- end
46
-
47
- def delete_one(op, server)
48
- delete(op[:delete_one], __method__, server)
49
- end
50
-
51
- def delete_many(op, server)
52
- delete(op[:delete_many], __method__, server)
53
- end
54
- end
55
- end
56
- end
@@ -1,48 +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 BulkWrite
17
-
18
- # Defines behavior for validating and combining insert bulk write operations.
19
- #
20
- # @since 2.0.0.
21
- module Insertable
22
-
23
- private
24
-
25
- def validate_insert_ops!(type, inserts)
26
- if inserts.empty?
27
- raise Error::InvalidBulkOperation.new(type, inserts)
28
- end
29
- inserts.each do |i|
30
- unless valid_doc?(i)
31
- raise Error::InvalidBulkOperation.new(type, i)
32
- end
33
- end
34
- end
35
-
36
- def insert_one(op, server)
37
- validate_insert_ops!(__method__, op[:insert_one])
38
- Operation::Write::BulkInsert.new(
39
- :documents => op[:insert_one].flatten,
40
- :db_name => database.name,
41
- :coll_name => @collection.name,
42
- :write_concern => write_concern,
43
- :ordered => ordered?
44
- ).execute(server.context)
45
- end
46
- end
47
- end
48
- end
@@ -1,57 +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 BulkWrite
17
-
18
- # Defines behavior for validating and combining replace bulk write operations.
19
- #
20
- # @since 2.0.0.
21
- module Replacable
22
-
23
- private
24
-
25
- def replacement_doc?(doc)
26
- doc.respond_to?(:keys) && doc.keys.all?{|key| key !~ /^\$/}
27
- end
28
-
29
- def validate_replace_op!(r, type)
30
- unless r[:find] && r[:replacement] && replacement_doc?(r[:replacement])
31
- raise Error::InvalidBulkOperation.new(type, r)
32
- end
33
- end
34
-
35
- def replace_ops(ops, type)
36
- ops.collect do |r|
37
- validate_replace_op!(r, type)
38
- { q: r[:find],
39
- u: r[:replacement],
40
- multi: false,
41
- upsert: r.fetch(:upsert, false)
42
- }
43
- end
44
- end
45
-
46
- def replace_one(op, server)
47
- Operation::Write::BulkUpdate.new(
48
- :updates => replace_ops(op[:replace_one], __method__),
49
- :db_name => database.name,
50
- :coll_name => @collection.name,
51
- :write_concern => write_concern,
52
- :ordered => ordered?
53
- ).execute(server.context)
54
- end
55
- end
56
- end
57
- end
@@ -1,68 +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 BulkWrite
17
-
18
- # Defines behavior for validating and combining update bulk write operations.
19
- #
20
- # @since 2.0.0.
21
- module Updatable
22
-
23
- private
24
-
25
- def update_doc?(doc)
26
- !doc.empty? &&
27
- doc.respond_to?(:keys) &&
28
- doc.keys.first.to_s =~ /^\$/
29
- end
30
-
31
- def validate_update_op!(type, u)
32
- unless u[:find] && u[:update] && update_doc?(u[:update])
33
- raise Error::InvalidBulkOperation.new(type, u)
34
- end
35
- end
36
-
37
- def updates(ops, type)
38
- multi = type == :update_many
39
- ops.collect do |u|
40
- validate_update_op!(type, u)
41
- { q: u[:find],
42
- u: u[:update],
43
- multi: multi,
44
- upsert: u.fetch(:upsert, false)
45
- }
46
- end
47
- end
48
-
49
- def update(ops, type, server)
50
- Operation::Write::BulkUpdate.new(
51
- :updates => updates(ops, type),
52
- :db_name => database.name,
53
- :coll_name => @collection.name,
54
- :write_concern => write_concern,
55
- :ordered => ordered?
56
- ).execute(server.context)
57
- end
58
-
59
- def update_one(op, server)
60
- update(op[:update_one], __method__, server)
61
- end
62
-
63
- def update_many(op, server)
64
- update(op[:update_many], __method__, server)
65
- end
66
- end
67
- end
68
- end
data/lib/mongo/grid/fs.rb DELETED
@@ -1,149 +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 Grid
17
-
18
- # Represents a view of the GridFS in the database.
19
- #
20
- # @since 2.0.0
21
- class FS
22
- extend Forwardable
23
-
24
- # The default root prefix.
25
- #
26
- # @since 2.0.0
27
- DEFAULT_ROOT = 'fs'.freeze
28
-
29
- # The specification for the chunks index.
30
- #
31
- # @since 2.0.0
32
- INDEX_SPEC = { :files_id => 1, :n => 1 }.freeze
33
-
34
- # @return [ Collection ] chunks_collection The chunks collection.
35
- attr_reader :chunks_collection
36
-
37
- # @return [ Database ] database The database.
38
- attr_reader :database
39
-
40
- # @return [ Collection ] files_collection The files collection.
41
- attr_reader :files_collection
42
-
43
- # Get write concern from database.
44
- def_delegators :database, :write_concern
45
-
46
- # Find a file in the GridFS.
47
- #
48
- # @example Find a file by it's id.
49
- # fs.find_one(_id: id)
50
- #
51
- # @example Find a file by it's filename.
52
- # fs.find_one(filename: 'test.txt')
53
- #
54
- # @param [ Hash ] selector The selector.
55
- #
56
- # @return [ Grid::File ] The file.
57
- #
58
- # @since 2.0.0
59
- def find_one(selector = nil)
60
- metadata = files_collection.find(selector).first
61
- return nil unless metadata
62
- chunks = chunks_collection.find(:files_id => metadata[:_id]).sort(:n => 1)
63
- Grid::File.new(chunks.to_a, metadata)
64
- end
65
-
66
- # Insert a single file into the GridFS.
67
- #
68
- # @example Insert a single file.
69
- # fs.insert_one(file)
70
- #
71
- # @param [ Grid::File ] file The file to insert.
72
- #
73
- # @return [ Result ] The result of the insert.
74
- #
75
- # @since 2.0.0
76
- def insert_one(file)
77
- files_collection.insert_one(file.metadata)
78
- inserts = file.chunks.reduce([]) do |ops, chunk|
79
- ops << { :insert_one => chunk }
80
- end
81
- result = chunks_collection.bulk_write(inserts, ordered: true)
82
- validate_md5!(file) if write_concern.get_last_error
83
- file.id
84
- end
85
-
86
- # Create the GridFS.
87
- #
88
- # @example Create the GridFS.
89
- # Grid::FS.new(database)
90
- #
91
- # @param [ Database ] database The database the files reside in.
92
- # @param [ Hash ] options The GridFS options.
93
- #
94
- # @option options [ String ] :fs_name The prefix for the files and chunks
95
- # collections.
96
- #
97
- # @since 2.0.0
98
- def initialize(database, options = {})
99
- @database = database
100
- @options = options
101
- @chunks_collection = database[chunks_name]
102
- @files_collection = database[files_name]
103
- chunks_collection.indexes.create_one(INDEX_SPEC, :unique => true)
104
- end
105
-
106
- # Get the prefix for the GridFS
107
- #
108
- # @example Get the prefix.
109
- # fs.prefix
110
- #
111
- # @return [ String ] The GridFS prefix.
112
- #
113
- # @since 2.0.0
114
- def prefix
115
- @options[:fs_name] || DEFAULT_ROOT
116
- end
117
-
118
- # Remove a single file from the GridFS.
119
- #
120
- # @example Remove a file from the GridFS.
121
- # fs.delete_one(file)
122
- #
123
- # @param [ Grid::File ] file The file to remove.
124
- #
125
- # @return [ Result ] The result of the remove.
126
- #
127
- # @since 2.0.0
128
- def delete_one(file)
129
- files_collection.find(:_id => file.id).delete_one
130
- chunks_collection.find(:files_id => file.id).delete_many
131
- end
132
-
133
- private
134
-
135
- def chunks_name
136
- "#{prefix}.#{Grid::File::Chunk::COLLECTION}"
137
- end
138
-
139
- def files_name
140
- "#{prefix}.#{Grid::File::Metadata::COLLECTION}"
141
- end
142
-
143
- def validate_md5!(file)
144
- md5 = database.command(:filemd5 => file.id, :root => prefix).documents[0][:md5]
145
- raise Error::InvalidFile.new(file.md5, md5) unless file.md5 == md5
146
- end
147
- end
148
- end
149
- end
@@ -1,114 +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 Read
18
- class ListCollections
19
-
20
- # Defines custom behaviour of results when using the
21
- # listCollections command.
22
- #
23
- # @since 2.0.0
24
- class Result < Operation::Result
25
-
26
- # The field name for the cursor document in a listCollections result.
27
- #
28
- # @since 2.0.0
29
- CURSOR = 'cursor'.freeze
30
-
31
- # The cursor id field in the cursor document.
32
- #
33
- # @since 2.0.0
34
- CURSOR_ID = 'id'.freeze
35
-
36
- # The namespace field in the cursor document.
37
- #
38
- # @since 2.0.0
39
- NAMESPACE = 'ns'.freeze
40
-
41
- # The field name for the first batch of a cursor.
42
- #
43
- # @since 2.0.0
44
- FIRST_BATCH = 'firstBatch'.freeze
45
-
46
- # Get the cursor id for the result.
47
- #
48
- # @example Get the cursor id.
49
- # result.cursor_id
50
- #
51
- # @note Even though the wire protocol has a cursor_id field for all
52
- # messages of type reply, it is always zero when using the
53
- # listCollections command and must be retrieved from the cursor
54
- # document itself.
55
- #
56
- # @return [ Integer ] The cursor id.
57
- #
58
- # @since 2.0.0
59
- def cursor_id
60
- cursor_document ? cursor_document[CURSOR_ID] : super
61
- end
62
-
63
- # Get the namespace for the cursor.
64
- #
65
- # @example Get the namespace.
66
- # result.namespace
67
- #
68
- # @return [ String ] The namespace.
69
- #
70
- # @since 2.0.0
71
- def namespace
72
- cursor_document ? cursor_document[NAMESPACE] : super
73
- end
74
-
75
- # Get the documents for the listCollections result. It is the 'firstBatch'
76
- # field in the 'cursor' field of the first document returned.
77
- #
78
- # @example Get the documents.
79
- # result.documents
80
- #
81
- # @return [ Array<BSON::Document> ] The documents.
82
- #
83
- # @since 2.0.0
84
- def documents
85
- cursor_document[FIRST_BATCH]
86
- end
87
-
88
- # Validate the result. In the case where an unauthorized client tries
89
- # to run the command we need to generate the proper error.
90
- #
91
- # @example Validate the result.
92
- # result.validate!
93
- #
94
- # @return [ Result ] Self if successful.
95
- #
96
- # @since 2.0.0
97
- def validate!
98
- !successful? ? raise(Error::OperationFailure.new(parser.message)) : self
99
- end
100
-
101
- private
102
-
103
- def cursor_document
104
- @cursor_document ||= first_document[CURSOR]
105
- end
106
-
107
- def first_document
108
- @first_document ||= reply.documents[0]
109
- end
110
- end
111
- end
112
- end
113
- end
114
- end