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,187 @@
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
+ class FSBucket
18
+
19
+ module Stream
20
+ # A stream that writes files to the FSBucket.
21
+ #
22
+ # @since 2.1.0
23
+ class Write
24
+
25
+ # @return [ FSBucket ] fs The fs bucket to which this stream writes.
26
+ #
27
+ # @since 2.1.0
28
+ attr_reader :fs
29
+
30
+ # @return [ BSON::ObjectId ] file_id The id of the file being uploaded.
31
+ #
32
+ # @since 2.1.0
33
+ attr_reader :file_id
34
+
35
+ # @return [ String ] filename The name of the file being uploaded.
36
+ #
37
+ # @since 2.1.0
38
+ attr_reader :filename
39
+
40
+ # @return [ Hash ] options The write stream options.
41
+ #
42
+ # @since 2.1.0
43
+ attr_reader :options
44
+
45
+ # Create a stream for writing files to the FSBucket.
46
+ #
47
+ # @example Create the stream.
48
+ # Stream::Write.new(fs, options)
49
+ #
50
+ # @param [ FSBucket ] fs The GridFS bucket object.
51
+ # @param [ Hash ] options The write stream options.
52
+ #
53
+ # @option opts [ Integer ] :chunk_size Override the default chunk size.
54
+ # @option opts [ Hash ] :write The write concern.
55
+ # @option opts [ Hash ] :metadata User data for the 'metadata' field of the files collection document.
56
+ # @option opts [ String ] :content_type The content type of the file.
57
+ # Deprecated, please use the metadata document instead.
58
+ # @option opts [ Array<String> ] :aliases A list of aliases.
59
+ # Deprecated, please use the metadata document instead.
60
+ #
61
+ # @since 2.1.0
62
+ def initialize(fs, options)
63
+ @fs = fs
64
+ @length = 0
65
+ @n = 0
66
+ @file_id = BSON::ObjectId.new
67
+ @options = options
68
+ @filename = @options[:filename]
69
+ @open = true
70
+ end
71
+
72
+ # Write to the GridFS bucket from the source stream.
73
+ #
74
+ # @example Write to GridFS.
75
+ # stream.write(io)
76
+ #
77
+ # @param [ IO ] io The source io stream to upload from.
78
+ #
79
+ # @return [ Stream::Write ] self The write stream itself.
80
+ #
81
+ # @since 2.1.0
82
+ def write(io)
83
+ ensure_open!
84
+ @indexes ||= ensure_indexes!
85
+ data = io.read
86
+ @length += data.length
87
+ chunks = File::Chunk.split(data, file_info, @n)
88
+ @n += chunks.size
89
+ chunks_collection.insert_many(chunks) unless chunks.empty?
90
+ self
91
+ end
92
+
93
+ # Close the write stream.
94
+ #
95
+ # @example Close the stream.
96
+ # stream.close
97
+ #
98
+ # @return [ BSON::ObjectId, Object ] The file id.
99
+ #
100
+ # @raise [ Error::ClosedStream ] If the stream is already closed.
101
+ #
102
+ # @since 2.1.0
103
+ def close
104
+ ensure_open!
105
+ update_length
106
+ files_collection.insert_one(file_info)
107
+ @open = false
108
+ file_id
109
+ end
110
+
111
+ # Get the write concern used when uploading.
112
+ #
113
+ # @example Get the write concern.
114
+ # stream.write_concern
115
+ #
116
+ # @return [ Mongo::WriteConcern ] The write concern.
117
+ #
118
+ # @since 2.1.0
119
+ def write_concern
120
+ @write_concern ||= @options[:write] ? WriteConcern.get(@options[:write]) :
121
+ fs.write_concern
122
+ end
123
+
124
+ # Is the stream closed.
125
+ #
126
+ # @example Is the stream closed.
127
+ # stream.closed?
128
+ #
129
+ # @return [ true, false ] Whether the stream is closed.
130
+ #
131
+ # @since 2.1.0
132
+ def closed?
133
+ !@open
134
+ end
135
+
136
+ # Abort the upload by deleting all chunks already inserted.
137
+ #
138
+ # @example Abort the write operation.
139
+ # stream.abort
140
+ #
141
+ # @return [ true ] True if the operation was aborted and the stream is closed.
142
+ #
143
+ # @since 2.1.0
144
+ def abort
145
+ fs.chunks_collection.find(:files_id => file_id).delete_many
146
+ @open = false || true
147
+ end
148
+
149
+ private
150
+
151
+ def chunks_collection
152
+ with_write_concern(fs.chunks_collection)
153
+ end
154
+
155
+ def files_collection
156
+ with_write_concern(fs.files_collection)
157
+ end
158
+
159
+ def with_write_concern(collection)
160
+ if collection.write_concern.options == write_concern.options
161
+ collection
162
+ else
163
+ collection.client.with(write: write_concern.options)[collection.name]
164
+ end
165
+ end
166
+
167
+ def update_length
168
+ file_info.document[:length] = @length
169
+ end
170
+
171
+ def file_info
172
+ doc = { length: @length, _id: file_id, filename: filename }
173
+ @file_info ||= File::Info.new(options.merge(doc))
174
+ end
175
+
176
+ def ensure_indexes!
177
+ fs.send(:ensure_indexes!)
178
+ end
179
+
180
+ def ensure_open!
181
+ raise Error::ClosedStream.new if closed?
182
+ end
183
+ end
184
+ end
185
+ end
186
+ end
187
+ end
@@ -0,0 +1,64 @@
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/grid/stream/read'
16
+ require 'mongo/grid/stream/write'
17
+
18
+ module Mongo
19
+ module Grid
20
+ class FSBucket
21
+
22
+ # A stream that reads and writes files from/to the FSBucket.
23
+ #
24
+ # @since 2.1.0
25
+ module Stream
26
+ extend self
27
+
28
+ # The symbol for opening a read stream.
29
+ #
30
+ # @since 2.1.0
31
+ READ_MODE = :r
32
+
33
+ # The symbol for opening a write stream.
34
+ #
35
+ # @since 2.1.0
36
+ WRITE_MODE = :w
37
+
38
+ # Mapping from mode to stream class.
39
+ #
40
+ # @since 2.1.0
41
+ MODE_MAP = {
42
+ READ_MODE => Read,
43
+ WRITE_MODE => Write
44
+ }.freeze
45
+
46
+ # Get a stream for reading/writing files from/to the FSBucket.
47
+ #
48
+ # @example Get a stream.
49
+ # FSBucket::Stream.get(fs, FSBucket::READ_MODE, options)
50
+ #
51
+ # @param [ FSBucket ] fs The GridFS bucket object.
52
+ # @param [ FSBucket::READ_MODE, FSBucket::WRITE_MODE ] mode The stream mode.
53
+ # @param [ Hash ] options The stream options.
54
+ #
55
+ # @return [ Stream::Read, Stream::Write ] The stream object.
56
+ #
57
+ # @since 2.1.0
58
+ def get(fs, mode, options = {})
59
+ MODE_MAP[mode].new(fs, options)
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
data/lib/mongo/grid.rb CHANGED
@@ -13,4 +13,5 @@
13
13
  # limitations under the License.
14
14
 
15
15
  require 'mongo/grid/file'
16
- require 'mongo/grid/fs'
16
+ require 'mongo/grid/fs_bucket'
17
+ require 'mongo/grid/stream'
@@ -76,7 +76,7 @@ module Mongo
76
76
  #
77
77
  # @since 2.0.0
78
78
  def drop_one(name)
79
- raise Error::MultiIndexDrop.new if name == '*'
79
+ raise Error::MultiIndexDrop.new if name == Index::ALL
80
80
  drop_by_name(name)
81
81
  end
82
82
 
@@ -89,7 +89,7 @@ module Mongo
89
89
  #
90
90
  # @since 2.0.0
91
91
  def drop_all
92
- drop_by_name('*')
92
+ drop_by_name(Index::ALL)
93
93
  end
94
94
 
95
95
  # Creates an index on the collection.
@@ -229,7 +229,7 @@ module Mongo
229
229
  end
230
230
 
231
231
  def initial_query_op
232
- Operation::Read::Indexes.new(indexes_spec)
232
+ Operation::Indexes.new(indexes_spec)
233
233
  end
234
234
 
235
235
  def limit; -1; end
data/lib/mongo/index.rb CHANGED
@@ -21,6 +21,11 @@ module Mongo
21
21
  # @since 2.0.0
22
22
  module Index
23
23
 
24
+ # Wildcard constant for all.
25
+ #
26
+ # @since 2.1.0
27
+ ALL = '*'.freeze
28
+
24
29
  # Specify ascending order for an index.
25
30
  #
26
31
  # @since 2.0.0
@@ -24,105 +24,82 @@ module Mongo
24
24
  # @since 2.0.0
25
25
  PREFIX = 'MONGODB'.freeze
26
26
 
27
- # Log the operations. If a block is provided it will be yielded to,
28
- # otherwise only the logging will take place.
29
- #
30
- # @example Log a query operation.
31
- # loggable.log(:debug, "MONGO.query", operations)
32
- #
33
- # @param [ Symbol ] level The log level.
34
- # @param [ String ] prefix The prefix for the log line.
35
- # @param [ Array<Object> ] operations The operations to log. The must
36
- # respond to #log_message.
37
- #
38
- # @return [ Object ] The result of the block or nil if no block given.
39
- #
40
- # @since 2.0.0
41
- def log(level, prefix, operations)
42
- started = Time.new
43
- begin
44
- yield(operations) if block_given?
45
- rescue Exception => e
46
- raise e
47
- ensure
48
- if Logger.allow?(level)
49
- runtime = format("%.4fms", (Time.now.to_f - started.to_f) * 1000.0)
50
- operations.each do |operation|
51
- Logger.log(level, prefix, log_inspect(operation), runtime)
52
- end
53
- end
54
- end
55
- end
56
-
57
27
  # Convenience method to log debug messages with the standard prefix.
58
28
  #
59
29
  # @example Log a debug message.
60
- # log_debug([ 'Message' ])
30
+ # log_debug('Message')
61
31
  #
62
- # @param [ Array<Operation, String> ] operations The operations or messages
63
- # to log.
32
+ # @param [ String ] message The message to log.
64
33
  #
65
34
  # @since 2.0.0
66
- def log_debug(operations, &block)
67
- log(:debug, PREFIX, operations, &block)
35
+ def log_debug(message)
36
+ logger.debug(format_message(message)) if logger.debug?
68
37
  end
69
38
 
70
39
  # Convenience method to log error messages with the standard prefix.
71
40
  #
72
41
  # @example Log a error message.
73
- # log_error([ 'Message' ])
42
+ # log_error('Message')
74
43
  #
75
- # @param [ Array<Operation, String> ] operations The operations or messages
76
- # to log.
44
+ # @param [ String ] message The message to log.
77
45
  #
78
46
  # @since 2.0.0
79
- def log_error(operations, &block)
80
- log(:error, PREFIX, operations, &block)
47
+ def log_error(message)
48
+ logger.error(format_message(message)) if logger.error?
81
49
  end
82
50
 
83
51
  # Convenience method to log fatal messages with the standard prefix.
84
52
  #
85
53
  # @example Log a fatal message.
86
- # log_fatal([ 'Message' ])
54
+ # log_fatal('Message')
87
55
  #
88
- # @param [ Array<Operation, String> ] operations The operations or messages
89
- # to log.
56
+ # @param [ String ] message The message to log.
90
57
  #
91
58
  # @since 2.0.0
92
- def log_fatal(operations, &block)
93
- log(:fatal, PREFIX, operations, &block)
59
+ def log_fatal(message)
60
+ logger.fatal(format_message(message)) if logger.fatal?
94
61
  end
95
62
 
96
63
  # Convenience method to log info messages with the standard prefix.
97
64
  #
98
65
  # @example Log a info message.
99
- # log_info([ 'Message' ])
66
+ # log_info('Message')
100
67
  #
101
- # @param [ Array<Operation, String> ] operations The operations or messages
102
- # to log.
68
+ # @param [ String ] message The message to log.
103
69
  #
104
70
  # @since 2.0.0
105
- def log_info(operations, &block)
106
- log(:info, PREFIX, operations, &block)
71
+ def log_info(message)
72
+ logger.info(format_message(message)) if logger.info?
107
73
  end
108
74
 
109
75
  # Convenience method to log warn messages with the standard prefix.
110
76
  #
111
77
  # @example Log a warn message.
112
- # log_warn([ 'Message' ])
78
+ # log_warn('Message')
113
79
  #
114
- # @param [ Array<Operation, String> ] operations The operations or messages
115
- # to log.
80
+ # @param [ String ] message The message to log.
116
81
  #
117
82
  # @since 2.0.0
118
- def log_warn(operations, &block)
119
- log(:warn, PREFIX, operations, &block)
83
+ def log_warn(message)
84
+ logger.warn(format_message(message)) if logger.warn?
85
+ end
86
+
87
+ # Get the logger instance.
88
+ #
89
+ # @example Get the logger instance.
90
+ # loggable.logger
91
+ #
92
+ # @return [ Logger ] The logger.
93
+ #
94
+ # @since 2.1.0
95
+ def logger
96
+ (options[:logger] || Logger.logger)
120
97
  end
121
98
 
122
99
  private
123
100
 
124
- def log_inspect(operation)
125
- operation.respond_to?(:log_message) ? operation.log_message : operation
101
+ def format_message(message)
102
+ format("%s | %s".freeze, PREFIX, message)
126
103
  end
127
104
  end
128
105
  end
data/lib/mongo/logger.rb CHANGED
@@ -23,76 +23,6 @@ module Mongo
23
23
 
24
24
  class << self
25
25
 
26
- # Log a debug level message.
27
- #
28
- # @example Log a debug level message.
29
- # Logger.debug('mongo', 'message', '10ms')
30
- #
31
- # @param [ String ] prefix The category prefix.
32
- # @param [ String ] message The log message.
33
- # @param [ String ] runtime The time of the operation.
34
- #
35
- # @since 2.0.0
36
- def debug(prefix, message, runtime)
37
- self.log(:debug, prefix, message, runtime)
38
- end
39
-
40
- # Log a error level message.
41
- #
42
- # @example Log a error level message.
43
- # Logger.error('mongo', 'message', '10ms')
44
- #
45
- # @param [ String ] prefix The category prefix.
46
- # @param [ String ] message The log message.
47
- # @param [ String ] runtime The time of the operation.
48
- #
49
- # @since 2.0.0
50
- def error(prefix, message, runtime)
51
- self.log(:error, prefix, message, runtime)
52
- end
53
-
54
- # Log a fatal level message.
55
- #
56
- # @example Log a fatal level message.
57
- # Logger.fatal('mongo', 'message', '10ms')
58
- #
59
- # @param [ String ] prefix The category prefix.
60
- # @param [ String ] message The log message.
61
- # @param [ String ] runtime The time of the operation.
62
- #
63
- # @since 2.0.0
64
- def fatal(prefix, message, runtime)
65
- self.log(:fatal, prefix, message, runtime)
66
- end
67
-
68
- # Log a info level message.
69
- #
70
- # @example Log a info level message.
71
- # Logger.info('mongo', 'message', '10ms')
72
- #
73
- # @param [ String ] prefix The category prefix.
74
- # @param [ String ] message The log message.
75
- # @param [ String ] runtime The time of the operation.
76
- #
77
- # @since 2.0.0
78
- def info(prefix, message, runtime)
79
- self.log(:info, prefix, message, runtime)
80
- end
81
-
82
- # Log a warn level message.
83
- #
84
- # @example Log a warn level message.
85
- # Logger.warn('mongo', 'message', '10ms')
86
- #
87
- # @param [ String ] prefix The category prefix.
88
- # @param [ String ] message The log message.
89
- # @param [ String ] runtime The time of the operation.
90
- #
91
- # @since 2.0.0
92
- def warn(prefix, message, runtime)
93
- self.log(:warn, prefix, message, runtime)
94
- end
95
-
96
26
  # Get the wrapped logger. If none was set will return a default debug
97
27
  # level logger.
98
28
  #
@@ -120,18 +50,26 @@ module Mongo
120
50
  @logger = other
121
51
  end
122
52
 
123
- def log(level, prefix, message, runtime)
124
- logger.send(level, format("%s | %s | runtime: %s".freeze, prefix, message, runtime))
125
- end
126
-
127
- def allow?(level)
128
- logger.send(:"#{level}?")
129
- end
130
-
53
+ # Get the global logger level.
54
+ #
55
+ # @example Get the global logging level.
56
+ # Mongo::Logger.level
57
+ #
58
+ # @return [ Integer ] The log level.
59
+ #
60
+ # @since 2.0.0
131
61
  def level
132
62
  logger.level
133
63
  end
134
64
 
65
+ # Set the global logger level.
66
+ #
67
+ # @example Set the global logging level.
68
+ # Mongo::Logger.level == Logger::DEBUG
69
+ #
70
+ # @return [ Integer ] The log level.
71
+ #
72
+ # @since 2.0.0
135
73
  def level=(level)
136
74
  logger.level = level
137
75
  end
@@ -0,0 +1,112 @@
1
+ # Copyright (C) 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
+ class Monitoring
17
+
18
+ # Subscribes to command events and logs them.
19
+ #
20
+ # @since 2.1.0
21
+ class CommandLogSubscriber
22
+ include Loggable
23
+
24
+ # @return [ Hash ] options The options.
25
+ attr_reader :options
26
+
27
+ # Constant for the max number of characters to print when inspecting
28
+ # a query field.
29
+ #
30
+ # @since 2.1.0
31
+ LOG_STRING_LIMIT = 250
32
+
33
+ # Create the new log subscriber.
34
+ #
35
+ # @example Create the log subscriber.
36
+ # CommandLogSubscriber.new
37
+ #
38
+ # @param [ Hash ] options The options.
39
+ #
40
+ # @option options [ Logger ] :logger An optional custom logger.
41
+ #
42
+ # @since 2.1.0
43
+ def initialize(options = {})
44
+ @options = options
45
+ end
46
+
47
+ # Handle the command started event.
48
+ #
49
+ # @example Handle the event.
50
+ # subscriber.started(event)
51
+ #
52
+ # @param [ CommandStartedEvent ] event The event.
53
+ #
54
+ # @since 2.1.0
55
+ def started(event)
56
+ if logger.debug?
57
+ log_debug("#{prefix(event)} | STARTED | #{format_command(event.command)}")
58
+ end
59
+ end
60
+
61
+ # Handle the command succeeded event.
62
+ #
63
+ # @example Handle the event.
64
+ # subscriber.succeeded(event)
65
+ #
66
+ # @param [ CommandSucceededEvent ] event The event.
67
+ #
68
+ # @since 2.1.0
69
+ def succeeded(event)
70
+ if logger.debug?
71
+ log_debug("#{prefix(event)} | SUCCEEDED | #{event.duration}s")
72
+ end
73
+ end
74
+
75
+ # Handle the command failed event.
76
+ #
77
+ # @example Handle the event.
78
+ # subscriber.failed(event)
79
+ #
80
+ # @param [ CommandFailedEvent ] event The event.
81
+ #
82
+ # @since 2.1.0
83
+ def failed(event)
84
+ if logger.debug?
85
+ log_debug("#{prefix(event)} | FAILED | #{event.message} | #{event.duration}s")
86
+ end
87
+ end
88
+
89
+ private
90
+
91
+ def format_command(args)
92
+ begin
93
+ truncating? ? truncate(args) : args.inspect
94
+ rescue Exception
95
+ '<Unable to inspect arguments>'
96
+ end
97
+ end
98
+
99
+ def prefix(event)
100
+ "#{event.address.to_s} | #{event.database_name}.#{event.command_name}"
101
+ end
102
+
103
+ def truncate(command)
104
+ ((s = command.inspect).length > LOG_STRING_LIMIT) ? "#{s[0..LOG_STRING_LIMIT]}..." : s
105
+ end
106
+
107
+ def truncating?
108
+ @truncating ||= (options[:truncate_logs] != false)
109
+ end
110
+ end
111
+ end
112
+ end