mongo 2.0.6 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (317) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +5 -2
  3. data/lib/mongo/address/ipv4.rb +6 -1
  4. data/lib/mongo/address/unix.rb +2 -2
  5. data/lib/mongo/address.rb +18 -10
  6. data/lib/mongo/auth/cr/conversation.rb +1 -1
  7. data/lib/mongo/auth/ldap/conversation.rb +7 -3
  8. data/lib/mongo/auth/scram/conversation.rb +9 -3
  9. data/lib/mongo/auth/user/view.rb +23 -2
  10. data/lib/mongo/auth/x509/conversation.rb +1 -1
  11. data/lib/mongo/bulk_write/combineable.rb +51 -0
  12. data/lib/mongo/bulk_write/ordered_combiner.rb +55 -0
  13. data/lib/mongo/bulk_write/result.rb +191 -0
  14. data/lib/mongo/bulk_write/result_combiner.rb +117 -0
  15. data/lib/mongo/bulk_write/transformable.rb +132 -0
  16. data/lib/mongo/bulk_write/unordered_combiner.rb +52 -0
  17. data/lib/mongo/bulk_write/validatable.rb +62 -0
  18. data/lib/mongo/bulk_write.rb +159 -23
  19. data/lib/mongo/client.rb +52 -16
  20. data/lib/mongo/cluster/topology/replica_set.rb +27 -9
  21. data/lib/mongo/cluster/topology/sharded.rb +1 -1
  22. data/lib/mongo/cluster/topology/unknown.rb +5 -2
  23. data/lib/mongo/cluster.rb +42 -7
  24. data/lib/mongo/collection/view/aggregation.rb +48 -9
  25. data/lib/mongo/collection/view/immutable.rb +6 -6
  26. data/lib/mongo/collection/view/iterable.rb +18 -4
  27. data/lib/mongo/collection/view/map_reduce.rb +58 -17
  28. data/lib/mongo/collection/view/readable.rb +173 -42
  29. data/lib/mongo/collection/view/writable.rb +37 -23
  30. data/lib/mongo/collection/view.rb +2 -2
  31. data/lib/mongo/collection.rb +370 -33
  32. data/lib/mongo/cursor.rb +15 -3
  33. data/lib/mongo/database/view.rb +5 -4
  34. data/lib/mongo/database.rb +14 -4
  35. data/lib/mongo/dbref.rb +113 -0
  36. data/lib/mongo/error/closed_stream.rb +34 -0
  37. data/lib/mongo/error/extra_file_chunk.rb +34 -0
  38. data/lib/mongo/error/{invalid_uri_option.rb → file_not_found.rb} +11 -12
  39. data/lib/mongo/error/invalid_file.rb +2 -2
  40. data/lib/mongo/error/invalid_file_revision.rb +37 -0
  41. data/lib/mongo/error/invalid_uri.rb +5 -4
  42. data/lib/mongo/error/missing_file_chunk.rb +38 -0
  43. data/lib/mongo/error/operation_failure.rb +1 -1
  44. data/lib/mongo/error/parser.rb +1 -1
  45. data/lib/mongo/error/unchangeable_collection_option.rb +38 -0
  46. data/lib/mongo/error/unexpected_chunk_length.rb +39 -0
  47. data/lib/mongo/error.rb +13 -2
  48. data/lib/mongo/event/description_changed.rb +1 -1
  49. data/lib/mongo/grid/file/chunk.rb +6 -6
  50. data/lib/mongo/grid/file/{metadata.rb → info.rb} +41 -39
  51. data/lib/mongo/grid/file.rb +13 -10
  52. data/lib/mongo/grid/fs_bucket.rb +448 -0
  53. data/lib/mongo/grid/stream/read.rb +208 -0
  54. data/lib/mongo/grid/stream/write.rb +187 -0
  55. data/lib/mongo/grid/stream.rb +64 -0
  56. data/lib/mongo/grid.rb +2 -1
  57. data/lib/mongo/index/view.rb +3 -3
  58. data/lib/mongo/index.rb +5 -0
  59. data/lib/mongo/loggable.rb +34 -57
  60. data/lib/mongo/logger.rb +16 -78
  61. data/lib/mongo/monitoring/command_log_subscriber.rb +112 -0
  62. data/lib/mongo/monitoring/event/command_failed.rb +96 -0
  63. data/lib/mongo/monitoring/event/command_started.rb +89 -0
  64. data/lib/mongo/monitoring/event/command_succeeded.rb +118 -0
  65. data/lib/mongo/monitoring/event/secure.rb +58 -0
  66. data/lib/mongo/monitoring/event.rb +18 -0
  67. data/lib/mongo/monitoring/publishable.rb +106 -0
  68. data/lib/mongo/monitoring.rb +195 -0
  69. data/lib/mongo/operation/{aggregate.rb → commands/aggregate.rb} +3 -41
  70. data/lib/mongo/operation/commands/collections_info/result.rb +39 -0
  71. data/lib/mongo/operation/commands/collections_info.rb +68 -0
  72. data/lib/mongo/operation/{command.rb → commands/command.rb} +2 -18
  73. data/lib/mongo/operation/commands/indexes.rb +70 -0
  74. data/lib/mongo/operation/commands/list_collections/result.rb +112 -0
  75. data/lib/mongo/operation/commands/list_collections.rb +54 -0
  76. data/lib/mongo/operation/commands/list_indexes/result.rb +116 -0
  77. data/lib/mongo/operation/commands/list_indexes.rb +56 -0
  78. data/lib/mongo/operation/{map_reduce → commands/map_reduce}/result.rb +1 -1
  79. data/lib/mongo/operation/{map_reduce.rb → commands/map_reduce.rb} +3 -41
  80. data/lib/mongo/operation/commands/parallel_scan/result.rb +72 -0
  81. data/lib/mongo/operation/commands/parallel_scan.rb +56 -0
  82. data/lib/mongo/operation/commands/user_query.rb +69 -0
  83. data/lib/mongo/{bulk_write/ordered_bulk_write.rb → operation/commands/users_info/result.rb} +18 -30
  84. data/lib/mongo/operation/commands/users_info.rb +53 -0
  85. data/lib/mongo/operation/commands.rb +24 -0
  86. data/lib/mongo/operation/executable.rb +4 -68
  87. data/lib/mongo/operation/kill_cursors.rb +3 -3
  88. data/lib/mongo/operation/read/get_more.rb +2 -22
  89. data/lib/mongo/{bulk_write/unordered_bulk_write.rb → operation/read/query/result.rb} +20 -26
  90. data/lib/mongo/operation/read/query.rb +4 -21
  91. data/lib/mongo/operation/read.rb +0 -4
  92. data/lib/mongo/operation/{read_preferrable.rb → read_preference.rb} +3 -2
  93. data/lib/mongo/operation/result.rb +13 -1
  94. data/lib/mongo/operation/specifiable.rb +42 -0
  95. data/lib/mongo/operation/write/bulk/bulkable.rb +82 -0
  96. data/lib/mongo/operation/write/bulk/delete/result.rb +74 -0
  97. data/lib/mongo/operation/write/bulk/delete.rb +71 -0
  98. data/lib/mongo/operation/write/bulk/insert/result.rb +129 -0
  99. data/lib/mongo/operation/write/bulk/insert.rb +96 -0
  100. data/lib/mongo/operation/write/bulk/legacy_mergable.rb +87 -0
  101. data/lib/mongo/operation/write/bulk/mergable.rb +71 -0
  102. data/lib/mongo/operation/write/bulk/update/result.rb +174 -0
  103. data/lib/mongo/operation/write/bulk/update.rb +81 -0
  104. data/lib/mongo/operation/write/bulk.rb +6 -3
  105. data/lib/mongo/operation/write/command/create_index.rb +0 -1
  106. data/lib/mongo/operation/write/command/create_user.rb +0 -1
  107. data/lib/mongo/operation/write/command/delete.rb +0 -1
  108. data/lib/mongo/operation/write/command/drop_index.rb +0 -1
  109. data/lib/mongo/operation/write/command/insert.rb +0 -1
  110. data/lib/mongo/operation/write/command/remove_user.rb +0 -1
  111. data/lib/mongo/operation/write/command/update.rb +0 -1
  112. data/lib/mongo/operation/write/command/update_user.rb +0 -1
  113. data/lib/mongo/operation/write/command/writable.rb +13 -18
  114. data/lib/mongo/operation/write/create_index.rb +4 -27
  115. data/lib/mongo/operation/write/create_user.rb +4 -30
  116. data/lib/mongo/operation/write/delete.rb +6 -29
  117. data/lib/mongo/operation/write/drop_index.rb +3 -3
  118. data/lib/mongo/operation/write/gle.rb +48 -0
  119. data/lib/mongo/operation/write/idable.rb +5 -0
  120. data/lib/mongo/operation/write/insert.rb +2 -24
  121. data/lib/mongo/operation/write/remove_user.rb +4 -27
  122. data/lib/mongo/operation/write/update.rb +13 -36
  123. data/lib/mongo/operation/write/update_user.rb +4 -30
  124. data/lib/mongo/operation/write/write_command_enabled.rb +53 -0
  125. data/lib/mongo/operation/write.rb +2 -0
  126. data/lib/mongo/operation.rb +32 -4
  127. data/lib/mongo/options/mapper.rb +4 -2
  128. data/lib/mongo/options/redacted.rb +156 -0
  129. data/lib/mongo/options.rb +1 -0
  130. data/lib/mongo/protocol/delete.rb +75 -15
  131. data/lib/mongo/protocol/get_more.rb +65 -13
  132. data/lib/mongo/protocol/insert.rb +85 -13
  133. data/lib/mongo/protocol/kill_cursors.rb +59 -14
  134. data/lib/mongo/protocol/message.rb +12 -12
  135. data/lib/mongo/protocol/query.rb +163 -37
  136. data/lib/mongo/protocol/reply.rb +103 -0
  137. data/lib/mongo/protocol/serializers.rb +1 -1
  138. data/lib/mongo/protocol/update.rb +82 -14
  139. data/lib/mongo/retryable.rb +83 -0
  140. data/lib/mongo/server/connectable.rb +21 -25
  141. data/lib/mongo/server/connection.rb +75 -4
  142. data/lib/mongo/server/connection_pool/queue.rb +15 -0
  143. data/lib/mongo/server/connection_pool.rb +12 -0
  144. data/lib/mongo/server/description/features.rb +2 -1
  145. data/lib/mongo/server/description.rb +52 -1
  146. data/lib/mongo/server/monitor/connection.rb +26 -2
  147. data/lib/mongo/server/monitor.rb +19 -3
  148. data/lib/mongo/server.rb +39 -5
  149. data/lib/mongo/server_selector/selectable.rb +40 -31
  150. data/lib/mongo/server_selector.rb +19 -10
  151. data/lib/mongo/socket/ssl.rb +28 -16
  152. data/lib/mongo/socket/tcp.rb +3 -3
  153. data/lib/mongo/socket/unix.rb +5 -8
  154. data/lib/mongo/socket.rb +11 -4
  155. data/lib/mongo/uri.rb +248 -137
  156. data/lib/mongo/version.rb +1 -1
  157. data/lib/mongo.rb +5 -3
  158. data/spec/mongo/address/unix_spec.rb +1 -1
  159. data/spec/mongo/address_spec.rb +25 -0
  160. data/spec/mongo/auth/cr_spec.rb +9 -1
  161. data/spec/mongo/auth/ldap/conversation_spec.rb +43 -0
  162. data/spec/mongo/auth/ldap_spec.rb +9 -1
  163. data/spec/mongo/auth/scram_spec.rb +9 -1
  164. data/spec/mongo/auth/user/view_spec.rb +26 -1
  165. data/spec/mongo/auth/x509_spec.rb +9 -1
  166. data/spec/mongo/bulk_write/ordered_combiner_spec.rb +271 -0
  167. data/spec/mongo/bulk_write/unordered_combiner_spec.rb +239 -0
  168. data/spec/mongo/bulk_write_spec.rb +428 -0
  169. data/spec/mongo/client_spec.rb +167 -17
  170. data/spec/mongo/cluster/topology/replica_set_spec.rb +18 -9
  171. data/spec/mongo/cluster/topology/sharded_spec.rb +11 -3
  172. data/spec/mongo/cluster/topology/single_spec.rb +12 -4
  173. data/spec/mongo/cluster_spec.rb +55 -10
  174. data/spec/mongo/collection/view/aggregation_spec.rb +188 -1
  175. data/spec/mongo/collection/view/explainable_spec.rb +1 -1
  176. data/spec/mongo/collection/view/immutable_spec.rb +103 -0
  177. data/spec/mongo/collection/view/map_reduce_spec.rb +99 -4
  178. data/spec/mongo/collection/view/readable_spec.rb +238 -6
  179. data/spec/mongo/collection/view/writable_spec.rb +4 -4
  180. data/spec/mongo/collection/view_spec.rb +459 -71
  181. data/spec/mongo/collection_spec.rb +1291 -9
  182. data/spec/mongo/command_monitoring_spec.rb +51 -0
  183. data/spec/mongo/connection_string_spec.rb +115 -0
  184. data/spec/mongo/crud_spec.rb +2 -2
  185. data/spec/mongo/cursor_spec.rb +3 -3
  186. data/spec/mongo/database_spec.rb +47 -11
  187. data/spec/mongo/dbref_spec.rb +149 -0
  188. data/spec/mongo/grid/file/chunk_spec.rb +5 -5
  189. data/spec/mongo/grid/file/{metadata_spec.rb → info_spec.rb} +29 -17
  190. data/spec/mongo/grid/file_spec.rb +8 -8
  191. data/spec/mongo/grid/fs_bucket_spec.rb +1020 -0
  192. data/spec/mongo/grid/stream/read_spec.rb +275 -0
  193. data/spec/mongo/grid/stream/write_spec.rb +440 -0
  194. data/spec/mongo/grid/stream_spec.rb +48 -0
  195. data/spec/mongo/gridfs_spec.rb +50 -0
  196. data/spec/mongo/logger_spec.rb +0 -40
  197. data/spec/mongo/monitoring/command_log_subscriber_spec.rb +76 -0
  198. data/spec/mongo/monitoring/event/command_started_spec.rb +26 -0
  199. data/spec/mongo/monitoring/event/command_succeeded_spec.rb +26 -0
  200. data/spec/mongo/monitoring/event/secure_spec.rb +57 -0
  201. data/spec/mongo/monitoring_spec.rb +168 -0
  202. data/spec/mongo/operation/commands/aggregate_spec.rb +69 -0
  203. data/spec/mongo/operation/{read → commands}/collections_info_spec.rb +1 -1
  204. data/spec/mongo/operation/{command_spec.rb → commands/command_spec.rb} +0 -18
  205. data/spec/mongo/operation/{read → commands}/indexes_spec.rb +1 -1
  206. data/spec/mongo/operation/{map_reduce_spec.rb → commands/map_reduce_spec.rb} +1 -19
  207. data/spec/mongo/operation/kill_cursors_spec.rb +1 -17
  208. data/spec/mongo/operation/read/get_more_spec.rb +0 -16
  209. data/spec/mongo/operation/read/query_spec.rb +19 -16
  210. data/spec/mongo/operation/{read_preferrable_spec.rb → read_preference_spec.rb} +11 -11
  211. data/spec/mongo/operation/write/bulk/{bulk_delete_spec.rb → delete_spec.rb} +18 -29
  212. data/spec/mongo/operation/write/bulk/{bulk_insert_spec.rb → insert_spec.rb} +3 -14
  213. data/spec/mongo/operation/write/bulk/{bulk_update_spec.rb → update_spec.rb} +8 -19
  214. data/spec/mongo/operation/write/command/delete_spec.rb +0 -16
  215. data/spec/mongo/operation/write/command/insert_spec.rb +0 -16
  216. data/spec/mongo/operation/write/command/update_spec.rb +0 -16
  217. data/spec/mongo/operation/write/delete_spec.rb +4 -4
  218. data/spec/mongo/operation/write/insert_spec.rb +2 -13
  219. data/spec/mongo/operation/write/update_spec.rb +7 -7
  220. data/spec/mongo/options/redacted_spec.rb +350 -0
  221. data/spec/mongo/protocol/kill_cursors_spec.rb +5 -3
  222. data/spec/mongo/protocol/query_spec.rb +15 -30
  223. data/spec/mongo/retryable_spec.rb +147 -0
  224. data/spec/mongo/server/connection_pool/queue_spec.rb +16 -0
  225. data/spec/mongo/server/connection_pool_spec.rb +50 -6
  226. data/spec/mongo/server/connection_spec.rb +49 -4
  227. data/spec/mongo/server/description_spec.rb +49 -3
  228. data/spec/mongo/server/monitor_spec.rb +51 -0
  229. data/spec/mongo/server_discovery_and_monitoring_spec.rb +32 -59
  230. data/spec/mongo/server_selection_rtt_spec.rb +37 -57
  231. data/spec/mongo/server_selection_spec.rb +19 -9
  232. data/spec/mongo/server_selector/nearest_spec.rb +35 -27
  233. data/spec/mongo/server_selector/primary_preferred_spec.rb +32 -30
  234. data/spec/mongo/server_selector/primary_spec.rb +21 -14
  235. data/spec/mongo/server_selector/secondary_preferred_spec.rb +28 -26
  236. data/spec/mongo/server_selector/secondary_spec.rb +24 -22
  237. data/spec/mongo/server_selector_spec.rb +87 -24
  238. data/spec/mongo/server_spec.rb +94 -8
  239. data/spec/mongo/socket/ssl_spec.rb +123 -13
  240. data/spec/mongo/socket/unix_spec.rb +52 -0
  241. data/spec/mongo/uri_spec.rb +295 -67
  242. data/spec/spec_helper.rb +40 -24
  243. data/spec/support/authorization.rb +23 -9
  244. data/spec/support/certificates/client.pem +4 -4
  245. data/spec/support/command_monitoring/bulkWrite.yml +73 -0
  246. data/spec/support/command_monitoring/command.yml +42 -0
  247. data/spec/support/command_monitoring/deleteMany.yml +55 -0
  248. data/spec/support/command_monitoring/deleteOne.yml +55 -0
  249. data/spec/support/command_monitoring/find.yml +219 -0
  250. data/spec/support/command_monitoring/insertMany.yml +81 -0
  251. data/spec/support/command_monitoring/insertOne.yml +51 -0
  252. data/spec/support/command_monitoring/updateMany.yml +67 -0
  253. data/spec/support/command_monitoring/updateOne.yml +95 -0
  254. data/spec/support/command_monitoring.rb +365 -0
  255. data/spec/support/connection_string.rb +228 -0
  256. data/spec/support/connection_string_tests/invalid-uris.yml +193 -0
  257. data/spec/support/connection_string_tests/valid-auth.yml +256 -0
  258. data/spec/support/connection_string_tests/valid-host_identifiers.yml +121 -0
  259. data/spec/support/connection_string_tests/valid-options.yml +30 -0
  260. data/spec/support/connection_string_tests/valid-unix_socket-absolute.yml +197 -0
  261. data/spec/support/connection_string_tests/valid-unix_socket-relative.yml +213 -0
  262. data/spec/support/connection_string_tests/valid-warnings.yml +55 -0
  263. data/spec/support/crud/read.rb +22 -19
  264. data/spec/support/crud/write.rb +58 -27
  265. data/spec/support/crud.rb +10 -2
  266. data/spec/support/gridfs.rb +637 -0
  267. data/spec/support/gridfs_tests/delete.yml +157 -0
  268. data/spec/support/gridfs_tests/download.yml +210 -0
  269. data/spec/support/gridfs_tests/download_by_name.yml +113 -0
  270. data/spec/support/gridfs_tests/upload.yml +158 -0
  271. data/spec/support/matchers.rb +1 -1
  272. data/spec/support/sdam/rs/equal_electionids.yml +44 -0
  273. data/spec/support/sdam/rs/new_primary_new_electionid.yml +95 -0
  274. data/spec/support/sdam/rs/null_election_id.yml +144 -0
  275. data/spec/support/sdam/rs/primary_disconnect_electionid.yml +124 -0
  276. data/spec/support/sdam/rs/primary_mismatched_me.yml +37 -0
  277. data/spec/support/sdam/rs/primary_to_no_primary_mismatched_me.yml +75 -0
  278. data/spec/support/sdam/rs/secondary_mismatched_me.yml +37 -0
  279. data/spec/support/sdam/sharded/mongos_disconnect.yml +104 -0
  280. data/spec/support/sdam/single/direct_connection_rsarbiter.yml +1 -1
  281. data/spec/support/sdam/single/direct_connection_rsprimary.yml +1 -1
  282. data/spec/support/sdam/single/direct_connection_rssecondary.yml +1 -1
  283. data/spec/support/sdam/single/direct_connection_slave.yml +1 -1
  284. data/spec/support/sdam/single/direct_connection_standalone.yml +1 -1
  285. data/spec/support/sdam/single/not_ok_response.yml +0 -1
  286. data/spec/support/server_discovery_and_monitoring.rb +22 -3
  287. data/spec/support/server_selection.rb +3 -1
  288. data/spec/support/shared/bulk_write.rb +218 -22
  289. data/spec/support/shared/server_selector.rb +80 -14
  290. data.tar.gz.sig +0 -0
  291. metadata +188 -59
  292. metadata.gz.sig +0 -0
  293. data/lib/mongo/bulk_write/bulk_writable.rb +0 -196
  294. data/lib/mongo/bulk_write/deletable.rb +0 -56
  295. data/lib/mongo/bulk_write/insertable.rb +0 -48
  296. data/lib/mongo/bulk_write/replacable.rb +0 -57
  297. data/lib/mongo/bulk_write/updatable.rb +0 -68
  298. data/lib/mongo/grid/fs.rb +0 -149
  299. data/lib/mongo/operation/list_collections/result.rb +0 -114
  300. data/lib/mongo/operation/list_indexes/result.rb +0 -118
  301. data/lib/mongo/operation/read/collections_info.rb +0 -68
  302. data/lib/mongo/operation/read/indexes.rb +0 -69
  303. data/lib/mongo/operation/read/list_collections.rb +0 -76
  304. data/lib/mongo/operation/read/list_indexes.rb +0 -78
  305. data/lib/mongo/operation/write/bulk/bulk_delete/result.rb +0 -75
  306. data/lib/mongo/operation/write/bulk/bulk_delete.rb +0 -145
  307. data/lib/mongo/operation/write/bulk/bulk_insert/result.rb +0 -130
  308. data/lib/mongo/operation/write/bulk/bulk_insert.rb +0 -132
  309. data/lib/mongo/operation/write/bulk/bulk_mergable.rb +0 -67
  310. data/lib/mongo/operation/write/bulk/bulk_update/result.rb +0 -162
  311. data/lib/mongo/operation/write/bulk/bulk_update.rb +0 -154
  312. data/lib/mongo/operation/write/bulk/legacy_bulk_mergable.rb +0 -83
  313. data/spec/mongo/bulk/bulk_write_spec.rb +0 -262
  314. data/spec/mongo/grid/fs_spec.rb +0 -160
  315. data/spec/mongo/loggable_spec.rb +0 -63
  316. data/spec/mongo/operation/aggregate_spec.rb +0 -127
  317. /data/lib/mongo/operation/{aggregate → commands/aggregate}/result.rb +0 -0
@@ -29,37 +29,14 @@ module Mongo
29
29
  #
30
30
  # @since 2.0.0
31
31
  class RemoveUser
32
- include Executable
32
+ include GLE
33
+ include WriteCommandEnabled
33
34
  include Specifiable
34
35
 
35
- # Execute the remove user operation.
36
- #
37
- # @example Execute the operation.
38
- # operation.execute(context)
39
- #
40
- # @param [ Mongo::Server::Context ] context The context for this operation.
41
- #
42
- # @return [ Result ] The operation result.
43
- #
44
- # @since 2.0.0
45
- def execute(context)
46
- if context.features.write_command_enabled?
47
- execute_write_command(context)
48
- else
49
- execute_message(context)
50
- end
51
- end
52
-
53
36
  private
54
37
 
55
- def execute_write_command(context)
56
- Result.new(Command::RemoveUser.new(spec).execute(context)).validate!
57
- end
58
-
59
- def execute_message(context)
60
- context.with_connection do |connection|
61
- Result.new(connection.dispatch([ message, gle ].compact)).validate!
62
- end
38
+ def write_command_op
39
+ Command::RemoveUser.new(spec)
63
40
  end
64
41
 
65
42
  def message
@@ -51,52 +51,29 @@ module Mongo
51
51
  #
52
52
  # @since 2.0.0
53
53
  class Update
54
- include Executable
54
+ include GLE
55
+ include WriteCommandEnabled
55
56
  include Specifiable
56
57
 
57
- # Execute the update operation.
58
- #
59
- # @example Execute the operation.
60
- # operation.execute(context)
61
- #
62
- # @param [ Mongo::Server::Context ] context The context for this operation.
63
- #
64
- # @return [ Result ] The operation result.
65
- #
66
- # @since 2.0.0
67
- def execute(context)
68
- if context.features.write_command_enabled?
69
- execute_write_command(context)
70
- else
71
- execute_message(context)
72
- end
73
- end
74
-
75
58
  private
76
59
 
77
- def execute_write_command(context)
60
+ def write_command_op
78
61
  s = spec.merge(:updates => [ update ])
79
62
  s.delete(:update)
80
- Result.new(Command::Update.new(s).execute(context)).validate!
81
- end
82
-
83
- def execute_message(context)
84
- context.with_connection do |connection|
85
- LegacyResult.new(connection.dispatch([ message, gle ].compact)).validate!
86
- end
87
- end
88
-
89
- def initialize_copy(original)
90
- @spec = original.spec.dup
91
- @spec[:updates] = original.spec[:updates].dup
63
+ Command::Update.new(s)
92
64
  end
93
65
 
94
66
  def message
95
67
  flags = []
96
- flags << :multi_update if update[:multi]
97
- flags << :upsert if update[:upsert]
98
- Protocol::Update.new(db_name, coll_name, update[:q], update[:u],
99
- flags.empty? ? {} : { flags: flags })
68
+ flags << :multi_update if update[Operation::MULTI]
69
+ flags << :upsert if update[Operation::UPSERT]
70
+ Protocol::Update.new(
71
+ db_name,
72
+ coll_name,
73
+ update[Operation::Q],
74
+ update[Operation::U],
75
+ flags.empty? ? {} : { flags: flags }
76
+ )
100
77
  end
101
78
  end
102
79
  end
@@ -30,40 +30,14 @@ module Mongo
30
30
  #
31
31
  # @since 2.0.0
32
32
  class UpdateUser
33
- include Executable
33
+ include GLE
34
+ include WriteCommandEnabled
34
35
  include Specifiable
35
36
 
36
- # Execute the operation.
37
- #
38
- # @note Updating users behaves different on 2.7+, 2.6.x, and
39
- # 2.4- so we need to break this out into separate operations.
40
- #
41
- # @example Execute the operation.
42
- # operation.execute(context)
43
- #
44
- # @param [ Mongo::Server::Context ] context The context for this operation.
45
- #
46
- # @return [ Result ] The operation result.
47
- #
48
- # @since 2.0.0
49
- def execute(context)
50
- if context.features.write_command_enabled?
51
- execute_write_command(context)
52
- else
53
- execute_message(context)
54
- end
55
- end
56
-
57
37
  private
58
38
 
59
- def execute_write_command(context)
60
- Result.new(Command::UpdateUser.new(spec).execute(context)).validate!
61
- end
62
-
63
- def execute_message(context)
64
- context.with_connection do |connection|
65
- Result.new(connection.dispatch([ message, gle ].compact)).validate!
66
- end
39
+ def write_command_op
40
+ Command::UpdateUser.new(spec)
67
41
  end
68
42
 
69
43
  def message
@@ -0,0 +1,53 @@
1
+ # Copyright (C) 2014-2015 MongoDB, Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module Mongo
16
+ module Operation
17
+ module Write
18
+
19
+ # This module contains common functionality for operations that send either
20
+ # a write command or a specific wire protocol message, depending on server version.
21
+ # For server versions >= 2.6, a write command is sent.
22
+ #
23
+ # @since 2.1.0
24
+ module WriteCommandEnabled
25
+
26
+ # Execute the operation.
27
+ #
28
+ # @example Execute the operation.
29
+ # operation.execute(context)
30
+ #
31
+ # @param [ Mongo::Server::Context ] context The context for this operation.
32
+ #
33
+ # @return [ Result ] The operation result.
34
+ #
35
+ # @since 2.1.0
36
+ def execute(context)
37
+ if context.features.write_command_enabled?
38
+ execute_write_command(context)
39
+ else
40
+ execute_message(context)
41
+ end
42
+ end
43
+
44
+ private
45
+
46
+ def execute_write_command(context)
47
+ result_class = defined?(self.class::Result) ? self.class::Result : Result
48
+ result_class.new(write_command_op.execute(context)).validate!
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -12,7 +12,9 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ require 'mongo/operation/write/write_command_enabled'
15
16
  require 'mongo/operation/write/idable'
17
+ require 'mongo/operation/write/gle'
16
18
  require 'mongo/operation/write/bulk'
17
19
  require 'mongo/operation/write/delete'
18
20
  require 'mongo/operation/write/insert'
@@ -16,10 +16,38 @@ require 'mongo/operation/result'
16
16
  require 'mongo/operation/executable'
17
17
  require 'mongo/operation/specifiable'
18
18
  require 'mongo/operation/limited'
19
- require 'mongo/operation/read_preferrable'
19
+ require 'mongo/operation/read_preference'
20
20
  require 'mongo/operation/read'
21
21
  require 'mongo/operation/write'
22
- require 'mongo/operation/aggregate'
23
- require 'mongo/operation/command'
22
+ require 'mongo/operation/commands'
24
23
  require 'mongo/operation/kill_cursors'
25
- require 'mongo/operation/map_reduce'
24
+
25
+ module Mongo
26
+ module Operation
27
+
28
+ # The q field constant.
29
+ #
30
+ # @since 2.1.0
31
+ Q = 'q'.freeze
32
+
33
+ # The u field constant.
34
+ #
35
+ # @since 2.1.0
36
+ U = 'u'.freeze
37
+
38
+ # The limit field constant.
39
+ #
40
+ # @since 2.1.0
41
+ LIMIT = 'limit'.freeze
42
+
43
+ # The multi field constant.
44
+ #
45
+ # @since 2.1.0
46
+ MULTI = 'multi'.freeze
47
+
48
+ # The upsert field constant.
49
+ #
50
+ # @since 2.1.0
51
+ UPSERT = 'upsert'.freeze
52
+ end
53
+ end
@@ -34,8 +34,10 @@ module Mongo
34
34
  #
35
35
  # @since 2.0.0
36
36
  def transform(options, mappings)
37
- options.reduce({}) do |transformed, (key, value)|
38
- transformed[mappings[key] || key] = value
37
+ map = transform_keys_to_strings(mappings)
38
+ opts = transform_keys_to_strings(options)
39
+ opts.reduce({}) do |transformed, (key, value)|
40
+ transformed[map[key]] = value if map[key]
39
41
  transformed
40
42
  end
41
43
  end
@@ -0,0 +1,156 @@
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
+ module Options
17
+
18
+ # Class for wrapping options that could be sensitive.
19
+ # When printed, the sensitive values will be redacted.
20
+ #
21
+ # @since 2.1.0
22
+ class Redacted < BSON::Document
23
+
24
+ # The options whose values will be redacted.
25
+ #
26
+ # @since 2.1.0
27
+ SENSITIVE_OPTIONS = [ :password,
28
+ :pwd ].freeze
29
+
30
+ # The replacement string used in place of the value for sensitive keys.
31
+ #
32
+ # @since 2.1.0
33
+ STRING_REPLACEMENT = '<REDACTED>'.freeze
34
+
35
+ # Get a string representation of the options.
36
+ #
37
+ # @return [ String ] The string representation of the options.
38
+ #
39
+ # @since 2.1.0
40
+ def inspect
41
+ redacted_string(:inspect)
42
+ end
43
+
44
+ # Get a string representation of the options.
45
+ #
46
+ # @return [ String ] The string representation of the options.
47
+ #
48
+ # @since 2.1.0
49
+ def to_s
50
+ redacted_string(:to_s)
51
+ end
52
+
53
+ # Whether these options contain a given key.
54
+ #
55
+ # @example Determine if the options contain a given key.
56
+ # options.has_key?(:name)
57
+ #
58
+ # @param [ String, Symbol ] key The key to check for existence.
59
+ #
60
+ # @return [ true, false ] If the options contain the given key.
61
+ #
62
+ # @since 2.1.0
63
+ def has_key?(key)
64
+ super(convert_key(key))
65
+ end
66
+ alias_method :key?, :has_key?
67
+
68
+ # Returns a new options object consisting of pairs for which the block returns false.
69
+ #
70
+ # @example Get a new options object with pairs for which the block returns false.
71
+ # new_options = options.reject { |k, v| k == 'database' }
72
+ #
73
+ # @yieldparam [ String, Object ] The key as a string and its value.
74
+ #
75
+ # @return [ Options::Redacted ] A new options object.
76
+ #
77
+ # @since 2.1.0
78
+ def reject(&block)
79
+ new_options = dup
80
+ new_options.reject!(&block) || new_options
81
+ end
82
+
83
+ # Only keeps pairs for which the block returns false.
84
+ #
85
+ # @example Remove pairs from this object for which the block returns true.
86
+ # options.reject! { |k, v| k == 'database' }
87
+ #
88
+ # @yieldparam [ String, Object ] The key as a string and its value.
89
+ #
90
+ # @return [ Options::Redacted, nil ] This object or nil if no changes were made.
91
+ #
92
+ # @since 2.1.0
93
+ def reject!
94
+ if block_given?
95
+ n_keys = keys.size
96
+ keys.each do |key|
97
+ delete(key) if yield(key, self[key])
98
+ end
99
+ n_keys == keys.size ? nil : self
100
+ else
101
+ to_enum
102
+ end
103
+ end
104
+
105
+ # Returns a new options object consisting of pairs for which the block returns true.
106
+ #
107
+ # @example Get a new options object with pairs for which the block returns true.
108
+ # ssl_options = options.select { |k, v| k =~ /ssl/ }
109
+ #
110
+ # @yieldparam [ String, Object ] The key as a string and its value.
111
+ #
112
+ # @return [ Options::Redacted ] A new options object.
113
+ #
114
+ # @since 2.1.0
115
+ def select(&block)
116
+ new_options = dup
117
+ new_options.select!(&block) || new_options
118
+ end
119
+
120
+ # Only keeps pairs for which the block returns true.
121
+ #
122
+ # @example Remove pairs from this object for which the block does not return true.
123
+ # options.select! { |k, v| k =~ /ssl/ }
124
+ #
125
+ # @yieldparam [ String, Object ] The key as a string and its value.
126
+ #
127
+ # @return [ Options::Redacted, nil ] This object or nil if no changes were made.
128
+ #
129
+ # @since 2.1.0
130
+ def select!
131
+ if block_given?
132
+ n_keys = keys.size
133
+ keys.each do |key|
134
+ delete(key) unless yield(key, self[key])
135
+ end
136
+ n_keys == keys.size ? nil : self
137
+ else
138
+ to_enum
139
+ end
140
+ end
141
+
142
+ private
143
+
144
+ def redacted_string(method)
145
+ '{' + reduce([]) do |list, (k, v)|
146
+ list << "#{k.send(method)}=>#{redact(k, v, method)}"
147
+ end.join(', ') + '}'
148
+ end
149
+
150
+ def redact(k, v, method)
151
+ return STRING_REPLACEMENT if SENSITIVE_OPTIONS.include?(k.to_sym)
152
+ v.send(method)
153
+ end
154
+ end
155
+ end
156
+ end
data/lib/mongo/options.rb CHANGED
@@ -13,3 +13,4 @@
13
13
  # limitations under the License.
14
14
 
15
15
  require 'mongo/options/mapper'
16
+ require 'mongo/options/redacted'
@@ -41,31 +41,34 @@ module Mongo
41
41
  #
42
42
  # Supported flags: +:single_remove+
43
43
  def initialize(database, collection, selector, options = {})
44
+ @database = database
44
45
  @namespace = "#{database}.#{collection}"
45
- @selector = selector
46
- @flags = options[:flags] || []
46
+ @selector = selector
47
+ @flags = options[:flags] || []
48
+ @upconverter = Upconverter.new(collection, selector, options)
47
49
  end
48
50
 
49
- # The log message for a delete operation.
51
+ # Return the event payload for monitoring.
50
52
  #
51
- # @example Get the log message.
52
- # delete.log_message
53
+ # @example Return the event payload.
54
+ # message.payload
53
55
  #
54
- # @return [ String ] The log message
56
+ # @return [ Hash ] The event payload.
55
57
  #
56
- # @since 2.0.0
57
- def log_message
58
- fields = []
59
- fields << ["%s |", "DELETE"]
60
- fields << ["namespace=%s", namespace]
61
- fields << ["selector=%s", selector.inspect]
62
- fields << ["flags=%s", flags.inspect]
63
- f, v = fields.transpose
64
- f.join(" ") % v
58
+ # @since 2.1.0
59
+ def payload
60
+ {
61
+ command_name: 'delete',
62
+ database_name: @database,
63
+ command: upconverter.command,
64
+ request_id: request_id
65
+ }
65
66
  end
66
67
 
67
68
  private
68
69
 
70
+ attr_reader :upconverter
71
+
69
72
  # The operation code required to specify a Delete message.
70
73
  # @return [Fixnum] the operation code.
71
74
  def op_code
@@ -89,6 +92,63 @@ module Mongo
89
92
  # @!attribute
90
93
  # @return [Hash] The selector for this Delete message.
91
94
  field :selector, Document
95
+
96
+ # Converts legacy delete messages to the appropriare OP_COMMAND style
97
+ # message.
98
+ #
99
+ # @since 2.1.0
100
+ class Upconverter
101
+
102
+ # @return [ String ] collection The name of the collection.
103
+ attr_reader :collection
104
+
105
+ # @return [ BSON::Document, Hash ] filter The query filter or command.
106
+ attr_reader :filter
107
+
108
+ # @return [ Hash ] options The options.
109
+ attr_reader :options
110
+
111
+ # Instantiate the upconverter.
112
+ #
113
+ # @example Instantiate the upconverter.
114
+ # Upconverter.new('users', { name: 'test' })
115
+ #
116
+ # @param [ String ] collection The name of the collection.
117
+ # @param [ BSON::Document, Hash ] filter The filter or command.
118
+ #
119
+ # @since 2.1.0
120
+ def initialize(collection, filter, options)
121
+ @collection = collection
122
+ @filter = filter
123
+ @options = options
124
+ end
125
+
126
+ # Get the upconverted command.
127
+ #
128
+ # @example Get the command.
129
+ # upconverter.command
130
+ #
131
+ # @return [ BSON::Document ] The upconverted command.
132
+ #
133
+ # @since 2.1.0
134
+ def command
135
+ BSON::Document.new(
136
+ delete: collection,
137
+ deletes: [ BSON::Document.new(q: filter, limit: limit) ],
138
+ ordered: true
139
+ )
140
+ end
141
+
142
+ private
143
+
144
+ def limit
145
+ if options.key?(:flags)
146
+ options[:flags].include?(:single_remove) ? 1 : 0
147
+ else
148
+ 0
149
+ end
150
+ end
151
+ end
92
152
  end
93
153
  end
94
154
  end
@@ -37,27 +37,28 @@ module Mongo
37
37
  # @param number_to_return [Integer] The number of documents to return.
38
38
  # @param cursor_id [Integer] The cursor id returned in a reply.
39
39
  def initialize(database, collection, number_to_return, cursor_id)
40
+ @database = database
40
41
  @namespace = "#{database}.#{collection}"
41
42
  @number_to_return = number_to_return
42
43
  @cursor_id = cursor_id
44
+ @upconverter = Upconverter.new(collection, cursor_id, number_to_return)
43
45
  end
44
46
 
45
- # The log message for a get more operation.
47
+ # Return the event payload for monitoring.
46
48
  #
47
- # @example Get the log message.
48
- # get_more.log_message
49
+ # @example Return the event payload.
50
+ # message.payload
49
51
  #
50
- # @return [ String ] The log message
52
+ # @return [ Hash ] The event payload.
51
53
  #
52
- # @since 2.0.0
53
- def log_message
54
- fields = []
55
- fields << ["%s |", "GETMORE"]
56
- fields << ["namespace=%s", namespace]
57
- fields << ["number_to_return=%s", number_to_return]
58
- fields << ["cursor_id=%s", cursor_id]
59
- f, v = fields.transpose
60
- f.join(" ") % v
54
+ # @since 2.1.0
55
+ def payload
56
+ {
57
+ command_name: 'getMore',
58
+ database_name: @database,
59
+ command: upconverter.command,
60
+ request_id: request_id
61
+ }
61
62
  end
62
63
 
63
64
  # Get more messages require replies from the database.
@@ -74,6 +75,8 @@ module Mongo
74
75
 
75
76
  private
76
77
 
78
+ attr_reader :upconverter
79
+
77
80
  # The operation code required to specify a GetMore message.
78
81
  # @return [Fixnum] the operation code.
79
82
  def op_code
@@ -94,6 +97,55 @@ module Mongo
94
97
  # @!attribute
95
98
  # @return [Fixnum] The cursor id to get more documents from.
96
99
  field :cursor_id, Int64
100
+
101
+ # Converts legacy getmore messages to the appropriare OP_COMMAND style
102
+ # message.
103
+ #
104
+ # @since 2.1.0
105
+ class Upconverter
106
+
107
+ # @return [ String ] collection The name of the collection.
108
+ attr_reader :collection
109
+
110
+ # @return [ Integer ] cursor_id The cursor id.
111
+ attr_reader :cursor_id
112
+
113
+ # @return [ Integer ] number_to_return The number of docs to return.
114
+ attr_reader :number_to_return
115
+
116
+ # Instantiate the upconverter.
117
+ #
118
+ # @example Instantiate the upconverter.
119
+ # Upconverter.new('users', 1, 1)
120
+ #
121
+ # @param [ String ] collection The name of the collection.
122
+ # @param [ Integer ] cursor_id The cursor id.
123
+ # @param [ Integer ] number_to_return The number of documents to
124
+ # return.
125
+ #
126
+ # @since 2.1.0
127
+ def initialize(collection, cursor_id, number_to_return)
128
+ @collection = collection
129
+ @cursor_id = cursor_id
130
+ @number_to_return = number_to_return
131
+ end
132
+
133
+ # Get the upconverted command.
134
+ #
135
+ # @example Get the command.
136
+ # upconverter.command
137
+ #
138
+ # @return [ BSON::Document ] The upconverted command.
139
+ #
140
+ # @since 2.1.0
141
+ def command
142
+ BSON::Document.new(
143
+ getMore: cursor_id,
144
+ batchSize: number_to_return,
145
+ collection: collection
146
+ )
147
+ end
148
+ end
97
149
  end
98
150
  end
99
151
  end