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,134 @@
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 Server
17
+
18
+ # This class models the socket connections for servers and their behavior.
19
+ #
20
+ # @since 2.0.0
21
+ class Connection
22
+ include Connectable
23
+ extend Forwardable
24
+
25
+ # @return [ Mongo::Auth::CR, Mongo::Auth::X509, Mongo::Auth:LDAP ]
26
+ # authenticator The authentication strategy.
27
+ attr_reader :authenticator
28
+
29
+ def_delegators :@server,
30
+ :features,
31
+ :max_bson_object_size,
32
+ :max_message_size,
33
+ :mongos?
34
+
35
+ # Is this connection authenticated. Will return true if authorization
36
+ # details were provided and authentication passed.
37
+ #
38
+ # @example Is the connection authenticated?
39
+ # connection.authenticated?
40
+ #
41
+ # @return [ true, false ] If the connection is authenticated.
42
+ #
43
+ # @since 2.0.0
44
+ def authenticated?
45
+ !!@authenticated
46
+ end
47
+
48
+ # Tell the underlying socket to establish a connection to the host.
49
+ #
50
+ # @example Connect to the host.
51
+ # connection.connect!
52
+ #
53
+ # @note This method mutates the connection class by setting a socket if
54
+ # one previously did not exist.
55
+ #
56
+ # @return [ true ] If the connection succeeded.
57
+ #
58
+ # @since 2.0.0
59
+ def connect!
60
+ unless socket
61
+ @socket = address.socket(timeout, ssl_options)
62
+ @socket.connect!
63
+ if authenticator
64
+ authenticator.login(self)
65
+ @authenticated = true
66
+ end
67
+ end
68
+ true
69
+ end
70
+
71
+ # Disconnect the connection.
72
+ #
73
+ # @example Disconnect from the host.
74
+ # connection.disconnect!
75
+ #
76
+ # @note This method mutates the connection by setting the socket to nil
77
+ # if the closing succeeded.
78
+ #
79
+ # @return [ true ] If the disconnect succeeded.
80
+ #
81
+ # @since 2.0.0
82
+ def disconnect!
83
+ if socket
84
+ socket.close
85
+ @socket = nil
86
+ @authenticated = false
87
+ end
88
+ true
89
+ end
90
+
91
+ # Initialize a new socket connection from the client to the server.
92
+ #
93
+ # @example Create the connection.
94
+ # Connection.new(server)
95
+ #
96
+ # @param [ Mongo::Server ] server The server the connection is for.
97
+ # @param [ Hash ] options The connection options.
98
+ #
99
+ # @since 2.0.0
100
+ def initialize(server, options = {})
101
+ @address = server.address
102
+ @options = options.freeze
103
+ @server = server
104
+ @ssl_options = options.reject { |k, v| !k.to_s.start_with?('ssl') }
105
+ @socket = nil
106
+ @pid = Process.pid
107
+ setup_authentication!
108
+ end
109
+
110
+ private
111
+
112
+ def setup_authentication!
113
+ if options[:user]
114
+ default_mechanism = @server.features.scram_sha_1_enabled? ? :scram : :mongodb_cr
115
+ user = Auth::User.new({ :auth_mech => default_mechanism }.merge(options))
116
+ @authenticator = Auth.get(user)
117
+ end
118
+ end
119
+
120
+ def write(messages, buffer = '')
121
+ start_size = 0
122
+ messages.each do |message|
123
+ message.serialize(buffer, max_bson_object_size)
124
+ if max_message_size &&
125
+ (buffer.size - start_size) > max_message_size
126
+ raise Error::MaxMessageSize.new(max_message_size)
127
+ start_size = buffer.size
128
+ end
129
+ end
130
+ ensure_connected{ |socket| socket.write(buffer) }
131
+ end
132
+ end
133
+ end
134
+ end
@@ -0,0 +1,182 @@
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 Server
17
+ class ConnectionPool
18
+
19
+ # A FIFO queue of connections to be used by the connection pool. This is
20
+ # based on mperham's connection pool, implemented with a queue instead of a
21
+ # stack.
22
+ #
23
+ # @since 2.0.0
24
+ class Queue
25
+ extend Forwardable
26
+
27
+ # Size of the queue delegates to the wrapped queue.
28
+ def_delegators :queue, :size
29
+
30
+ # The default max size for the queue.
31
+ MAX_SIZE = 5.freeze
32
+
33
+ # The default min size for the queue.
34
+ MIN_SIZE = 1.freeze
35
+
36
+ # The default timeout, in seconds, to wait for a connection.
37
+ WAIT_TIMEOUT = 1.freeze
38
+
39
+ # @return [ Array ] queue The underlying array of connections.
40
+ attr_reader :queue
41
+
42
+ # @return [ Mutex ] mutex The mutex used for synchronization.
43
+ attr_reader :mutex
44
+
45
+ # @return [ Hash ] options The options.
46
+ attr_reader :options
47
+
48
+ # @return [ ConditionVariable ] resource The resource.
49
+ attr_reader :resource
50
+
51
+ # Dequeue a connection from the queue, waiting for the provided timeout
52
+ # for an item if none is in the queue.
53
+ #
54
+ # @example Dequeue a connection.
55
+ # queue.dequeue
56
+ #
57
+ # @return [ Mongo::Pool::Connection ] The next connection.
58
+ #
59
+ # @since 2.0.0
60
+ def dequeue
61
+ mutex.synchronize do
62
+ dequeue_connection
63
+ end
64
+ end
65
+
66
+ # Enqueue a connection in the queue.
67
+ #
68
+ # @example Enqueue a connection.
69
+ # queue.enqueue(connection)
70
+ #
71
+ # @param [ Mongo::Pool::Connection ] connection The connection.
72
+ #
73
+ # @since 2.0.0
74
+ def enqueue(connection)
75
+ mutex.synchronize do
76
+ queue.push(connection)
77
+ resource.broadcast
78
+ end
79
+ end
80
+
81
+ # Initialize the new queue. Will yield the block the number of times for
82
+ # the initial size of the queue.
83
+ #
84
+ # @example Create the queue.
85
+ # Mongo::Pool::Queue.new(max_pool_size: 5) { Connection.new }
86
+ #
87
+ # @param [ Hash ] options The options.
88
+ #
89
+ # @option options [ Integer ] :max_pool_size The maximum size.
90
+ # @option options [ Integer ] :min_pool_size The minimum size.
91
+ # @option options [ Float ] :wait_queue_timeout The time to wait, in
92
+ # seconds, for a free connection.
93
+ #
94
+ # @since 2.0.0
95
+ def initialize(options = {}, &block)
96
+ @block = block
97
+ @connections = 0
98
+ @options = options
99
+ @queue = Array.new(min_size, create_connection)
100
+ @mutex = Mutex.new
101
+ @resource = ConditionVariable.new
102
+ end
103
+
104
+ # Get a pretty printed string inspection for the queue.
105
+ #
106
+ # @example Inspect the queue.
107
+ # queue.inspect
108
+ #
109
+ # @return [ String ] The queue inspection.
110
+ #
111
+ # @since 2.0.0
112
+ def inspect
113
+ "#<Mongo::Pool::Queue:0x#{object_id} min_size=#{min_size} max_size=#{max_size} " +
114
+ "wait_timeout=#{wait_timeout} current_size=#{queue.size}>"
115
+ end
116
+
117
+ # Get the maximum size of the queue.
118
+ #
119
+ # @example Get the max size.
120
+ # queue.max_size
121
+ #
122
+ # @return [ Integer ] The maximum size of the queue.
123
+ #
124
+ # @since 2.0.0
125
+ def max_size
126
+ @max_size ||= options[:max_pool_size] || MAX_SIZE
127
+ end
128
+
129
+ # Get the minimum size of the queue.
130
+ #
131
+ # @example Get the min size.
132
+ # queue.min_size
133
+ #
134
+ # @return [ Integer ] The minimum size of the queue.
135
+ #
136
+ # @since 2.0.0
137
+ def min_size
138
+ @min_size ||= options[:min_pool_size] || MIN_SIZE
139
+ end
140
+
141
+ # The time to wait, in seconds, for a connection to become available.
142
+ #
143
+ # @example Get the wait timeout.
144
+ # queue.wait_timeout
145
+ #
146
+ # @return [ Float ] The queue wait timeout.
147
+ #
148
+ # @since 2.0.0
149
+ def wait_timeout
150
+ @wait_timeout ||= options[:wait_queue_timeout] || WAIT_TIMEOUT
151
+ end
152
+
153
+ private
154
+
155
+ def dequeue_connection
156
+ deadline = Time.now + wait_timeout
157
+ loop do
158
+ return queue.delete_at(0) unless queue.empty?
159
+ connection = create_connection
160
+ return connection if connection
161
+ wait_for_next!(deadline)
162
+ end
163
+ end
164
+
165
+ def create_connection
166
+ if @connections < max_size
167
+ @connections += 1
168
+ @block.call
169
+ end
170
+ end
171
+
172
+ def wait_for_next!(deadline)
173
+ wait = deadline - Time.now
174
+ if wait <= 0
175
+ raise Timeout::Error.new("Timed out attempting to dequeue connection after #{wait_timeout} sec.")
176
+ end
177
+ resource.wait(mutex, wait)
178
+ end
179
+ end
180
+ end
181
+ end
182
+ end
@@ -0,0 +1,141 @@
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/server/connection_pool/queue'
16
+
17
+ module Mongo
18
+ class Server
19
+
20
+ # Represents a connection pool for server connections.
21
+ #
22
+ # @since 2.0.0
23
+ class ConnectionPool
24
+ include Loggable
25
+
26
+ # Used for synchronization of pools access.
27
+ MUTEX = Mutex.new
28
+
29
+ # @return [ Hash ] options The pool options.
30
+ attr_reader :options
31
+
32
+ # Check a connection back into the pool. Will pull the connection from a
33
+ # thread local stack that should contain it after it was checked out.
34
+ #
35
+ # @example Checkin the thread's connection to the pool.
36
+ # pool.checkin
37
+ #
38
+ # @since 2.0.0
39
+ def checkin(connection)
40
+ queue.enqueue(connection)
41
+ end
42
+
43
+ # Check a connection out from the pool. If a connection exists on the same
44
+ # thread it will get that connection, otherwise it will dequeue a
45
+ # connection from the queue and pin it to this thread.
46
+ #
47
+ # @example Check a connection out from the pool.
48
+ # pool.checkout
49
+ #
50
+ # @return [ Mongo::Pool::Connection ] The checked out connection.
51
+ #
52
+ # @since 2.0.0
53
+ def checkout
54
+ queue.dequeue
55
+ end
56
+
57
+ # Create the new connection pool.
58
+ #
59
+ # @example Create the new connection pool.
60
+ # Pool.new(timeout: 0.5) do
61
+ # Connection.new
62
+ # end
63
+ #
64
+ # @note A block must be passed to set up the connections on initialization.
65
+ #
66
+ # @param [ Hash ] options The connection pool options.
67
+ #
68
+ # @since 2.0.0
69
+ def initialize(options = {}, &block)
70
+ @options = options.freeze
71
+ @queue = Queue.new(options, &block)
72
+ end
73
+
74
+ # Get a pretty printed string inspection for the pool.
75
+ #
76
+ # @example Inspect the pool.
77
+ # pool.inspect
78
+ #
79
+ # @return [ String ] The pool inspection.
80
+ #
81
+ # @since 2.0.0
82
+ def inspect
83
+ "#<Mongo::Server::ConnectionPool:0x#{object_id} queue=#{queue.inspect}>"
84
+ end
85
+
86
+ # Yield the block to a connection, while handling checkin/checkout logic.
87
+ #
88
+ # @example Execute with a connection.
89
+ # pool.with_connection do |connection|
90
+ # connection.read
91
+ # end
92
+ #
93
+ # @return [ Object ] The result of the block.
94
+ #
95
+ # @since 2.0.0
96
+ def with_connection
97
+ begin
98
+ connection = checkout
99
+ yield(connection)
100
+ ensure
101
+ checkin(connection)
102
+ end
103
+ end
104
+
105
+ private
106
+
107
+ attr_reader :queue
108
+
109
+ class << self
110
+
111
+ # Get a connection pool for the provided server.
112
+ #
113
+ # @example Get a connection pool.
114
+ # Mongo::Pool.get(server)
115
+ #
116
+ # @param [ Mongo::Server ] server The server.
117
+ #
118
+ # @return [ Mongo::Pool ] The connection pool.
119
+ #
120
+ # @since 2.0.0
121
+ def get(server)
122
+ MUTEX.synchronize do
123
+ pools[server.address] ||= create_pool(server)
124
+ end
125
+ end
126
+
127
+ private
128
+
129
+ def create_pool(server)
130
+ ConnectionPool.new(server.options) do
131
+ Connection.new(server, server.options)
132
+ end
133
+ end
134
+
135
+ def pools
136
+ @pools ||= {}
137
+ end
138
+ end
139
+ end
140
+ end
141
+ end
@@ -0,0 +1,66 @@
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 Server
17
+
18
+ # Represents a context in which messages are sent to the server on a
19
+ # connection.
20
+ #
21
+ # @since 2.0.0
22
+ class Context
23
+ extend Forwardable
24
+
25
+ # @return [ Mongo::Server ] server The server the context is for.
26
+ attr_reader :server
27
+
28
+ # Delegate state checks to the server.
29
+ def_delegators :@server,
30
+ :features,
31
+ :max_wire_version,
32
+ :max_write_batch_size,
33
+ :mongos?,
34
+ :primary?,
35
+ :secondary?,
36
+ :standalone?
37
+
38
+ # Instantiate a server context.
39
+ #
40
+ # @example Instantiate a server context.
41
+ # Mongo::Server::Context.new(server)
42
+ #
43
+ # @param [ Mongo::Server ] server The server the context is for.
44
+ #
45
+ # @since 2.0.0
46
+ def initialize(server)
47
+ @server = server
48
+ end
49
+
50
+ # Execute a block of code with a connection, that is checked out of the
51
+ # pool and then checked back in.
52
+ #
53
+ # @example Send a message with the connection.
54
+ # context.with_connection do |connection|
55
+ # connection.dispatch([ command ])
56
+ # end
57
+ #
58
+ # @return [ Object ] The result of the block execution.
59
+ #
60
+ # @since 2.0.0
61
+ def with_connection(&block)
62
+ server.pool.with_connection(&block)
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,85 @@
1
+ # Copyright (C) 2014 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 Server
17
+ class Description
18
+
19
+ # Defines behaviour around what features a specific server supports.
20
+ #
21
+ # @since 2.0.0
22
+ class Features
23
+
24
+ # List of features and the wire protocol version they appear in.
25
+ #
26
+ # @since 2.0.0
27
+ MAPPINGS = {
28
+ :list_collections => 3,
29
+ :list_indexes => 3,
30
+ :scram_sha_1 => 3,
31
+ :write_command => 2
32
+ }.freeze
33
+
34
+ # The wire protocol versions that this version of the driver supports.
35
+ #
36
+ # @since 2.0.0
37
+ DRIVER_WIRE_VERSIONS = (0..3).freeze
38
+
39
+ # Create the methods for each mapping to tell if they are supported.
40
+ #
41
+ # @since 2.0.0
42
+ MAPPINGS.each do |name, version|
43
+
44
+ # Determine whether or not the feature is enabled.
45
+ #
46
+ # @example Is a feature enabled?
47
+ # features.list_collections_enabled?
48
+ #
49
+ # @return [ true, false ] If the feature is enabled.
50
+ #
51
+ # @since 2.0.0
52
+ define_method("#{name}_enabled?") do
53
+ server_wire_versions.include?(MAPPINGS[name])
54
+ end
55
+ end
56
+
57
+ # @return [ Range ] server_wire_versions The server's supported wire
58
+ # versions.
59
+ attr_reader :server_wire_versions
60
+
61
+ # Initialize the features.
62
+ #
63
+ # @example Initialize the features.
64
+ # Features.new(0..3)
65
+ #
66
+ # @param [ Range ] server_wire_versions The server supported wire
67
+ # versions.
68
+ #
69
+ # @since 2.0.0
70
+ def initialize(server_wire_versions)
71
+ @server_wire_versions = server_wire_versions
72
+ check_driver_support!
73
+ end
74
+
75
+ private
76
+
77
+ def check_driver_support!
78
+ if DRIVER_WIRE_VERSIONS.max < server_wire_versions.max
79
+ raise Error::UnsupportedFeatures.new(server_wire_versions)
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,58 @@
1
+ # Copyright (C) 2015 MongoDB, Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the 'License');
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an 'AS IS' BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module Mongo
16
+ class Server
17
+ class Description
18
+ class Inspector
19
+
20
+ # Handles inspecting the result of an ismaster command to check if this
21
+ # server was elected primary.
22
+ #
23
+ # @since 2.0.0
24
+ class PrimaryElected
25
+ include Event::Publisher
26
+
27
+ # Instantiate the primary elected inspection.
28
+ #
29
+ # @example Instantiate the inspection.
30
+ # PrimaryElected.new(listeners)
31
+ #
32
+ # @param [ Event::Listeners ] event_listeners The event listeners.
33
+ #
34
+ # @since 2.0.0
35
+ def initialize(event_listeners)
36
+ @event_listeners = event_listeners
37
+ end
38
+
39
+ # Run the primary elected inspection.
40
+ #
41
+ # @example Run the inspection.
42
+ # PrimaryElected.run(description, {})
43
+ #
44
+ # @param [ Description ] description The server description.
45
+ # @param [ Description ] updated The updated description.
46
+ #
47
+ # @since 2.0.0
48
+ def run(description, updated)
49
+ if (!description.primary? && updated.primary?) ||
50
+ (!description.mongos? && updated.mongos?)
51
+ publish(Event::PRIMARY_ELECTED, updated)
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end