mongo 1.12.5 → 2.0.0.beta

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 (437) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/CONTRIBUTING.md +64 -0
  5. data/LICENSE +1 -1
  6. data/README.md +23 -125
  7. data/Rakefile +26 -21
  8. data/bin/mongo_console +6 -38
  9. data/lib/mongo.rb +23 -82
  10. data/lib/mongo/address.rb +111 -0
  11. data/lib/mongo/address/ipv4.rb +85 -0
  12. data/lib/mongo/address/ipv6.rb +85 -0
  13. data/lib/mongo/address/unix.rb +76 -0
  14. data/lib/mongo/auth.rb +108 -0
  15. data/lib/mongo/auth/cr.rb +44 -0
  16. data/lib/mongo/auth/cr/conversation.rb +119 -0
  17. data/lib/mongo/auth/executable.rb +52 -0
  18. data/lib/mongo/auth/ldap.rb +48 -0
  19. data/lib/mongo/auth/ldap/conversation.rb +92 -0
  20. data/lib/mongo/auth/roles.rb +104 -0
  21. data/lib/mongo/auth/scram.rb +53 -0
  22. data/lib/mongo/auth/scram/conversation.rb +450 -0
  23. data/lib/mongo/auth/user.rb +159 -0
  24. data/lib/mongo/auth/user/view.rb +102 -0
  25. data/lib/mongo/auth/x509.rb +48 -0
  26. data/lib/mongo/auth/x509/conversation.rb +92 -0
  27. data/lib/mongo/{gridfs.rb → bulk.rb} +2 -5
  28. data/lib/mongo/bulk/bulk_write.rb +307 -0
  29. data/lib/mongo/client.rb +233 -0
  30. data/lib/mongo/cluster.rb +203 -0
  31. data/lib/mongo/cluster/topology.rb +60 -0
  32. data/lib/mongo/cluster/topology/replica_set.rb +160 -0
  33. data/lib/mongo/cluster/topology/sharded.rb +132 -0
  34. data/lib/mongo/cluster/topology/standalone.rb +132 -0
  35. data/lib/mongo/cluster/topology/unknown.rb +155 -0
  36. data/lib/mongo/collection.rb +130 -1101
  37. data/lib/mongo/collection/view.rb +169 -0
  38. data/lib/mongo/collection/view/aggregation.rb +108 -0
  39. data/lib/mongo/collection/view/explainable.rb +49 -0
  40. data/lib/mongo/collection/view/immutable.rb +43 -0
  41. data/lib/mongo/collection/view/iterable.rb +48 -0
  42. data/lib/mongo/collection/view/map_reduce.rb +191 -0
  43. data/lib/mongo/collection/view/readable.rb +363 -0
  44. data/lib/mongo/collection/view/writable.rb +169 -0
  45. data/lib/mongo/cursor.rb +79 -680
  46. data/lib/mongo/database.rb +224 -0
  47. data/lib/mongo/database/view.rb +101 -0
  48. data/lib/mongo/error.rb +81 -0
  49. data/lib/mongo/error/bulk_write_failure.rb +41 -0
  50. data/lib/mongo/{utils/thread_local_variable_manager.rb → error/empty_batch.rb} +22 -8
  51. data/{test/functional/db_connection_test.rb → lib/mongo/error/invalid_bulk_operation.rb} +19 -8
  52. data/lib/mongo/error/invalid_collection_name.rb +39 -0
  53. data/lib/mongo/error/invalid_database_name.rb +39 -0
  54. data/{test/replica_set/ssl_test.rb → lib/mongo/error/invalid_document.rb} +21 -14
  55. data/lib/mongo/error/invalid_file.rb +38 -0
  56. data/lib/mongo/error/invalid_nonce.rb +46 -0
  57. data/lib/mongo/error/invalid_replacement_document.rb +39 -0
  58. data/lib/mongo/error/invalid_signature.rb +47 -0
  59. data/{test/functional/ssl_test.rb → lib/mongo/error/invalid_update_document.rb} +22 -12
  60. data/lib/mongo/error/max_bson_size.rb +40 -0
  61. data/lib/mongo/error/max_message_size.rb +42 -0
  62. data/lib/mongo/{utils.rb → error/need_primary_server.rb} +10 -6
  63. data/lib/mongo/{connection.rb → error/operation_failure.rb} +10 -6
  64. data/lib/mongo/error/parser.rb +77 -0
  65. data/lib/mongo/{connection/socket.rb → error/socket_error.rb} +10 -5
  66. data/lib/mongo/error/socket_timeout_error.rb +23 -0
  67. data/lib/mongo/error/unsupported_features.rb +43 -0
  68. data/lib/mongo/event.rb +40 -0
  69. data/lib/mongo/event/listeners.rb +63 -0
  70. data/lib/mongo/event/primary_elected.rb +53 -0
  71. data/lib/mongo/event/publisher.rb +42 -0
  72. data/lib/mongo/event/server_added.rb +53 -0
  73. data/lib/mongo/event/server_removed.rb +53 -0
  74. data/lib/mongo/event/subscriber.rb +41 -0
  75. data/lib/mongo/grid.rb +16 -0
  76. data/lib/mongo/grid/file.rb +94 -0
  77. data/lib/mongo/grid/file/chunk.rb +184 -0
  78. data/lib/mongo/grid/file/metadata.rb +223 -0
  79. data/lib/mongo/grid/fs.rb +149 -0
  80. data/lib/mongo/index.rb +64 -0
  81. data/lib/mongo/index/view.rb +205 -0
  82. data/lib/mongo/loggable.rb +126 -0
  83. data/lib/mongo/logger.rb +132 -0
  84. data/lib/mongo/operation.rb +26 -0
  85. data/lib/mongo/operation/aggregate.rb +100 -0
  86. data/lib/mongo/operation/aggregate/result.rb +84 -0
  87. data/lib/mongo/operation/batchable.rb +103 -0
  88. data/lib/mongo/operation/bulk_delete/result.rb +197 -0
  89. data/lib/mongo/operation/bulk_insert/result.rb +195 -0
  90. data/lib/mongo/operation/bulk_update/result.rb +295 -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 +116 -0
  96. data/lib/mongo/operation/list_indexes/result.rb +118 -0
  97. data/lib/mongo/operation/map_reduce.rb +96 -0
  98. data/lib/mongo/operation/map_reduce/result.rb +122 -0
  99. data/lib/mongo/{functional.rb → operation/read.rb} +7 -7
  100. data/lib/mongo/operation/read/collections_info.rb +67 -0
  101. data/lib/mongo/operation/read/get_more.rb +71 -0
  102. data/lib/mongo/operation/read/indexes.rb +68 -0
  103. data/lib/mongo/operation/read/list_collections.rb +75 -0
  104. data/lib/mongo/operation/read/list_indexes.rb +77 -0
  105. data/lib/mongo/operation/read/query.rb +71 -0
  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 +380 -0
  109. data/lib/mongo/operation/write.rb +25 -0
  110. data/lib/mongo/operation/write/bulk_delete.rb +158 -0
  111. data/lib/mongo/operation/write/bulk_insert.rb +160 -0
  112. data/lib/mongo/operation/write/bulk_update.rb +167 -0
  113. data/lib/mongo/{connection/socket/socket_util.rb → operation/write/command.rb} +9 -24
  114. data/lib/mongo/operation/write/command/create_user.rb +43 -0
  115. data/lib/mongo/operation/write/command/delete.rb +56 -0
  116. data/lib/mongo/operation/write/command/drop_index.rb +51 -0
  117. data/lib/mongo/operation/write/command/ensure_index.rb +55 -0
  118. data/lib/mongo/operation/write/command/insert.rb +55 -0
  119. data/lib/mongo/operation/write/command/remove_user.rb +42 -0
  120. data/lib/mongo/operation/write/command/update.rb +60 -0
  121. data/lib/mongo/operation/write/command/writable.rb +61 -0
  122. data/lib/mongo/operation/write/create_index.rb +84 -0
  123. data/lib/mongo/operation/write/create_user.rb +75 -0
  124. data/lib/mongo/operation/write/delete.rb +91 -0
  125. data/lib/mongo/operation/write/drop_index.rb +62 -0
  126. data/lib/mongo/operation/write/insert.rb +88 -0
  127. data/lib/mongo/operation/write/remove_user.rb +70 -0
  128. data/lib/mongo/operation/write/update.rb +98 -0
  129. data/lib/mongo/protocol.rb +15 -0
  130. data/lib/mongo/protocol/bit_vector.rb +61 -0
  131. data/lib/mongo/protocol/delete.rb +94 -0
  132. data/lib/mongo/protocol/get_more.rb +99 -0
  133. data/lib/mongo/protocol/insert.rb +99 -0
  134. data/lib/mongo/protocol/kill_cursors.rb +74 -0
  135. data/lib/mongo/protocol/message.rb +252 -0
  136. data/lib/mongo/protocol/query.rb +147 -0
  137. data/lib/mongo/protocol/reply.rb +72 -0
  138. data/lib/mongo/protocol/serializers.rb +180 -0
  139. data/lib/mongo/protocol/update.rb +111 -0
  140. data/lib/mongo/server.rb +163 -0
  141. data/lib/mongo/server/connectable.rb +99 -0
  142. data/lib/mongo/server/connection.rb +133 -0
  143. data/lib/mongo/server/connection_pool.rb +141 -0
  144. data/lib/mongo/server/connection_pool/queue.rb +182 -0
  145. data/lib/mongo/server/context.rb +66 -0
  146. data/lib/mongo/server/description.rb +450 -0
  147. data/lib/mongo/server/description/features.rb +85 -0
  148. data/lib/mongo/server/description/inspector.rb +79 -0
  149. data/lib/mongo/server/description/inspector/primary_elected.rb +58 -0
  150. data/lib/mongo/server/description/inspector/server_added.rb +59 -0
  151. data/lib/mongo/server/description/inspector/server_removed.rb +59 -0
  152. data/lib/mongo/server/monitor.rb +160 -0
  153. data/lib/mongo/server/monitor/connection.rb +88 -0
  154. data/lib/mongo/server_selector.rb +81 -0
  155. data/lib/mongo/server_selector/nearest.rb +94 -0
  156. data/lib/mongo/server_selector/primary.rb +88 -0
  157. data/lib/mongo/server_selector/primary_preferred.rb +94 -0
  158. data/lib/mongo/server_selector/secondary.rb +91 -0
  159. data/lib/mongo/server_selector/secondary_preferred.rb +96 -0
  160. data/lib/mongo/server_selector/selectable.rb +209 -0
  161. data/lib/mongo/socket.rb +179 -0
  162. data/lib/mongo/socket/ssl.rb +108 -0
  163. data/lib/mongo/socket/tcp.rb +69 -0
  164. data/lib/mongo/socket/unix.rb +66 -0
  165. data/lib/mongo/uri.rb +504 -0
  166. data/lib/mongo/version.rb +21 -0
  167. data/lib/mongo/write_concern.rb +99 -0
  168. data/lib/mongo/write_concern/acknowledged.rb +38 -0
  169. data/lib/mongo/write_concern/normalizable.rb +73 -0
  170. data/lib/mongo/write_concern/unacknowledged.rb +43 -0
  171. data/mongo.gemspec +17 -14
  172. data/spec/mongo/address/ipv4_spec.rb +74 -0
  173. data/spec/mongo/address/ipv6_spec.rb +74 -0
  174. data/spec/mongo/address/unix_spec.rb +30 -0
  175. data/spec/mongo/address_spec.rb +206 -0
  176. data/spec/mongo/auth/cr_spec.rb +59 -0
  177. data/spec/mongo/auth/ldap_spec.rb +40 -0
  178. data/spec/mongo/auth/scram/conversation_spec.rb +197 -0
  179. data/spec/mongo/auth/scram_spec.rb +55 -0
  180. data/spec/mongo/auth/user/view_spec.rb +76 -0
  181. data/spec/mongo/auth/user_spec.rb +190 -0
  182. data/spec/mongo/auth/x509_spec.rb +40 -0
  183. data/spec/mongo/auth_spec.rb +65 -0
  184. data/spec/mongo/bulk/bulk_write_spec.rb +175 -0
  185. data/spec/mongo/client_spec.rb +564 -0
  186. data/spec/mongo/cluster/topology/replica_set_spec.rb +101 -0
  187. data/spec/mongo/cluster/topology/sharded_spec.rb +74 -0
  188. data/spec/mongo/cluster/topology/standalone_spec.rb +79 -0
  189. data/spec/mongo/cluster/topology_spec.rb +65 -0
  190. data/spec/mongo/cluster_spec.rb +129 -0
  191. data/spec/mongo/collection/view/aggregation_spec.rb +135 -0
  192. data/spec/mongo/collection/view/explainable_spec.rb +32 -0
  193. data/spec/mongo/collection/view/map_reduce_spec.rb +242 -0
  194. data/spec/mongo/collection/view/readable_spec.rb +603 -0
  195. data/spec/mongo/collection/view/writable_spec.rb +504 -0
  196. data/spec/mongo/collection/view_spec.rb +521 -0
  197. data/spec/mongo/collection_spec.rb +362 -0
  198. data/spec/mongo/cursor_spec.rb +295 -0
  199. data/spec/mongo/database_spec.rb +306 -0
  200. data/spec/mongo/error/parser_spec.rb +119 -0
  201. data/spec/mongo/event/publisher_spec.rb +50 -0
  202. data/spec/mongo/event/subscriber_spec.rb +34 -0
  203. data/spec/mongo/grid/file/chunk_spec.rb +226 -0
  204. data/spec/mongo/grid/file/metadata_spec.rb +69 -0
  205. data/spec/mongo/grid/file_spec.rb +138 -0
  206. data/spec/mongo/grid/fs_spec.rb +129 -0
  207. data/spec/mongo/index/view_spec.rb +226 -0
  208. data/spec/mongo/loggable_spec.rb +62 -0
  209. data/spec/mongo/logger_spec.rb +97 -0
  210. data/spec/mongo/operation/aggregate/result_spec.rb +80 -0
  211. data/spec/mongo/operation/aggregate_spec.rb +135 -0
  212. data/spec/mongo/operation/command_spec.rb +106 -0
  213. data/spec/mongo/operation/kill_cursors_spec.rb +66 -0
  214. data/spec/mongo/operation/limited_spec.rb +50 -0
  215. data/spec/mongo/operation/map_reduce_spec.rb +143 -0
  216. data/spec/mongo/operation/read/collections_info_spec.rb +40 -0
  217. data/spec/mongo/operation/read/get_more_spec.rb +81 -0
  218. data/spec/mongo/operation/read/indexes_spec.rb +31 -0
  219. data/spec/mongo/operation/read/query_spec.rb +84 -0
  220. data/spec/mongo/operation/result_spec.rb +275 -0
  221. data/spec/mongo/operation/specifiable_spec.rb +53 -0
  222. data/spec/mongo/operation/write/bulk_delete_spec.rb +473 -0
  223. data/spec/mongo/operation/write/bulk_insert_spec.rb +466 -0
  224. data/spec/mongo/operation/write/bulk_update_spec.rb +524 -0
  225. data/spec/mongo/operation/write/command/delete_spec.rb +116 -0
  226. data/spec/mongo/operation/write/command/insert_spec.rb +117 -0
  227. data/spec/mongo/operation/write/command/update_spec.rb +123 -0
  228. data/spec/mongo/operation/write/create_user_spec.rb +44 -0
  229. data/spec/mongo/operation/write/delete_spec.rb +178 -0
  230. data/spec/mongo/operation/write/drop_index_spec.rb +51 -0
  231. data/spec/mongo/operation/write/ensure_index_spec.rb +81 -0
  232. data/spec/mongo/operation/write/insert_spec.rb +231 -0
  233. data/spec/mongo/operation/write/remove_user_spec.rb +46 -0
  234. data/spec/mongo/operation/write/response_spec.rb +85 -0
  235. data/spec/mongo/operation/write/update_spec.rb +177 -0
  236. data/spec/mongo/protocol/delete_spec.rb +167 -0
  237. data/spec/mongo/protocol/get_more_spec.rb +146 -0
  238. data/spec/mongo/protocol/insert_spec.rb +161 -0
  239. data/spec/mongo/protocol/kill_cursors_spec.rb +101 -0
  240. data/spec/mongo/protocol/query_spec.rb +285 -0
  241. data/spec/mongo/protocol/reply_spec.rb +157 -0
  242. data/spec/mongo/protocol/update_spec.rb +186 -0
  243. data/spec/mongo/server/connection_pool/queue_spec.rb +170 -0
  244. data/spec/mongo/server/connection_pool_spec.rb +120 -0
  245. data/spec/mongo/server/connection_spec.rb +289 -0
  246. data/spec/mongo/server/description/features_spec.rb +138 -0
  247. data/spec/mongo/server/description/inspector/primary_elected_spec.rb +94 -0
  248. data/spec/mongo/server/description/inspector/server_added_spec.rb +92 -0
  249. data/spec/mongo/server/description/inspector/server_removed_spec.rb +95 -0
  250. data/spec/mongo/server/description_spec.rb +510 -0
  251. data/spec/mongo/server/monitor_spec.rb +130 -0
  252. data/spec/mongo/server_discovery_and_monitoring_spec.rb +103 -0
  253. data/spec/mongo/server_selection_rtt_spec.rb +104 -0
  254. data/spec/mongo/server_selection_spec.rb +89 -0
  255. data/spec/mongo/server_selector/nearest_spec.rb +250 -0
  256. data/spec/mongo/server_selector/primary_preferred_spec.rb +290 -0
  257. data/spec/mongo/server_selector/primary_spec.rb +114 -0
  258. data/spec/mongo/server_selector/secondary_preferred_spec.rb +252 -0
  259. data/spec/mongo/server_selector/secondary_spec.rb +196 -0
  260. data/spec/mongo/server_selector_spec.rb +101 -0
  261. data/spec/mongo/server_spec.rb +131 -0
  262. data/spec/mongo/uri_spec.rb +517 -0
  263. data/spec/mongo/write_concern/acknowledged_spec.rb +44 -0
  264. data/spec/mongo/write_concern/unacknowledged_spec.rb +15 -0
  265. data/spec/mongo_orchestration_spec.rb +70 -0
  266. data/spec/spec_helper.rb +148 -0
  267. data/spec/support/authorization.rb +245 -0
  268. data/spec/support/helpers.rb +140 -0
  269. data/spec/support/matchers.rb +37 -0
  270. data/spec/support/mongo_orchestration.rb +61 -0
  271. data/spec/support/mongo_orchestration/requestable.rb +109 -0
  272. data/spec/support/mongo_orchestration/standalone.rb +57 -0
  273. data/spec/support/sdam/rs/discover_arbiters.yml +41 -0
  274. data/spec/support/sdam/rs/discover_passives.yml +41 -0
  275. data/spec/support/sdam/rs/discover_primary.yml +40 -0
  276. data/spec/support/sdam/rs/discover_secondary.yml +41 -0
  277. data/spec/support/sdam/rs/discovery.yml +195 -0
  278. data/spec/support/sdam/rs/ghost_discovered.yml +39 -0
  279. data/spec/support/sdam/rs/hosts_differ_from_seeds.yml +34 -0
  280. data/spec/support/sdam/rs/member_reconfig.yml +68 -0
  281. data/spec/support/sdam/rs/member_standalone.yml +60 -0
  282. data/spec/support/sdam/rs/new_primary.yml +74 -0
  283. data/spec/support/sdam/rs/new_primary_wrong_set_name.yml +71 -0
  284. data/spec/support/sdam/rs/non_rs_member.yml +31 -0
  285. data/spec/support/sdam/rs/normalize_case.yml +49 -0
  286. data/spec/support/sdam/rs/primary_becomes_standalone.yml +52 -0
  287. data/spec/support/sdam/rs/primary_changes_set_name.yml +57 -0
  288. data/spec/support/sdam/rs/primary_disconnect.yml +56 -0
  289. data/spec/support/sdam/rs/primary_wrong_set_name.yml +27 -0
  290. data/spec/support/sdam/rs/response_from_removed.yml +63 -0
  291. data/spec/support/sdam/rs/rsother_discovered.yml +41 -0
  292. data/spec/support/sdam/rs/sec_not_auth.yml +49 -0
  293. data/spec/support/sdam/rs/secondary_wrong_set_name.yml +28 -0
  294. data/spec/support/sdam/rs/secondary_wrong_set_name_with_primary.yml +69 -0
  295. data/spec/support/sdam/rs/unexpected_mongos.yml +26 -0
  296. data/spec/support/sdam/rs/wrong_set_name.yml +35 -0
  297. data/spec/support/sdam/sharded/multiple_mongoses.yml +46 -0
  298. data/spec/support/sdam/sharded/non_mongos_removed.yml +41 -0
  299. data/spec/support/sdam/sharded/normalize_uri_case.yml +32 -0
  300. data/spec/support/sdam/single/direct_connection_external_ip.yml +34 -0
  301. data/spec/support/sdam/single/direct_connection_mongos.yml +33 -0
  302. data/spec/support/sdam/single/direct_connection_rsarbiter.yml +35 -0
  303. data/spec/support/sdam/single/direct_connection_rsprimary.yml +34 -0
  304. data/spec/support/sdam/single/direct_connection_rssecondary.yml +35 -0
  305. data/spec/support/sdam/single/direct_connection_slave.yml +32 -0
  306. data/spec/support/sdam/single/direct_connection_standalone.yml +32 -0
  307. data/spec/support/sdam/single/not_ok_response.yml +39 -0
  308. data/spec/support/sdam/single/standalone_removed.yml +32 -0
  309. data/spec/support/sdam/single/unavailable_seed.yml +28 -0
  310. data/spec/support/server_discovery_and_monitoring.rb +167 -0
  311. data/spec/support/server_selection.rb +140 -0
  312. data/spec/support/server_selection/rtt/first_value.yml +4 -0
  313. data/spec/support/server_selection/rtt/first_value_zero.yml +4 -0
  314. data/spec/support/server_selection/rtt/value_test_1.yml +4 -0
  315. data/spec/support/server_selection/rtt/value_test_2.yml +4 -0
  316. data/spec/support/server_selection/rtt/value_test_3.yml +4 -0
  317. data/spec/support/server_selection/rtt/value_test_4.yml +4 -0
  318. data/spec/support/server_selection/rtt/value_test_5.yml +4 -0
  319. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest.yml +32 -0
  320. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest_non_matching.yml +27 -0
  321. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Primary.yml +23 -0
  322. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred.yml +32 -0
  323. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred_non_matching.yml +27 -0
  324. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary.yml +32 -0
  325. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred.yml +32 -0
  326. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred_non_matching.yml +27 -0
  327. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary_non_matching.yml +27 -0
  328. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest.yml +41 -0
  329. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest_non_matching.yml +34 -0
  330. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Primary.yml +33 -0
  331. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred.yml +39 -0
  332. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred_non_matching.yml +36 -0
  333. data/spec/support/server_selection/selection/Sharded/read/SecondaryPreferred.yml +32 -0
  334. data/spec/support/server_selection/selection/Single/read/SecondaryPreferred.yml +23 -0
  335. data/spec/support/server_selection/selection/Unknown/read/SecondaryPreferred.yml +13 -0
  336. data/spec/support/server_selection_rtt.rb +41 -0
  337. data/spec/support/shared/bulk_write.rb +498 -0
  338. data/spec/support/shared/cursor.rb +38 -0
  339. data/spec/support/shared/operation.rb +77 -0
  340. data/spec/support/shared/protocol.rb +31 -0
  341. data/spec/support/shared/server_selector.rb +111 -0
  342. data/spec/support/shared/socket.rb +82 -0
  343. data/spec/support/travis.rb +14 -0
  344. metadata +523 -189
  345. metadata.gz.sig +0 -0
  346. data/VERSION +0 -1
  347. data/lib/mongo/bulk_write_collection_view.rb +0 -387
  348. data/lib/mongo/collection_writer.rb +0 -364
  349. data/lib/mongo/connection/node.rb +0 -249
  350. data/lib/mongo/connection/pool.rb +0 -340
  351. data/lib/mongo/connection/pool_manager.rb +0 -320
  352. data/lib/mongo/connection/sharding_pool_manager.rb +0 -67
  353. data/lib/mongo/connection/socket/ssl_socket.rb +0 -95
  354. data/lib/mongo/connection/socket/tcp_socket.rb +0 -87
  355. data/lib/mongo/connection/socket/unix_socket.rb +0 -39
  356. data/lib/mongo/db.rb +0 -808
  357. data/lib/mongo/exception.rb +0 -145
  358. data/lib/mongo/functional/authentication.rb +0 -455
  359. data/lib/mongo/functional/logging.rb +0 -85
  360. data/lib/mongo/functional/read_preference.rb +0 -183
  361. data/lib/mongo/functional/scram.rb +0 -556
  362. data/lib/mongo/functional/uri_parser.rb +0 -409
  363. data/lib/mongo/functional/write_concern.rb +0 -66
  364. data/lib/mongo/gridfs/grid.rb +0 -112
  365. data/lib/mongo/gridfs/grid_ext.rb +0 -53
  366. data/lib/mongo/gridfs/grid_file_system.rb +0 -163
  367. data/lib/mongo/gridfs/grid_io.rb +0 -484
  368. data/lib/mongo/legacy.rb +0 -140
  369. data/lib/mongo/mongo_client.rb +0 -697
  370. data/lib/mongo/mongo_replica_set_client.rb +0 -535
  371. data/lib/mongo/mongo_sharded_client.rb +0 -159
  372. data/lib/mongo/networking.rb +0 -372
  373. data/lib/mongo/utils/conversions.rb +0 -110
  374. data/lib/mongo/utils/core_ext.rb +0 -70
  375. data/lib/mongo/utils/server_version.rb +0 -69
  376. data/lib/mongo/utils/support.rb +0 -80
  377. data/test/functional/authentication_test.rb +0 -39
  378. data/test/functional/bulk_api_stress_test.rb +0 -133
  379. data/test/functional/bulk_write_collection_view_test.rb +0 -1198
  380. data/test/functional/client_test.rb +0 -627
  381. data/test/functional/collection_test.rb +0 -2175
  382. data/test/functional/collection_writer_test.rb +0 -83
  383. data/test/functional/conversions_test.rb +0 -163
  384. data/test/functional/cursor_fail_test.rb +0 -57
  385. data/test/functional/cursor_message_test.rb +0 -56
  386. data/test/functional/cursor_test.rb +0 -683
  387. data/test/functional/db_api_test.rb +0 -835
  388. data/test/functional/db_test.rb +0 -348
  389. data/test/functional/grid_file_system_test.rb +0 -285
  390. data/test/functional/grid_io_test.rb +0 -252
  391. data/test/functional/grid_test.rb +0 -273
  392. data/test/functional/pool_test.rb +0 -136
  393. data/test/functional/safe_test.rb +0 -98
  394. data/test/functional/support_test.rb +0 -62
  395. data/test/functional/timeout_test.rb +0 -60
  396. data/test/functional/uri_test.rb +0 -446
  397. data/test/functional/write_concern_test.rb +0 -118
  398. data/test/helpers/general.rb +0 -50
  399. data/test/helpers/test_unit.rb +0 -476
  400. data/test/replica_set/authentication_test.rb +0 -37
  401. data/test/replica_set/basic_test.rb +0 -189
  402. data/test/replica_set/client_test.rb +0 -393
  403. data/test/replica_set/connection_test.rb +0 -138
  404. data/test/replica_set/count_test.rb +0 -66
  405. data/test/replica_set/cursor_test.rb +0 -220
  406. data/test/replica_set/insert_test.rb +0 -157
  407. data/test/replica_set/max_values_test.rb +0 -151
  408. data/test/replica_set/pinning_test.rb +0 -105
  409. data/test/replica_set/query_test.rb +0 -73
  410. data/test/replica_set/read_preference_test.rb +0 -219
  411. data/test/replica_set/refresh_test.rb +0 -211
  412. data/test/replica_set/replication_ack_test.rb +0 -95
  413. data/test/sharded_cluster/basic_test.rb +0 -203
  414. data/test/shared/authentication/basic_auth_shared.rb +0 -260
  415. data/test/shared/authentication/bulk_api_auth_shared.rb +0 -249
  416. data/test/shared/authentication/gssapi_shared.rb +0 -176
  417. data/test/shared/authentication/sasl_plain_shared.rb +0 -96
  418. data/test/shared/authentication/scram_shared.rb +0 -92
  419. data/test/shared/ssl_shared.rb +0 -235
  420. data/test/test_helper.rb +0 -61
  421. data/test/threading/basic_test.rb +0 -120
  422. data/test/tools/mongo_config.rb +0 -708
  423. data/test/tools/mongo_config_test.rb +0 -160
  424. data/test/unit/client_test.rb +0 -381
  425. data/test/unit/collection_test.rb +0 -166
  426. data/test/unit/connection_test.rb +0 -335
  427. data/test/unit/cursor_test.rb +0 -307
  428. data/test/unit/db_test.rb +0 -136
  429. data/test/unit/grid_test.rb +0 -76
  430. data/test/unit/mongo_sharded_client_test.rb +0 -48
  431. data/test/unit/node_test.rb +0 -93
  432. data/test/unit/pool_manager_test.rb +0 -111
  433. data/test/unit/read_pref_test.rb +0 -406
  434. data/test/unit/read_test.rb +0 -159
  435. data/test/unit/safe_test.rb +0 -158
  436. data/test/unit/sharding_pool_manager_test.rb +0 -84
  437. data/test/unit/write_concern_test.rb +0 -175
@@ -0,0 +1,99 @@
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
+
18
+ # This provides common behaviour for connection objects.
19
+ #
20
+ # @since 2.0.0
21
+ module Connectable
22
+ include Loggable
23
+
24
+ # The default time in seconds to timeout a connection attempt.
25
+ #
26
+ # @since 2.0.0
27
+ TIMEOUT = 5.freeze
28
+
29
+ # @return [ Mongo::Address ] address The address to connect to.
30
+ attr_reader :address
31
+
32
+ # @return [ Hash ] options The passed in options.
33
+ attr_reader :options
34
+
35
+ # Determine if the connection is currently connected.
36
+ #
37
+ # @example Is the connection connected?
38
+ # connection.connected?
39
+ #
40
+ # @return [ true, false ] If connected.
41
+ #
42
+ # @since 2.0.0
43
+ def connected?
44
+ !!@socket && @socket.alive?
45
+ end
46
+
47
+ # Dispatch the provided messages to the connection. If the last message
48
+ # requires a response a reply will be returned.
49
+ #
50
+ # @example Dispatch the messages.
51
+ # connection.dispatch([ insert, command ])
52
+ #
53
+ # @note This method is named dispatch since 'send' is a core Ruby method on
54
+ # all objects.
55
+ #
56
+ # @param [ Array<Message> ] messages The messages to dispatch.
57
+ #
58
+ # @return [ Protocol::Reply ] The reply if needed.
59
+ #
60
+ # @since 2.0.0
61
+ def dispatch(messages)
62
+ log_debug(messages) do |msgs|
63
+ write(msgs)
64
+ msgs.last.replyable? ? read : nil
65
+ end
66
+ end
67
+
68
+ # Get the connection timeout.
69
+ #
70
+ # @example Get the connection timeout.
71
+ # connection.timeout
72
+ #
73
+ # @return [ Float ] The connection timeout in seconds.
74
+ #
75
+ # @since 2.0.0
76
+ def timeout
77
+ @timeout ||= options[:socket_timeout] || TIMEOUT
78
+ end
79
+
80
+ private
81
+
82
+ attr_reader :socket, :ssl_options
83
+
84
+ def ensure_connected
85
+ connect! if socket.nil? || !socket.alive?
86
+ begin
87
+ yield socket
88
+ rescue Error::SocketError, Error::SocketTimeoutError => e
89
+ disconnect!
90
+ raise e
91
+ end
92
+ end
93
+
94
+ def read
95
+ ensure_connected{ |socket| Protocol::Reply.deserialize(socket) }
96
+ end
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,133 @@
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
+ setup_authentication!
107
+ end
108
+
109
+ private
110
+
111
+ def setup_authentication!
112
+ if options[:user]
113
+ default_mechanism = @server.features.scram_sha_1_enabled? ? :scram : :mongodb_cr
114
+ user = Auth::User.new({ :auth_mech => default_mechanism }.merge(options))
115
+ @authenticator = Auth.get(user)
116
+ end
117
+ end
118
+
119
+ def write(messages, buffer = '')
120
+ start_size = 0
121
+ messages.each do |message|
122
+ message.serialize(buffer, max_bson_object_size)
123
+ if max_message_size &&
124
+ (buffer.size - start_size) > max_message_size
125
+ raise Error::MaxMessageSize.new(max_message_size)
126
+ start_size = buffer.size
127
+ end
128
+ end
129
+ ensure_connected{ |socket| socket.write(buffer) }
130
+ end
131
+ end
132
+ end
133
+ 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,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 [ Integer ] size The initial size of the queue.
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