mongo 1.12.5 → 2.0.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 (475) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CONTRIBUTING.md +64 -0
  4. data/LICENSE +1 -1
  5. data/README.md +21 -126
  6. data/Rakefile +39 -21
  7. data/bin/mongo_console +6 -38
  8. data/lib/mongo/address/ipv4.rb +85 -0
  9. data/lib/mongo/address/ipv6.rb +85 -0
  10. data/lib/mongo/address/unix.rb +76 -0
  11. data/lib/mongo/address.rb +111 -0
  12. data/lib/mongo/auth/cr/conversation.rb +119 -0
  13. data/lib/mongo/auth/cr.rb +44 -0
  14. data/lib/mongo/auth/executable.rb +52 -0
  15. data/lib/mongo/auth/ldap/conversation.rb +92 -0
  16. data/lib/mongo/auth/ldap.rb +48 -0
  17. data/lib/mongo/auth/roles.rb +104 -0
  18. data/lib/mongo/auth/scram/conversation.rb +450 -0
  19. data/lib/mongo/auth/scram.rb +53 -0
  20. data/lib/mongo/auth/user/view.rb +102 -0
  21. data/lib/mongo/auth/user.rb +159 -0
  22. data/lib/mongo/auth/x509/conversation.rb +92 -0
  23. data/lib/mongo/auth/x509.rb +48 -0
  24. data/lib/mongo/auth.rb +108 -0
  25. data/lib/mongo/bulk_write/bulk_writable.rb +191 -0
  26. data/lib/mongo/bulk_write/deletable.rb +60 -0
  27. data/lib/mongo/bulk_write/insertable.rb +52 -0
  28. data/lib/mongo/bulk_write/ordered_bulk_write.rb +48 -0
  29. data/lib/mongo/bulk_write/replacable.rb +57 -0
  30. data/lib/mongo/bulk_write/unordered_bulk_write.rb +46 -0
  31. data/lib/mongo/bulk_write/updatable.rb +68 -0
  32. data/lib/mongo/bulk_write.rb +52 -0
  33. data/lib/mongo/client.rb +246 -0
  34. data/lib/mongo/cluster/topology/replica_set.rb +160 -0
  35. data/lib/mongo/cluster/topology/sharded.rb +132 -0
  36. data/lib/mongo/cluster/topology/standalone.rb +132 -0
  37. data/lib/mongo/cluster/topology/unknown.rb +155 -0
  38. data/lib/mongo/cluster/topology.rb +60 -0
  39. data/lib/mongo/cluster.rb +203 -0
  40. data/lib/mongo/collection/view/aggregation.rb +108 -0
  41. data/lib/mongo/collection/view/explainable.rb +49 -0
  42. data/lib/mongo/collection/view/immutable.rb +43 -0
  43. data/lib/mongo/collection/view/iterable.rb +48 -0
  44. data/lib/mongo/collection/view/map_reduce.rb +191 -0
  45. data/lib/mongo/collection/view/readable.rb +363 -0
  46. data/lib/mongo/collection/view/writable.rb +185 -0
  47. data/lib/mongo/collection/view.rb +169 -0
  48. data/lib/mongo/collection.rb +130 -1101
  49. data/lib/mongo/cursor.rb +78 -681
  50. data/lib/mongo/database/view.rb +101 -0
  51. data/lib/mongo/database.rb +224 -0
  52. data/lib/mongo/error/bulk_write_error.rb +41 -0
  53. data/lib/mongo/error/invalid_bulk_operation.rb +36 -0
  54. data/lib/mongo/error/invalid_bulk_operation_type.rb +36 -0
  55. data/lib/mongo/error/invalid_collection_name.rb +39 -0
  56. data/lib/mongo/error/invalid_database_name.rb +39 -0
  57. data/{test/replica_set/ssl_test.rb → lib/mongo/error/invalid_document.rb} +21 -14
  58. data/lib/mongo/error/invalid_file.rb +38 -0
  59. data/lib/mongo/error/invalid_nonce.rb +46 -0
  60. data/lib/mongo/error/invalid_replacement_document.rb +39 -0
  61. data/lib/mongo/error/invalid_signature.rb +47 -0
  62. data/{test/functional/ssl_test.rb → lib/mongo/error/invalid_update_document.rb} +22 -12
  63. data/lib/mongo/error/max_bson_size.rb +40 -0
  64. data/lib/mongo/error/max_message_size.rb +42 -0
  65. data/{test/functional/db_connection_test.rb → lib/mongo/error/multi_index_drop.rb} +17 -8
  66. data/lib/mongo/{utils.rb → error/need_primary_server.rb} +10 -6
  67. data/lib/mongo/{connection.rb → error/operation_failure.rb} +10 -6
  68. data/lib/mongo/error/parser.rb +77 -0
  69. data/lib/mongo/{connection/socket.rb → error/socket_error.rb} +10 -5
  70. data/lib/mongo/error/socket_timeout_error.rb +23 -0
  71. data/lib/mongo/error/unsupported_features.rb +43 -0
  72. data/lib/mongo/error.rb +82 -0
  73. data/lib/mongo/event/listeners.rb +63 -0
  74. data/lib/mongo/event/primary_elected.rb +53 -0
  75. data/lib/mongo/event/publisher.rb +42 -0
  76. data/lib/mongo/event/server_added.rb +53 -0
  77. data/lib/mongo/event/server_removed.rb +53 -0
  78. data/lib/mongo/event/subscriber.rb +41 -0
  79. data/lib/mongo/event.rb +40 -0
  80. data/lib/mongo/grid/file/chunk.rb +184 -0
  81. data/lib/mongo/grid/file/metadata.rb +229 -0
  82. data/lib/mongo/grid/file.rb +106 -0
  83. data/lib/mongo/grid/fs.rb +149 -0
  84. data/lib/mongo/{gridfs.rb → grid.rb} +3 -5
  85. data/lib/mongo/index/view.rb +261 -0
  86. data/lib/mongo/index.rb +64 -0
  87. data/lib/mongo/loggable.rb +126 -0
  88. data/lib/mongo/logger.rb +132 -0
  89. data/lib/mongo/operation/aggregate/result.rb +88 -0
  90. data/lib/mongo/operation/aggregate.rb +100 -0
  91. data/lib/mongo/operation/command.rb +62 -0
  92. data/lib/mongo/operation/executable.rb +105 -0
  93. data/lib/mongo/operation/kill_cursors.rb +39 -0
  94. data/lib/mongo/operation/limited.rb +37 -0
  95. data/lib/mongo/operation/list_collections/result.rb +114 -0
  96. data/lib/mongo/operation/list_indexes/result.rb +118 -0
  97. data/lib/mongo/operation/map_reduce/result.rb +122 -0
  98. data/lib/mongo/operation/map_reduce.rb +96 -0
  99. data/lib/mongo/operation/read/collections_info.rb +67 -0
  100. data/lib/mongo/operation/read/get_more.rb +71 -0
  101. data/lib/mongo/operation/read/indexes.rb +68 -0
  102. data/lib/mongo/operation/read/list_collections.rb +75 -0
  103. data/lib/mongo/operation/read/list_indexes.rb +77 -0
  104. data/lib/mongo/operation/read/query.rb +71 -0
  105. data/lib/mongo/{functional.rb → operation/read.rb} +7 -7
  106. data/lib/mongo/operation/read_preferrable.rb +34 -0
  107. data/lib/mongo/operation/result.rb +259 -0
  108. data/lib/mongo/operation/specifiable.rb +397 -0
  109. data/lib/mongo/operation/write/bulk/bulk_delete/result.rb +75 -0
  110. data/lib/mongo/operation/write/bulk/bulk_delete.rb +144 -0
  111. data/lib/mongo/operation/write/bulk/bulk_insert/result.rb +68 -0
  112. data/lib/mongo/operation/write/bulk/bulk_insert.rb +129 -0
  113. data/lib/mongo/operation/write/bulk/bulk_mergable.rb +67 -0
  114. data/lib/mongo/operation/write/bulk/bulk_update/result.rb +162 -0
  115. data/lib/mongo/operation/write/bulk/bulk_update.rb +153 -0
  116. data/lib/mongo/operation/write/bulk/legacy_bulk_mergable.rb +83 -0
  117. data/lib/mongo/operation/write/bulk.rb +17 -0
  118. data/lib/mongo/operation/write/command/create_index.rb +50 -0
  119. data/lib/mongo/operation/write/command/create_user.rb +43 -0
  120. data/lib/mongo/operation/write/command/delete.rb +56 -0
  121. data/lib/mongo/operation/write/command/drop_index.rb +51 -0
  122. data/lib/mongo/operation/write/command/insert.rb +55 -0
  123. data/lib/mongo/operation/write/command/remove_user.rb +42 -0
  124. data/lib/mongo/operation/write/command/update.rb +60 -0
  125. data/lib/mongo/operation/write/command/writable.rb +61 -0
  126. data/lib/mongo/operation/write/command.rb +22 -0
  127. data/lib/mongo/operation/write/create_index.rb +89 -0
  128. data/lib/mongo/operation/write/create_user.rb +75 -0
  129. data/lib/mongo/operation/write/delete/result.rb +40 -0
  130. data/lib/mongo/operation/write/delete.rb +93 -0
  131. data/lib/mongo/operation/write/drop_index.rb +62 -0
  132. data/lib/mongo/{utils/thread_local_variable_manager.rb → operation/write/insert/result.rb} +15 -8
  133. data/lib/mongo/operation/write/insert.rb +90 -0
  134. data/lib/mongo/operation/write/remove_user.rb +70 -0
  135. data/lib/mongo/operation/write/update/result.rb +160 -0
  136. data/lib/mongo/operation/write/update.rb +103 -0
  137. data/lib/mongo/{connection/socket/socket_util.rb → operation/write.rb} +10 -24
  138. data/lib/mongo/operation.rb +25 -0
  139. data/lib/mongo/options/mapper.rb +78 -0
  140. data/lib/mongo/options.rb +15 -0
  141. data/lib/mongo/protocol/bit_vector.rb +61 -0
  142. data/lib/mongo/protocol/delete.rb +94 -0
  143. data/lib/mongo/protocol/get_more.rb +99 -0
  144. data/lib/mongo/protocol/insert.rb +99 -0
  145. data/lib/mongo/protocol/kill_cursors.rb +74 -0
  146. data/lib/mongo/protocol/message.rb +252 -0
  147. data/lib/mongo/protocol/query.rb +147 -0
  148. data/lib/mongo/protocol/reply.rb +72 -0
  149. data/lib/mongo/protocol/serializers.rb +180 -0
  150. data/lib/mongo/protocol/update.rb +111 -0
  151. data/lib/mongo/protocol.rb +15 -0
  152. data/lib/mongo/server/connectable.rb +110 -0
  153. data/lib/mongo/server/connection.rb +134 -0
  154. data/lib/mongo/server/connection_pool/queue.rb +182 -0
  155. data/lib/mongo/server/connection_pool.rb +141 -0
  156. data/lib/mongo/server/context.rb +66 -0
  157. data/lib/mongo/server/description/features.rb +85 -0
  158. data/lib/mongo/server/description/inspector/primary_elected.rb +58 -0
  159. data/lib/mongo/server/description/inspector/server_added.rb +59 -0
  160. data/lib/mongo/server/description/inspector/server_removed.rb +59 -0
  161. data/lib/mongo/server/description/inspector.rb +79 -0
  162. data/lib/mongo/server/description.rb +450 -0
  163. data/lib/mongo/server/monitor/connection.rb +89 -0
  164. data/lib/mongo/server/monitor.rb +176 -0
  165. data/lib/mongo/server.rb +163 -0
  166. data/lib/mongo/server_selector/nearest.rb +94 -0
  167. data/lib/mongo/server_selector/primary.rb +88 -0
  168. data/lib/mongo/server_selector/primary_preferred.rb +94 -0
  169. data/lib/mongo/server_selector/secondary.rb +91 -0
  170. data/lib/mongo/server_selector/secondary_preferred.rb +96 -0
  171. data/lib/mongo/server_selector/selectable.rb +209 -0
  172. data/lib/mongo/server_selector.rb +81 -0
  173. data/lib/mongo/socket/ssl.rb +130 -0
  174. data/lib/mongo/socket/tcp.rb +69 -0
  175. data/lib/mongo/socket/unix.rb +64 -0
  176. data/lib/mongo/socket.rb +179 -0
  177. data/lib/mongo/uri.rb +504 -0
  178. data/lib/mongo/version.rb +21 -0
  179. data/lib/mongo/write_concern/acknowledged.rb +52 -0
  180. data/lib/mongo/write_concern/normalizable.rb +51 -0
  181. data/lib/mongo/write_concern/unacknowledged.rb +55 -0
  182. data/lib/mongo/write_concern.rb +99 -0
  183. data/lib/mongo.rb +24 -82
  184. data/mongo.gemspec +17 -14
  185. data/spec/certificates/ca.pem +17 -0
  186. data/spec/certificates/client.pem +101 -0
  187. data/spec/certificates/crl.pem +10 -0
  188. data/spec/certificates/crl_client_revoked.pem +12 -0
  189. data/spec/certificates/password_protected.pem +51 -0
  190. data/spec/certificates/server.pem +34 -0
  191. data/spec/mongo/address/ipv4_spec.rb +74 -0
  192. data/spec/mongo/address/ipv6_spec.rb +74 -0
  193. data/spec/mongo/address/unix_spec.rb +30 -0
  194. data/spec/mongo/address_spec.rb +206 -0
  195. data/spec/mongo/auth/cr_spec.rb +59 -0
  196. data/spec/mongo/auth/ldap_spec.rb +40 -0
  197. data/spec/mongo/auth/scram/conversation_spec.rb +197 -0
  198. data/spec/mongo/auth/scram_spec.rb +55 -0
  199. data/spec/mongo/auth/user/view_spec.rb +76 -0
  200. data/spec/mongo/auth/user_spec.rb +190 -0
  201. data/spec/mongo/auth/x509_spec.rb +40 -0
  202. data/spec/mongo/auth_spec.rb +65 -0
  203. data/spec/mongo/bulk/bulk_write_spec.rb +262 -0
  204. data/spec/mongo/client_spec.rb +564 -0
  205. data/spec/mongo/cluster/topology/replica_set_spec.rb +101 -0
  206. data/spec/mongo/cluster/topology/sharded_spec.rb +74 -0
  207. data/spec/mongo/cluster/topology/standalone_spec.rb +79 -0
  208. data/spec/mongo/cluster/topology_spec.rb +65 -0
  209. data/spec/mongo/cluster_spec.rb +129 -0
  210. data/spec/mongo/collection/view/aggregation_spec.rb +148 -0
  211. data/spec/mongo/collection/view/explainable_spec.rb +32 -0
  212. data/spec/mongo/collection/view/map_reduce_spec.rb +242 -0
  213. data/spec/mongo/collection/view/readable_spec.rb +603 -0
  214. data/spec/mongo/collection/view/writable_spec.rb +679 -0
  215. data/spec/mongo/collection/view_spec.rb +530 -0
  216. data/spec/mongo/collection_spec.rb +362 -0
  217. data/spec/mongo/crud_spec.rb +42 -0
  218. data/spec/mongo/cursor_spec.rb +295 -0
  219. data/spec/mongo/database_spec.rb +302 -0
  220. data/spec/mongo/error/parser_spec.rb +119 -0
  221. data/spec/mongo/event/publisher_spec.rb +50 -0
  222. data/spec/mongo/event/subscriber_spec.rb +34 -0
  223. data/spec/mongo/grid/file/chunk_spec.rb +226 -0
  224. data/spec/mongo/grid/file/metadata_spec.rb +92 -0
  225. data/spec/mongo/grid/file_spec.rb +172 -0
  226. data/spec/mongo/grid/fs_spec.rb +129 -0
  227. data/spec/mongo/index/view_spec.rb +330 -0
  228. data/spec/mongo/loggable_spec.rb +62 -0
  229. data/spec/mongo/logger_spec.rb +97 -0
  230. data/spec/mongo/operation/aggregate/result_spec.rb +80 -0
  231. data/spec/mongo/operation/aggregate_spec.rb +127 -0
  232. data/spec/mongo/operation/command_spec.rb +98 -0
  233. data/spec/mongo/operation/kill_cursors_spec.rb +66 -0
  234. data/spec/mongo/operation/limited_spec.rb +50 -0
  235. data/spec/mongo/operation/map_reduce_spec.rb +143 -0
  236. data/spec/mongo/operation/read/collections_info_spec.rb +40 -0
  237. data/spec/mongo/operation/read/get_more_spec.rb +81 -0
  238. data/spec/mongo/operation/read/indexes_spec.rb +31 -0
  239. data/spec/mongo/operation/read/query_spec.rb +84 -0
  240. data/spec/mongo/operation/result_spec.rb +275 -0
  241. data/spec/mongo/operation/specifiable_spec.rb +53 -0
  242. data/spec/mongo/operation/write/bulk_delete_spec.rb +235 -0
  243. data/spec/mongo/operation/write/bulk_insert_spec.rb +235 -0
  244. data/spec/mongo/operation/write/bulk_update_spec.rb +236 -0
  245. data/spec/mongo/operation/write/command/delete_spec.rb +103 -0
  246. data/spec/mongo/operation/write/command/insert_spec.rb +103 -0
  247. data/spec/mongo/operation/write/command/update_spec.rb +109 -0
  248. data/spec/mongo/operation/write/create_index_spec.rb +63 -0
  249. data/spec/mongo/operation/write/create_user_spec.rb +44 -0
  250. data/spec/mongo/operation/write/delete_spec.rb +186 -0
  251. data/spec/mongo/operation/write/drop_index_spec.rb +51 -0
  252. data/spec/mongo/operation/write/insert_spec.rb +244 -0
  253. data/spec/mongo/operation/write/remove_user_spec.rb +46 -0
  254. data/spec/mongo/operation/write/response_spec.rb +85 -0
  255. data/spec/mongo/operation/write/update_spec.rb +228 -0
  256. data/spec/mongo/protocol/delete_spec.rb +167 -0
  257. data/spec/mongo/protocol/get_more_spec.rb +146 -0
  258. data/spec/mongo/protocol/insert_spec.rb +161 -0
  259. data/spec/mongo/protocol/kill_cursors_spec.rb +101 -0
  260. data/spec/mongo/protocol/query_spec.rb +285 -0
  261. data/spec/mongo/protocol/reply_spec.rb +157 -0
  262. data/spec/mongo/protocol/update_spec.rb +186 -0
  263. data/spec/mongo/server/connection_pool/queue_spec.rb +170 -0
  264. data/spec/mongo/server/connection_pool_spec.rb +120 -0
  265. data/spec/mongo/server/connection_spec.rb +312 -0
  266. data/spec/mongo/server/description/features_spec.rb +138 -0
  267. data/spec/mongo/server/description/inspector/primary_elected_spec.rb +94 -0
  268. data/spec/mongo/server/description/inspector/server_added_spec.rb +92 -0
  269. data/spec/mongo/server/description/inspector/server_removed_spec.rb +95 -0
  270. data/spec/mongo/server/description_spec.rb +510 -0
  271. data/spec/mongo/server/monitor_spec.rb +144 -0
  272. data/spec/mongo/server_discovery_and_monitoring_spec.rb +103 -0
  273. data/spec/mongo/server_selection_rtt_spec.rb +104 -0
  274. data/spec/mongo/server_selection_spec.rb +89 -0
  275. data/spec/mongo/server_selector/nearest_spec.rb +250 -0
  276. data/spec/mongo/server_selector/primary_preferred_spec.rb +290 -0
  277. data/spec/mongo/server_selector/primary_spec.rb +114 -0
  278. data/spec/mongo/server_selector/secondary_preferred_spec.rb +252 -0
  279. data/spec/mongo/server_selector/secondary_spec.rb +196 -0
  280. data/spec/mongo/server_selector_spec.rb +101 -0
  281. data/spec/mongo/server_spec.rb +131 -0
  282. data/spec/mongo/uri_spec.rb +517 -0
  283. data/spec/mongo/write_concern/acknowledged_spec.rb +44 -0
  284. data/spec/mongo/write_concern/unacknowledged_spec.rb +15 -0
  285. data/spec/spec_helper.rb +133 -0
  286. data/spec/support/authorization.rb +247 -0
  287. data/spec/support/crud/read.rb +144 -0
  288. data/spec/support/crud/write.rb +214 -0
  289. data/spec/support/crud.rb +203 -0
  290. data/spec/support/crud_tests/read/aggregate.yml +43 -0
  291. data/spec/support/crud_tests/read/count.yml +37 -0
  292. data/spec/support/crud_tests/read/distinct.yml +33 -0
  293. data/spec/support/crud_tests/read/find.yml +50 -0
  294. data/spec/support/crud_tests/write/deleteMany.yml +36 -0
  295. data/spec/support/crud_tests/write/deleteOne.yml +49 -0
  296. data/spec/support/crud_tests/write/findOneAndDelete.yml +54 -0
  297. data/spec/support/crud_tests/write/findOneAndReplace.yml +153 -0
  298. data/spec/support/crud_tests/write/findOneAndUpdate.yml +161 -0
  299. data/spec/support/crud_tests/write/insertMany.yml +24 -0
  300. data/spec/support/crud_tests/write/insertOne.yml +19 -0
  301. data/spec/support/crud_tests/write/replaceOne.yml +96 -0
  302. data/spec/support/crud_tests/write/updateMany.yml +83 -0
  303. data/spec/support/crud_tests/write/updateOne.yml +80 -0
  304. data/spec/support/helpers.rb +140 -0
  305. data/spec/support/matchers.rb +37 -0
  306. data/spec/support/sdam/rs/discover_arbiters.yml +41 -0
  307. data/spec/support/sdam/rs/discover_passives.yml +41 -0
  308. data/spec/support/sdam/rs/discover_primary.yml +40 -0
  309. data/spec/support/sdam/rs/discover_secondary.yml +41 -0
  310. data/spec/support/sdam/rs/discovery.yml +195 -0
  311. data/spec/support/sdam/rs/ghost_discovered.yml +39 -0
  312. data/spec/support/sdam/rs/hosts_differ_from_seeds.yml +34 -0
  313. data/spec/support/sdam/rs/member_reconfig.yml +68 -0
  314. data/spec/support/sdam/rs/member_standalone.yml +60 -0
  315. data/spec/support/sdam/rs/new_primary.yml +74 -0
  316. data/spec/support/sdam/rs/new_primary_wrong_set_name.yml +71 -0
  317. data/spec/support/sdam/rs/non_rs_member.yml +31 -0
  318. data/spec/support/sdam/rs/normalize_case.yml +49 -0
  319. data/spec/support/sdam/rs/primary_becomes_standalone.yml +52 -0
  320. data/spec/support/sdam/rs/primary_changes_set_name.yml +57 -0
  321. data/spec/support/sdam/rs/primary_disconnect.yml +56 -0
  322. data/spec/support/sdam/rs/primary_wrong_set_name.yml +27 -0
  323. data/spec/support/sdam/rs/response_from_removed.yml +63 -0
  324. data/spec/support/sdam/rs/rsother_discovered.yml +41 -0
  325. data/spec/support/sdam/rs/sec_not_auth.yml +49 -0
  326. data/spec/support/sdam/rs/secondary_wrong_set_name.yml +28 -0
  327. data/spec/support/sdam/rs/secondary_wrong_set_name_with_primary.yml +69 -0
  328. data/spec/support/sdam/rs/unexpected_mongos.yml +26 -0
  329. data/spec/support/sdam/rs/wrong_set_name.yml +35 -0
  330. data/spec/support/sdam/sharded/multiple_mongoses.yml +46 -0
  331. data/spec/support/sdam/sharded/non_mongos_removed.yml +41 -0
  332. data/spec/support/sdam/sharded/normalize_uri_case.yml +32 -0
  333. data/spec/support/sdam/single/direct_connection_external_ip.yml +34 -0
  334. data/spec/support/sdam/single/direct_connection_mongos.yml +33 -0
  335. data/spec/support/sdam/single/direct_connection_rsarbiter.yml +35 -0
  336. data/spec/support/sdam/single/direct_connection_rsprimary.yml +34 -0
  337. data/spec/support/sdam/single/direct_connection_rssecondary.yml +35 -0
  338. data/spec/support/sdam/single/direct_connection_slave.yml +32 -0
  339. data/spec/support/sdam/single/direct_connection_standalone.yml +32 -0
  340. data/spec/support/sdam/single/not_ok_response.yml +39 -0
  341. data/spec/support/sdam/single/standalone_removed.yml +32 -0
  342. data/spec/support/sdam/single/unavailable_seed.yml +28 -0
  343. data/spec/support/server_discovery_and_monitoring.rb +167 -0
  344. data/spec/support/server_selection/rtt/first_value.yml +4 -0
  345. data/spec/support/server_selection/rtt/first_value_zero.yml +4 -0
  346. data/spec/support/server_selection/rtt/value_test_1.yml +4 -0
  347. data/spec/support/server_selection/rtt/value_test_2.yml +4 -0
  348. data/spec/support/server_selection/rtt/value_test_3.yml +4 -0
  349. data/spec/support/server_selection/rtt/value_test_4.yml +4 -0
  350. data/spec/support/server_selection/rtt/value_test_5.yml +4 -0
  351. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest.yml +26 -0
  352. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest_non_matching.yml +21 -0
  353. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Primary.yml +21 -0
  354. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred.yml +26 -0
  355. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred_non_matching.yml +21 -0
  356. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary.yml +26 -0
  357. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred.yml +26 -0
  358. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred_non_matching.yml +21 -0
  359. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary_non_matching.yml +21 -0
  360. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest.yml +33 -0
  361. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest_non_matching.yml +26 -0
  362. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Primary.yml +29 -0
  363. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred.yml +29 -0
  364. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred_non_matching.yml +29 -0
  365. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Secondary.yml +31 -0
  366. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/SecondaryPreferred.yml +31 -0
  367. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/SecondaryPreferred_non_matching.yml +29 -0
  368. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Secondary_non_matching.yml +26 -0
  369. data/spec/support/server_selection/selection/Sharded/read/SecondaryPreferred.yml +26 -0
  370. data/spec/support/server_selection/selection/Single/read/SecondaryPreferred.yml +19 -0
  371. data/spec/support/server_selection/selection/Unknown/read/SecondaryPreferred.yml +11 -0
  372. data/spec/support/server_selection.rb +157 -0
  373. data/spec/support/server_selection_rtt.rb +41 -0
  374. data/spec/support/shared/bulk_write.rb +535 -0
  375. data/spec/support/shared/cursor.rb +38 -0
  376. data/spec/support/shared/operation.rb +77 -0
  377. data/spec/support/shared/protocol.rb +31 -0
  378. data/spec/support/shared/server_selector.rb +111 -0
  379. data/spec/support/shared/socket.rb +82 -0
  380. data/spec/support/travis.rb +14 -0
  381. data.tar.gz.sig +2 -3
  382. metadata +583 -186
  383. metadata.gz.sig +0 -0
  384. data/VERSION +0 -1
  385. data/lib/mongo/bulk_write_collection_view.rb +0 -387
  386. data/lib/mongo/collection_writer.rb +0 -364
  387. data/lib/mongo/connection/node.rb +0 -249
  388. data/lib/mongo/connection/pool.rb +0 -340
  389. data/lib/mongo/connection/pool_manager.rb +0 -320
  390. data/lib/mongo/connection/sharding_pool_manager.rb +0 -67
  391. data/lib/mongo/connection/socket/ssl_socket.rb +0 -95
  392. data/lib/mongo/connection/socket/tcp_socket.rb +0 -87
  393. data/lib/mongo/connection/socket/unix_socket.rb +0 -39
  394. data/lib/mongo/db.rb +0 -808
  395. data/lib/mongo/exception.rb +0 -145
  396. data/lib/mongo/functional/authentication.rb +0 -455
  397. data/lib/mongo/functional/logging.rb +0 -85
  398. data/lib/mongo/functional/read_preference.rb +0 -183
  399. data/lib/mongo/functional/scram.rb +0 -556
  400. data/lib/mongo/functional/uri_parser.rb +0 -409
  401. data/lib/mongo/functional/write_concern.rb +0 -66
  402. data/lib/mongo/gridfs/grid.rb +0 -112
  403. data/lib/mongo/gridfs/grid_ext.rb +0 -53
  404. data/lib/mongo/gridfs/grid_file_system.rb +0 -163
  405. data/lib/mongo/gridfs/grid_io.rb +0 -484
  406. data/lib/mongo/legacy.rb +0 -140
  407. data/lib/mongo/mongo_client.rb +0 -697
  408. data/lib/mongo/mongo_replica_set_client.rb +0 -535
  409. data/lib/mongo/mongo_sharded_client.rb +0 -159
  410. data/lib/mongo/networking.rb +0 -372
  411. data/lib/mongo/utils/conversions.rb +0 -110
  412. data/lib/mongo/utils/core_ext.rb +0 -70
  413. data/lib/mongo/utils/server_version.rb +0 -69
  414. data/lib/mongo/utils/support.rb +0 -80
  415. data/test/functional/authentication_test.rb +0 -39
  416. data/test/functional/bulk_api_stress_test.rb +0 -133
  417. data/test/functional/bulk_write_collection_view_test.rb +0 -1198
  418. data/test/functional/client_test.rb +0 -627
  419. data/test/functional/collection_test.rb +0 -2175
  420. data/test/functional/collection_writer_test.rb +0 -83
  421. data/test/functional/conversions_test.rb +0 -163
  422. data/test/functional/cursor_fail_test.rb +0 -57
  423. data/test/functional/cursor_message_test.rb +0 -56
  424. data/test/functional/cursor_test.rb +0 -683
  425. data/test/functional/db_api_test.rb +0 -835
  426. data/test/functional/db_test.rb +0 -348
  427. data/test/functional/grid_file_system_test.rb +0 -285
  428. data/test/functional/grid_io_test.rb +0 -252
  429. data/test/functional/grid_test.rb +0 -273
  430. data/test/functional/pool_test.rb +0 -136
  431. data/test/functional/safe_test.rb +0 -98
  432. data/test/functional/support_test.rb +0 -62
  433. data/test/functional/timeout_test.rb +0 -60
  434. data/test/functional/uri_test.rb +0 -446
  435. data/test/functional/write_concern_test.rb +0 -118
  436. data/test/helpers/general.rb +0 -50
  437. data/test/helpers/test_unit.rb +0 -476
  438. data/test/replica_set/authentication_test.rb +0 -37
  439. data/test/replica_set/basic_test.rb +0 -189
  440. data/test/replica_set/client_test.rb +0 -393
  441. data/test/replica_set/connection_test.rb +0 -138
  442. data/test/replica_set/count_test.rb +0 -66
  443. data/test/replica_set/cursor_test.rb +0 -220
  444. data/test/replica_set/insert_test.rb +0 -157
  445. data/test/replica_set/max_values_test.rb +0 -151
  446. data/test/replica_set/pinning_test.rb +0 -105
  447. data/test/replica_set/query_test.rb +0 -73
  448. data/test/replica_set/read_preference_test.rb +0 -219
  449. data/test/replica_set/refresh_test.rb +0 -211
  450. data/test/replica_set/replication_ack_test.rb +0 -95
  451. data/test/sharded_cluster/basic_test.rb +0 -203
  452. data/test/shared/authentication/basic_auth_shared.rb +0 -260
  453. data/test/shared/authentication/bulk_api_auth_shared.rb +0 -249
  454. data/test/shared/authentication/gssapi_shared.rb +0 -176
  455. data/test/shared/authentication/sasl_plain_shared.rb +0 -96
  456. data/test/shared/authentication/scram_shared.rb +0 -92
  457. data/test/shared/ssl_shared.rb +0 -235
  458. data/test/test_helper.rb +0 -61
  459. data/test/threading/basic_test.rb +0 -120
  460. data/test/tools/mongo_config.rb +0 -708
  461. data/test/tools/mongo_config_test.rb +0 -160
  462. data/test/unit/client_test.rb +0 -381
  463. data/test/unit/collection_test.rb +0 -166
  464. data/test/unit/connection_test.rb +0 -335
  465. data/test/unit/cursor_test.rb +0 -307
  466. data/test/unit/db_test.rb +0 -136
  467. data/test/unit/grid_test.rb +0 -76
  468. data/test/unit/mongo_sharded_client_test.rb +0 -48
  469. data/test/unit/node_test.rb +0 -93
  470. data/test/unit/pool_manager_test.rb +0 -111
  471. data/test/unit/read_pref_test.rb +0 -406
  472. data/test/unit/read_test.rb +0 -159
  473. data/test/unit/safe_test.rb +0 -158
  474. data/test/unit/sharding_pool_manager_test.rb +0 -84
  475. data/test/unit/write_concern_test.rb +0 -175
@@ -0,0 +1,129 @@
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
+ require 'mongo/operation/write/bulk/bulk_insert/result'
16
+
17
+ module Mongo
18
+ module Operation
19
+ module Write
20
+
21
+ # A MongoDB bulk insert operation.
22
+ # This class should only be used by the Bulk API.
23
+ #
24
+ # @note If a server with version >= 2.5.5 is being used, a write command
25
+ # operation will be created and sent instead.
26
+ #
27
+ # @example Create the new insert operation.
28
+ # Write::BulkInsert.new({
29
+ # :documents => [{ :foo => 1 }],
30
+ # :db_name => 'test',
31
+ # :coll_name => 'test_coll',
32
+ # :write_concern => write_concern,
33
+ # :ordered => false
34
+ # })
35
+ #
36
+ # @param [ Hash ] spec The specifications for the insert.
37
+ #
38
+ # @option spec :documents [ Array ] The documents to insert.
39
+ # @option spec :db_name [ String ] The name of the database.
40
+ # @option spec :coll_name [ String ] The name of the collection.
41
+ # @option spec :write_concern [ Mongo::WriteConcern ] The write concern.
42
+ # @option spec :ordered [ true, false ] Whether the operations should be
43
+ # executed in order.
44
+ # @option spec :options [ Hash ] Options for the command, if it ends up being a
45
+ # write command.
46
+ #
47
+ # @since 2.0.0
48
+ class BulkInsert
49
+ include Specifiable
50
+
51
+ # Execute the bulk insert operation.
52
+ #
53
+ # @example Execute the operation.
54
+ # operation.execute(context)
55
+ #
56
+ # @param [ Mongo::Server::Context ] context The context for this operation.
57
+ #
58
+ # @return [ Result ] The operation result.
59
+ #
60
+ # @since 2.0.0
61
+ def execute(context)
62
+ if context.features.write_command_enabled?
63
+ execute_write_command(context)
64
+ else
65
+ execute_message(context)
66
+ end
67
+ end
68
+
69
+ private
70
+
71
+ def execute_write_command(context)
72
+ Result.new(Command::Insert.new(spec).execute(context))
73
+ end
74
+
75
+ def execute_message(context)
76
+ replies = []
77
+ messages.map do |m|
78
+ context.with_connection do |connection|
79
+ result = LegacyResult.new(connection.dispatch([ m, gle ].compact))
80
+ replies << result.reply
81
+ if stop_sending?(result)
82
+ return LegacyResult.new(replies)
83
+ end
84
+ end
85
+ end
86
+ LegacyResult.new(replies.compact.empty? ? nil : replies)
87
+ end
88
+
89
+ def stop_sending?(result)
90
+ ordered? && !result.successful?
91
+ end
92
+
93
+ # @todo put this somewhere else
94
+ def ordered?
95
+ @spec.fetch(:ordered, true)
96
+ end
97
+
98
+ def initialize_copy(original)
99
+ @spec = original.spec.dup
100
+ @spec[DOCUMENTS] = original.spec[DOCUMENTS].clone
101
+ end
102
+
103
+ def gle
104
+ gle_message = ( ordered? && write_concern.get_last_error.nil? ) ?
105
+ Mongo::WriteConcern.get(:w => 1).get_last_error :
106
+ write_concern.get_last_error
107
+ if gle_message
108
+ Protocol::Query.new(
109
+ db_name,
110
+ Database::COMMAND,
111
+ gle_message,
112
+ options.merge(limit: -1)
113
+ )
114
+ end
115
+ end
116
+
117
+ def messages
118
+ if ordered? || gle
119
+ documents.collect do |doc|
120
+ Protocol::Insert.new(db_name, coll_name, [ doc ], options)
121
+ end
122
+ else
123
+ [ Protocol::Insert.new(db_name, coll_name, documents, { :flags => [:continue_on_error] }) ]
124
+ end
125
+ end
126
+ end
127
+ end
128
+ end
129
+ end
@@ -0,0 +1,67 @@
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
+ module BulkMergable
20
+
21
+ # Aggregate the write errors returned from this result.
22
+ #
23
+ # @example Aggregate the write errors.
24
+ # result.aggregate_write_errors([0, 1, 2, 3])
25
+ #
26
+ # @param [ Array ] indexes The indexes of each operation as they
27
+ # were listed in the Bulk API.
28
+ #
29
+ # @return [ Array ] The aggregate write errors.
30
+ #
31
+ # @since 2.0.0
32
+ def aggregate_write_errors(indexes)
33
+ @replies.reduce(nil) do |errors, reply|
34
+ if reply.documents.first['writeErrors']
35
+ write_errors = reply.documents.first['writeErrors'].collect do |we|
36
+ we.merge!('index' => indexes[we['index']])
37
+ end
38
+ (errors || []) << write_errors if write_errors
39
+ end
40
+ end
41
+ end
42
+
43
+ # Aggregate the write concern errors returned from this result.
44
+ #
45
+ # @example Aggregate the write concern errors.
46
+ # result.aggregate_write_concern_errors([0, 1, 2, 3])
47
+ #
48
+ # @param [ Array ] indexes The indexes of each operation as they
49
+ # were listed in the Bulk API.
50
+ #
51
+ # @return [ Array ] The aggregate write concern errors.
52
+ #
53
+ # @since 2.0.0
54
+ def aggregate_write_concern_errors(indexes)
55
+ @replies.each_with_index.reduce(nil) do |errors, (reply, i)|
56
+ if write_concern_errors = reply.documents.first['writeConcernErrors']
57
+ (errors || []) << write_concern_errors.reduce(nil) do |errs, wce|
58
+ wce.merge!('index' => indexes[wce['index']])
59
+ (errs || []) << write_concern_error
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,162 @@
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
+ require 'mongo/operation/write/bulk/bulk_mergable'
16
+ require 'mongo/operation/write/bulk/legacy_bulk_mergable'
17
+
18
+ module Mongo
19
+ module Operation
20
+ module Write
21
+ class BulkUpdate
22
+
23
+ # Defines custom behaviour of results when updating.
24
+ #
25
+ # @since 2.0.0
26
+ class Result < Operation::Result
27
+ include BulkMergable
28
+
29
+ # The number of modified docs field in the result.
30
+ #
31
+ # @since 2.0.0
32
+ MODIFIED = 'nModified'.freeze
33
+
34
+ # The upserted docs field in the result.
35
+ #
36
+ # @since 2.0.0
37
+ UPSERTED = 'upserted'.freeze
38
+
39
+ # Gets the number of documents upserted.
40
+ #
41
+ # @example Get the upserted count.
42
+ # result.n_upserted
43
+ #
44
+ # @return [ Integer ] The number of documents upserted.
45
+ #
46
+ # @since 2.0.0
47
+ def n_upserted
48
+ return 0 unless acknowledged?
49
+ @replies.reduce(0) do |n, reply|
50
+ if upsert?(reply)
51
+ n += 1
52
+ else
53
+ n += 0
54
+ end
55
+ end
56
+ end
57
+
58
+ # Gets the number of documents matched.
59
+ #
60
+ # @example Get the matched count.
61
+ # result.n_matched
62
+ #
63
+ # @return [ Integer ] The number of documents matched.
64
+ #
65
+ # @since 2.0.0
66
+ def n_matched
67
+ return 0 unless acknowledged?
68
+ @replies.reduce(0) do |n, reply|
69
+ if upsert?(reply)
70
+ n += 0
71
+ else
72
+ n += reply.documents.first[N]
73
+ end
74
+ end
75
+ end
76
+
77
+ # Gets the number of documents modified.
78
+ #
79
+ # @example Get the modified count.
80
+ # result.n_modified
81
+ #
82
+ # @return [ Integer ] The number of documents modified.
83
+ #
84
+ # @since 2.0.0
85
+ def n_modified
86
+ return 0 unless acknowledged?
87
+ @replies.reduce(0) do |n, reply|
88
+ n += reply.documents.first[MODIFIED] || 0
89
+ end
90
+ end
91
+
92
+ private
93
+
94
+ def upsert?(reply)
95
+ reply.documents.first[UPSERTED]
96
+ end
97
+ end
98
+
99
+ # Defines custom behaviour of results when updating.
100
+ # For server versions < 2.5.5 (that don't use write commands).
101
+ #
102
+ # @since 2.0.0
103
+ class LegacyResult < Operation::Result
104
+ include LegacyBulkMergable
105
+
106
+ # The updated existing field in the result.
107
+ #
108
+ # @since 2.0.0
109
+ UPDATED_EXISTING = 'updatedExisting'.freeze
110
+
111
+ # Gets the number of documents upserted.
112
+ #
113
+ # @example Get the upserted count.
114
+ # result.n_upserted
115
+ #
116
+ # @return [ Integer ] The number of documents upserted.
117
+ #
118
+ # @since 2.0.0
119
+ def n_upserted
120
+ return 0 unless acknowledged?
121
+ @replies.reduce(0) do |n, reply|
122
+ if upsert?(reply)
123
+ n += reply.documents.first[N]
124
+ else
125
+ n
126
+ end
127
+ end
128
+ end
129
+
130
+ # Gets the number of documents matched.
131
+ #
132
+ # @example Get the matched count.
133
+ # result.n_matched
134
+ #
135
+ # @return [ Integer ] The number of documents matched.
136
+ #
137
+ # @since 2.0.0
138
+ def n_matched
139
+ return 0 unless acknowledged?
140
+ @replies.reduce(0) do |n, reply|
141
+ if upsert?(reply)
142
+ n
143
+ else
144
+ n += reply.documents.first[N]
145
+ end
146
+ end
147
+ end
148
+
149
+ private
150
+
151
+ def upsert?(reply)
152
+ !updated_existing?(reply) && reply.documents.first[N] == 1
153
+ end
154
+
155
+ def updated_existing?(reply)
156
+ reply.documents.first[UPDATED_EXISTING]
157
+ end
158
+ end
159
+ end
160
+ end
161
+ end
162
+ end
@@ -0,0 +1,153 @@
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
+ require 'mongo/operation/write/bulk/bulk_update/result'
16
+
17
+ module Mongo
18
+ module Operation
19
+ module Write
20
+
21
+ # A MongoDB bulk update operation.
22
+ #
23
+ # @note If the server version is >= 2.5.5, a write command operation
24
+ # will be created and sent instead.
25
+ #
26
+ # @example Create the update operation.
27
+ # Write::BulkUpdate.new({
28
+ # :updates => [
29
+ # {
30
+ # :q => { :foo => 1 },
31
+ # :u => { :$set => { :bar => 1 }},
32
+ # :multi => true,
33
+ # :upsert => false
34
+ # }
35
+ # ],
36
+ # :db_name => 'test',
37
+ # :coll_name => 'test_coll',
38
+ # :write_concern => write_concern,
39
+ # :ordered => false
40
+ # })
41
+ #
42
+ # @param [ Hash ] spec The specifications for the update.
43
+ #
44
+ # @option spec :updates [ Array ] The update documents.
45
+ # @option spec :db_name [ String ] The name of the database on which
46
+ # the query should be run.
47
+ # @option spec :coll_name [ String ] The name of the collection on which
48
+ # the query should be run.
49
+ # @option spec :write_concern [ Mongo::WriteConcern ] The write concern.
50
+ # @option spec :ordered [ true, false ] Whether the operations should be
51
+ # executed in order.
52
+ # @option spec :options [ Hash ] Options for the command, if it ends up being a
53
+ # write command.
54
+ #
55
+ # @since 2.0.0
56
+ class BulkUpdate
57
+ include Executable
58
+ include Specifiable
59
+
60
+ # Execute the update operation.
61
+ #
62
+ # @example Execute the operation.
63
+ # operation.execute(context)
64
+ #
65
+ # @param [ Mongo::Server::Context ] context The context for this operation.
66
+ #
67
+ # @return [ Result ] The operation result.
68
+ #
69
+ # @since 2.0.0
70
+ def execute(context)
71
+ if context.features.write_command_enabled?
72
+ execute_write_command(context)
73
+ else
74
+ execute_message(context)
75
+ end
76
+ end
77
+
78
+ # Set the write concern on this operation.
79
+ #
80
+ # @example Set a write concern.
81
+ # new_op = operation.write_concern(:w => 2)
82
+ #
83
+ # @param [ Hash ] wc The write concern.
84
+ #
85
+ # @since 2.0.0
86
+ def write_concern(wc = nil)
87
+ if wc
88
+ self.class.new(spec.merge(write_concern: WriteConcern.get(wc)))
89
+ else
90
+ spec[WRITE_CONCERN]
91
+ end
92
+ end
93
+
94
+ private
95
+
96
+ def execute_write_command(context)
97
+ Result.new(Command::Update.new(spec).execute(context))
98
+ end
99
+
100
+ def execute_message(context)
101
+ replies = messages.map do |m|
102
+ context.with_connection do |connection|
103
+ result = LegacyResult.new(connection.dispatch([ m, gle ].compact))
104
+ if stop_sending?(result)
105
+ return result
106
+ else
107
+ result.reply
108
+ end
109
+ end
110
+ end
111
+ LegacyResult.new(replies.compact.empty? ? nil : replies)
112
+ end
113
+
114
+ def stop_sending?(result)
115
+ ordered? && !result.successful?
116
+ end
117
+
118
+ # @todo put this somewhere else
119
+ def ordered?
120
+ @spec.fetch(:ordered, true)
121
+ end
122
+
123
+ def gle
124
+ gle_message = ( ordered? && write_concern.get_last_error.nil? ) ?
125
+ Mongo::WriteConcern.get(:w => 1).get_last_error :
126
+ write_concern.get_last_error
127
+ if gle_message
128
+ Protocol::Query.new(
129
+ db_name,
130
+ Database::COMMAND,
131
+ gle_message,
132
+ options.merge(limit: -1)
133
+ )
134
+ end
135
+ end
136
+
137
+ def initialize_copy(original)
138
+ @spec = original.spec.dup
139
+ @spec[UPDATES] = original.spec[UPDATES].dup
140
+ end
141
+
142
+ def messages
143
+ updates.collect do |u|
144
+ opts = { :flags => [] }
145
+ opts[:flags] << :multi_update if !!u[:multi]
146
+ opts[:flags] << :upsert if !!u[:upsert]
147
+ Protocol::Update.new(db_name, coll_name, u[:q], u[:u], opts)
148
+ end
149
+ end
150
+ end
151
+ end
152
+ end
153
+ end
@@ -0,0 +1,83 @@
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
+ module LegacyBulkMergable
20
+
21
+ # Aggregate the write errors returned from this result.
22
+ #
23
+ # @example Aggregate the write errors.
24
+ # result.aggregate_write_errors([0, 1, 2, 3])
25
+ #
26
+ # @param [ Array ] indexes The indexes of each operation as they
27
+ # were listed in the Bulk API.
28
+ #
29
+ # @return [ Array ] The aggregate write errors.
30
+ #
31
+ # @since 2.0.0
32
+ def aggregate_write_errors(indexes)
33
+ @replies.each_with_index.reduce(nil) do |errors, (reply, i)|
34
+ if reply_write_errors?(reply)
35
+ errors ||= []
36
+ errors << { 'errmsg' => reply.documents.first[Error::ERROR],
37
+ 'index' => indexes[i],
38
+ 'code' => reply.documents.first[Error::CODE] }
39
+ end
40
+ errors
41
+ end
42
+ end
43
+
44
+ # Aggregate the write concern errors returned from this result.
45
+ #
46
+ # @example Aggregate the write concern errors.
47
+ # result.aggregate_write_concern_errors([0, 1, 2, 3])
48
+ #
49
+ # @param [ Array ] indexes The indexes of each operation as they
50
+ # were listed in the Bulk API.
51
+ #
52
+ # @return [ Array ] The aggregate write concern errors.
53
+ #
54
+ # @since 2.0.0
55
+ def aggregate_write_concern_errors(indexes)
56
+ @replies.each_with_index.reduce(nil) do |errors, (reply, i)|
57
+ if error = reply_write_errors?(reply)
58
+ errors ||= []
59
+ if note = reply.documents.first['wnote'] || reply.documents.first['jnote']
60
+ code = reply.documents.first['code'] || Error::BAD_VALUE
61
+ error_string = "#{code}: #{note}"
62
+ elsif error == 'timeout'
63
+ code = reply.documents.first['code'] || Error::UNKNOWN_ERROR
64
+ error_string = "#{code}: #{error}"
65
+ end
66
+ errors << { 'errmsg' => error_string,
67
+ 'index' => indexes[i],
68
+ 'code' => code } if error_string
69
+ end
70
+ errors
71
+ end
72
+ end
73
+
74
+ private
75
+
76
+ def reply_write_errors?(reply)
77
+ reply.documents.first[Error::ERROR] ||
78
+ reply.documents.first[Error::ERRMSG]
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,17 @@
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
+ require 'mongo/operation/write/bulk/bulk_delete'
16
+ require 'mongo/operation/write/bulk/bulk_insert'
17
+ require 'mongo/operation/write/bulk/bulk_update'
@@ -0,0 +1,50 @@
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
+ module Command
19
+
20
+ # A MongoDB ensure index write command operation.
21
+ #
22
+ # @example Create an ensure index command operation.
23
+ # Write::Command::CreateIndex.new({
24
+ # :indexes => [{ :key => { :foo => 1 }, :name => 'foo_1', :unique => true }],
25
+ # :db_name => 'test',
26
+ # :coll_name => 'test_coll'
27
+ # })
28
+ #
29
+ # @since 2.0.0
30
+ class CreateIndex
31
+ include Specifiable
32
+ include Executable
33
+ include Writable
34
+
35
+ private
36
+
37
+ # The query selector for this ensure index command operation.
38
+ #
39
+ # @return [ Hash ] The selector describing this insert operation.
40
+ #
41
+ # @since 2.0.0
42
+ def selector
43
+ { :createIndexes => coll_name, :indexes => indexes }
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+