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
@@ -49,31 +49,34 @@ module Mongo
49
49
  #
50
50
  # Supported flags: +:continue_on_error+
51
51
  def initialize(database, collection, documents, options = {})
52
+ @database = database
52
53
  @namespace = "#{database}.#{collection}"
53
54
  @documents = documents
54
55
  @flags = options[:flags] || []
56
+ @upconverter = Upconverter.new(collection, documents, options)
55
57
  end
56
58
 
57
- # The log message for a insert operation.
59
+ # Return the event payload for monitoring.
58
60
  #
59
- # @example Get the log message.
60
- # insert.log_message
61
+ # @example Return the event payload.
62
+ # message.payload
61
63
  #
62
- # @return [ String ] The log message
64
+ # @return [ Hash ] The event payload.
63
65
  #
64
- # @since 2.0.0
65
- def log_message
66
- fields = []
67
- fields << ["%s |", "INSERT"]
68
- fields << ["namespace=%s", namespace]
69
- fields << ["documents=%s", documents.inspect]
70
- fields << ["flags=%s", flags.inspect]
71
- f, v = fields.transpose
72
- f.join(" ") % v
66
+ # @since 2.1.0
67
+ def payload
68
+ {
69
+ command_name: 'insert',
70
+ database_name: @database,
71
+ command: upconverter.command,
72
+ request_id: request_id
73
+ }
73
74
  end
74
75
 
75
76
  private
76
77
 
78
+ attr_reader :upconverter
79
+
77
80
  # The operation code required to specify an Insert message.
78
81
  # @return [Fixnum] the operation code.
79
82
  def op_code
@@ -94,6 +97,75 @@ module Mongo
94
97
  # @!attribute
95
98
  # @return [Array<Hash>] The documents to insert.
96
99
  field :documents, Document, true
100
+
101
+ # Converts legacy insert messages to the appropriare OP_COMMAND style
102
+ # message.
103
+ #
104
+ # @since 2.1.0
105
+ class Upconverter
106
+
107
+ # Insert field constant.
108
+ #
109
+ # @since 2.1.0
110
+ INSERT = 'insert'.freeze
111
+
112
+ # Documents field constant.
113
+ #
114
+ # @since 2.1.0
115
+ DOCUMENTS = 'documents'.freeze
116
+
117
+ # Ordered field constant.
118
+ #
119
+ # @since 2.1.0
120
+ ORDERED = 'ordered'.freeze
121
+
122
+ # Write concern field constant.
123
+ #
124
+ # @since 2.1.0
125
+ WRITE_CONCERN = 'writeConcern'.freeze
126
+
127
+ # @return [ String ] collection The name of the collection.
128
+ attr_reader :collection
129
+
130
+ # @return [ Array<BSON::Document> ] documents The documents to insert.
131
+ attr_reader :documents
132
+
133
+ # @return [ Hash ] options The options.
134
+ attr_reader :options
135
+
136
+ # Instantiate the upconverter.
137
+ #
138
+ # @example Instantiate the upconverter.
139
+ # Upconverter.new('users', documents)
140
+ #
141
+ # @param [ String ] collection The name of the collection.
142
+ # @param [ Array<BSON::Document> ] documents The documents.
143
+ # @param [ Hash ] options The options.
144
+ #
145
+ # @since 2.1.0
146
+ def initialize(collection, documents, options)
147
+ @collection = collection
148
+ @documents = documents
149
+ @options = options
150
+ end
151
+
152
+ # Get the upconverted command.
153
+ #
154
+ # @example Get the command.
155
+ # upconverter.command
156
+ #
157
+ # @return [ BSON::Document ] The upconverted command.
158
+ #
159
+ # @since 2.1.0
160
+ def command
161
+ document = BSON::Document.new
162
+ document.store(INSERT, collection)
163
+ document.store(DOCUMENTS, documents)
164
+ document.store(ORDERED, options.fetch(:ordered, true))
165
+ document.merge!(WRITE_CONCERN => options[:write_concern].options) if options[:write_concern]
166
+ document
167
+ end
168
+ end
97
169
  end
98
170
  end
99
171
  end
@@ -28,31 +28,37 @@ module Mongo
28
28
  # @example Kill the cursor on the server with id 1.
29
29
  # KillCursors.new([1])
30
30
  #
31
- # @param cursor_ids [Array<Fixnum>] The cursor ids to kill.
32
- # @param options [Hash] The additional kill cursors options.
33
- def initialize(cursor_ids, options = {})
31
+ # @param [ Mongo::Database ] collection The collection.
32
+ # @param [ Mongo::Database ] database The database.
33
+ # @param [ Array<Fixnum> ] cursor_ids The cursor ids to kill.
34
+ def initialize(collection, database, cursor_ids)
35
+ @database = database
34
36
  @cursor_ids = cursor_ids
35
37
  @id_count = @cursor_ids.size
38
+ @upconverter = Upconverter.new(collection, cursor_ids)
36
39
  end
37
40
 
38
- # The log message for a kill cursors operation.
41
+ # Return the event payload for monitoring.
39
42
  #
40
- # @example Get the log message.
41
- # kill_cursors.log_message
43
+ # @example Return the event payload.
44
+ # message.payload
42
45
  #
43
- # @return [ String ] The log message
46
+ # @return [ Hash ] The event payload.
44
47
  #
45
- # @since 2.0.0
46
- def log_message
47
- fields = []
48
- fields << ["%s |", "KILLCURSORS"]
49
- fields << ["cursor_ids=%s", cursor_ids.inspect]
50
- f, v = fields.transpose
51
- f.join(" ") % v
48
+ # @since 2.1.0
49
+ def payload
50
+ {
51
+ command_name: 'killCursors',
52
+ database_name: @database,
53
+ command: upconverter.command,
54
+ request_id: request_id
55
+ }
52
56
  end
53
57
 
54
58
  private
55
59
 
60
+ attr_reader :upconverter
61
+
56
62
  # The operation code required to specify +KillCursors+ message.
57
63
  # @return [Fixnum] the operation code.
58
64
  def op_code
@@ -69,6 +75,45 @@ module Mongo
69
75
  # @!attribute
70
76
  # @return [Array<Fixnum>] Cursors to kill.
71
77
  field :cursor_ids, Int64, true
78
+
79
+ # Converts legacy insert messages to the appropriare OP_COMMAND style
80
+ # message.
81
+ #
82
+ # @since 2.1.0
83
+ class Upconverter
84
+
85
+ # @return [ String ] collection The name of the collection.
86
+ attr_reader :collection
87
+
88
+ # @return [ Array<Integer> ] cursor_ids The cursor ids.
89
+ attr_reader :cursor_ids
90
+
91
+ # Instantiate the upconverter.
92
+ #
93
+ # @example Instantiate the upconverter.
94
+ # Upconverter.new('users', [ 1, 2, 3 ])
95
+ #
96
+ # @param [ String ] collection The name of the collection.
97
+ # @param [ Array<Integer> ] cursor_ids The cursor ids.
98
+ #
99
+ # @since 2.1.0
100
+ def initialize(collection, cursor_ids)
101
+ @collection = collection
102
+ @cursor_ids = cursor_ids
103
+ end
104
+
105
+ # Get the upconverted command.
106
+ #
107
+ # @example Get the command.
108
+ # upconverter.command
109
+ #
110
+ # @return [ BSON::Document ] The upconverted command.
111
+ #
112
+ # @since 2.1.0
113
+ def command
114
+ BSON::Document.new(killCursors: collection, cursors: cursor_ids)
115
+ end
116
+ end
72
117
  end
73
118
  end
74
119
  end
@@ -114,6 +114,17 @@ module Mongo
114
114
  fields.map { |field| instance_variable_get(field[:name]) }.hash
115
115
  end
116
116
 
117
+ # Generates a request id for a message
118
+ #
119
+ # @return [Fixnum] a request id used for sending a message to the
120
+ # server. The server will put this id in the response_to field of
121
+ # a reply.
122
+ def set_request_id
123
+ @@id_lock.synchronize do
124
+ @request_id = @@request_id += 1
125
+ end
126
+ end
127
+
117
128
  private
118
129
 
119
130
  @@request_id = 0
@@ -158,17 +169,6 @@ module Mongo
158
169
  end
159
170
  end
160
171
 
161
- # Generates a request id for a message
162
- #
163
- # @return [Fixnum] a request id used for sending a message to the
164
- # server. The server will put this id in the response_to field of
165
- # a reply.
166
- def set_request_id
167
- @@id_lock.synchronize do
168
- @request_id = @@request_id += 1
169
- end
170
- end
171
-
172
172
  # Serializes the header of the message consisting of 4 32bit integers
173
173
  #
174
174
  # The integers represent a message length placeholder (calculation of
@@ -181,7 +181,7 @@ module Mongo
181
181
  # @param buffer [String] Buffer to receive the header
182
182
  # @return [String] Serialized header
183
183
  def serialize_header(buffer)
184
- set_request_id
184
+ set_request_id unless @request_id
185
185
  Header.serialize(buffer, [0, request_id, 0, op_code])
186
186
  end
187
187
 
@@ -30,12 +30,6 @@ module Mongo
30
30
  # @api semipublic
31
31
  class Query < Message
32
32
 
33
- # Constant for the max number of characters to print when inspecting
34
- # a query field.
35
- #
36
- # @since 2.0.3
37
- LOG_STRING_LIMIT = 250
38
-
39
33
  # Creates a new Query message
40
34
  #
41
35
  # @example Find all users named Tyler.
@@ -64,33 +58,32 @@ module Mongo
64
58
  # Supported flags: +:tailable_cursor+, +:slave_ok+, +:oplog_replay+,
65
59
  # +:no_cursor_timeout+, +:await_data+, +:exhaust+, +:partial+
66
60
  def initialize(database, collection, selector, options = {})
67
- @namespace = "#{database}.#{collection}"
68
- @selector = selector
69
- @project = options[:project]
70
- @skip = options[:skip] || 0
71
- @limit = options[:limit] || 0
72
- @flags = options[:flags] || []
61
+ @database = database
62
+ @namespace = "#{database}.#{collection}"
63
+ @selector = selector
64
+ @options = options
65
+ @project = options[:project]
66
+ @limit = determine_limit
67
+ @skip = options[:skip] || 0
68
+ @flags = options[:flags] || []
69
+ @upconverter = Upconverter.new(collection, selector, options, flags)
73
70
  end
74
71
 
75
- # The log message for a query operation.
72
+ # Return the event payload for monitoring.
76
73
  #
77
- # @example Get the log message.
78
- # query.log_message
74
+ # @example Return the event payload.
75
+ # message.payload
79
76
  #
80
- # @return [ String ] The log message
77
+ # @return [ Hash ] The event payload.
81
78
  #
82
- # @since 2.0.0
83
- def log_message
84
- fields = []
85
- fields << ["%s |", query_type]
86
- fields << ["namespace=%s", namespace]
87
- fields << ["selector=%s", formatted_selector]
88
- fields << ["flags=%s", flags.inspect]
89
- fields << ["limit=%s", limit.inspect]
90
- fields << ["skip=%s", skip.inspect]
91
- fields << ["project=%s", project.inspect]
92
- f, v = fields.transpose
93
- f.join(" ") % v
79
+ # @since 2.1.0
80
+ def payload
81
+ {
82
+ command_name: upconverter.command_name,
83
+ database_name: @database,
84
+ command: upconverter.command,
85
+ request_id: request_id
86
+ }
94
87
  end
95
88
 
96
89
  # Query messages require replies from the database.
@@ -107,21 +100,16 @@ module Mongo
107
100
 
108
101
  private
109
102
 
103
+ attr_reader :upconverter
104
+
110
105
  # The operation code required to specify a Query message.
111
106
  # @return [Fixnum] the operation code.
112
107
  def op_code
113
108
  2004
114
109
  end
115
110
 
116
- def query_type
117
- namespace.include?(Database::COMMAND) ? 'COMMAND' : 'QUERY'
118
- end
119
-
120
- def formatted_selector
121
- ( (str = selector.inspect).length > LOG_STRING_LIMIT ) ?
122
- "#{str[0..LOG_STRING_LIMIT]}..." : str
123
- rescue ArgumentError
124
- '<Unable to inspect selector>'
111
+ def determine_limit
112
+ [ @options[:limit] || @options[:batch_size], @options[:batch_size] || @options[:limit] ].min || 0
125
113
  end
126
114
 
127
115
  # Available flags for a Query message.
@@ -159,6 +147,144 @@ module Mongo
159
147
  # @!attribute
160
148
  # @return [Hash] The projection.
161
149
  field :project, Document
150
+
151
+ # Converts legacy query messages to the appropriare OP_COMMAND style
152
+ # message.
153
+ #
154
+ # @since 2.1.0
155
+ class Upconverter
156
+
157
+ # Mappings of the options to the find command options.
158
+ #
159
+ # @since 2.1.0
160
+ OPTION_MAPPINGS = {
161
+ :project => 'projection',
162
+ :skip => 'skip',
163
+ :limit => 'limit',
164
+ :batch_size => 'batchSize'
165
+ }.freeze
166
+
167
+ SPECIAL_FIELD_MAPPINGS = {
168
+ :$readPreference => 'readPreference',
169
+ :$orderby => 'sort',
170
+ :$hint => 'hint',
171
+ :$comment => 'comment',
172
+ :$returnKey => 'returnKey',
173
+ :$snapshot => 'snapshot',
174
+ :$maxScan => 'maxScan',
175
+ :$max => 'max',
176
+ :$min => 'min',
177
+ :$maxTimeMS => 'maxTimeMS',
178
+ :$showDiskLoc => 'showRecordId',
179
+ :$explain => 'explain'
180
+ }.freeze
181
+
182
+ # Mapping of flags to find command options.
183
+ #
184
+ # @since 2.1.0
185
+ FLAG_MAPPINGS = {
186
+ :tailable_cursor => 'tailable',
187
+ :oplog_replay => 'oplogReplay',
188
+ :no_cursor_timeout => 'noCursorTimeout',
189
+ :await_data => 'awaitData',
190
+ :partial => 'allowPartialResults'
191
+ }.freeze
192
+
193
+ # Find command constant.
194
+ #
195
+ # @since 2.1.0
196
+ FIND = 'find'.freeze
197
+
198
+ # Filter attribute constant.
199
+ #
200
+ # @since 2.1.0
201
+ FILTER = 'filter'.freeze
202
+
203
+ # @return [ String ] collection The name of the collection.
204
+ attr_reader :collection
205
+
206
+ # @return [ BSON::Document, Hash ] filter The query filter or command.
207
+ attr_reader :filter
208
+
209
+ # @return [ BSON::Document, Hash ] options The options.
210
+ attr_reader :options
211
+
212
+ # @return [ Array<Symbol> ] flags The flags.
213
+ attr_reader :flags
214
+
215
+ # Instantiate the upconverter.
216
+ #
217
+ # @example Instantiate the upconverter.
218
+ # Upconverter.new('users', { name: 'test' }, { skip: 10 })
219
+ #
220
+ # @param [ String ] collection The name of the collection.
221
+ # @param [ BSON::Document, Hash ] filter The filter or command.
222
+ # @param [ BSON::Document, Hash ] options The options.
223
+ # @param [ Array<Symbol> ] flags The flags.
224
+ #
225
+ # @since 2.1.0
226
+ def initialize(collection, filter, options, flags)
227
+ @collection = collection
228
+ @filter = filter
229
+ @options = options
230
+ @flags = flags
231
+ end
232
+
233
+ # Get the upconverted command.
234
+ #
235
+ # @example Get the command.
236
+ # upconverter.command
237
+ #
238
+ # @return [ BSON::Document ] The upconverted command.
239
+ #
240
+ # @since 2.1.0
241
+ def command
242
+ command? ? op_command : find_command
243
+ end
244
+
245
+ # Get the name of the command. If the collection is $cmd then it's the
246
+ # first key in the filter, otherwise it's a find.
247
+ #
248
+ # @example Get the command name.
249
+ # upconverter.command_name
250
+ #
251
+ # @return [ String, Symbol ] The command name.
252
+ #
253
+ # @since 2.1.0
254
+ def command_name
255
+ command? ? filter.keys.first : FIND
256
+ end
257
+
258
+ private
259
+
260
+ def command?
261
+ collection == Database::COMMAND
262
+ end
263
+
264
+ def op_command
265
+ document = BSON::Document.new
266
+ filter.each do |field, value|
267
+ document.store(field.to_s, value)
268
+ end
269
+ document
270
+ end
271
+
272
+ def find_command
273
+ document = BSON::Document.new
274
+ document.store(FIND, collection)
275
+ document.store(FILTER, filter[:$query] ? filter[:$query] : filter)
276
+ OPTION_MAPPINGS.each do |legacy, option|
277
+ document.store(option, options[legacy]) unless options[legacy].nil?
278
+ end
279
+ SPECIAL_FIELD_MAPPINGS.each do |special, normal|
280
+ document.store(normal, filter[special]) unless filter[special].nil?
281
+ end
282
+ FLAG_MAPPINGS.each do |legacy, flag|
283
+ document.store(flag, true) if flags.include?(legacy)
284
+ end
285
+ document
286
+ end
287
+ end
162
288
  end
163
289
  end
164
290
  end
@@ -38,8 +38,24 @@ module Mongo
38
38
  flags.include?(:query_failure)
39
39
  end
40
40
 
41
+ # Return the event payload for monitoring.
42
+ #
43
+ # @example Return the event payload.
44
+ # message.payload
45
+ #
46
+ # @return [ Hash ] The event payload.
47
+ #
48
+ # @since 2.1.0
49
+ def payload
50
+ { reply: upconverter.command, request_id: request_id }
51
+ end
52
+
41
53
  private
42
54
 
55
+ def upconverter
56
+ @upconverter ||= Upconverter.new(documents, cursor_id, starting_from)
57
+ end
58
+
43
59
  # The operation code required to specify a Reply message.
44
60
  # @return [Fixnum] the operation code.
45
61
  def op_code
@@ -79,6 +95,93 @@ module Mongo
79
95
  # @!attribute
80
96
  # @return [Array<Hash>] The documents in this Reply.
81
97
  field :documents, Document, :@number_returned
98
+
99
+ # Upconverts legacy replies to new op command replies.
100
+ #
101
+ # @since 2.1.0
102
+ class Upconverter
103
+
104
+ # Next batch constant.
105
+ #
106
+ # @since 2.1.0
107
+ NEXT_BATCH = 'nextBatch'.freeze
108
+
109
+ # First batch constant.
110
+ #
111
+ # @since 2.1.0
112
+ FIRST_BATCH = 'firstBatch'.freeze
113
+
114
+ # Cursor field constant.
115
+ #
116
+ # @since 2.1.0
117
+ CURSOR = 'cursor'.freeze
118
+
119
+ # Id field constant.
120
+ #
121
+ # @since 2.1.0
122
+ ID = 'id'.freeze
123
+
124
+ # @return [ Array<BSON::Document> ] documents The documents.
125
+ attr_reader :documents
126
+
127
+ # @return [ Integer ] cursor_id The cursor id.
128
+ attr_reader :cursor_id
129
+
130
+ # @return [ Integer ] starting_from The starting point in the cursor.
131
+ attr_reader :starting_from
132
+
133
+ # Initialize the new upconverter.
134
+ #
135
+ # @example Create the upconverter.
136
+ # Upconverter.new(docs, 1, 3)
137
+ #
138
+ # @param [ Array<BSON::Document> ] documents The documents.
139
+ # @param [ Integer ] cursor_id The cursor id.
140
+ # @param [ Integer ] starting_from The starting position.
141
+ #
142
+ # @since 2.1.0
143
+ def initialize(documents, cursor_id, starting_from)
144
+ @documents = documents
145
+ @cursor_id = cursor_id
146
+ @starting_from = starting_from
147
+ end
148
+
149
+ # Get the upconverted command.
150
+ #
151
+ # @example Get the command.
152
+ # upconverter.command
153
+ #
154
+ # @return [ BSON::Document ] The command.
155
+ #
156
+ # @since 2.1.0
157
+ def command
158
+ command? ? op_command : find_command
159
+ end
160
+
161
+ private
162
+
163
+ def batch_field
164
+ starting_from > 0 ? NEXT_BATCH : FIRST_BATCH
165
+ end
166
+
167
+ def command?
168
+ !documents.empty? && documents.first.key?(Operation::Result::OK)
169
+ end
170
+
171
+ def find_command
172
+ document = BSON::Document.new
173
+ cursor_document = BSON::Document.new
174
+ cursor_document.store(ID, cursor_id)
175
+ cursor_document.store(batch_field, documents)
176
+ document.store(Operation::Result::OK, 1)
177
+ document.store(CURSOR, cursor_document)
178
+ document
179
+ end
180
+
181
+ def op_command
182
+ documents.first
183
+ end
184
+ end
82
185
  end
83
186
  end
84
187
  end
@@ -74,7 +74,7 @@ module Mongo
74
74
  # @param value [String] The string to be serialized.
75
75
  # @return [String] Buffer with serialized value.
76
76
  def self.serialize(buffer, value)
77
- buffer << value
77
+ buffer << value.force_encoding(BSON::BINARY)
78
78
  buffer << NULL
79
79
  end
80
80
  end