mongo 2.2.7 → 2.3.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 (266) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/LICENSE +1 -1
  5. data/README.md +1 -1
  6. data/Rakefile +1 -1
  7. data/lib/mongo.rb +1 -1
  8. data/lib/mongo/address.rb +1 -1
  9. data/lib/mongo/address/ipv4.rb +1 -1
  10. data/lib/mongo/address/ipv6.rb +1 -1
  11. data/lib/mongo/address/unix.rb +1 -1
  12. data/lib/mongo/auth.rb +1 -1
  13. data/lib/mongo/auth/cr.rb +1 -1
  14. data/lib/mongo/auth/ldap.rb +1 -1
  15. data/lib/mongo/auth/roles.rb +1 -1
  16. data/lib/mongo/auth/user.rb +1 -1
  17. data/lib/mongo/auth/user/view.rb +5 -5
  18. data/lib/mongo/auth/x509.rb +1 -1
  19. data/lib/mongo/bson.rb +1 -1
  20. data/lib/mongo/bulk_write.rb +4 -4
  21. data/lib/mongo/bulk_write/combineable.rb +1 -1
  22. data/lib/mongo/bulk_write/ordered_combiner.rb +1 -1
  23. data/lib/mongo/bulk_write/result.rb +1 -1
  24. data/lib/mongo/bulk_write/result_combiner.rb +1 -1
  25. data/lib/mongo/bulk_write/transformable.rb +1 -1
  26. data/lib/mongo/bulk_write/unordered_combiner.rb +1 -1
  27. data/lib/mongo/bulk_write/validatable.rb +1 -1
  28. data/lib/mongo/client.rb +2 -2
  29. data/lib/mongo/cluster.rb +15 -3
  30. data/lib/mongo/cluster/cursor_reaper.rb +174 -0
  31. data/lib/mongo/cluster/topology.rb +1 -1
  32. data/lib/mongo/cluster/topology/replica_set.rb +1 -1
  33. data/lib/mongo/cluster/topology/sharded.rb +1 -1
  34. data/lib/mongo/cluster/topology/single.rb +1 -1
  35. data/lib/mongo/cluster/topology/unknown.rb +1 -1
  36. data/lib/mongo/collection.rb +5 -4
  37. data/lib/mongo/collection/view.rb +4 -4
  38. data/lib/mongo/collection/view/aggregation.rb +2 -2
  39. data/lib/mongo/collection/view/builder.rb +1 -1
  40. data/lib/mongo/collection/view/builder/aggregation.rb +1 -1
  41. data/lib/mongo/collection/view/builder/find_command.rb +1 -1
  42. data/lib/mongo/collection/view/builder/flags.rb +1 -1
  43. data/lib/mongo/collection/view/builder/map_reduce.rb +1 -1
  44. data/lib/mongo/collection/view/builder/modifiers.rb +1 -1
  45. data/lib/mongo/collection/view/builder/op_query.rb +1 -1
  46. data/lib/mongo/collection/view/explainable.rb +1 -1
  47. data/lib/mongo/collection/view/immutable.rb +1 -1
  48. data/lib/mongo/collection/view/iterable.rb +2 -2
  49. data/lib/mongo/collection/view/map_reduce.rb +3 -3
  50. data/lib/mongo/collection/view/readable.rb +23 -6
  51. data/lib/mongo/collection/view/writable.rb +3 -3
  52. data/lib/mongo/cursor.rb +50 -7
  53. data/lib/mongo/cursor/builder.rb +1 -1
  54. data/lib/mongo/cursor/builder/get_more_command.rb +1 -1
  55. data/lib/mongo/cursor/builder/kill_cursors_command.rb +29 -1
  56. data/lib/mongo/cursor/builder/op_get_more.rb +1 -1
  57. data/lib/mongo/cursor/builder/op_kill_cursors.rb +29 -1
  58. data/lib/mongo/database.rb +4 -4
  59. data/lib/mongo/database/view.rb +2 -2
  60. data/lib/mongo/dbref.rb +4 -3
  61. data/lib/mongo/error.rb +1 -1
  62. data/lib/mongo/error/bulk_write_error.rb +1 -1
  63. data/lib/mongo/error/closed_stream.rb +1 -1
  64. data/lib/mongo/error/extra_file_chunk.rb +1 -1
  65. data/lib/mongo/error/file_not_found.rb +1 -1
  66. data/lib/mongo/error/invalid_bulk_operation.rb +1 -1
  67. data/lib/mongo/error/invalid_bulk_operation_type.rb +1 -1
  68. data/lib/mongo/error/invalid_collection_name.rb +1 -1
  69. data/lib/mongo/error/invalid_database_name.rb +1 -1
  70. data/lib/mongo/error/invalid_document.rb +1 -1
  71. data/lib/mongo/error/invalid_file.rb +1 -1
  72. data/lib/mongo/error/invalid_file_revision.rb +1 -1
  73. data/lib/mongo/error/invalid_nonce.rb +1 -1
  74. data/lib/mongo/error/invalid_replacement_document.rb +1 -1
  75. data/lib/mongo/error/invalid_server_preference.rb +1 -1
  76. data/lib/mongo/error/invalid_signature.rb +1 -1
  77. data/lib/mongo/error/invalid_update_document.rb +1 -1
  78. data/lib/mongo/error/invalid_uri.rb +1 -1
  79. data/lib/mongo/error/invalid_write_concern.rb +1 -1
  80. data/lib/mongo/error/max_bson_size.rb +1 -1
  81. data/lib/mongo/error/max_message_size.rb +1 -1
  82. data/lib/mongo/error/missing_file_chunk.rb +1 -1
  83. data/lib/mongo/error/multi_index_drop.rb +1 -1
  84. data/lib/mongo/error/need_primary_server.rb +1 -1
  85. data/lib/mongo/error/no_server_available.rb +4 -2
  86. data/lib/mongo/error/operation_failure.rb +1 -1
  87. data/lib/mongo/error/parser.rb +1 -1
  88. data/lib/mongo/error/socket_error.rb +1 -1
  89. data/lib/mongo/error/socket_timeout_error.rb +1 -1
  90. data/lib/mongo/error/unchangeable_collection_option.rb +1 -1
  91. data/lib/mongo/error/unexpected_chunk_length.rb +1 -1
  92. data/lib/mongo/error/unexpected_response.rb +1 -1
  93. data/lib/mongo/error/unsupported_features.rb +1 -1
  94. data/lib/mongo/event.rb +1 -1
  95. data/lib/mongo/event/description_changed.rb +1 -1
  96. data/lib/mongo/event/publisher.rb +1 -1
  97. data/lib/mongo/event/subscriber.rb +1 -1
  98. data/lib/mongo/grid.rb +1 -1
  99. data/lib/mongo/grid/file.rb +6 -2
  100. data/lib/mongo/grid/file/chunk.rb +6 -4
  101. data/lib/mongo/grid/file/info.rb +7 -3
  102. data/lib/mongo/grid/fs_bucket.rb +12 -6
  103. data/lib/mongo/grid/stream.rb +1 -1
  104. data/lib/mongo/grid/stream/read.rb +2 -4
  105. data/lib/mongo/grid/stream/write.rb +4 -3
  106. data/lib/mongo/index.rb +1 -1
  107. data/lib/mongo/index/view.rb +5 -4
  108. data/lib/mongo/loggable.rb +1 -1
  109. data/lib/mongo/logger.rb +1 -1
  110. data/lib/mongo/monitoring.rb +1 -1
  111. data/lib/mongo/operation.rb +1 -1
  112. data/lib/mongo/operation/commands.rb +1 -1
  113. data/lib/mongo/operation/commands/aggregate.rb +7 -7
  114. data/lib/mongo/operation/commands/aggregate/result.rb +1 -1
  115. data/lib/mongo/operation/commands/collections_info.rb +10 -9
  116. data/lib/mongo/operation/commands/collections_info/result.rb +1 -1
  117. data/lib/mongo/operation/commands/command.rb +1 -1
  118. data/lib/mongo/operation/commands/indexes.rb +12 -11
  119. data/lib/mongo/operation/commands/list_collections.rb +1 -1
  120. data/lib/mongo/operation/commands/list_collections/result.rb +1 -1
  121. data/lib/mongo/operation/commands/list_indexes.rb +1 -1
  122. data/lib/mongo/operation/commands/list_indexes/result.rb +1 -1
  123. data/lib/mongo/operation/commands/map_reduce.rb +1 -1
  124. data/lib/mongo/operation/commands/map_reduce/result.rb +1 -1
  125. data/lib/mongo/operation/commands/user_query.rb +11 -10
  126. data/lib/mongo/operation/commands/users_info.rb +2 -2
  127. data/lib/mongo/operation/commands/users_info/result.rb +1 -1
  128. data/lib/mongo/operation/executable.rb +8 -7
  129. data/lib/mongo/operation/kill_cursors.rb +2 -2
  130. data/lib/mongo/operation/limited.rb +1 -1
  131. data/lib/mongo/operation/read.rb +1 -1
  132. data/lib/mongo/operation/read/get_more.rb +2 -2
  133. data/lib/mongo/operation/read/query.rb +1 -1
  134. data/lib/mongo/operation/read/query/result.rb +1 -1
  135. data/lib/mongo/operation/read_preference.rb +10 -10
  136. data/lib/mongo/operation/result.rb +1 -1
  137. data/lib/mongo/operation/specifiable.rb +2 -2
  138. data/lib/mongo/operation/write.rb +1 -1
  139. data/lib/mongo/operation/write/bulk.rb +1 -1
  140. data/lib/mongo/operation/write/bulk/bulkable.rb +9 -9
  141. data/lib/mongo/operation/write/bulk/delete.rb +3 -3
  142. data/lib/mongo/operation/write/bulk/delete/result.rb +1 -1
  143. data/lib/mongo/operation/write/bulk/insert.rb +5 -5
  144. data/lib/mongo/operation/write/bulk/insert/result.rb +1 -1
  145. data/lib/mongo/operation/write/bulk/legacy_mergable.rb +1 -1
  146. data/lib/mongo/operation/write/bulk/mergable.rb +1 -1
  147. data/lib/mongo/operation/write/bulk/update.rb +3 -3
  148. data/lib/mongo/operation/write/bulk/update/result.rb +1 -1
  149. data/lib/mongo/operation/write/command.rb +1 -1
  150. data/lib/mongo/operation/write/command/create_index.rb +1 -1
  151. data/lib/mongo/operation/write/command/create_user.rb +1 -1
  152. data/lib/mongo/operation/write/command/delete.rb +1 -1
  153. data/lib/mongo/operation/write/command/drop_index.rb +1 -1
  154. data/lib/mongo/operation/write/command/insert.rb +11 -1
  155. data/lib/mongo/operation/write/command/remove_user.rb +1 -1
  156. data/lib/mongo/operation/write/command/update.rb +1 -1
  157. data/lib/mongo/operation/write/command/update_user.rb +1 -1
  158. data/lib/mongo/operation/write/command/writable.rb +7 -6
  159. data/lib/mongo/operation/write/create_index.rb +1 -1
  160. data/lib/mongo/operation/write/create_user.rb +1 -1
  161. data/lib/mongo/operation/write/delete.rb +1 -1
  162. data/lib/mongo/operation/write/delete/result.rb +1 -1
  163. data/lib/mongo/operation/write/drop_index.rb +5 -5
  164. data/lib/mongo/operation/write/gle.rb +3 -3
  165. data/lib/mongo/operation/write/idable.rb +1 -1
  166. data/lib/mongo/operation/write/insert.rb +5 -5
  167. data/lib/mongo/operation/write/insert/result.rb +1 -1
  168. data/lib/mongo/operation/write/remove_user.rb +1 -1
  169. data/lib/mongo/operation/write/update.rb +1 -1
  170. data/lib/mongo/operation/write/update/result.rb +1 -1
  171. data/lib/mongo/operation/write/update_user.rb +1 -1
  172. data/lib/mongo/operation/write/write_command_enabled.rb +10 -9
  173. data/lib/mongo/protocol/bit_vector.rb +2 -2
  174. data/lib/mongo/protocol/delete.rb +1 -1
  175. data/lib/mongo/protocol/get_more.rb +1 -1
  176. data/lib/mongo/protocol/insert.rb +5 -1
  177. data/lib/mongo/protocol/kill_cursors.rb +1 -1
  178. data/lib/mongo/protocol/message.rb +9 -5
  179. data/lib/mongo/protocol/query.rb +1 -1
  180. data/lib/mongo/protocol/reply.rb +1 -1
  181. data/lib/mongo/protocol/serializers.rb +8 -8
  182. data/lib/mongo/protocol/update.rb +1 -1
  183. data/lib/mongo/server.rb +40 -3
  184. data/lib/mongo/server/connectable.rb +1 -1
  185. data/lib/mongo/server/connection.rb +4 -2
  186. data/lib/mongo/server/connection_pool.rb +1 -1
  187. data/lib/mongo/server/connection_pool/queue.rb +1 -1
  188. data/lib/mongo/server/context.rb +3 -1
  189. data/lib/mongo/server/description.rb +1 -1
  190. data/lib/mongo/server/description/inspector/description_changed.rb +1 -1
  191. data/lib/mongo/server/monitor.rb +1 -1
  192. data/lib/mongo/server_selector.rb +2 -1
  193. data/lib/mongo/server_selector/nearest.rb +1 -1
  194. data/lib/mongo/server_selector/primary.rb +1 -1
  195. data/lib/mongo/server_selector/primary_preferred.rb +1 -1
  196. data/lib/mongo/server_selector/secondary.rb +1 -1
  197. data/lib/mongo/server_selector/secondary_preferred.rb +1 -1
  198. data/lib/mongo/server_selector/selectable.rb +12 -7
  199. data/lib/mongo/socket.rb +1 -1
  200. data/lib/mongo/socket/ssl.rb +1 -1
  201. data/lib/mongo/socket/tcp.rb +1 -1
  202. data/lib/mongo/socket/unix.rb +1 -1
  203. data/lib/mongo/uri.rb +1 -1
  204. data/lib/mongo/version.rb +2 -2
  205. data/lib/mongo/write_concern/acknowledged.rb +1 -1
  206. data/lib/mongo/write_concern/normalizable.rb +1 -1
  207. data/lib/mongo/write_concern/unacknowledged.rb +1 -1
  208. data/mongo.gemspec +1 -1
  209. data/spec/mongo/client_spec.rb +2 -2
  210. data/spec/mongo/cluster/cursor_reaper_spec.rb +216 -0
  211. data/spec/mongo/cluster_spec.rb +36 -5
  212. data/spec/mongo/collection/view/aggregation_spec.rb +2 -2
  213. data/spec/mongo/collection/view/map_reduce_spec.rb +2 -2
  214. data/spec/mongo/collection/view/readable_spec.rb +203 -5
  215. data/spec/mongo/collection/view_spec.rb +10 -0
  216. data/spec/mongo/collection_spec.rb +64 -18
  217. data/spec/mongo/cursor_spec.rb +89 -0
  218. data/spec/mongo/database_spec.rb +79 -13
  219. data/spec/mongo/grid/fs_bucket_spec.rb +119 -1
  220. data/spec/mongo/grid/stream/write_spec.rb +63 -12
  221. data/spec/mongo/index/view_spec.rb +19 -0
  222. data/spec/mongo/operation/commands/aggregate_spec.rb +10 -7
  223. data/spec/mongo/operation/commands/collections_info_spec.rb +1 -1
  224. data/spec/mongo/operation/commands/command_spec.rb +3 -3
  225. data/spec/mongo/operation/commands/indexes_spec.rb +1 -1
  226. data/spec/mongo/operation/commands/map_reduce_spec.rb +2 -2
  227. data/spec/mongo/operation/kill_cursors_spec.rb +10 -19
  228. data/spec/mongo/operation/read/get_more_spec.rb +13 -25
  229. data/spec/mongo/operation/read/query_spec.rb +26 -30
  230. data/spec/mongo/operation/read_preference_spec.rb +11 -11
  231. data/spec/mongo/operation/specifiable_spec.rb +31 -0
  232. data/spec/mongo/operation/write/bulk/delete_spec.rb +16 -18
  233. data/spec/mongo/operation/write/bulk/insert_spec.rb +17 -18
  234. data/spec/mongo/operation/write/bulk/update_spec.rb +20 -25
  235. data/spec/mongo/operation/write/command/delete_spec.rb +26 -32
  236. data/spec/mongo/operation/write/command/insert_spec.rb +24 -31
  237. data/spec/mongo/operation/write/command/update_spec.rb +24 -32
  238. data/spec/mongo/operation/write/create_index_spec.rb +4 -4
  239. data/spec/mongo/operation/write/create_user_spec.rb +3 -3
  240. data/spec/mongo/operation/write/delete_spec.rb +51 -22
  241. data/spec/mongo/operation/write/drop_index_spec.rb +2 -2
  242. data/spec/mongo/operation/write/insert_spec.rb +42 -11
  243. data/spec/mongo/operation/write/remove_user_spec.rb +4 -4
  244. data/spec/mongo/operation/write/update_spec.rb +34 -6
  245. data/spec/mongo/operation/write/update_user_spec.rb +1 -1
  246. data/spec/mongo/server/connection_spec.rb +22 -14
  247. data/spec/mongo/server_selection_spec.rb +2 -2
  248. data/spec/mongo/server_selector/nearest_spec.rb +4 -4
  249. data/spec/mongo/server_selector/primary_preferred_spec.rb +4 -4
  250. data/spec/mongo/server_selector/primary_spec.rb +2 -2
  251. data/spec/mongo/server_selector/secondary_preferred_spec.rb +4 -4
  252. data/spec/mongo/server_selector/secondary_spec.rb +3 -3
  253. data/spec/mongo/server_selector_spec.rb +82 -3
  254. data/spec/mongo/server_spec.rb +0 -20
  255. data/spec/support/command_monitoring.rb +1 -1
  256. data/spec/support/connection_string.rb +1 -1
  257. data/spec/support/crud.rb +1 -1
  258. data/spec/support/crud/read.rb +1 -1
  259. data/spec/support/crud/write.rb +1 -1
  260. data/spec/support/gridfs.rb +1 -1
  261. data/spec/support/shared/server_selector.rb +3 -3
  262. metadata +7 -10
  263. metadata.gz.sig +0 -0
  264. data/lib/csasl/csasl.bundle +0 -0
  265. data/spec/mongo/operation/write/response_spec.rb +0 -85
  266. data/spec/support/shared/operation.rb +0 -100
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2015 MongoDB, Inc.
1
+ # Copyright (C) 2014-2016 MongoDB, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2015 MongoDB, Inc.
1
+ # Copyright (C) 2014-2016 MongoDB, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2015 MongoDB, Inc.
1
+ # Copyright (C) 2014-2016 MongoDB, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2015 MongoDB, Inc.
1
+ # Copyright (C) 2014-2016 MongoDB, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2015 MongoDB, Inc.
1
+ # Copyright (C) 2015-2016 MongoDB, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2015 MongoDB, Inc.
1
+ # Copyright (C) 2014-2016 MongoDB, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -112,8 +112,7 @@ module Mongo
112
112
  #
113
113
  # @since 2.0.0
114
114
  def read_preference
115
- @read_preference ||= options[:read] ? ServerSelector.get(client.options.merge(options[:read])) :
116
- database.read_preference
115
+ @read_preference ||= ServerSelector.get(options[:read] || database.read_preference)
117
116
  end
118
117
 
119
118
  # Get the write concern on this collection.
@@ -269,6 +268,7 @@ module Mongo
269
268
  # @option options [ Integer ] :limit The maximum number of documents to count.
270
269
  # @option options [ Integer ] :max_time_ms The maximum amount of time to allow the command to run.
271
270
  # @option options [ Integer ] :skip The number of documents to skip before counting.
271
+ # @option options [ Hash ] :read The read preference options.
272
272
  #
273
273
  # @return [ Integer ] The document count.
274
274
  #
@@ -287,6 +287,7 @@ module Mongo
287
287
  # @param [ Hash ] options The distinct command options.
288
288
  #
289
289
  # @option options [ Integer ] :max_time_ms The maximum amount of time to allow the command to run.
290
+ # @option options [ Hash ] :read The read preference options.
290
291
  #
291
292
  # @return [ Array<Object> ] The list of distinct values.
292
293
  #
@@ -343,7 +344,7 @@ module Mongo
343
344
  :bypass_document_validation => !!options[:bypass_document_validation],
344
345
  :options => options,
345
346
  :id_generator => client.options[:id_generator]
346
- ).execute(next_primary.context)
347
+ ).execute(next_primary)
347
348
  end
348
349
  end
349
350
 
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2015 MongoDB, Inc.
1
+ # Copyright (C) 2014-2016 MongoDB, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -132,7 +132,7 @@ module Mongo
132
132
  def initialize(collection, filter = {}, options = {})
133
133
  validate_doc!(filter)
134
134
  @collection = collection
135
- parse_parameters!(BSON::Document.new(filter.freeze), BSON::Document.new(options.freeze))
135
+ parse_parameters!(BSON::Document.new(filter), BSON::Document.new(options))
136
136
  end
137
137
 
138
138
  # Get a human-readable string representation of +View+.
@@ -159,8 +159,8 @@ module Mongo
159
159
  def parse_parameters!(filter, options)
160
160
  query = filter.delete(QUERY)
161
161
  modifiers = (filter || {}).merge(options.delete(MODIFIERS) || {})
162
- @filter = query || filter
163
- @options = Builder::Modifiers.map_driver_options(modifiers).merge!(options)
162
+ @filter = (query || filter).freeze
163
+ @options = Builder::Modifiers.map_driver_options(modifiers).merge!(options).freeze
164
164
  end
165
165
 
166
166
  def new(options)
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2015 MongoDB, Inc.
1
+ # Copyright (C) 2014-2016 MongoDB, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -115,7 +115,7 @@ module Mongo
115
115
  log_warn(REROUTE)
116
116
  server = cluster.next_primary(false)
117
117
  end
118
- initial_query_op.execute(server.context)
118
+ initial_query_op.execute(server)
119
119
  end
120
120
  end
121
121
  end
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2015 MongoDB, Inc.
1
+ # Copyright (C) 2015-2016 MongoDB, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2015 MongoDB, Inc.
1
+ # Copyright (C) 2015-2016 MongoDB, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2015 MongoDB, Inc.
1
+ # Copyright (C) 2015-2016 MongoDB, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2015 MongoDB, Inc.
1
+ # Copyright (C) 2015-2016 MongoDB, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2015 MongoDB, Inc.
1
+ # Copyright (C) 2015-2016 MongoDB, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2015 MongoDB, Inc.
1
+ # Copyright (C) 2015-2016 MongoDB, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2015 MongoDB, Inc.
1
+ # Copyright (C) 2015-2016 MongoDB, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2015 MongoDB, Inc.
1
+ # Copyright (C) 2014-2016 MongoDB, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2015 MongoDB, Inc.
1
+ # Copyright (C) 2014-2016 MongoDB, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2015 MongoDB, Inc.
1
+ # Copyright (C) 2014-2016 MongoDB, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -77,7 +77,7 @@ module Mongo
77
77
  end
78
78
 
79
79
  def send_initial_query(server)
80
- initial_query_op(server).execute(server.context)
80
+ initial_query_op(server).execute(server)
81
81
  end
82
82
  end
83
83
  end
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2015 MongoDB, Inc.
1
+ # Copyright (C) 2014-2016 MongoDB, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -211,7 +211,7 @@ module Mongo
211
211
  log_warn(REROUTE)
212
212
  server = cluster.next_primary(false)
213
213
  end
214
- result = initial_query_op.execute(server.context)
214
+ result = initial_query_op.execute(server)
215
215
  inline? ? result : send_fetch_query(server)
216
216
  end
217
217
 
@@ -232,7 +232,7 @@ module Mongo
232
232
  end
233
233
 
234
234
  def send_fetch_query(server)
235
- fetch_query_op(server).execute(server.context)
235
+ fetch_query_op(server).execute(server)
236
236
  end
237
237
  end
238
238
  end
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2015 MongoDB, Inc.
1
+ # Copyright (C) 2014-2016 MongoDB, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -120,6 +120,7 @@ module Mongo
120
120
  # @option options :limit [ Integer ] Max number of docs to return.
121
121
  # @option options :max_time_ms [ Integer ] The maximum amount of time to allow the
122
122
  # command to run.
123
+ # @option options [ Hash ] :read The read preference options.
123
124
  #
124
125
  # @return [ Integer ] The document count.
125
126
  #
@@ -132,6 +133,7 @@ module Mongo
132
133
  cmd[:maxTimeMS] = options[:max_time_ms] if options[:max_time_ms]
133
134
  cmd[:readConcern] = collection.read_concern if collection.read_concern
134
135
  read_with_retry do
136
+ options = options.merge(read: read) unless options[:read]
135
137
  database.command(cmd, options).n.to_i
136
138
  end
137
139
  end
@@ -146,7 +148,7 @@ module Mongo
146
148
  #
147
149
  # @option options :max_time_ms [ Integer ] The maximum amount of time to allow the
148
150
  # command to run.
149
- # @option options :read [ Hash ] The read preference for this command.
151
+ # @option options [ Hash ] :read The read preference options.
150
152
  #
151
153
  # @return [ Array<Object> ] The list of distinct values.
152
154
  #
@@ -158,6 +160,7 @@ module Mongo
158
160
  cmd[:maxTimeMS] = options[:max_time_ms] if options[:max_time_ms]
159
161
  cmd[:readConcern] = collection.read_concern if collection.read_concern
160
162
  read_with_retry do
163
+ options = options.merge(read: read) unless options[:read]
161
164
  database.command(cmd, options).first['values']
162
165
  end
163
166
  end
@@ -293,7 +296,7 @@ module Mongo
293
296
  # @since 2.0.0
294
297
  def read(value = nil)
295
298
  return default_read if value.nil?
296
- selector = value.is_a?(Hash) ? ServerSelector.get(client.options.merge(value)) : value
299
+ selector = ServerSelector.get(value)
297
300
  configure(:read, selector)
298
301
  end
299
302
 
@@ -416,6 +419,20 @@ module Mongo
416
419
  configure(:max_time_ms, max)
417
420
  end
418
421
 
422
+ # The type of cursor to use. Can be :tailable or :tailable_await.
423
+ #
424
+ # @example Set the cursor type.
425
+ # view.cursor_type(:tailable)
426
+ #
427
+ # @param [ :tailable, :tailable_await ] type The cursor type.
428
+ #
429
+ # @return [ :tailable, :tailable_await, View ] Either the cursor type setting or a new +View+.
430
+ #
431
+ # @since 2.3.0
432
+ def cursor_type(type = nil)
433
+ configure(:cursor_type, type)
434
+ end
435
+
419
436
  private
420
437
 
421
438
  def default_read
@@ -429,19 +446,19 @@ module Mongo
429
446
  :db_name => database.name,
430
447
  :cursor_count => cursor_count,
431
448
  :read_concern => collection.read_concern
432
- ).execute(server.context).cursor_ids.map do |cursor_id|
449
+ ).execute(server).cursor_ids.map do |cursor_id|
433
450
  result = if server.features.find_command_enabled?
434
451
  Operation::Commands::GetMore.new({
435
452
  :selector => { :getMore => cursor_id, :collection => collection.name },
436
453
  :db_name => database.name
437
- }).execute(server.context)
454
+ }).execute(server)
438
455
  else
439
456
  Operation::Read::GetMore.new({
440
457
  :to_return => 0,
441
458
  :cursor_id => cursor_id,
442
459
  :db_name => database.name,
443
460
  :coll_name => collection.name
444
- }).execute(server.context)
461
+ }).execute(server)
445
462
  end
446
463
  Cursor.new(self, result, server)
447
464
  end
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2015 MongoDB, Inc.
1
+ # Copyright (C) 2014-2016 MongoDB, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -191,7 +191,7 @@ module Mongo
191
191
  :db_name => collection.database.name,
192
192
  :coll_name => collection.name,
193
193
  :write_concern => collection.write_concern
194
- ).execute(next_primary.context)
194
+ ).execute(next_primary)
195
195
  end
196
196
  end
197
197
 
@@ -206,7 +206,7 @@ module Mongo
206
206
  :coll_name => collection.name,
207
207
  :write_concern => collection.write_concern,
208
208
  :bypass_document_validation => !!opts[:bypass_document_validation]
209
- ).execute(next_primary.context)
209
+ ).execute(next_primary)
210
210
  end
211
211
  end
212
212
  end
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2015 MongoDB, Inc.
1
+ # Copyright (C) 2014-2016 MongoDB, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -57,6 +57,31 @@ module Mongo
57
57
  @server = server
58
58
  @initial_result = result
59
59
  @remaining = limit if limited?
60
+ @cursor_id = result.cursor_id
61
+ register
62
+ ObjectSpace.define_finalizer(self, self.class.finalize(result.cursor_id,
63
+ cluster,
64
+ kill_cursors_op_spec,
65
+ server))
66
+ end
67
+
68
+
69
+ # Finalize the cursor for garbage collection. Schedules this cursor to be included
70
+ # in a killCursors operation executed by the Cluster's CursorReaper.
71
+ #
72
+ # @example Finalize the cursor.
73
+ # Cursor.finalize(id, cluster, op, server)
74
+ #
75
+ # @param [ Integer ] cursor_id The cursor's id.
76
+ # @param [ Mongo::Cluster ] cluster The cluster associated with this cursor and its server.
77
+ # @param [ Hash ] op_spec The killCursors operation specification.
78
+ # @param [ Mongo::Server ] server The server to send the killCursors operation to.
79
+ #
80
+ # @return [ Proc ] The Finalizer.
81
+ #
82
+ # @since 2.3.0
83
+ def self.finalize(cursor_id, cluster, op_spec, server)
84
+ proc { cluster.schedule_kill_cursor(cursor_id, op_spec, server) }
60
85
  end
61
86
 
62
87
  # Get a human-readable string representation of +Cursor+.
@@ -160,7 +185,7 @@ module Mongo
160
185
 
161
186
  def get_more
162
187
  read_with_retry do
163
- process(get_more_operation.execute(@server.context))
188
+ process(get_more_operation.execute(@server))
164
189
  end
165
190
  end
166
191
 
@@ -173,16 +198,25 @@ module Mongo
173
198
  end
174
199
 
175
200
  def kill_cursors
176
- read_with_retry do
177
- kill_cursors_operation.execute(@server.context)
201
+ unregister
202
+ read_with_one_retry do
203
+ kill_cursors_operation.execute(@server)
178
204
  end
179
205
  end
180
206
 
181
207
  def kill_cursors_operation
182
208
  if @server.features.find_command_enabled?
183
- Operation::Commands::Command.new(Builder::KillCursorsCommand.new(self).specification)
209
+ Operation::Commands::Command.new(kill_cursors_op_spec)
210
+ else
211
+ Operation::KillCursors.new(kill_cursors_op_spec)
212
+ end
213
+ end
214
+
215
+ def kill_cursors_op_spec
216
+ if @server.features.find_command_enabled?
217
+ Builder::KillCursorsCommand.new(self).specification
184
218
  else
185
- Operation::KillCursors.new(Builder::OpKillCursors.new(self).specification)
219
+ Builder::OpKillCursors.new(self).specification
186
220
  end
187
221
  end
188
222
 
@@ -196,13 +230,22 @@ module Mongo
196
230
 
197
231
  def process(result)
198
232
  @remaining -= result.returned_count if limited?
199
- @cursor_id = result.cursor_id
200
233
  @coll_name ||= result.namespace.sub("#{database.name}.", '') if result.namespace
234
+ unregister if result.cursor_id == 0
235
+ @cursor_id = result.cursor_id
201
236
  result.documents
202
237
  end
203
238
 
204
239
  def use_limit?
205
240
  limited? && batch_size >= @remaining
206
241
  end
242
+
243
+ def register
244
+ cluster.register_cursor(@cursor_id)
245
+ end
246
+
247
+ def unregister
248
+ cluster.unregister_cursor(@cursor_id)
249
+ end
207
250
  end
208
251
  end
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2015 MongoDB, Inc.
1
+ # Copyright (C) 2015-2016 MongoDB, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2015 MongoDB, Inc.
1
+ # Copyright (C) 2015-2016 MongoDB, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2015 MongoDB, Inc.
1
+ # Copyright (C) 2015-2016 MongoDB, Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -56,6 +56,34 @@ module Mongo
56
56
  def kill_cursors_command
57
57
  { :killCursors => collection_name, :cursors => [ cursor.id ] }
58
58
  end
59
+
60
+ class << self
61
+
62
+ # Update a specification's list of cursor ids.
63
+ #
64
+ # @example Update a specification's list of cursor ids.
65
+ # KillCursorsCommand.update_cursors(spec, ids)
66
+ #
67
+ # @return [ Hash ] The specification.
68
+ # @return [ Array ] The ids to update with.
69
+ #
70
+ # @since 2.3.0
71
+ def update_cursors(spec, ids)
72
+ spec[:selector].merge!(cursors: spec[:selector][:cursors] & ids)
73
+ end
74
+
75
+ # Get the list of cursor ids from a spec generated by this Builder.
76
+ #
77
+ # @example Get the list of cursor ids.
78
+ # KillCursorsCommand.cursors(spec)
79
+ #
80
+ # @return [ Hash ] The specification.
81
+ #
82
+ # @since 2.3.0
83
+ def get_cursors_list(spec)
84
+ spec[:selector][:cursors]
85
+ end
86
+ end
59
87
  end
60
88
  end
61
89
  end