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
@@ -1,409 +0,0 @@
1
- # Copyright (C) 2009-2013 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 'cgi'
16
- require 'uri'
17
-
18
- module Mongo
19
- class URIParser
20
-
21
- AUTH_REGEX = /((.+)@)?/
22
-
23
- HOST_REGEX = /([-.\w]+)|(\[[^\]]+\])/
24
- PORT_REGEX = /(?::(\w+))?/
25
- UNIX_SOCK_REGEX = /([\S]+.sock)/
26
- NODE_REGEX = /((#{HOST_REGEX}#{PORT_REGEX},?)+|#{UNIX_SOCK_REGEX}{1})/
27
-
28
- PATH_REGEX = /(?:\/([-\w]+))?/
29
-
30
- MONGODB_URI_MATCHER = /#{AUTH_REGEX}#{NODE_REGEX}#{PATH_REGEX}/
31
- MONGODB_URI_SPEC = "mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]"
32
-
33
- SPEC_ATTRS = [:nodes, :auths]
34
-
35
- READ_PREFERENCES = {
36
- 'primary' => :primary,
37
- 'primarypreferred' => :primary_preferred,
38
- 'secondary' => :secondary,
39
- 'secondarypreferred' => :secondary_preferred,
40
- 'nearest' => :nearest
41
- }
42
-
43
- OPT_ATTRS = [
44
- :authmechanism,
45
- :authmechanismproperties,
46
- :authsource,
47
- :connect,
48
- :connecttimeoutms,
49
- :fsync,
50
- :journal,
51
- :pool_size,
52
- :readpreference,
53
- :readpreferencetags,
54
- :replicaset,
55
- :safe,
56
- :slaveok,
57
- :sockettimeoutms,
58
- :ssl,
59
- :w,
60
- :wtimeout,
61
- :wtimeoutms
62
- ]
63
-
64
- OPT_VALID = {
65
- :authmechanism => lambda { |arg| Mongo::Authentication.validate_mechanism(arg) },
66
- :authmechanismproperties => lambda { |arg| arg.length > 0 },
67
- :authsource => lambda { |arg| arg.length > 0 },
68
- :connect => lambda { |arg| [ 'direct', 'replicaset', 'true', 'false', true, false ].include?(arg) },
69
- :connecttimeoutms => lambda { |arg| arg =~ /^\d+$/ },
70
- :fsync => lambda { |arg| ['true', 'false'].include?(arg) },
71
- :journal => lambda { |arg| ['true', 'false'].include?(arg) },
72
- :pool_size => lambda { |arg| arg.to_i > 0 },
73
- :readpreference => lambda { |arg| READ_PREFERENCES.keys.include?(arg) },
74
- :readpreferencetags => lambda { |arg| arg.none? { |tags| tags.scan(/(\w+:\w+),?/).empty? } },
75
- :replicaset => lambda { |arg| arg.length > 0 },
76
- :safe => lambda { |arg| ['true', 'false'].include?(arg) },
77
- :slaveok => lambda { |arg| ['true', 'false'].include?(arg) },
78
- :sockettimeoutms => lambda { |arg| arg =~ /^\d+$/ },
79
- :ssl => lambda { |arg| ['true', 'false'].include?(arg) },
80
- :w => lambda { |arg| arg =~ /^\w+$/ },
81
- :wtimeout => lambda { |arg| arg =~ /^\d+$/ },
82
- :wtimeoutms => lambda { |arg| arg =~ /^\d+$/ }
83
- }
84
-
85
- OPT_ERR = {
86
- :authmechanism => Mongo::Authentication::MECHANISM_ERROR,
87
- :authmechanismproperties => "must meet the format requirements of the authentication mechanism's properties",
88
- :authsource => "must be a string containing the name of the database being used for authentication",
89
- :connect => "must be 'direct', 'replicaset', 'true', or 'false'",
90
- :connecttimeoutms => "must be an integer specifying milliseconds",
91
- :fsync => "must be 'true' or 'false'",
92
- :journal => "must be 'true' or 'false'",
93
- :pool_size => "must be an integer greater than zero",
94
- :readpreference => "must be one of #{READ_PREFERENCES.keys.map(&:inspect).join(",")}",
95
- :readpreferencetags => "must be a comma-separated list of one or more key:value pairs",
96
- :replicaset => "must be a string containing the name of the replica set to connect to",
97
- :safe => "must be 'true' or 'false'",
98
- :slaveok => "must be 'true' or 'false'",
99
- :settimeoutms => "must be an integer specifying milliseconds",
100
- :ssl => "must be 'true' or 'false'",
101
- :w => "must be an integer indicating number of nodes to replicate to or a string " +
102
- "specifying that replication is required to the majority or nodes with a " +
103
- "particilar getLastErrorMode.",
104
- :wtimeout => "must be an integer specifying milliseconds",
105
- :wtimeoutms => "must be an integer specifying milliseconds"
106
- }
107
-
108
- OPT_CONV = {
109
- :authmechanism => lambda { |arg| arg.upcase },
110
- :authmechanismproperties => lambda { |arg| arg },
111
- :authsource => lambda { |arg| arg },
112
- :connect => lambda { |arg| arg == 'false' ? false : arg }, # convert 'false' to FalseClass
113
- :connecttimeoutms => lambda { |arg| arg.to_f / 1000 }, # stored as seconds
114
- :fsync => lambda { |arg| arg == 'true' ? true : false },
115
- :journal => lambda { |arg| arg == 'true' ? true : false },
116
- :pool_size => lambda { |arg| arg.to_i },
117
- :readpreference => lambda { |arg| READ_PREFERENCES[arg] },
118
- :readpreferencetags => lambda { |arg| arg.map do |tags|
119
- tags.scan(/(\w+:\w+),?/).reduce({}) do |tags, pair|
120
- key, value = pair.first.split(":")
121
- tags.merge!(key => value)
122
- end
123
- end },
124
- :replicaset => lambda { |arg| arg },
125
- :safe => lambda { |arg| arg == 'true' ? true : false },
126
- :slaveok => lambda { |arg| arg == 'true' ? true : false },
127
- :sockettimeoutms => lambda { |arg| arg.to_f / 1000 }, # stored as seconds
128
- :ssl => lambda { |arg| arg == 'true' ? true : false },
129
- :w => lambda { |arg| Mongo::Support.is_i?(arg) ? arg.to_i : arg.to_sym },
130
- :wtimeout => lambda { |arg| arg.to_i },
131
- :wtimeoutms => lambda { |arg| arg.to_i }
132
- }
133
-
134
- OPT_CASE_SENSITIVE = [ :authsource,
135
- :authmechanismproperties,
136
- :replicaset,
137
- :w
138
- ]
139
-
140
- OPT_NOT_STRING = [ :readpreferencetags ]
141
-
142
- attr_reader :auths,
143
- :authmechanism,
144
- :authmechanismproperties,
145
- :authsource,
146
- :connect,
147
- :connecttimeoutms,
148
- :db_name,
149
- :fsync,
150
- :journal,
151
- :nodes,
152
- :pool_size,
153
- :readpreference,
154
- :readpreferencetags,
155
- :replicaset,
156
- :safe,
157
- :slaveok,
158
- :sockettimeoutms,
159
- :ssl,
160
- :w,
161
- :wtimeout,
162
- :wtimeoutms
163
-
164
- # Parse a MongoDB URI. This method is used by MongoClient.from_uri.
165
- # Returns an array of nodes and an array of db authorizations, if applicable.
166
- #
167
- # @note Passwords can contain any character except for ','
168
- #
169
- # @param [String] uri The MongoDB URI string.
170
- def initialize(uri)
171
- if uri.start_with?('mongodb://')
172
- uri = uri[10..-1]
173
- else
174
- raise MongoArgumentError, "MongoDB URI must match this spec: #{MONGODB_URI_SPEC}"
175
- end
176
-
177
- hosts, opts = uri.split('?')
178
- parse_options(opts)
179
- parse_hosts(hosts)
180
- validate_connect
181
- end
182
-
183
- # Create a Mongo::MongoClient or a Mongo::MongoReplicaSetClient based on the URI.
184
- #
185
- # @note Don't confuse this with attribute getter method #connect.
186
- #
187
- # @return [MongoClient,MongoReplicaSetClient]
188
- def connection(extra_opts={}, legacy = false, sharded = false)
189
- opts = connection_options.merge!(extra_opts)
190
- if(legacy)
191
- if replicaset?
192
- ReplSetConnection.new(node_strings, opts)
193
- else
194
- Connection.new(host, port, opts)
195
- end
196
- else
197
- if sharded
198
- MongoShardedClient.new(node_strings, opts)
199
- elsif replicaset?
200
- MongoReplicaSetClient.new(node_strings, opts)
201
- else
202
- MongoClient.new(host, port, opts)
203
- end
204
- end
205
- end
206
-
207
- # Whether this represents a replica set.
208
- # @return [true,false]
209
- def replicaset?
210
- replicaset.is_a?(String) || nodes.length > 1
211
- end
212
-
213
- # Whether to immediately connect to the MongoDB node[s]. Defaults to true.
214
- # @return [true, false]
215
- def connect?
216
- connect != false
217
- end
218
-
219
- # Whether this represents a direct connection.
220
- #
221
- # @note Specifying :connect => 'direct' has no effect... other than to raise an exception if other variables suggest a replicaset.
222
- #
223
- # @return [true,false]
224
- def direct?
225
- !replicaset?
226
- end
227
-
228
- # For direct connections, the host of the (only) node.
229
- # @return [String]
230
- def host
231
- nodes[0][0]
232
- end
233
-
234
- # For direct connections, the port of the (only) node.
235
- # @return [Integer]
236
- def port
237
- nodes[0][1].to_i
238
- end
239
-
240
- # Options that can be passed to MongoClient.new or MongoReplicaSetClient.new
241
- # @return [Hash]
242
- def connection_options
243
- opts = {}
244
-
245
- if @wtimeout
246
- warn "Using wtimeout in a URI is deprecated, please use wtimeoutMS. It will be removed in v2.0."
247
- opts[:wtimeout] = @wtimeout
248
- end
249
- opts[:wtimeout] = @wtimeoutms if @wtimeoutms
250
-
251
- opts[:w] = 1 if @safe
252
- opts[:w] = @w if @w
253
- opts[:j] = @journal if @journal
254
- opts[:fsync] = @fsync if @fsync
255
-
256
- opts[:connect_timeout] = @connecttimeoutms if @connecttimeoutms
257
- opts[:op_timeout] = @sockettimeoutms if @sockettimeoutms
258
- opts[:pool_size] = @pool_size if @pool_size
259
- opts[:read] = @readpreference if @readpreference
260
- opts[:tag_sets] = @readpreferencetags if @readpreferencetags
261
-
262
- if @slaveok && !@readpreference
263
- unless replicaset?
264
- opts[:slave_ok] = true
265
- else
266
- opts[:read] = :secondary_preferred
267
- end
268
- end
269
-
270
- if replicaset.is_a?(String)
271
- opts[:name] = replicaset
272
- end
273
-
274
- opts[:db_name] = @db_name if @db_name
275
- opts[:auths] = @auths if @auths
276
- opts[:ssl] = @ssl if @ssl
277
- opts[:connect] = connect?
278
-
279
- opts
280
- end
281
-
282
- def node_strings
283
- nodes.map { |node| node.join(':') }
284
- end
285
-
286
- private
287
-
288
- def parse_hosts(uri_without_protocol)
289
- @nodes = []
290
- @auths = Set.new
291
-
292
- unless matches = MONGODB_URI_MATCHER.match(uri_without_protocol)
293
- raise MongoArgumentError,
294
- "MongoDB URI must match this spec: #{MONGODB_URI_SPEC}"
295
- end
296
-
297
- user_info = matches[2].split(':') if matches[2]
298
- host_info = matches[3].split(',')
299
- @db_name = matches[9]
300
-
301
- if host_info.first.end_with?('.sock')
302
- @nodes << [ host_info.first ]
303
- else
304
- host_info.each do |host|
305
- if host[0,1] == '['
306
- host, port = host.split(']:') << MongoClient::DEFAULT_PORT
307
- host = host.end_with?(']') ? host[1...-1] : host[1..-1]
308
- else
309
- host, port = host.split(':') << MongoClient::DEFAULT_PORT
310
- end
311
- unless port.to_s =~ /^\d+$/
312
- raise MongoArgumentError,
313
- "Invalid port #{port}; port must be specified as digits."
314
- end
315
- @nodes << [host, port.to_i]
316
- end
317
- end
318
-
319
- if @nodes.empty?
320
- raise MongoArgumentError,
321
- "No nodes specified. Please ensure that you've provided at " +
322
- "least one node."
323
- end
324
-
325
- # no user info to parse, exit here
326
- return unless user_info
327
-
328
- # check for url encoding for username and password
329
- username, password = user_info
330
- if user_info.size > 2 ||
331
- (username && username.include?('@')) ||
332
- (password && password.include?('@'))
333
-
334
- raise MongoArgumentError,
335
- "The characters ':' and '@' in a username or password " +
336
- "must be escaped (RFC 2396)."
337
- end
338
-
339
- # if username exists, proceed adding to auth set
340
- unless username.nil? || username.empty?
341
- auth = Authentication.validate_credentials({
342
- :db_name => @db_name,
343
- :username => URI.unescape(username),
344
- :password => password ? URI.unescape(password) : nil,
345
- :source => @authsource,
346
- :mechanism => @authmechanism,
347
- :extra => @authmechanismproperties || {}
348
- })
349
-
350
- @auths << auth
351
- end
352
- end
353
-
354
- # This method uses the lambdas defined in OPT_VALID and OPT_CONV to validate
355
- # and convert the given options.
356
- def parse_options(string_opts)
357
- # initialize instance variables for available options
358
- OPT_VALID.keys.each { |k| instance_variable_set("@#{k}", nil) }
359
-
360
- string_opts ||= ''
361
-
362
- return if string_opts.empty?
363
-
364
- if string_opts.include?(';') and string_opts.include?('&')
365
- raise MongoArgumentError, 'must not mix URL separators ; and &'
366
- end
367
-
368
- opts = CGI.parse(string_opts).inject({}) do |memo, (key, value)|
369
- key_sym = key.downcase.to_sym
370
- if OPT_NOT_STRING.include?(key_sym)
371
- memo[key_sym] = value
372
- else
373
- value = value.first
374
- memo[key_sym] = OPT_CASE_SENSITIVE.include?(key_sym) ? value.strip : value.strip.downcase
375
- end
376
- memo
377
- end
378
-
379
- opts.each do |key, value|
380
- if !OPT_ATTRS.include?(key)
381
- raise MongoArgumentError, "Invalid Mongo URI option #{key}"
382
- end
383
- if OPT_VALID[key].call(value)
384
- instance_variable_set("@#{key}", OPT_CONV[key].call(value))
385
- else
386
- raise MongoArgumentError, "Invalid value #{value.inspect} for #{key}: #{OPT_ERR[key]}"
387
- end
388
- end
389
-
390
- if @authmechanismproperties
391
- @authmechanismproperties = @authmechanismproperties.split(',').reduce({}) do |prop, pair|
392
- key, value = pair.split(':')
393
- if ["true", "false"].include?(value.downcase)
394
- value = value.downcase == "true"
395
- end
396
- prop[key.downcase.to_sym] = value
397
- prop
398
- end
399
- end
400
- end
401
-
402
- def validate_connect
403
- if replicaset? and @connect == 'direct'
404
- # Make sure the user doesn't specify something contradictory
405
- raise MongoArgumentError, "connect=direct conflicts with setting a replicaset name"
406
- end
407
- end
408
- end
409
- end
@@ -1,66 +0,0 @@
1
- # Copyright (C) 2009-2013 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 WriteConcern
17
- VALID_KEYS = [:w, :j, :fsync, :wtimeout]
18
- DEFAULT_WRITE_CONCERN = {:w => 1}
19
-
20
- attr_reader :legacy_write_concern
21
-
22
- @@safe_warn = nil
23
- def write_concern_from_legacy(opts)
24
- # Warn if 'safe' parameter is being used,
25
- if opts.key?(:safe) && !@@safe_warn && !ENV['TEST_MODE']
26
- warn "[DEPRECATED] The 'safe' write concern option has been deprecated in favor of 'w'."
27
- @@safe_warn = true
28
- end
29
-
30
- # nil: set :w => 0
31
- # false: set :w => 0
32
- # true: set :w => 1
33
- # hash: set :w => 0 and merge with opts
34
-
35
- unless opts.has_key?(:w)
36
- opts[:w] = 0 # legacy default, unacknowledged
37
- safe = opts.delete(:safe)
38
- if(safe && safe.is_a?(Hash))
39
- opts.merge!(safe)
40
- elsif(safe == true)
41
- opts[:w] = 1
42
- end
43
- end
44
- end
45
-
46
- # todo: throw exception for conflicting write concern options
47
- def get_write_concern(opts, parent=nil)
48
- write_concern_from_legacy(opts) if opts.key?(:safe) || legacy_write_concern
49
- write_concern = DEFAULT_WRITE_CONCERN.dup
50
- write_concern.merge!(parent.write_concern) if parent
51
- write_concern.merge!(opts.reject {|k,v| !VALID_KEYS.include?(k)})
52
- write_concern[:w] = write_concern[:w].to_s if write_concern[:w].is_a?(Symbol)
53
- write_concern
54
- end
55
-
56
- def self.gle?(write_concern)
57
- (write_concern[:w].is_a? Symbol) ||
58
- (write_concern[:w].is_a? String) ||
59
- write_concern[:w] > 0 ||
60
- write_concern[:j] ||
61
- write_concern[:fsync] ||
62
- write_concern[:wtimeout]
63
- end
64
-
65
- end
66
- end
@@ -1,112 +0,0 @@
1
- # Copyright (C) 2009-2013 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
- # Implementation of the MongoDB GridFS specification. A file store.
18
- class Grid
19
- include GridExt::InstanceMethods
20
-
21
- DEFAULT_FS_NAME = 'fs'
22
-
23
- # Initialize a new Grid instance, consisting of a MongoDB database
24
- # and a filesystem prefix if not using the default.
25
- #
26
- # @see GridFileSystem
27
- def initialize(db, fs_name=DEFAULT_FS_NAME)
28
- raise MongoArgumentError, "db must be a Mongo::DB." unless db.is_a?(Mongo::DB)
29
-
30
- @db = db
31
- @files = @db["#{fs_name}.files"]
32
- @chunks = @db["#{fs_name}.chunks"]
33
- @fs_name = fs_name
34
-
35
- # This will create indexes only if we're connected to a primary node.
36
- begin
37
- @chunks.ensure_index([['files_id', Mongo::ASCENDING], ['n', Mongo::ASCENDING]], :unique => true)
38
- rescue Mongo::ConnectionFailure
39
- end
40
- end
41
-
42
- # Store a file in the file store. This method is designed only for writing new files;
43
- # if you need to update a given file, first delete it using Grid#delete.
44
- #
45
- # Note that arbitrary metadata attributes can be saved to the file by passing
46
- # them in as options.
47
- #
48
- # @param [String, #read] data a string or io-like object to store.
49
- #
50
- # @option opts [String] :filename (nil) a name for the file.
51
- # @option opts [Hash] :metadata ({}) any additional data to store with the file.
52
- # @option opts [ObjectId] :_id (ObjectId) a unique id for
53
- # the file to be use in lieu of an automatically generated one.
54
- # @option opts [String] :content_type ('binary/octet-stream') If no content type is specified,
55
- # the content type will may be inferred from the filename extension if the mime-types gem can be
56
- # loaded. Otherwise, the content type 'binary/octet-stream' will be used.
57
- # @option opts [Integer] (261120) :chunk_size size of file chunks in bytes.
58
- # @option opts [String, Integer, Symbol] :w (1) Set write concern
59
- #
60
- # Notes on write concern:
61
- # When :w > 0, the chunks sent to the server are validated using an md5 hash.
62
- # If validation fails, an exception will be raised.
63
- #
64
- # @return [BSON::ObjectId] the file's id.
65
- def put(data, opts={})
66
- begin
67
- # Ensure there is an index on files_id and n, as state may have changed since instantiation of self.
68
- # Recall that index definitions are cached with ensure_index so this statement won't unneccesarily repeat index creation.
69
- @chunks.ensure_index([['files_id', Mongo::ASCENDING], ['n', Mongo::ASCENDING]], :unique => true)
70
- opts = opts.dup
71
- filename = opts.delete(:filename)
72
- opts.merge!(default_grid_io_opts)
73
- file = GridIO.new(@files, @chunks, filename, 'w', opts)
74
- file.write(data)
75
- file.close
76
- file.files_id
77
- rescue Mongo::ConnectionFailure => e
78
- raise e, "Failed to create necessary index and write data."
79
- end
80
- end
81
-
82
- # Read a file from the file store.
83
- #
84
- # @param id the file's unique id.
85
- #
86
- # @return [Mongo::GridIO]
87
- def get(id)
88
- opts = {:query => {'_id' => id}}.merge!(default_grid_io_opts)
89
- GridIO.new(@files, @chunks, nil, 'r', opts)
90
- end
91
-
92
- # Delete a file from the store.
93
- #
94
- # Note that deleting a GridFS file can result in read errors if another process
95
- # is attempting to read a file while it's being deleted. While the odds for this
96
- # kind of race condition are small, it's important to be aware of.
97
- #
98
- # @param id
99
- #
100
- # @return [Boolean]
101
- def delete(id)
102
- @files.remove({"_id" => id})
103
- @chunks.remove({"files_id" => id})
104
- end
105
-
106
- private
107
-
108
- def default_grid_io_opts
109
- {:fs_name => @fs_name}
110
- end
111
- end
112
- end
@@ -1,53 +0,0 @@
1
- # Copyright (C) 2009-2013 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 GridExt
17
- module InstanceMethods
18
-
19
- # Check the existence of a file matching the given query selector.
20
- #
21
- # Note that this method can be used with both the Grid and GridFileSystem classes. Also
22
- # keep in mind that if you're going to be performing lots of existence checks, you should
23
- # keep an instance of Grid or GridFileSystem handy rather than instantiating for each existence
24
- # check. Alternatively, simply keep a reference to the proper files collection and query that
25
- # as needed. That's exactly how this methods works.
26
- #
27
- # @param [Hash] selector a query selector.
28
- #
29
- # @example
30
- #
31
- # # Check for the existence of a given filename
32
- # @grid = Mongo::GridFileSystem.new(@db)
33
- # @grid.exist?(:filename => 'foo.txt')
34
- #
35
- # # Check for existence filename and content type
36
- # @grid = Mongo::GridFileSystem.new(@db)
37
- # @grid.exist?(:filename => 'foo.txt', :content_type => 'image/jpg')
38
- #
39
- # # Check for existence by _id
40
- # @grid = Mongo::Grid.new(@db)
41
- # @grid.exist?(:_id => BSON::ObjectId.from_string('4bddcd24beffd95a7db9b8c8'))
42
- #
43
- # # Check for existence by an arbitrary attribute.
44
- # @grid = Mongo::Grid.new(@db)
45
- # @grid.exist?(:tags => {'$in' => ['nature', 'zen', 'photography']})
46
- #
47
- # @return [nil, Hash] either nil for the file's metadata as a hash.
48
- def exist?(selector)
49
- @files.find_one(selector)
50
- end
51
- end
52
- end
53
- end