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,48 @@
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
+
17
+ module BulkWrite
18
+
19
+ class OrderedBulkWrite
20
+
21
+ include BulkWritable
22
+
23
+ private
24
+
25
+ def ordered?
26
+ true
27
+ end
28
+
29
+ def merged_ops
30
+ merge_consecutive_ops(@operations)
31
+ end
32
+
33
+ def process(result, indexes)
34
+ combine_results(result, indexes)
35
+ raise Error::BulkWriteError.new(@results) if stop?
36
+ end
37
+
38
+ def stop?
39
+ @results.keys.include?(:write_errors)
40
+ end
41
+
42
+ def finalize
43
+ raise Error::BulkWriteError.new(@results) if @results[:write_concern_errors]
44
+ @results
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,57 @@
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 BulkWrite
17
+
18
+ # Defines behavior for validating and combining replace bulk write operations.
19
+ #
20
+ # @since 2.0.0.
21
+ module Replacable
22
+
23
+ private
24
+
25
+ def replacement_doc?(doc)
26
+ doc.respond_to?(:keys) && doc.keys.all?{|key| key !~ /^\$/}
27
+ end
28
+
29
+ def validate_replace_op!(r, type)
30
+ unless r[:find] && r[:replacement] && replacement_doc?(r[:replacement])
31
+ raise Error::InvalidBulkOperation.new(type, r)
32
+ end
33
+ end
34
+
35
+ def replace_ops(ops, type)
36
+ ops.collect do |r|
37
+ validate_replace_op!(r, type)
38
+ { q: r[:find],
39
+ u: r[:replacement],
40
+ multi: false,
41
+ upsert: r.fetch(:upsert, false)
42
+ }
43
+ end
44
+ end
45
+
46
+ def replace_one(op, server)
47
+ Operation::Write::BulkUpdate.new(
48
+ :updates => replace_ops(op[:replace_one], __method__),
49
+ :db_name => database.name,
50
+ :coll_name => @collection.name,
51
+ :write_concern => write_concern,
52
+ :ordered => ordered?
53
+ ).execute(server.context)
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,46 @@
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
+
17
+ module BulkWrite
18
+
19
+ class UnorderedBulkWrite
20
+
21
+ include BulkWritable
22
+
23
+ private
24
+
25
+ def ordered?
26
+ false
27
+ end
28
+
29
+ def merged_ops
30
+ merge_consecutive_ops(merge_ops_by_type)
31
+ end
32
+
33
+ def process(result, indexes)
34
+ combine_results(result, indexes)
35
+ end
36
+
37
+ def finalize
38
+ @results.tap do |results|
39
+ if results[:write_errors] || results[:write_concern_errors]
40
+ raise Error::BulkWriteError.new(results)
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,68 @@
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 BulkWrite
17
+
18
+ # Defines behavior for validating and combining update bulk write operations.
19
+ #
20
+ # @since 2.0.0.
21
+ module Updatable
22
+
23
+ private
24
+
25
+ def update_doc?(doc)
26
+ !doc.empty? &&
27
+ doc.respond_to?(:keys) &&
28
+ doc.keys.first.to_s =~ /^\$/
29
+ end
30
+
31
+ def validate_update_op!(type, u)
32
+ unless u[:find] && u[:update] && update_doc?(u[:update])
33
+ raise Error::InvalidBulkOperation.new(type, u)
34
+ end
35
+ end
36
+
37
+ def updates(ops, type)
38
+ multi = type == :update_many
39
+ ops.collect do |u|
40
+ validate_update_op!(type, u)
41
+ { q: u[:find],
42
+ u: u[:update],
43
+ multi: multi,
44
+ upsert: u.fetch(:upsert, false)
45
+ }
46
+ end
47
+ end
48
+
49
+ def update(ops, type, server)
50
+ Operation::Write::BulkUpdate.new(
51
+ :updates => updates(ops, type),
52
+ :db_name => database.name,
53
+ :coll_name => @collection.name,
54
+ :write_concern => write_concern,
55
+ :ordered => ordered?
56
+ ).execute(server.context)
57
+ end
58
+
59
+ def update_one(op, server)
60
+ update(op[:update_one], __method__, server)
61
+ end
62
+
63
+ def update_many(op, server)
64
+ update(op[:update_many], __method__, server)
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,52 @@
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/bulk_write/bulk_writable'
16
+ require 'mongo/bulk_write/ordered_bulk_write'
17
+ require 'mongo/bulk_write/unordered_bulk_write'
18
+
19
+ module Mongo
20
+ module BulkWrite
21
+ extend self
22
+
23
+ # Get a bulk write object either of type ordered or unordered.
24
+ #
25
+ # @example Get a bulk write object.
26
+ # Mongo::BulkWrite.get(collection, operations, ordered: true)
27
+ #
28
+ # @param [ Collection ] collection The collection on which the operations
29
+ # will be executed.
30
+ #
31
+ # @param [ Array<Hash> ] operations The operations to execute.
32
+ #
33
+ # @param [ Hash ] options The options for the bulk write object.
34
+ #
35
+ # @option options [ true, false ] :ordered Whether the operations
36
+ # should be executed in order.
37
+ # @option options [ Hash ] :write_concern The write concern options.
38
+ # Can be :w => Integer, :fsync => Boolean, :j => Boolean.
39
+ #
40
+ # @return [ OrderedBulkWrite, UnorderedBulkWrite ] The appropriate bulk
41
+ # write object.
42
+ #
43
+ # @since 2.0.0
44
+ def get(collection, operations, options)
45
+ if options.fetch(:ordered, true)
46
+ OrderedBulkWrite.new(collection, operations, options)
47
+ else
48
+ UnorderedBulkWrite.new(collection, operations, options)
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,246 @@
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
+
17
+ # The client is the entry point to the driver and is the main object that
18
+ # will be interacted with.
19
+ #
20
+ # @since 2.0.0
21
+ class Client
22
+ extend Forwardable
23
+
24
+ # @return [ Mongo::Cluster ] cluster The cluster of servers for the client.
25
+ attr_reader :cluster
26
+
27
+ # @return [ Mongo::Database ] database The database the client is operating on.
28
+ attr_reader :database
29
+
30
+ # @return [ Hash ] options The configuration options.
31
+ attr_reader :options
32
+
33
+ # Delegate command execution to the current database.
34
+ def_delegators :@database, :command
35
+
36
+ # Determine if this client is equivalent to another object.
37
+ #
38
+ # @example Check client equality.
39
+ # client == other
40
+ #
41
+ # @param [ Object ] other The object to compare to.
42
+ #
43
+ # @return [ true, false ] If the objects are equal.
44
+ #
45
+ # @since 2.0.0
46
+ def ==(other)
47
+ return false unless other.is_a?(Client)
48
+ cluster == other.cluster && options == other.options
49
+ end
50
+ alias_method :eql?, :==
51
+
52
+ # Get a collection object for the provided collection name.
53
+ #
54
+ # @example Get the collection.
55
+ # client[:users]
56
+ #
57
+ # @param [ String, Symbol ] collection_name The name of the collection.
58
+ # @param [ Hash ] options The options to the collection.
59
+ #
60
+ # @return [ Mongo::Collection ] The collection.
61
+ #
62
+ # @since 2.0.0
63
+ def [](collection_name, options = {})
64
+ database[collection_name, options]
65
+ end
66
+
67
+ # Get the hash value of the client.
68
+ #
69
+ # @example Get the client hash value.
70
+ # client.hash
71
+ #
72
+ # @return [ Integer ] The client hash value.
73
+ #
74
+ # @since 2.0.0
75
+ def hash
76
+ [cluster, options].hash
77
+ end
78
+
79
+ # Instantiate a new driver client.
80
+ #
81
+ # @example Instantiate a single server or mongos client.
82
+ # Mongo::Client.new([ '127.0.0.1:27017' ])
83
+ #
84
+ # @example Instantiate a client for a replica set.
85
+ # Mongo::Client.new([ '127.0.0.1:27017', '127.0.0.1:27021' ])
86
+ #
87
+ # @param [ Array<String>, String ] addresses_or_uri The array of server addresses in the
88
+ # form of host:port or a MongoDB URI connection string.
89
+ # @param [ Hash ] options The options to be used by the client.
90
+ #
91
+ # @option options [ Symbol ] :auth_mech The authentication mechanism to
92
+ # use. One of :mongodb_cr, :mongodb_x509, :plain, :scram
93
+ # @option options [ String ] :auth_source The source to authenticate from.
94
+ # @option options [ Symbol ] :connect The connection method to use. This
95
+ # forces the cluster to behave in the specified way instead of
96
+ # auto-discovering. One of :direct, :replica_set, :sharded
97
+ # @option options [ String ] :database The database to connect to.
98
+ # @option options [ Hash ] :auth_mech_properties
99
+ # @option options [ Float ] :heartbeat_frequency The number of seconds for
100
+ # the server monitor to refresh it's description via ismaster.
101
+ # @option options [ Integer ] :local_threshold The local threshold boundary
102
+ # in seconds for selecting a near server for an operation.
103
+ # @option options [ Integer ] :server_selection_timeout The timeout in seconds
104
+ # for selecting a server for an operation.
105
+ # @option options [ String ] :password The user's password.
106
+ # @option options [ Integer ] :max_pool_size The maximum size of the
107
+ # connection pool.
108
+ # @option options [ Integer ] :min_pool_size The minimum size of the
109
+ # connection pool.
110
+ # @option options [ Float ] :wait_queue_timeout The time to wait, in
111
+ # seconds, in the connection pool for a connection to be checked in.
112
+ # @option options [ Float ] :connect_timeout The timeout, in seconds, to
113
+ # attempt a connection.
114
+ # @option options [ Symbol ] :read The read preference options. :mode can
115
+ # be one of :secondary, :secondary_preferred, :primary,
116
+ # :primary_preferred, :nearest.
117
+ # @option options [ Array<Hash, String> ] :roles The list of roles for the
118
+ # user.
119
+ # @option options [ Symbol ] :replica_set The name of the replica set to
120
+ # connect to. Servers not in this replica set will be ignored.
121
+ # @option options [ true, false ] :ssl Whether to use SSL.
122
+ # @option options [ String ] :ssl_cert The certificate file used to identify
123
+ # the connection against MongoDB.
124
+ # @option options [ String ] :ssl_key The private keyfile used to identify the
125
+ # connection against MongoDB. Note that even if the key is stored in the same
126
+ # file as the certificate, both need to be explicitly specified.
127
+ # @option options [ String ] :ssl_key_pass_phrase A passphrase for the private key.
128
+ # @option options [ true, false ] :ssl_verify Whether or not to do peer certification
129
+ # validation.
130
+ # @option options [ String ] :ssl_ca_cert The file containing a set of concatenated
131
+ # certification authority certifications used to validate certs passed from the
132
+ # other end of the connection. Required for :ssl_verify.
133
+ # @option options [ Float ] :socket_timeout The timeout, in seconds, to
134
+ # execute operations on a socket.
135
+ # @option options [ String ] :user The user name.
136
+ # @option options [ Hash ] :write The write concern options. Can be :w =>
137
+ # Integer, :fsync => Boolean, :j => Boolean.
138
+ #
139
+ # @since 2.0.0
140
+ def initialize(addresses_or_uri, options = {})
141
+ if addresses_or_uri.is_a?(::String)
142
+ create_from_uri(addresses_or_uri, options)
143
+ else
144
+ create_from_addresses(addresses_or_uri, options)
145
+ end
146
+ end
147
+
148
+ # Get an inspection of the client as a string.
149
+ #
150
+ # @example Inspect the client.
151
+ # client.inspect
152
+ #
153
+ # @return [ String ] The inspection string.
154
+ #
155
+ # @since 2.0.0
156
+ def inspect
157
+ "#<Mongo::Client:0x#{object_id} cluster=#{cluster.addresses.join(', ')}>"
158
+ end
159
+
160
+ # Get the read preference from the options passed to the client.
161
+ #
162
+ # @example Get the read preference.
163
+ # client.read_preference
164
+ #
165
+ # @return [ Object ] The appropriate read preference or primary if none
166
+ # was provided to the client.
167
+ #
168
+ # @since 2.0.0
169
+ def read_preference
170
+ @read_preference ||= ServerSelector.get(options[:read] || {}, options)
171
+ end
172
+
173
+ # Use the database with the provided name. This will switch the current
174
+ # database the client is operating on.
175
+ #
176
+ # @example Use the provided database.
177
+ # client.use(:users)
178
+ #
179
+ # @param [ String, Symbol ] name The name of the database to use.
180
+ #
181
+ # @return [ Mongo::Client ] The new client with new database.
182
+ #
183
+ # @since 2.0.0
184
+ def use(name)
185
+ with(database: name)
186
+ end
187
+
188
+ # Provides a new client with the passed options merged over the existing
189
+ # options of this client. Useful for one-offs to change specific options
190
+ # without altering the original client.
191
+ #
192
+ # @example Get a client with changed options.
193
+ # client.with(:read => { :mode => :primary_preferred })
194
+ #
195
+ # @param [ Hash ] new_options The new options to use.
196
+ #
197
+ # @return [ Mongo::Client ] A new client instance.
198
+ #
199
+ # @since 2.0.0
200
+ def with(new_options = {})
201
+ clone.tap do |client|
202
+ client.options.update(new_options)
203
+ Database.create(client)
204
+ # We can't use the same cluster if authentication details have changed.
205
+ if new_options[:user] || new_options[:password]
206
+ Cluster.create(client)
207
+ end
208
+ end
209
+ end
210
+
211
+ # Get the write concern for this client. If no option was provided, then a
212
+ # default single server acknowledgement will be used.
213
+ #
214
+ # @example Get the client write concern.
215
+ # client.write_concern
216
+ #
217
+ # @return [ Mongo::WriteConcern ] The write concern.
218
+ #
219
+ # @since 2.0.0
220
+ def write_concern
221
+ @write_concern ||= WriteConcern.get(options[:write])
222
+ end
223
+
224
+ private
225
+
226
+ def create_from_addresses(addresses, opts = {})
227
+ @options = Database::DEFAULT_OPTIONS.merge(opts).freeze
228
+ @cluster = Cluster.new(addresses, options)
229
+ @database = Database.new(self, options[:database], options)
230
+ end
231
+
232
+ def create_from_uri(connection_string, opts = {})
233
+ uri = URI.new(connection_string)
234
+ @options = Database::DEFAULT_OPTIONS.merge(uri.client_options.merge(opts)).freeze
235
+ @cluster = Cluster.new(uri.servers, options)
236
+ @database = Database.new(self, options[:database], options)
237
+ end
238
+
239
+ def initialize_copy(original)
240
+ @options = original.options.dup
241
+ @database = nil
242
+ @read_preference = nil
243
+ @write_concern = nil
244
+ end
245
+ end
246
+ end
@@ -0,0 +1,160 @@
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
+ class Cluster
17
+ module Topology
18
+
19
+ # Defines behaviour when a cluster is in replica set topology.
20
+ #
21
+ # @since 2.0.0
22
+ class ReplicaSet
23
+ include Loggable
24
+
25
+ # Constant for the replica set name configuration option.
26
+ #
27
+ # @since 2.0.0
28
+ REPLICA_SET_NAME = :replica_set.freeze
29
+
30
+ # @return [ Hash ] options The options.
31
+ attr_reader :options
32
+
33
+ # The display name for the topology.
34
+ #
35
+ # @since 2.0.0
36
+ NAME = 'Replica Set'.freeze
37
+
38
+ # Get the display name.
39
+ #
40
+ # @example Get the display name.
41
+ # ReplicaSet.display_name
42
+ #
43
+ # @return [ String ] The display name.
44
+ #
45
+ # @since 2.0.0
46
+ def display_name
47
+ NAME
48
+ end
49
+
50
+ # Elect a primary server within this topology.
51
+ #
52
+ # @example Elect a primary server.
53
+ # topology.elect_primary(description, servers)
54
+ #
55
+ # @param [ Server::Description ] description The description of the
56
+ # elected primary.
57
+ # @param [ Array<Server> ] servers The list of known servers to the
58
+ # cluster.
59
+ #
60
+ # @return [ ReplicaSet ] The topology.
61
+ def elect_primary(description, servers)
62
+ if description.replica_set_name == replica_set_name
63
+ log_debug([ "Server #{description.address.to_s} elected as primary in #{replica_set_name}." ])
64
+ servers.each do |server|
65
+ if server.primary? && server.address != description.address
66
+ server.description.unknown!
67
+ end
68
+ end
69
+ else
70
+ log_warn([
71
+ "Server #{description.address.to_s} in incorrect replica set: #{description.replica_set_name}."
72
+ ])
73
+ end
74
+ self
75
+ end
76
+
77
+ # Initialize the topology with the options.
78
+ #
79
+ # @example Initialize the topology.
80
+ # ReplicaSet.new(options)
81
+ #
82
+ # @param [ Hash ] options The options.
83
+ #
84
+ # @since 2.0.0
85
+ def initialize(options)
86
+ @options = options
87
+ end
88
+
89
+ # A replica set topology is a replica set.
90
+ #
91
+ # @example Is the topology a replica set?
92
+ # ReplicaSet.replica_set?
93
+ #
94
+ # @return [ true ] Always true.
95
+ #
96
+ # @since 2.0.0
97
+ def replica_set?; true; end
98
+
99
+ # Get the replica set name configured for this topology.
100
+ #
101
+ # @example Get the replica set name.
102
+ # topology.replica_set_name
103
+ #
104
+ # @return [ String ] The name of the configured replica set.
105
+ #
106
+ # @since 2.0.0
107
+ def replica_set_name
108
+ @replica_set_name ||= options[REPLICA_SET_NAME]
109
+ end
110
+
111
+ # Select appropriate servers for this topology.
112
+ #
113
+ # @example Select the servers.
114
+ # ReplicaSet.servers(servers)
115
+ #
116
+ # @param [ Array<Server> ] servers The known servers.
117
+ #
118
+ # @return [ Array<Server> ] The servers in the replica set.
119
+ #
120
+ # @since 2.0.0
121
+ def servers(servers)
122
+ servers.select do |server|
123
+ (replica_set_name.nil? || server.replica_set_name == replica_set_name) &&
124
+ server.primary? || server.secondary?
125
+ end
126
+ end
127
+
128
+ # A replica set topology is not sharded.
129
+ #
130
+ # @example Is the topology sharded?
131
+ # ReplicaSet.sharded?
132
+ #
133
+ # @return [ false ] Always false.
134
+ #
135
+ # @since 2.0.0
136
+ def sharded?; false; end
137
+
138
+ # A replica set topology is not standalone.
139
+ #
140
+ # @example Is the topology standalone?
141
+ # ReplicaSet.standalone?
142
+ #
143
+ # @return [ false ] Always false.
144
+ #
145
+ # @since 2.0.0
146
+ def standalone?; false; end
147
+
148
+ # A replica set topology is not unknown.
149
+ #
150
+ # @example Is the topology unknown?
151
+ # ReplicaSet.unknown?
152
+ #
153
+ # @return [ false ] Always false.
154
+ #
155
+ # @since 2.0.0
156
+ def unknown?; false; end
157
+ end
158
+ end
159
+ end
160
+ end