mongo 2.1.0.beta → 2.2.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 (342) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +10 -3
  4. data/Rakefile +1 -7
  5. data/lib/mongo/address/ipv4.rb +6 -1
  6. data/lib/mongo/address/unix.rb +2 -2
  7. data/lib/mongo/address.rb +32 -10
  8. data/lib/mongo/auth/cr/conversation.rb +1 -1
  9. data/lib/mongo/auth/ldap/conversation.rb +7 -3
  10. data/lib/mongo/auth/scram/conversation.rb +9 -3
  11. data/lib/mongo/auth/user/view.rb +23 -2
  12. data/lib/mongo/auth/x509/conversation.rb +1 -1
  13. data/lib/mongo/bulk_write/combineable.rb +51 -0
  14. data/lib/mongo/bulk_write/ordered_combiner.rb +55 -0
  15. data/lib/mongo/bulk_write/result.rb +61 -8
  16. data/lib/mongo/bulk_write/result_combiner.rb +117 -0
  17. data/lib/mongo/bulk_write/transformable.rb +132 -0
  18. data/lib/mongo/bulk_write/unordered_combiner.rb +52 -0
  19. data/lib/mongo/bulk_write/validatable.rb +62 -0
  20. data/lib/mongo/bulk_write.rb +164 -23
  21. data/lib/mongo/client.rb +75 -18
  22. data/lib/mongo/cluster/topology/replica_set.rb +8 -6
  23. data/lib/mongo/cluster/topology/unknown.rb +5 -2
  24. data/lib/mongo/cluster.rb +85 -5
  25. data/lib/mongo/collection/view/aggregation.rb +19 -45
  26. data/lib/mongo/collection/view/builder/aggregation.rb +98 -0
  27. data/lib/mongo/collection/view/builder/find_command.rb +111 -0
  28. data/lib/mongo/collection/view/builder/flags.rb +62 -0
  29. data/lib/mongo/collection/view/builder/map_reduce.rb +134 -0
  30. data/lib/mongo/collection/view/builder/modifiers.rb +80 -0
  31. data/lib/mongo/collection/view/builder/op_query.rb +83 -0
  32. data/lib/mongo/collection/view/builder.rb +20 -0
  33. data/lib/mongo/collection/view/explainable.rb +15 -0
  34. data/lib/mongo/collection/view/immutable.rb +4 -11
  35. data/lib/mongo/collection/view/iterable.rb +40 -5
  36. data/lib/mongo/collection/view/map_reduce.rb +67 -37
  37. data/lib/mongo/collection/view/readable.rb +114 -100
  38. data/lib/mongo/collection/view/writable.rb +46 -22
  39. data/lib/mongo/collection/view.rb +25 -22
  40. data/lib/mongo/collection.rb +130 -12
  41. data/lib/mongo/cursor/builder/get_more_command.rb +71 -0
  42. data/lib/mongo/cursor/builder/kill_cursors_command.rb +62 -0
  43. data/lib/mongo/cursor/builder/op_get_more.rb +61 -0
  44. data/lib/mongo/cursor/builder/op_kill_cursors.rb +56 -0
  45. data/lib/mongo/cursor/builder.rb +18 -0
  46. data/lib/mongo/cursor.rb +76 -21
  47. data/lib/mongo/database/view.rb +11 -6
  48. data/lib/mongo/database.rb +16 -6
  49. data/lib/mongo/dbref.rb +9 -9
  50. data/lib/mongo/{bulk_write/unordered_bulk_write.rb → error/closed_stream.rb} +12 -21
  51. data/lib/mongo/{bulk_write/ordered_bulk_write.rb → error/extra_file_chunk.rb} +13 -27
  52. data/lib/mongo/error/file_not_found.rb +37 -0
  53. data/lib/mongo/error/invalid_file.rb +2 -2
  54. data/lib/mongo/error/invalid_file_revision.rb +37 -0
  55. data/lib/mongo/error/invalid_uri.rb +5 -4
  56. data/lib/mongo/error/invalid_write_concern.rb +35 -0
  57. data/lib/mongo/error/missing_file_chunk.rb +38 -0
  58. data/lib/mongo/error/operation_failure.rb +33 -2
  59. data/lib/mongo/error/unchangeable_collection_option.rb +38 -0
  60. data/lib/mongo/error/unexpected_chunk_length.rb +39 -0
  61. data/lib/mongo/error.rb +8 -0
  62. data/lib/mongo/grid/file/chunk.rb +9 -9
  63. data/lib/mongo/grid/file/{metadata.rb → info.rb} +41 -39
  64. data/lib/mongo/grid/file.rb +12 -9
  65. data/lib/mongo/grid/fs_bucket.rb +448 -0
  66. data/lib/mongo/grid/stream/read.rb +208 -0
  67. data/lib/mongo/grid/stream/write.rb +187 -0
  68. data/lib/mongo/grid/stream.rb +64 -0
  69. data/lib/mongo/grid.rb +2 -1
  70. data/lib/mongo/index/view.rb +7 -4
  71. data/lib/mongo/index.rb +5 -0
  72. data/lib/mongo/loggable.rb +34 -57
  73. data/lib/mongo/logger.rb +16 -78
  74. data/lib/mongo/monitoring/command_log_subscriber.rb +38 -14
  75. data/lib/mongo/monitoring/event/command_started.rb +2 -1
  76. data/lib/mongo/monitoring/event/command_succeeded.rb +24 -2
  77. data/lib/mongo/monitoring/event/secure.rb +58 -0
  78. data/lib/mongo/monitoring/event.rb +1 -0
  79. data/lib/mongo/monitoring/publishable.rb +22 -12
  80. data/lib/mongo/monitoring.rb +1 -5
  81. data/lib/mongo/operation/commands/aggregate/result.rb +89 -0
  82. data/lib/mongo/operation/commands/aggregate.rb +64 -0
  83. data/lib/mongo/operation/commands/collections_info/result.rb +41 -0
  84. data/lib/mongo/operation/{read → commands}/collections_info.rb +5 -3
  85. data/lib/mongo/operation/commands/command.rb +47 -0
  86. data/lib/mongo/operation/commands/find/result.rb +62 -0
  87. data/lib/mongo/operation/commands/find.rb +27 -0
  88. data/lib/mongo/operation/commands/get_more/result.rb +62 -0
  89. data/lib/mongo/operation/commands/get_more.rb +27 -0
  90. data/lib/mongo/operation/{read → commands}/indexes.rb +9 -6
  91. data/lib/mongo/operation/{list_collections → commands/list_collections}/result.rb +1 -21
  92. data/lib/mongo/operation/{read → commands}/list_collections.rb +4 -32
  93. data/lib/mongo/operation/{list_indexes → commands/list_indexes}/result.rb +1 -21
  94. data/lib/mongo/operation/{read → commands}/list_indexes.rb +3 -33
  95. data/lib/mongo/operation/commands/map_reduce/result.rb +119 -0
  96. data/lib/mongo/operation/commands/map_reduce.rb +49 -0
  97. data/lib/mongo/operation/commands/parallel_scan/result.rb +64 -0
  98. data/lib/mongo/operation/commands/parallel_scan.rb +52 -0
  99. data/lib/mongo/operation/commands/user_query.rb +71 -0
  100. data/lib/mongo/operation/commands/users_info/result.rb +38 -0
  101. data/lib/mongo/operation/commands/users_info.rb +48 -0
  102. data/lib/mongo/operation/commands.rb +26 -0
  103. data/lib/mongo/operation/executable.rb +4 -68
  104. data/lib/mongo/operation/kill_cursors.rb +3 -3
  105. data/lib/mongo/operation/object_id_generator.rb +36 -0
  106. data/lib/mongo/operation/read/get_more.rb +2 -22
  107. data/lib/mongo/operation/read/query/result.rb +40 -0
  108. data/lib/mongo/operation/read/query.rb +4 -21
  109. data/lib/mongo/operation/read.rb +0 -4
  110. data/lib/mongo/operation/{read_preferrable.rb → read_preference.rb} +3 -2
  111. data/lib/mongo/operation/result.rb +43 -1
  112. data/lib/mongo/operation/specifiable.rb +59 -1
  113. data/lib/mongo/operation/write/bulk/bulkable.rb +83 -0
  114. data/lib/mongo/operation/write/bulk/delete/result.rb +67 -0
  115. data/lib/mongo/operation/write/bulk/delete.rb +71 -0
  116. data/lib/mongo/operation/write/bulk/insert/result.rb +129 -0
  117. data/lib/mongo/operation/write/bulk/insert.rb +96 -0
  118. data/lib/mongo/operation/write/bulk/legacy_mergable.rb +87 -0
  119. data/lib/mongo/operation/write/bulk/mergable.rb +71 -0
  120. data/lib/mongo/operation/write/bulk/update/result.rb +174 -0
  121. data/lib/mongo/operation/write/bulk/update.rb +81 -0
  122. data/lib/mongo/operation/write/bulk.rb +6 -3
  123. data/lib/mongo/operation/write/command/create_index.rb +0 -1
  124. data/lib/mongo/operation/write/command/create_user.rb +0 -1
  125. data/lib/mongo/operation/write/command/delete.rb +3 -3
  126. data/lib/mongo/operation/write/command/drop_index.rb +0 -1
  127. data/lib/mongo/operation/write/command/insert.rb +4 -3
  128. data/lib/mongo/operation/write/command/remove_user.rb +0 -1
  129. data/lib/mongo/operation/write/command/update.rb +6 -4
  130. data/lib/mongo/operation/write/command/update_user.rb +0 -1
  131. data/lib/mongo/operation/write/command/writable.rb +13 -18
  132. data/lib/mongo/operation/write/create_index.rb +4 -27
  133. data/lib/mongo/operation/write/create_user.rb +4 -30
  134. data/lib/mongo/operation/write/delete.rb +6 -29
  135. data/lib/mongo/operation/write/drop_index.rb +3 -3
  136. data/lib/mongo/operation/write/gle.rb +49 -0
  137. data/lib/mongo/operation/write/idable.rb +24 -2
  138. data/lib/mongo/operation/write/insert.rb +2 -24
  139. data/lib/mongo/operation/write/remove_user.rb +4 -27
  140. data/lib/mongo/operation/write/update.rb +13 -36
  141. data/lib/mongo/operation/write/update_user.rb +4 -30
  142. data/lib/mongo/operation/write/write_command_enabled.rb +53 -0
  143. data/lib/mongo/operation/write.rb +2 -0
  144. data/lib/mongo/operation.rb +33 -5
  145. data/lib/mongo/options/mapper.rb +26 -2
  146. data/lib/mongo/options/redacted.rb +156 -0
  147. data/lib/mongo/options.rb +1 -0
  148. data/lib/mongo/protocol/bit_vector.rb +11 -9
  149. data/lib/mongo/protocol/delete.rb +78 -3
  150. data/lib/mongo/protocol/get_more.rb +59 -2
  151. data/lib/mongo/protocol/insert.rb +73 -1
  152. data/lib/mongo/protocol/kill_cursors.rb +66 -4
  153. data/lib/mongo/protocol/message.rb +44 -20
  154. data/lib/mongo/protocol/query.rb +153 -65
  155. data/lib/mongo/protocol/reply.rb +92 -1
  156. data/lib/mongo/protocol/serializers.rb +49 -40
  157. data/lib/mongo/protocol/update.rb +93 -1
  158. data/lib/mongo/retryable.rb +101 -0
  159. data/lib/mongo/server/connectable.rb +28 -8
  160. data/lib/mongo/server/connection.rb +52 -10
  161. data/lib/mongo/server/connection_pool/queue.rb +15 -0
  162. data/lib/mongo/server/connection_pool.rb +12 -15
  163. data/lib/mongo/server/description/features.rb +4 -2
  164. data/lib/mongo/server/description.rb +39 -3
  165. data/lib/mongo/server/monitor/connection.rb +49 -28
  166. data/lib/mongo/server/monitor.rb +3 -14
  167. data/lib/mongo/server.rb +31 -4
  168. data/lib/mongo/server_selector/selectable.rb +58 -32
  169. data/lib/mongo/server_selector.rb +19 -10
  170. data/lib/mongo/socket/ssl.rb +4 -1
  171. data/lib/mongo/socket/tcp.rb +2 -2
  172. data/lib/mongo/socket/unix.rb +5 -8
  173. data/lib/mongo/socket.rb +11 -4
  174. data/lib/mongo/uri.rb +245 -139
  175. data/lib/mongo/version.rb +1 -1
  176. data/lib/mongo/write_concern.rb +21 -6
  177. data/lib/mongo.rb +4 -4
  178. data/mongo.gemspec +1 -2
  179. data/spec/mongo/address/unix_spec.rb +1 -1
  180. data/spec/mongo/address_spec.rb +25 -0
  181. data/spec/mongo/auth/ldap/conversation_spec.rb +43 -0
  182. data/spec/mongo/auth/user/view_spec.rb +26 -1
  183. data/spec/mongo/bulk_write/ordered_combiner_spec.rb +284 -0
  184. data/spec/mongo/bulk_write/unordered_combiner_spec.rb +239 -0
  185. data/spec/mongo/bulk_write_spec.rb +385 -161
  186. data/spec/mongo/client_spec.rb +193 -23
  187. data/spec/mongo/cluster/topology/replica_set_spec.rb +2 -0
  188. data/spec/mongo/collection/view/aggregation_spec.rb +65 -0
  189. data/spec/mongo/collection/view/builder/find_command_spec.rb +167 -0
  190. data/spec/mongo/collection/view/builder/flags_spec.rb +106 -0
  191. data/spec/mongo/collection/view/builder/modifiers_spec.rb +210 -0
  192. data/spec/mongo/collection/view/builder/op_query_spec.rb +154 -0
  193. data/spec/mongo/collection/view/explainable_spec.rb +1 -2
  194. data/spec/mongo/collection/view/immutable_spec.rb +54 -0
  195. data/spec/mongo/collection/view/map_reduce_spec.rb +104 -9
  196. data/spec/mongo/collection/view/readable_spec.rb +109 -112
  197. data/spec/mongo/collection/view_spec.rb +119 -487
  198. data/spec/mongo/collection_spec.rb +1002 -33
  199. data/spec/mongo/command_monitoring_spec.rb +64 -0
  200. data/spec/mongo/connection_string_spec.rb +115 -0
  201. data/spec/mongo/cursor/builder/get_more_command_spec.rb +160 -0
  202. data/spec/mongo/cursor/builder/op_get_more_spec.rb +52 -0
  203. data/spec/mongo/cursor_spec.rb +10 -60
  204. data/spec/mongo/database_spec.rb +81 -12
  205. data/spec/mongo/dbref_spec.rb +4 -4
  206. data/spec/mongo/grid/file/chunk_spec.rb +6 -6
  207. data/spec/mongo/grid/file/{metadata_spec.rb → info_spec.rb} +29 -17
  208. data/spec/mongo/grid/file_spec.rb +8 -8
  209. data/spec/mongo/grid/fs_bucket_spec.rb +1020 -0
  210. data/spec/mongo/grid/stream/read_spec.rb +275 -0
  211. data/spec/mongo/grid/stream/write_spec.rb +440 -0
  212. data/spec/mongo/grid/stream_spec.rb +48 -0
  213. data/spec/mongo/gridfs_spec.rb +50 -0
  214. data/spec/mongo/index/view_spec.rb +41 -0
  215. data/spec/mongo/logger_spec.rb +0 -40
  216. data/spec/mongo/monitoring/command_log_subscriber_spec.rb +76 -0
  217. data/spec/mongo/monitoring/event/command_started_spec.rb +26 -0
  218. data/spec/mongo/monitoring/event/command_succeeded_spec.rb +26 -0
  219. data/spec/mongo/monitoring/event/secure_spec.rb +57 -0
  220. data/spec/mongo/operation/{aggregate → commands/aggregate}/result_spec.rb +1 -1
  221. data/spec/mongo/operation/commands/aggregate_spec.rb +69 -0
  222. data/spec/mongo/operation/{read → commands}/collections_info_spec.rb +1 -1
  223. data/spec/mongo/operation/{command_spec.rb → commands/command_spec.rb} +1 -19
  224. data/spec/mongo/operation/{read → commands}/indexes_spec.rb +1 -1
  225. data/spec/mongo/operation/{map_reduce_spec.rb → commands/map_reduce_spec.rb} +1 -19
  226. data/spec/mongo/operation/kill_cursors_spec.rb +1 -17
  227. data/spec/mongo/operation/read/get_more_spec.rb +0 -16
  228. data/spec/mongo/operation/read/query_spec.rb +19 -16
  229. data/spec/mongo/operation/{read_preferrable_spec.rb → read_preference_spec.rb} +11 -11
  230. data/spec/mongo/operation/result_spec.rb +19 -0
  231. data/spec/mongo/operation/write/bulk/{bulk_delete_spec.rb → delete_spec.rb} +17 -28
  232. data/spec/mongo/operation/write/bulk/{bulk_insert_spec.rb → insert_spec.rb} +1 -12
  233. data/spec/mongo/operation/write/bulk/{bulk_update_spec.rb → update_spec.rb} +7 -18
  234. data/spec/mongo/operation/write/command/delete_spec.rb +18 -9
  235. data/spec/mongo/operation/write/command/insert_spec.rb +18 -9
  236. data/spec/mongo/operation/write/command/update_spec.rb +18 -9
  237. data/spec/mongo/operation/write/delete_spec.rb +3 -3
  238. data/spec/mongo/operation/write/insert_spec.rb +0 -11
  239. data/spec/mongo/operation/write/update_spec.rb +6 -6
  240. data/spec/mongo/options/redacted_spec.rb +350 -0
  241. data/spec/mongo/protocol/delete_spec.rb +4 -4
  242. data/spec/mongo/protocol/get_more_spec.rb +4 -4
  243. data/spec/mongo/protocol/insert_spec.rb +3 -3
  244. data/spec/mongo/protocol/kill_cursors_spec.rb +8 -6
  245. data/spec/mongo/protocol/query_spec.rb +21 -7
  246. data/spec/mongo/protocol/update_spec.rb +5 -5
  247. data/spec/mongo/retryable_spec.rb +221 -0
  248. data/spec/mongo/server/connection_pool/queue_spec.rb +16 -0
  249. data/spec/mongo/server/connection_pool_spec.rb +42 -6
  250. data/spec/mongo/server/connection_spec.rb +86 -1
  251. data/spec/mongo/server/description/features_spec.rb +25 -0
  252. data/spec/mongo/server/description_spec.rb +42 -0
  253. data/spec/mongo/server/monitor_spec.rb +44 -0
  254. data/spec/mongo/server_discovery_and_monitoring_spec.rb +25 -59
  255. data/spec/mongo/server_selection_rtt_spec.rb +37 -57
  256. data/spec/mongo/server_selection_spec.rb +5 -3
  257. data/spec/mongo/server_selector/nearest_spec.rb +35 -27
  258. data/spec/mongo/server_selector/primary_preferred_spec.rb +32 -30
  259. data/spec/mongo/server_selector/primary_spec.rb +21 -14
  260. data/spec/mongo/server_selector/secondary_preferred_spec.rb +28 -26
  261. data/spec/mongo/server_selector/secondary_spec.rb +24 -22
  262. data/spec/mongo/server_selector_spec.rb +87 -24
  263. data/spec/mongo/server_spec.rb +78 -15
  264. data/spec/mongo/socket/ssl_spec.rb +101 -57
  265. data/spec/mongo/socket/unix_spec.rb +52 -0
  266. data/spec/mongo/uri_spec.rb +271 -59
  267. data/spec/mongo/write_concern_spec.rb +126 -0
  268. data/spec/spec_helper.rb +29 -23
  269. data/spec/support/authorization.rb +4 -5
  270. data/spec/support/command_monitoring/bulkWrite.yml +73 -0
  271. data/spec/support/command_monitoring/command.yml +42 -0
  272. data/spec/support/command_monitoring/deleteMany.yml +55 -0
  273. data/spec/support/command_monitoring/deleteOne.yml +55 -0
  274. data/spec/support/command_monitoring/find.yml +268 -0
  275. data/spec/support/command_monitoring/insertMany.yml +81 -0
  276. data/spec/support/command_monitoring/insertOne.yml +51 -0
  277. data/spec/support/command_monitoring/updateMany.yml +67 -0
  278. data/spec/support/command_monitoring/updateOne.yml +95 -0
  279. data/spec/support/command_monitoring.rb +373 -0
  280. data/spec/support/connection_string.rb +228 -0
  281. data/spec/support/connection_string_tests/invalid-uris.yml +193 -0
  282. data/spec/support/connection_string_tests/valid-auth.yml +256 -0
  283. data/spec/support/connection_string_tests/valid-host_identifiers.yml +121 -0
  284. data/spec/support/connection_string_tests/valid-options.yml +30 -0
  285. data/spec/support/connection_string_tests/valid-unix_socket-absolute.yml +197 -0
  286. data/spec/support/connection_string_tests/valid-unix_socket-relative.yml +213 -0
  287. data/spec/support/connection_string_tests/valid-warnings.yml +55 -0
  288. data/spec/support/crud/read.rb +14 -10
  289. data/spec/support/crud/write.rb +36 -9
  290. data/spec/support/crud.rb +10 -2
  291. data/spec/support/gridfs.rb +637 -0
  292. data/spec/support/gridfs_tests/delete.yml +157 -0
  293. data/spec/support/gridfs_tests/download.yml +210 -0
  294. data/spec/support/gridfs_tests/download_by_name.yml +113 -0
  295. data/spec/support/gridfs_tests/upload.yml +158 -0
  296. data/spec/support/matchers.rb +2 -2
  297. data/spec/support/sdam/rs/equal_electionids.yml +1 -2
  298. data/spec/support/sdam/rs/new_primary_new_electionid.yml +0 -3
  299. data/spec/support/sdam/rs/primary_mismatched_me.yml +37 -0
  300. data/spec/support/sdam/rs/primary_to_no_primary_mismatched_me.yml +75 -0
  301. data/spec/support/sdam/rs/rsother_discovered.yml +24 -3
  302. data/spec/support/sdam/rs/secondary_mismatched_me.yml +37 -0
  303. data/spec/support/sdam/rs/stepdown_change_set_name.yml +59 -0
  304. data/spec/support/sdam/single/direct_connection_rsarbiter.yml +1 -1
  305. data/spec/support/sdam/single/direct_connection_rsprimary.yml +1 -1
  306. data/spec/support/sdam/single/direct_connection_rssecondary.yml +1 -1
  307. data/spec/support/sdam/single/direct_connection_slave.yml +1 -1
  308. data/spec/support/sdam/single/direct_connection_standalone.yml +1 -1
  309. data/spec/support/sdam/single/not_ok_response.yml +0 -1
  310. data/spec/support/server_discovery_and_monitoring.rb +3 -1
  311. data/spec/support/server_selection.rb +3 -1
  312. data/spec/support/shared/bulk_write.rb +192 -0
  313. data/spec/support/shared/protocol.rb +5 -5
  314. data/spec/support/shared/server_selector.rb +78 -13
  315. data/spec/support/travis.rb +1 -1
  316. data.tar.gz.sig +0 -0
  317. metadata +211 -72
  318. metadata.gz.sig +0 -0
  319. data/lib/mongo/bulk_write/bulk_writable.rb +0 -252
  320. data/lib/mongo/bulk_write/deletable.rb +0 -57
  321. data/lib/mongo/bulk_write/insertable.rb +0 -49
  322. data/lib/mongo/bulk_write/replacable.rb +0 -58
  323. data/lib/mongo/bulk_write/updatable.rb +0 -69
  324. data/lib/mongo/grid/fs.rb +0 -146
  325. data/lib/mongo/operation/aggregate/result.rb +0 -103
  326. data/lib/mongo/operation/aggregate.rb +0 -108
  327. data/lib/mongo/operation/command.rb +0 -61
  328. data/lib/mongo/operation/map_reduce/result.rb +0 -122
  329. data/lib/mongo/operation/map_reduce.rb +0 -95
  330. data/lib/mongo/operation/parallel_scan/result.rb +0 -72
  331. data/lib/mongo/operation/parallel_scan.rb +0 -76
  332. data/lib/mongo/operation/write/bulk/bulk_delete/result.rb +0 -75
  333. data/lib/mongo/operation/write/bulk/bulk_delete.rb +0 -145
  334. data/lib/mongo/operation/write/bulk/bulk_insert/result.rb +0 -130
  335. data/lib/mongo/operation/write/bulk/bulk_insert.rb +0 -132
  336. data/lib/mongo/operation/write/bulk/bulk_mergable.rb +0 -67
  337. data/lib/mongo/operation/write/bulk/bulk_update/result.rb +0 -174
  338. data/lib/mongo/operation/write/bulk/bulk_update.rb +0 -154
  339. data/lib/mongo/operation/write/bulk/legacy_bulk_mergable.rb +0 -83
  340. data/spec/mongo/grid/fs_spec.rb +0 -160
  341. data/spec/mongo/loggable_spec.rb +0 -63
  342. data/spec/mongo/operation/aggregate_spec.rb +0 -127
@@ -50,10 +50,15 @@ module Mongo
50
50
  # @since 2.0.0
51
51
  def collection_names(options = {})
52
52
  @batch_size = options[:batch_size]
53
- server = next_primary
53
+ server = next_primary(false)
54
+ @limit = -1 if server.features.list_collections_enabled?
54
55
  collections_info(server).collect do |info|
55
- server.context.features.list_collections_enabled? ?
56
- info['name'] : info['name'].sub("#{@database.name}.", '')
56
+ if server.features.list_collections_enabled?
57
+ info[Database::NAME]
58
+ else
59
+ (info[Database::NAME] &&
60
+ info[Database::NAME].sub("#{@database.name}.", ''))
61
+ end
57
62
  end
58
63
  end
59
64
 
@@ -66,7 +71,7 @@ module Mongo
66
71
  #
67
72
  # @since 2.0.5
68
73
  def list_collections
69
- collections_info(next_primary)
74
+ collections_info(next_primary(false))
70
75
  end
71
76
 
72
77
  # Create the new database view.
@@ -80,7 +85,7 @@ module Mongo
80
85
  def initialize(database)
81
86
  @database = database
82
87
  @batch_size = nil
83
- @limit = -1
88
+ @limit = nil
84
89
  @collection = @database[Database::COMMAND]
85
90
  end
86
91
 
@@ -102,7 +107,7 @@ module Mongo
102
107
  end
103
108
 
104
109
  def initial_query_op
105
- Operation::Read::CollectionsInfo.new(collections_info_spec)
110
+ Operation::Commands::CollectionsInfo.new(collections_info_spec)
106
111
  end
107
112
 
108
113
  def send_initial_query(server)
@@ -36,7 +36,17 @@ module Mongo
36
36
  # The default database options.
37
37
  #
38
38
  # @since 2.0.0
39
- DEFAULT_OPTIONS = { :database => ADMIN }.freeze
39
+ DEFAULT_OPTIONS = Options::Redacted.new(:database => ADMIN).freeze
40
+
41
+ # Database name field constant.
42
+ #
43
+ # @since 2.1.0
44
+ NAME = 'name'.freeze
45
+
46
+ # Databases constant.
47
+ #
48
+ # @since 2.1.0
49
+ DATABASES = 'databases'.freeze
40
50
 
41
51
  # The name of the collection that holds all the collection names.
42
52
  #
@@ -138,9 +148,9 @@ module Mongo
138
148
  #
139
149
  # @return [ Hash ] The result of the command execution.
140
150
  def command(operation, opts = {})
141
- preference = opts[:read] ? ServerSelector.get(opts[:read], options) : read_preference
142
- server = preference.select_server(cluster)
143
- Operation::Command.new({
151
+ preference = ServerSelector.get(client.options.merge(opts[:read])) if opts[:read]
152
+ server = preference ? preference.select_server(cluster, false) : cluster.next_primary(false)
153
+ Operation::Commands::Command.new({
144
154
  :selector => operation,
145
155
  :db_name => name,
146
156
  :options => { :limit => -1 },
@@ -196,11 +206,11 @@ module Mongo
196
206
  # @example Get the GridFS.
197
207
  # database.fs
198
208
  #
199
- # @return [ Grid::FS ] The GridFS for the database.
209
+ # @return [ Grid::FSBucket ] The GridFS for the database.
200
210
  #
201
211
  # @since 2.0.0
202
212
  def fs(options = {})
203
- Grid::FS.new(self, options)
213
+ Grid::FSBucket.new(self, options)
204
214
  end
205
215
 
206
216
  # Get the user view for this database.
data/lib/mongo/dbref.rb CHANGED
@@ -53,8 +53,8 @@ module Mongo
53
53
  #
54
54
  # @since 2.1.0
55
55
  def as_json(*args)
56
- document = { '$ref' => collection, '$id' => id }
57
- document.merge!('$db' => database) if database
56
+ document = { COLLECTION => collection, ID => id }
57
+ document.merge!(DATABASE => database) if database
58
58
  document
59
59
  end
60
60
 
@@ -79,30 +79,30 @@ module Mongo
79
79
  # @example Convert the DBRef to raw BSON.
80
80
  # dbref.to_bson
81
81
  #
82
- # @param [ String ] encoded The encoded BSON to append to.
82
+ # @param [ String ] buffer The encoded BSON buffer to append to.
83
83
  #
84
84
  # @return [ String ] The raw BSON.
85
85
  #
86
86
  # @since 2.1.0
87
- def to_bson(encoded = ''.force_encoding(BSON::BINARY))
88
- as_json.to_bson(encoded)
87
+ def to_bson(buffer = BSON::ByteBuffer.new)
88
+ as_json.to_bson(buffer)
89
89
  end
90
90
 
91
91
  module ClassMethods
92
92
 
93
93
  # Deserialize the hash from BSON, converting to a DBRef if appropriate.
94
94
  #
95
- # @param [ IO ] bson The bson representing a hash.
95
+ # @param [ String ] buffer The bson representing a hash.
96
96
  #
97
97
  # @return [ Hash, DBRef ] The decoded hash or DBRef.
98
98
  #
99
99
  # @see http://bsonspec.org/#/specification
100
100
  #
101
101
  # @since 2.0.0
102
- def from_bson(bson)
102
+ def from_bson(buffer)
103
103
  decoded = super
104
- if ref = decoded['$ref']
105
- decoded = DBRef.new(ref, decoded['$id'], decoded['$db'])
104
+ if ref = decoded[COLLECTION]
105
+ decoded = DBRef.new(ref, decoded[ID], decoded[DATABASE])
106
106
  end
107
107
  decoded
108
108
  end
@@ -13,30 +13,21 @@
13
13
  # limitations under the License.
14
14
 
15
15
  module Mongo
16
- module BulkWrite
16
+ class Error
17
17
 
18
- # Encapsulates behaviour around an unordered bulk write operation.
18
+ # Raised if the GridFS::Stream object is closed and an operation is attempted.
19
19
  #
20
- # @since 2.0.0
21
- class UnorderedBulkWrite
22
- include BulkWritable
20
+ # @since 2.1.0
21
+ class ClosedStream < Error
23
22
 
24
- private
25
-
26
- def ordered?
27
- false
28
- end
29
-
30
- def merged_ops
31
- merge_consecutive_ops(merge_ops_by_type)
32
- end
33
-
34
- def process(result, indexes)
35
- combine_results(result, indexes)
36
- end
37
-
38
- def finalize
39
- Result.new(@results).validate!
23
+ # Create the new exception.
24
+ #
25
+ # @example Create the new exception.
26
+ # Mongo::Error::ClosedStream.new
27
+ #
28
+ # @since 2.1.0
29
+ def initialize
30
+ super("The stream is closed and cannot be written to or read from.")
40
31
  end
41
32
  end
42
33
  end
@@ -13,35 +13,21 @@
13
13
  # limitations under the License.
14
14
 
15
15
  module Mongo
16
- module BulkWrite
16
+ class Error
17
17
 
18
- # Encapsulates behaviour around an ordered bulk write operation.
18
+ # Raised if an extra chunk is found.
19
19
  #
20
- # @since 2.0.0
21
- class OrderedBulkWrite
22
- include BulkWritable
23
-
24
- private
25
-
26
- def ordered?
27
- true
28
- end
29
-
30
- def merged_ops
31
- merge_consecutive_ops(@operations)
32
- end
33
-
34
- def process(result, indexes)
35
- combine_results(result, indexes)
36
- raise Error::BulkWriteError.new(@results) if stop?
37
- end
38
-
39
- def stop?
40
- @results.keys.include?(Error::WRITE_ERRORS)
41
- end
42
-
43
- def finalize
44
- Result.new(@results).validate!
20
+ # @since 2.1.0
21
+ class ExtraFileChunk < Error
22
+
23
+ # Create the new exception.
24
+ #
25
+ # @example Create the new exception.
26
+ # Mongo::Error::ExtraFileChunk.new
27
+ #
28
+ # @since 2.1.0
29
+ def initialize
30
+ super("Extra file chunk found.")
45
31
  end
46
32
  end
47
33
  end
@@ -0,0 +1,37 @@
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
+ class Error
17
+
18
+ # Raised if a file is deleted from a GridFS but it is not found.
19
+ #
20
+ # @since 2.1.0
21
+ class FileNotFound < Error
22
+
23
+ # Create the new exception.
24
+ #
25
+ # @example Create the new exception.
26
+ # Mongo::Error::FileNotFound.new(id, :id)
27
+ #
28
+ # @param [ Object ] value The property value used to find the file.
29
+ # @param [ String, Symbol ] property The name of the property used to find the file.
30
+ #
31
+ # @since 2.1.0
32
+ def initialize(value, property)
33
+ super("File with #{property} '#{value}' not found.")
34
+ end
35
+ end
36
+ end
37
+ end
@@ -21,9 +21,9 @@ module Mongo
21
21
  # @since 2.0.0
22
22
  class InvalidFile < Error
23
23
 
24
- # Create the nex exception.
24
+ # Create the new exception.
25
25
  #
26
- # @example Create the mew exception.
26
+ # @example Create the new exception.
27
27
  # Mongo::Error::InvalidFile.new(file_md5, server_md5)
28
28
  #
29
29
  # @param [ String ] client_md5 The client side file md5.
@@ -0,0 +1,37 @@
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
+ class Error
17
+
18
+ # Raised if the requested file revision is not found.
19
+ #
20
+ # @since 2.1.0
21
+ class InvalidFileRevision < Error
22
+
23
+ # Create the new exception.
24
+ #
25
+ # @example Create the new exception.
26
+ # Mongo::Error::InvalidFileRevision.new('some-file.txt', 3)
27
+ #
28
+ # @param [ String ] filename The name of the file.
29
+ # @param [ Integer ] revision The requested revision.
30
+ #
31
+ # @since 2.1.0
32
+ def initialize(filename, revision)
33
+ super("No revision #{revision} found for file '#{filename}'.")
34
+ end
35
+ end
36
+ end
37
+ end
@@ -27,10 +27,11 @@ module Mongo
27
27
  # Mongo::Error::InvalidURI.new(uri)
28
28
  #
29
29
  # @since 2.0.0
30
- def initialize(uri)
31
- super("MongoDB URI must be in the following format: #{Mongo::URI::FORMAT}\n" +
32
- "Please see the following URL for more information: #{Mongo::URI::HELP}\n" +
33
- "Bad URI: #{uri}")
30
+ def initialize(uri, details)
31
+ super("Bad URI: #{uri}\n" +
32
+ "#{details}\n" +
33
+ "MongoDB URI must be in the following format: #{Mongo::URI::FORMAT}\n" +
34
+ "Please see the following URL for more information: #{Mongo::URI::HELP}\n")
34
35
  end
35
36
  end
36
37
  end
@@ -0,0 +1,35 @@
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
+ class Error
17
+
18
+ # Raised when an invalid write concern is provided.
19
+ #
20
+ # @since 2.2.0
21
+ class InvalidWriteConcern < Error
22
+
23
+ # Instantiate the new exception.
24
+ #
25
+ # @example Instantiate the exception.
26
+ # Mongo::Error::InvalidWriteConcern.new
27
+ #
28
+ # @since 2.2.0
29
+ def initialize
30
+ super('Invalid write concern options. If w is an Integer, it must be greater than or equal to 0. ' +
31
+ 'If w is 0, it cannot be combined with a true value for fsync or j (journal).')
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,38 @@
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
+ class Error
17
+
18
+ # Raised if the next chunk when reading from a GridFSBucket does not have the
19
+ # expected sequence number (n).
20
+ #
21
+ # @since 2.1.0
22
+ class MissingFileChunk < Error
23
+
24
+ # Create the new exception.
25
+ #
26
+ # @example Create the new exception.
27
+ # Mongo::Error::MissingFileChunk.new(expected_n, chunk)
28
+ #
29
+ # @param [ Integer ] expected_n The expected index value.
30
+ # @param [ Grid::File::Chunk ] chunk The chunk read from GridFS.
31
+ #
32
+ # @since 2.1.0
33
+ def initialize(expected_n, chunk)
34
+ super("Unexpected chunk in sequence. Expected next chunk to have index #{expected_n} but it has index #{chunk.n}")
35
+ end
36
+ end
37
+ end
38
+ end
@@ -15,9 +15,40 @@
15
15
  module Mongo
16
16
  class Error
17
17
 
18
- # Raised when a command failes for some reason.
18
+ # Raised when an operation fails for some reason.
19
19
  #
20
20
  # @since 2.0.0
21
- class OperationFailure < Error; end
21
+ class OperationFailure < Error
22
+
23
+ # These are magic error messages that could indicate a cluster
24
+ # reconfiguration behind a mongos. We cannot check error codes as they
25
+ # change between versions, for example 15988 which has 2 completely
26
+ # different meanings between 2.4 and 3.0.
27
+ #
28
+ # @since 2.1.1
29
+ RETRY_MESSAGES = [
30
+ 'transport error',
31
+ 'socket exception',
32
+ "can't connect",
33
+ 'no master',
34
+ 'not master',
35
+ 'connect failed',
36
+ 'error querying',
37
+ 'could not get last error',
38
+ 'connection attempt failed'
39
+ ].freeze
40
+
41
+ # Can the operation that caused the error be retried?
42
+ #
43
+ # @example Is the error retryable?
44
+ # error.retryable?
45
+ #
46
+ # @return [ true, false ] If the error is retryable.
47
+ #
48
+ # @since 2.1.1
49
+ def retryable?
50
+ RETRY_MESSAGES.any?{ |m| message.include?(m) }
51
+ end
52
+ end
22
53
  end
23
54
  end
@@ -0,0 +1,38 @@
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
+ class Error
17
+
18
+ # Raised if a new collection is created from an existing one and options other than the
19
+ # changeable ones are provided.
20
+ #
21
+ # @since 2.1.0
22
+ class UnchangeableCollectionOption < Error
23
+
24
+ # Create the new exception.
25
+ #
26
+ # @example Create the new exception.
27
+ # Mongo::Error::UnchangeableCollectionOption.new(option)
28
+ #
29
+ # @param [ String, Symbol ] option The option that was attempted to be changed.
30
+ #
31
+ # @since 2.1.0
32
+ def initialize(option)
33
+ super("The option #{option} cannot be set on a new collection instance." +
34
+ " The options that can be updated are #{Collection::CHANGEABLE_OPTIONS}")
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,39 @@
1
+ # Copyright (C) 2014-2015 MongoDB, Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module Mongo
16
+ class Error
17
+
18
+ # Raised if the next chunk when reading from a GridFSBucket does not have the
19
+ # expected length.
20
+ #
21
+ # @since 2.1.0
22
+ class UnexpectedChunkLength < Error
23
+
24
+ # Create the new exception.
25
+ #
26
+ # @example Create the new exception.
27
+ # Mongo::Error::UnexpectedChunkLength.new(expected_len, chunk)
28
+ #
29
+ # @param [ Integer ] expected_len The expected length.
30
+ # @param [ Grid::File::Chunk ] chunk The chunk read from GridFS.
31
+ #
32
+ # @since 2.1.0
33
+ def initialize(expected_len, chunk)
34
+ super("Unexpected chunk length. Chunk has length #{chunk.data.data.size} but expected length " +
35
+ "#{expected_len} or for it to be the last chunk in the sequence.")
36
+ end
37
+ end
38
+ end
39
+ end
data/lib/mongo/error.rb CHANGED
@@ -67,6 +67,9 @@ end
67
67
 
68
68
  require 'mongo/error/parser'
69
69
  require 'mongo/error/bulk_write_error'
70
+ require 'mongo/error/closed_stream'
71
+ require 'mongo/error/extra_file_chunk'
72
+ require 'mongo/error/file_not_found'
70
73
  require 'mongo/error/operation_failure'
71
74
  require 'mongo/error/invalid_bulk_operation'
72
75
  require 'mongo/error/invalid_bulk_operation_type'
@@ -74,12 +77,14 @@ require 'mongo/error/invalid_collection_name'
74
77
  require 'mongo/error/invalid_database_name'
75
78
  require 'mongo/error/invalid_document'
76
79
  require 'mongo/error/invalid_file'
80
+ require 'mongo/error/invalid_file_revision'
77
81
  require 'mongo/error/invalid_nonce'
78
82
  require 'mongo/error/invalid_replacement_document'
79
83
  require 'mongo/error/invalid_server_preference'
80
84
  require 'mongo/error/invalid_signature'
81
85
  require 'mongo/error/invalid_update_document'
82
86
  require 'mongo/error/invalid_uri'
87
+ require 'mongo/error/invalid_write_concern'
83
88
  require 'mongo/error/max_bson_size'
84
89
  require 'mongo/error/max_message_size'
85
90
  require 'mongo/error/multi_index_drop'
@@ -87,4 +92,7 @@ require 'mongo/error/need_primary_server'
87
92
  require 'mongo/error/no_server_available'
88
93
  require 'mongo/error/socket_error'
89
94
  require 'mongo/error/socket_timeout_error'
95
+ require 'mongo/error/unchangeable_collection_option'
96
+ require 'mongo/error/unexpected_chunk_length'
97
+ require 'mongo/error/missing_file_chunk'
90
98
  require 'mongo/error/unsupported_features'
@@ -128,13 +128,13 @@ module Mongo
128
128
  # @example Convert the chunk to BSON.
129
129
  # chunk.to_bson
130
130
  #
131
- # @param [ String ] encoded The encoded data to append to.
131
+ # @param [ String ] buffer The encoded data buffer to append to.
132
132
  #
133
133
  # @return [ String ] The raw BSON data.
134
134
  #
135
135
  # @since 2.0.0
136
- def to_bson(encoded = ''.force_encoding(BSON::BINARY))
137
- document.to_bson(encoded)
136
+ def to_bson(buffer = BSON::ByteBuffer.new)
137
+ document.to_bson(buffer)
138
138
  end
139
139
 
140
140
  class << self
@@ -160,17 +160,17 @@ module Mongo
160
160
  # Chunks.split(data)
161
161
  #
162
162
  # @param [ String ] data The raw bytes.
163
- # @param [ Metadata ] metadata The file metadata.
163
+ # @param [ File::Info ] file_info The files collection file doc.
164
164
  #
165
165
  # @return [ Array<Chunk> ] The chunks of the data.
166
166
  #
167
167
  # @since 2.0.0
168
- def split(data, metadata)
169
- chunks, index, n = [], 0, 0
168
+ def split(data, file_info, offset = 0)
169
+ chunks, index, n = [], 0, offset
170
170
  while index < data.length
171
- bytes = data.slice(index, metadata.chunk_size)
172
- metadata.md5.update(bytes)
173
- chunk = Chunk.new(:data => BSON::Binary.new(bytes), :files_id => metadata.id, :n => n)
171
+ bytes = data.slice(index, file_info.chunk_size)
172
+ file_info.md5.update(bytes)
173
+ chunk = Chunk.new(:data => BSON::Binary.new(bytes), :files_id => file_info.id, :n => n)
174
174
  chunks.push(chunk)
175
175
  index += bytes.length
176
176
  n += 1