mongo 2.1.0.beta → 2.1.0.rc0

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 (253) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/Rakefile +2 -2
  5. data/lib/mongo.rb +2 -3
  6. data/lib/mongo/address.rb +7 -5
  7. data/lib/mongo/address/unix.rb +2 -2
  8. data/lib/mongo/auth/ldap/conversation.rb +6 -2
  9. data/lib/mongo/auth/scram/conversation.rb +8 -2
  10. data/lib/mongo/auth/user/view.rb +21 -0
  11. data/lib/mongo/bulk_write.rb +155 -23
  12. data/lib/mongo/bulk_write/combineable.rb +51 -0
  13. data/lib/mongo/bulk_write/ordered_combiner.rb +55 -0
  14. data/lib/mongo/bulk_write/result.rb +61 -8
  15. data/lib/mongo/bulk_write/result_combiner.rb +117 -0
  16. data/lib/mongo/bulk_write/transformable.rb +117 -0
  17. data/lib/mongo/bulk_write/unordered_combiner.rb +52 -0
  18. data/lib/mongo/bulk_write/validatable.rb +62 -0
  19. data/lib/mongo/client.rb +7 -3
  20. data/lib/mongo/cluster.rb +3 -3
  21. data/lib/mongo/cluster/topology/replica_set.rb +8 -6
  22. data/lib/mongo/cluster/topology/unknown.rb +5 -2
  23. data/lib/mongo/collection.rb +75 -4
  24. data/lib/mongo/collection/view.rb +1 -2
  25. data/lib/mongo/collection/view/aggregation.rb +13 -8
  26. data/lib/mongo/collection/view/immutable.rb +6 -6
  27. data/lib/mongo/collection/view/iterable.rb +13 -4
  28. data/lib/mongo/collection/view/map_reduce.rb +22 -17
  29. data/lib/mongo/collection/view/readable.rb +121 -70
  30. data/lib/mongo/cursor.rb +5 -1
  31. data/lib/mongo/database.rb +3 -3
  32. data/lib/mongo/database/view.rb +1 -1
  33. data/lib/mongo/error.rb +7 -0
  34. data/lib/mongo/{bulk_write/unordered_bulk_write.rb → error/closed_stream.rb} +12 -21
  35. data/lib/mongo/{bulk_write/ordered_bulk_write.rb → error/extra_file_chunk.rb} +13 -27
  36. data/lib/mongo/error/file_not_found.rb +37 -0
  37. data/lib/mongo/error/invalid_file.rb +2 -2
  38. data/lib/mongo/error/invalid_file_revision.rb +37 -0
  39. data/lib/mongo/error/invalid_uri.rb +5 -4
  40. data/lib/mongo/error/missing_file_chunk.rb +38 -0
  41. data/lib/mongo/error/operation_failure.rb +1 -1
  42. data/lib/mongo/error/unchangeable_collection_option.rb +38 -0
  43. data/lib/mongo/error/unexpected_chunk_length.rb +39 -0
  44. data/lib/mongo/grid.rb +2 -1
  45. data/lib/mongo/grid/file.rb +12 -9
  46. data/lib/mongo/grid/file/chunk.rb +6 -6
  47. data/lib/mongo/grid/file/{metadata.rb → info.rb} +41 -39
  48. data/lib/mongo/grid/fs_bucket.rb +441 -0
  49. data/lib/mongo/grid/stream.rb +64 -0
  50. data/lib/mongo/grid/stream/read.rb +208 -0
  51. data/lib/mongo/grid/stream/write.rb +187 -0
  52. data/lib/mongo/index/view.rb +1 -1
  53. data/lib/mongo/loggable.rb +34 -57
  54. data/lib/mongo/logger.rb +16 -78
  55. data/lib/mongo/monitoring.rb +1 -5
  56. data/lib/mongo/monitoring/command_log_subscriber.rb +35 -17
  57. data/lib/mongo/monitoring/event/command_succeeded.rb +20 -1
  58. data/lib/mongo/monitoring/publishable.rb +22 -12
  59. data/lib/mongo/operation.rb +3 -6
  60. data/lib/mongo/operation/commands.rb +24 -0
  61. data/lib/mongo/operation/{aggregate.rb → commands/aggregate.rb} +3 -41
  62. data/lib/mongo/operation/{aggregate → commands/aggregate}/result.rb +0 -0
  63. data/lib/mongo/operation/commands/collections_info.rb +66 -0
  64. data/lib/mongo/operation/{command.rb → commands/command.rb} +2 -18
  65. data/lib/mongo/operation/commands/indexes.rb +70 -0
  66. data/lib/mongo/operation/commands/list_collections.rb +54 -0
  67. data/lib/mongo/operation/commands/list_collections/result.rb +112 -0
  68. data/lib/mongo/operation/commands/list_indexes.rb +56 -0
  69. data/lib/mongo/operation/commands/list_indexes/result.rb +115 -0
  70. data/lib/mongo/operation/{map_reduce.rb → commands/map_reduce.rb} +3 -41
  71. data/lib/mongo/operation/{map_reduce → commands/map_reduce}/result.rb +0 -0
  72. data/lib/mongo/operation/{parallel_scan.rb → commands/parallel_scan.rb} +3 -23
  73. data/lib/mongo/operation/{parallel_scan → commands/parallel_scan}/result.rb +0 -0
  74. data/lib/mongo/operation/commands/user_query.rb +69 -0
  75. data/lib/mongo/operation/commands/users_info.rb +53 -0
  76. data/lib/mongo/operation/commands/users_info/result.rb +36 -0
  77. data/lib/mongo/operation/executable.rb +4 -68
  78. data/lib/mongo/operation/kill_cursors.rb +3 -3
  79. data/lib/mongo/operation/read.rb +0 -4
  80. data/lib/mongo/operation/read/get_more.rb +2 -22
  81. data/lib/mongo/operation/read/query.rb +2 -21
  82. data/lib/mongo/operation/{read_preferrable.rb → read_preference.rb} +3 -2
  83. data/lib/mongo/operation/specifiable.rb +24 -0
  84. data/lib/mongo/operation/write.rb +2 -0
  85. data/lib/mongo/operation/write/bulk.rb +6 -3
  86. data/lib/mongo/operation/write/bulk/bulkable.rb +82 -0
  87. data/lib/mongo/operation/write/bulk/delete.rb +71 -0
  88. data/lib/mongo/operation/write/bulk/delete/result.rb +74 -0
  89. data/lib/mongo/operation/write/bulk/insert.rb +96 -0
  90. data/lib/mongo/operation/write/bulk/insert/result.rb +129 -0
  91. data/lib/mongo/operation/write/bulk/legacy_mergable.rb +87 -0
  92. data/lib/mongo/operation/write/bulk/mergable.rb +71 -0
  93. data/lib/mongo/operation/write/bulk/update.rb +81 -0
  94. data/lib/mongo/operation/write/bulk/update/result.rb +174 -0
  95. data/lib/mongo/operation/write/command/create_index.rb +0 -1
  96. data/lib/mongo/operation/write/command/create_user.rb +0 -1
  97. data/lib/mongo/operation/write/command/delete.rb +0 -1
  98. data/lib/mongo/operation/write/command/drop_index.rb +0 -1
  99. data/lib/mongo/operation/write/command/insert.rb +0 -1
  100. data/lib/mongo/operation/write/command/remove_user.rb +0 -1
  101. data/lib/mongo/operation/write/command/update.rb +0 -1
  102. data/lib/mongo/operation/write/command/update_user.rb +0 -1
  103. data/lib/mongo/operation/write/command/writable.rb +13 -18
  104. data/lib/mongo/operation/write/create_index.rb +4 -27
  105. data/lib/mongo/operation/write/create_user.rb +4 -30
  106. data/lib/mongo/operation/write/delete.rb +5 -28
  107. data/lib/mongo/operation/write/drop_index.rb +3 -3
  108. data/lib/mongo/operation/write/gle.rb +48 -0
  109. data/lib/mongo/operation/write/idable.rb +5 -0
  110. data/lib/mongo/operation/write/insert.rb +2 -24
  111. data/lib/mongo/operation/write/remove_user.rb +4 -27
  112. data/lib/mongo/operation/write/update.rb +4 -32
  113. data/lib/mongo/operation/write/update_user.rb +4 -30
  114. data/lib/mongo/operation/write/write_command_enabled.rb +53 -0
  115. data/lib/mongo/options/mapper.rb +4 -2
  116. data/lib/mongo/protocol/delete.rb +68 -3
  117. data/lib/mongo/protocol/get_more.rb +54 -2
  118. data/lib/mongo/protocol/insert.rb +59 -1
  119. data/lib/mongo/protocol/kill_cursors.rb +53 -4
  120. data/lib/mongo/protocol/message.rb +12 -12
  121. data/lib/mongo/protocol/query.rb +139 -65
  122. data/lib/mongo/protocol/reply.rb +69 -1
  123. data/lib/mongo/protocol/update.rb +70 -1
  124. data/lib/mongo/server/connection.rb +11 -3
  125. data/lib/mongo/server/description.rb +29 -0
  126. data/lib/mongo/server/description/features.rb +2 -1
  127. data/lib/mongo/server/monitor.rb +2 -2
  128. data/lib/mongo/server_selector.rb +14 -10
  129. data/lib/mongo/server_selector/selectable.rb +24 -22
  130. data/lib/mongo/socket.rb +6 -3
  131. data/lib/mongo/socket/tcp.rb +2 -2
  132. data/lib/mongo/socket/unix.rb +5 -8
  133. data/lib/mongo/uri.rb +243 -139
  134. data/lib/mongo/version.rb +1 -1
  135. data/spec/mongo/address/unix_spec.rb +1 -1
  136. data/spec/mongo/address_spec.rb +25 -0
  137. data/spec/mongo/auth/ldap/conversation_spec.rb +43 -0
  138. data/spec/mongo/auth/user/view_spec.rb +26 -1
  139. data/spec/mongo/bulk_write/ordered_combiner_spec.rb +271 -0
  140. data/spec/mongo/bulk_write/unordered_combiner_spec.rb +239 -0
  141. data/spec/mongo/bulk_write_spec.rb +332 -166
  142. data/spec/mongo/client_spec.rb +25 -0
  143. data/spec/mongo/cluster/topology/replica_set_spec.rb +2 -0
  144. data/spec/mongo/collection/view/aggregation_spec.rb +65 -0
  145. data/spec/mongo/collection/view/immutable_spec.rb +103 -0
  146. data/spec/mongo/collection/view/map_reduce_spec.rb +98 -3
  147. data/spec/mongo/collection/view/readable_spec.rb +17 -30
  148. data/spec/mongo/collection/view_spec.rb +233 -7
  149. data/spec/mongo/collection_spec.rb +360 -18
  150. data/spec/mongo/command_monitoring_spec.rb +51 -0
  151. data/spec/mongo/connection_string_spec.rb +137 -0
  152. data/spec/mongo/database_spec.rb +27 -11
  153. data/spec/mongo/grid/file/chunk_spec.rb +5 -5
  154. data/spec/mongo/grid/file/{metadata_spec.rb → info_spec.rb} +29 -17
  155. data/spec/mongo/grid/file_spec.rb +8 -8
  156. data/spec/mongo/grid/fs_bucket_spec.rb +1020 -0
  157. data/spec/mongo/grid/stream/read_spec.rb +275 -0
  158. data/spec/mongo/grid/stream/write_spec.rb +440 -0
  159. data/spec/mongo/grid/stream_spec.rb +48 -0
  160. data/spec/mongo/gridfs_spec.rb +50 -0
  161. data/spec/mongo/logger_spec.rb +0 -40
  162. data/spec/mongo/monitoring/command_log_subscriber_spec.rb +76 -0
  163. data/spec/mongo/operation/{aggregate_spec.rb → commands/aggregate_spec.rb} +0 -42
  164. data/spec/mongo/operation/{read → commands}/collections_info_spec.rb +1 -1
  165. data/spec/mongo/operation/{command_spec.rb → commands/command_spec.rb} +0 -0
  166. data/spec/mongo/operation/{read → commands}/indexes_spec.rb +1 -1
  167. data/spec/mongo/operation/{map_reduce_spec.rb → commands/map_reduce_spec.rb} +0 -18
  168. data/spec/mongo/operation/kill_cursors_spec.rb +1 -1
  169. data/spec/mongo/operation/{read_preferrable_spec.rb → read_preference_spec.rb} +11 -11
  170. data/spec/mongo/operation/write/bulk/{bulk_delete_spec.rb → delete_spec.rb} +1 -12
  171. data/spec/mongo/operation/write/bulk/{bulk_insert_spec.rb → insert_spec.rb} +1 -12
  172. data/spec/mongo/operation/write/bulk/{bulk_update_spec.rb → update_spec.rb} +1 -12
  173. data/spec/mongo/operation/write/insert_spec.rb +0 -11
  174. data/spec/mongo/protocol/kill_cursors_spec.rb +5 -3
  175. data/spec/mongo/server/description_spec.rb +42 -0
  176. data/spec/mongo/server/monitor_spec.rb +21 -0
  177. data/spec/mongo/server_discovery_and_monitoring_spec.rb +1 -0
  178. data/spec/mongo/server_selection_spec.rb +3 -3
  179. data/spec/mongo/server_selector/nearest_spec.rb +34 -27
  180. data/spec/mongo/server_selector/primary_preferred_spec.rb +31 -30
  181. data/spec/mongo/server_selector/primary_spec.rb +14 -13
  182. data/spec/mongo/server_selector/secondary_preferred_spec.rb +27 -26
  183. data/spec/mongo/server_selector/secondary_spec.rb +23 -22
  184. data/spec/mongo/server_selector_spec.rb +87 -24
  185. data/spec/mongo/socket/unix_spec.rb +52 -0
  186. data/spec/mongo/uri_spec.rb +251 -39
  187. data/spec/spec_helper.rb +11 -4
  188. data/spec/support/authorization.rb +4 -5
  189. data/spec/support/command_monitoring.rb +365 -0
  190. data/spec/support/command_monitoring/bulkWrite.yml +73 -0
  191. data/spec/support/command_monitoring/command.yml +42 -0
  192. data/spec/support/command_monitoring/deleteMany.yml +55 -0
  193. data/spec/support/command_monitoring/deleteOne.yml +55 -0
  194. data/spec/support/command_monitoring/find.yml +219 -0
  195. data/spec/support/command_monitoring/insertMany.yml +81 -0
  196. data/spec/support/command_monitoring/insertOne.yml +51 -0
  197. data/spec/support/command_monitoring/updateMany.yml +67 -0
  198. data/spec/support/command_monitoring/updateOne.yml +95 -0
  199. data/spec/support/connection_string.rb +228 -0
  200. data/spec/support/connection_string_tests/invalid-uris.yml +193 -0
  201. data/spec/support/connection_string_tests/valid-auth.yml +256 -0
  202. data/spec/support/connection_string_tests/valid-host_identifiers.yml +121 -0
  203. data/spec/support/connection_string_tests/valid-options.yml +30 -0
  204. data/spec/support/connection_string_tests/valid-unix_socket-absolute.yml +197 -0
  205. data/spec/support/connection_string_tests/valid-unix_socket-relative.yml +213 -0
  206. data/spec/support/connection_string_tests/valid-warnings.yml +55 -0
  207. data/spec/support/crud.rb +3 -1
  208. data/spec/support/crud/read.rb +14 -10
  209. data/spec/support/crud/write.rb +36 -9
  210. data/spec/support/gridfs.rb +637 -0
  211. data/spec/support/gridfs_tests/delete.yml +157 -0
  212. data/spec/support/gridfs_tests/download.yml +210 -0
  213. data/spec/support/gridfs_tests/download_by_name.yml +113 -0
  214. data/spec/support/gridfs_tests/upload.yml +158 -0
  215. data/spec/support/sdam/rs/equal_electionids.yml +1 -2
  216. data/spec/support/sdam/rs/new_primary_new_electionid.yml +0 -3
  217. data/spec/support/sdam/rs/primary_mismatched_me.yml +37 -0
  218. data/spec/support/sdam/rs/primary_to_no_primary_mismatched_me.yml +75 -0
  219. data/spec/support/sdam/rs/secondary_mismatched_me.yml +37 -0
  220. data/spec/support/sdam/single/direct_connection_rsarbiter.yml +1 -1
  221. data/spec/support/sdam/single/direct_connection_rsprimary.yml +1 -1
  222. data/spec/support/sdam/single/direct_connection_rssecondary.yml +1 -1
  223. data/spec/support/sdam/single/direct_connection_slave.yml +1 -1
  224. data/spec/support/sdam/single/direct_connection_standalone.yml +1 -1
  225. data/spec/support/sdam/single/not_ok_response.yml +0 -1
  226. data/spec/support/server_discovery_and_monitoring.rb +3 -1
  227. data/spec/support/server_selection.rb +3 -1
  228. data/spec/support/shared/bulk_write.rb +192 -0
  229. data/spec/support/shared/server_selector.rb +21 -12
  230. metadata +147 -57
  231. metadata.gz.sig +0 -0
  232. data/lib/mongo/bulk_write/bulk_writable.rb +0 -252
  233. data/lib/mongo/bulk_write/deletable.rb +0 -57
  234. data/lib/mongo/bulk_write/insertable.rb +0 -49
  235. data/lib/mongo/bulk_write/replacable.rb +0 -58
  236. data/lib/mongo/bulk_write/updatable.rb +0 -69
  237. data/lib/mongo/grid/fs.rb +0 -146
  238. data/lib/mongo/operation/list_collections/result.rb +0 -114
  239. data/lib/mongo/operation/list_indexes/result.rb +0 -118
  240. data/lib/mongo/operation/read/collections_info.rb +0 -68
  241. data/lib/mongo/operation/read/indexes.rb +0 -69
  242. data/lib/mongo/operation/read/list_collections.rb +0 -76
  243. data/lib/mongo/operation/read/list_indexes.rb +0 -78
  244. data/lib/mongo/operation/write/bulk/bulk_delete.rb +0 -145
  245. data/lib/mongo/operation/write/bulk/bulk_delete/result.rb +0 -75
  246. data/lib/mongo/operation/write/bulk/bulk_insert.rb +0 -132
  247. data/lib/mongo/operation/write/bulk/bulk_insert/result.rb +0 -130
  248. data/lib/mongo/operation/write/bulk/bulk_mergable.rb +0 -67
  249. data/lib/mongo/operation/write/bulk/bulk_update.rb +0 -154
  250. data/lib/mongo/operation/write/bulk/bulk_update/result.rb +0 -174
  251. data/lib/mongo/operation/write/bulk/legacy_bulk_mergable.rb +0 -83
  252. data/spec/mongo/grid/fs_spec.rb +0 -160
  253. data/spec/mongo/loggable_spec.rb +0 -63
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b6616ddb03b3417535c99796a74defa18bb90777
4
- data.tar.gz: 300c32fe7122805036f67b387f0bb68648a8b759
3
+ metadata.gz: 3a265ed462b59e6b5130e74d96dcd8fd03bd1cf8
4
+ data.tar.gz: df80f1545fc13f8cbbbaa41b7b2994a396eea58d
5
5
  SHA512:
6
- metadata.gz: 8046a19889e6f15481690eca65e8696834925bb7c1727a387af1d29e22fc63cb2d2640d5ddebf48e80d641e518dfc5a753d3a79713f655cccbbdba94215da1f3
7
- data.tar.gz: 50f48316c5d9b17cb516467609667b5792472dbd0cbd43accc70c62a99ead9bdee595679f9d9b564db865606bbb55d7fc81176dd1669e0abd5c696803bd01132
6
+ metadata.gz: f8fda95db660cc8690ebb838e7bc037614b34c67e03cb8a397dc9c467acbc27d2b8b39ff9af9ec396a03d86ab4e818dd4f3a333744e2727b7e0612d7e7069f30
7
+ data.tar.gz: 5845e5ca349dea175a1001e696d0df2600578cb7163bd236eefa4700f9492ee247feccbd46f9c2ef5e1400e31050629738820c824da69fe25f70dff4f86b7465
checksums.yaml.gz.sig CHANGED
Binary file
data.tar.gz.sig CHANGED
Binary file
data/Rakefile CHANGED
@@ -29,8 +29,8 @@ namespace :spec do
29
29
  end
30
30
 
31
31
  task :release => :spec do
32
- system "git tag -a #{Mongo::VERSION} -m 'Tagging release: #{Mongo::VERSION}'"
33
- system "git push --tags"
32
+ #system "git tag -a #{Mongo::VERSION} -m 'Tagging release: #{Mongo::VERSION}'"
33
+ #system "git push --tags"
34
34
  system "gem build mongo.gemspec"
35
35
  system "gem push mongo-#{Mongo::VERSION}.gem"
36
36
  system "rm mongo-#{Mongo::VERSION}.gem"
data/lib/mongo.rb CHANGED
@@ -15,14 +15,14 @@
15
15
  require 'forwardable'
16
16
  require 'bson'
17
17
  require 'openssl'
18
- require 'mongo/monitoring'
19
18
  require 'mongo/loggable'
19
+ require 'mongo/monitoring'
20
20
  require 'mongo/logger'
21
+ require 'mongo/operation'
21
22
  require 'mongo/error'
22
23
  require 'mongo/event'
23
24
  require 'mongo/address'
24
25
  require 'mongo/auth'
25
- require 'mongo/bulk_write'
26
26
  require 'mongo/client'
27
27
  require 'mongo/cluster'
28
28
  require 'mongo/collection'
@@ -31,7 +31,6 @@ require 'mongo/database'
31
31
  require 'mongo/dbref'
32
32
  require 'mongo/grid'
33
33
  require 'mongo/index'
34
- require 'mongo/operation'
35
34
  require 'mongo/options'
36
35
  require 'mongo/protocol'
37
36
  require 'mongo/server'
data/lib/mongo/address.rb CHANGED
@@ -144,14 +144,16 @@ module Mongo
144
144
  private
145
145
 
146
146
  def initialize_resolver!(timeout, ssl_options)
147
+ return Unix.new(seed.downcase) if seed.downcase =~ Unix::MATCH
148
+
147
149
  family = (host == 'localhost') ? ::Socket::AF_INET : ::Socket::AF_UNSPEC
148
150
  error = nil
149
- ::Socket.getaddrinfo(host, nil, family, ::Socket::SOCK_STREAM).detect do |info|
151
+ ::Socket.getaddrinfo(host, nil, family, ::Socket::SOCK_STREAM).each do |info|
150
152
  begin
151
- return FAMILY_MAP[info[4]].new(info[3], port, host).tap do |res|
152
- res.socket(timeout, ssl_options).connect!
153
- end
154
- rescue IOError, SystemCallError => e
153
+ res = FAMILY_MAP[info[4]].new(info[3], port, host)
154
+ res.socket(timeout, ssl_options).connect!.close
155
+ return res
156
+ rescue IOError, SystemCallError, Error::SocketError => e
155
157
  error = e
156
158
  end
157
159
  end
@@ -60,7 +60,7 @@ module Mongo
60
60
  # Get a socket for the provided address type, given the options.
61
61
  #
62
62
  # @example Get a Unix socket.
63
- # ipv4.socket(5)
63
+ # address.socket(5)
64
64
  #
65
65
  # @param [ Float ] timeout The socket timeout.
66
66
  # @param [ Hash ] ssl_options SSL options - ignored.
@@ -69,7 +69,7 @@ module Mongo
69
69
  #
70
70
  # @since 2.0.0
71
71
  def socket(timeout, ssl_options = {})
72
- Socket::Unix.new(host, timeout, Socket::AF_UNIX)
72
+ Socket::Unix.new(host, timeout)
73
73
  end
74
74
  end
75
75
  end
@@ -25,7 +25,7 @@ module Mongo
25
25
  # The login message.
26
26
  #
27
27
  # @since 2.0.0
28
- LOGIN = { authenticate: 1, digestPassword: false }.freeze
28
+ LOGIN = { saslStart: 1, autoAuthorize: 1 }.freeze
29
29
 
30
30
  # @return [ Protocol::Reply ] reply The current reply in the
31
31
  # conversation.
@@ -63,7 +63,7 @@ module Mongo
63
63
  Protocol::Query.new(
64
64
  Auth::EXTERNAL,
65
65
  Database::COMMAND,
66
- LOGIN.merge(user: user.name, password: user.password, mechanism: LDAP::MECHANISM),
66
+ LOGIN.merge(payload: payload, mechanism: LDAP::MECHANISM),
67
67
  limit: -1
68
68
  )
69
69
  end
@@ -82,6 +82,10 @@ module Mongo
82
82
 
83
83
  private
84
84
 
85
+ def payload
86
+ BSON::Binary.new("\x00#{user.name}\x00#{user.password}")
87
+ end
88
+
85
89
  def validate!(reply)
86
90
  raise Unauthorized.new(user) if reply.documents[0]['ok'] != 1
87
91
  @reply = reply
@@ -417,7 +417,7 @@ module Mongo
417
417
  #
418
418
  # @since 2.0.0
419
419
  def without_proof
420
- @withoout_proof ||= "c=biws,r=#{rnonce}"
420
+ @without_proof ||= "c=biws,r=#{rnonce}"
421
421
  end
422
422
 
423
423
  # XOR operation for two strings.
@@ -429,9 +429,15 @@ module Mongo
429
429
  first.bytes.zip(second.bytes).map{ |(a,b)| (a ^ b).chr }.join('')
430
430
  end
431
431
 
432
+ def compare_digest(a, b)
433
+ check = a.bytesize ^ b.bytesize
434
+ a.bytes.zip(b.bytes){ |x, y| check |= x ^ y.to_i }
435
+ check == 0
436
+ end
437
+
432
438
  def validate_final_message!(reply)
433
439
  validate!(reply)
434
- unless verifier == server_signature
440
+ unless compare_digest(verifier, server_signature)
435
441
  raise Error::InvalidSignature.new(verifier, server_signature)
436
442
  end
437
443
  end
@@ -95,8 +95,29 @@ module Mongo
95
95
  ).execute(next_primary.context)
96
96
  end
97
97
 
98
+ # Get info for a particular user in the database.
99
+ #
100
+ # @example Get a particular user's info.
101
+ # view.info('emily')
102
+ #
103
+ # @param [ String ] name The user name.
104
+ #
105
+ # @return [ Hash ] A document containing information on a particular user.
106
+ #
107
+ # @since 2.1.0
108
+ def info(name)
109
+ user_query(name).documents
110
+ end
111
+
98
112
  private
99
113
 
114
+ def user_query(name)
115
+ Operation::UserQuery.new(
116
+ user_name: name,
117
+ db_name: database.name
118
+ ).execute(next_primary.context)
119
+ end
120
+
100
121
  def generate(user, options)
101
122
  user.is_a?(String) ? Auth::User.new({ user: user }.merge(options)) : user
102
123
  end
@@ -12,42 +12,174 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- require 'mongo/bulk_write/bulk_writable'
16
- require 'mongo/bulk_write/ordered_bulk_write'
17
- require 'mongo/bulk_write/unordered_bulk_write'
18
15
  require 'mongo/bulk_write/result'
16
+ require 'mongo/bulk_write/transformable'
17
+ require 'mongo/bulk_write/validatable'
18
+ require 'mongo/bulk_write/combineable'
19
+ require 'mongo/bulk_write/ordered_combiner'
20
+ require 'mongo/bulk_write/unordered_combiner'
21
+ require 'mongo/bulk_write/result_combiner'
19
22
 
20
23
  module Mongo
21
- module BulkWrite
22
- extend self
24
+ class BulkWrite
25
+ extend Forwardable
23
26
 
24
- # Get a bulk write object either of type ordered or unordered.
27
+ # @return [ Mongo::Collection ] collection The collection.
28
+ attr_reader :collection
29
+
30
+ # @return [ Array<Hash, BSON::Document> ] requests The requests.
31
+ attr_reader :requests
32
+
33
+ # @return [ Hash, BSON::Document ] options The options.
34
+ attr_reader :options
35
+
36
+ # Delegate various methods to the collection.
37
+ def_delegators :@collection, :database, :cluster, :next_primary
38
+
39
+ # Execute the bulk write operation.
40
+ #
41
+ # @example Execute the bulk write.
42
+ # bulk_write.execute
43
+ #
44
+ # @return [ Mongo::BulkWrite::Result ] The result.
45
+ #
46
+ # @since 2.1.0
47
+ def execute
48
+ server = next_primary
49
+ operation_id = Monitoring.next_operation_id
50
+ result_combiner = ResultCombiner.new
51
+ operations.each do |operation|
52
+ execute_operation(
53
+ operation.keys.first,
54
+ operation.values.first,
55
+ server,
56
+ operation_id,
57
+ result_combiner
58
+ )
59
+ end
60
+ result_combiner.result
61
+ end
62
+
63
+ # Create the new bulk write operation.
25
64
  #
26
- # @example Get a bulk write object.
27
- # Mongo::BulkWrite.get(collection, operations, ordered: true)
65
+ # @api private
28
66
  #
29
- # @param [ Collection ] collection The collection on which the operations
30
- # will be executed.
67
+ # @example Create an ordered bulk write.
68
+ # Mongo::BulkWrite.new(collection, [{ insert_one: { _id: 1 }}])
31
69
  #
32
- # @param [ Array<Hash> ] operations The operations to execute.
70
+ # @example Create an unordered bulk write.
71
+ # Mongo::BulkWrite.new(collection, [{ insert_one: { _id: 1 }}], ordered: false)
33
72
  #
34
- # @param [ Hash ] options The options for the bulk write object.
73
+ # @example Create an ordered mixed bulk write.
74
+ # Mongo::BulkWrite.new(
75
+ # collection,
76
+ # [
77
+ # { insert_one: { _id: 1 }},
78
+ # { update_one: { filter: { _id: 0 }, update: { '$set' => { name: 'test' }}}},
79
+ # { delete_one: { filter: { _id: 2 }}}
80
+ # ]
81
+ # )
82
+ #
83
+ # @param [ Mongo::Collection ] collection The collection.
84
+ # @param [ Array<Hash, BSON::Document> ] requests The requests.
85
+ # @param [ Hash, BSON::Document ] options The options.
86
+ #
87
+ # @since 2.1.0
88
+ def initialize(collection, requests, options = {})
89
+ @collection = collection
90
+ @requests = requests
91
+ @options = options || {}
92
+ end
93
+
94
+ # Is the bulk write ordered?
95
+ #
96
+ # @api private
97
+ #
98
+ # @example Is the bulk write ordered?
99
+ # bulk_write.ordered?
100
+ #
101
+ # @return [ true, false ] If the bulk write is ordered.
102
+ #
103
+ # @since 2.1.0
104
+ def ordered?
105
+ @ordered ||= options.fetch(:ordered, true)
106
+ end
107
+
108
+ # Get the write concern for the bulk write.
35
109
  #
36
- # @option options [ true, false ] :ordered Whether the operations
37
- # should be executed in order.
38
- # @option options [ Hash ] :write_concern The write concern options.
39
- # Can be :w => Integer, :fsync => Boolean, :j => Boolean.
110
+ # @api private
40
111
  #
41
- # @return [ OrderedBulkWrite, UnorderedBulkWrite ] The appropriate bulk
42
- # write object.
112
+ # @example Get the write concern.
113
+ # bulk_write.write_concern
43
114
  #
44
- # @since 2.0.0
45
- def get(collection, operations, options)
46
- if options.fetch(:ordered, true)
47
- OrderedBulkWrite.new(collection, operations, options)
115
+ # @return [ WriteConcern ] The write concern.
116
+ #
117
+ # @since 2.1.0
118
+ def write_concern
119
+ @write_concern ||= options[:write_concern] ?
120
+ WriteConcern.get(options[:write_concern]) : collection.write_concern
121
+ end
122
+
123
+ private
124
+
125
+ def base_spec(operation_id)
126
+ {
127
+ :db_name => database.name,
128
+ :coll_name => collection.name,
129
+ :write_concern => write_concern,
130
+ :ordered => ordered?,
131
+ :operation_id => operation_id
132
+ }
133
+ end
134
+
135
+ def execute_operation(name, values, server, operation_id, combiner)
136
+ begin
137
+ if values.size > server.max_write_batch_size
138
+ split_execute(name, values, server, operation_id, combiner)
139
+ else
140
+ combiner.combine!(send(name, values, server, operation_id), values.size)
141
+ end
142
+ rescue Error::MaxBSONSize, Error::MaxMessageSize => e
143
+ split_execute(name, values, server, operation_id, combiner)
144
+ end
145
+ end
146
+
147
+ def operations
148
+ if ordered?
149
+ OrderedCombiner.new(requests).combine
48
150
  else
49
- UnorderedBulkWrite.new(collection, operations, options)
151
+ UnorderedCombiner.new(requests).combine
50
152
  end
51
153
  end
154
+
155
+ def split_execute(name, values, server, operation_id, combiner)
156
+ execute_operation(name, values.shift(values.size / 2), server, operation_id, combiner)
157
+ execute_operation(name, values, server, operation_id, combiner)
158
+ end
159
+
160
+ def delete(documents, server, operation_id)
161
+ Operation::Write::Bulk::Delete.new(
162
+ base_spec(operation_id).merge(:deletes => documents)
163
+ ).execute(server.context)
164
+ end
165
+
166
+ alias :delete_one :delete
167
+ alias :delete_many :delete
168
+
169
+ def insert_one(documents, server, operation_id)
170
+ Operation::Write::Bulk::Insert.new(
171
+ base_spec(operation_id).merge(:documents => documents)
172
+ ).execute(server.context)
173
+ end
174
+
175
+ def update(documents, server, operation_id)
176
+ Operation::Write::Bulk::Update.new(
177
+ base_spec(operation_id).merge(:updates => documents)
178
+ ).execute(server.context)
179
+ end
180
+
181
+ alias :replace_one :update
182
+ alias :update_one :update
183
+ alias :update_many :update
52
184
  end
53
185
  end
@@ -0,0 +1,51 @@
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 BulkWrite
17
+
18
+ # Defines behaviour around combiners
19
+ #
20
+ # @api private
21
+ #
22
+ # @since 2.1.0
23
+ module Combineable
24
+
25
+ # @return [ Array<Hash, BSON::Document> ] requests The provided requests.
26
+ attr_reader :requests
27
+
28
+ # Create the ordered combiner.
29
+ #
30
+ # @api private
31
+ #
32
+ # @example Create the ordered combiner.
33
+ # OrderedCombiner.new([{ insert_one: { _id: 0 }}])
34
+ #
35
+ # @param [ Array<Hash, BSON::Document> ] requests The bulk requests.
36
+ #
37
+ # @since 2.1.0
38
+ def initialize(requests)
39
+ @requests = requests
40
+ end
41
+
42
+ private
43
+
44
+ def combine_requests(ops)
45
+ requests.reduce(ops) do |operations, request|
46
+ add(operations, request.keys.first, request.values.first)
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,55 @@
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 BulkWrite
17
+
18
+ # Combines groups of bulk write operations in order.
19
+ #
20
+ # @api private
21
+ #
22
+ # @since 2.1.0
23
+ class OrderedCombiner
24
+ include Transformable
25
+ include Validatable
26
+ include Combineable
27
+
28
+ # Combine the requests in order.
29
+ #
30
+ # @api private
31
+ #
32
+ # @example Combine the requests.
33
+ # combiner.combine
34
+ #
35
+ # @return [ Array<Hash> ] The combined requests.
36
+ #
37
+ # @since 2.1.0
38
+ def combine
39
+ combine_requests([])
40
+ end
41
+
42
+ private
43
+
44
+ def add(operations, name, document)
45
+ operations.push({ name => []}) if next_group?(name, operations)
46
+ operations[-1][name].push(transform(name, document))
47
+ operations
48
+ end
49
+
50
+ def next_group?(name, operations)
51
+ !operations[-1] || !operations[-1].key?(name)
52
+ end
53
+ end
54
+ end
55
+ end