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,53 @@
1
+
2
+ # Copyright (C) 2014-2015 MongoDB, Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ module Mongo
17
+ module Event
18
+
19
+ # This handles host added events for server descriptions.
20
+ #
21
+ # @since 2.0.0
22
+ class ServerAdded
23
+
24
+ # @return [ Mongo::Cluster ] cluster The event publisher.
25
+ attr_reader :cluster
26
+
27
+ # Initialize the new host added event handler.
28
+ #
29
+ # @example Create the new handler.
30
+ # ServerAdded.new(cluster)
31
+ #
32
+ # @param [ Mongo::Cluster ] cluster The cluster to publish from.
33
+ #
34
+ # @since 2.0.0
35
+ def initialize(cluster)
36
+ @cluster = cluster
37
+ end
38
+
39
+ # This event publishes an event to add the cluster and logs the
40
+ # configuration change.
41
+ #
42
+ # @example Handle the event.
43
+ # server_added.handle('127.0.0.1:27018')
44
+ #
45
+ # @param [ Address ] address The added host.
46
+ #
47
+ # @since 2.0.0
48
+ def handle(address)
49
+ cluster.add(address)
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,53 @@
1
+ # Copyright (C) 2014-2015 MongoDB, Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module Mongo
16
+ module Event
17
+
18
+ # This handles host removed events for server descriptions.
19
+ #
20
+ # @since 2.0.0
21
+ class ServerRemoved
22
+ include Loggable
23
+
24
+ # @return [ Mongo::Cluster ] cluster The event publisher.
25
+ attr_reader :cluster
26
+
27
+ # Initialize the new host removed event handler.
28
+ #
29
+ # @example Create the new handler.
30
+ # ServerRemoved.new(cluster)
31
+ #
32
+ # @param [ Mongo::Cluster ] cluster The cluster to publish from.
33
+ #
34
+ # @since 2.0.0
35
+ def initialize(cluster)
36
+ @cluster = cluster
37
+ end
38
+
39
+ # This event publishes an event to remove from the cluster and logs the
40
+ # configuration change.
41
+ #
42
+ # @example Handle the event.
43
+ # server_removed.handle('127.0.0.1:27018')
44
+ #
45
+ # @param [ Address ] address The removed host.
46
+ #
47
+ # @since 2.0.0
48
+ def handle(address)
49
+ cluster.remove(address)
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,41 @@
1
+ # Copyright (C) 2014-2015 MongoDB, Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module Mongo
16
+ module Event
17
+
18
+ # Adds convenience methods for adding listeners to event publishers.
19
+ #
20
+ # @since 2.0.0
21
+ module Subscriber
22
+
23
+ # @return [ Event::Listeners ] event_listeners The listeners.
24
+ attr_reader :event_listeners
25
+
26
+ # Subscribe to the provided event.
27
+ #
28
+ # @example Subscribe to the event.
29
+ # subscriber.subscribe_to('test', listener)
30
+ #
31
+ # @param [ String ] event The event.
32
+ # @param [ Object ] listener The event listener.
33
+ #
34
+ # @since 2.0.0
35
+ def subscribe_to(event, listener)
36
+ event_listeners.add_listener(event, listener)
37
+ end
38
+ end
39
+ end
40
+ end
41
+
@@ -0,0 +1,40 @@
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/event/listeners'
16
+ require 'mongo/event/publisher'
17
+ require 'mongo/event/subscriber'
18
+ require 'mongo/event/primary_elected'
19
+ require 'mongo/event/server_added'
20
+ require 'mongo/event/server_removed'
21
+
22
+ module Mongo
23
+ module Event
24
+
25
+ # When a server is elected primary.
26
+ #
27
+ # @since 2.0.0
28
+ PRIMARY_ELECTED = 'primary_elected'.freeze
29
+
30
+ # When a server is to be added to a cluster.
31
+ #
32
+ # @since 2.0.0
33
+ SERVER_ADDED = 'server_added'.freeze
34
+
35
+ # When a server is to be removed from a cluster.
36
+ #
37
+ # @since 2.0.0
38
+ SERVER_REMOVED = 'server_removed'.freeze
39
+ end
40
+ end
@@ -0,0 +1,184 @@
1
+ # Copyright (C) 2014-2015 MongoDB, Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module Mongo
16
+ module Grid
17
+ class File
18
+
19
+ # Encapsulates behaviour around GridFS chunks of file data.
20
+ #
21
+ # @since 2.0.0
22
+ class Chunk
23
+
24
+ # Name of the chunks collection.
25
+ #
26
+ # @since 2.0.0
27
+ COLLECTION = 'chunks'.freeze
28
+
29
+ # Default size for chunks of data.
30
+ #
31
+ # @since 2.0.0
32
+ DEFAULT_SIZE = (255 * 1024).freeze
33
+
34
+ # @return [ BSON::Document ] document The document to store for the
35
+ # chunk.
36
+ attr_reader :document
37
+
38
+ # Check chunk equality.
39
+ #
40
+ # @example Check chunk equality.
41
+ # chunk == other
42
+ #
43
+ # @param [ Object ] other The object ot compare to.
44
+ #
45
+ # @return [ true, false ] If the objects are equal.
46
+ #
47
+ # @since 2.0.0
48
+ def ==(other)
49
+ return false unless other.is_a?(Chunk)
50
+ document == other.document
51
+ end
52
+
53
+ # Get the BSON type for a chunk document.
54
+ #
55
+ # @example Get the BSON type.
56
+ # chunk.bson_type
57
+ #
58
+ # @return [ Integer ] The BSON type.
59
+ #
60
+ # @since 2.0.0
61
+ def bson_type
62
+ BSON::Hash::BSON_TYPE
63
+ end
64
+
65
+ # Get the chunk data.
66
+ #
67
+ # @example Get the chunk data.
68
+ # chunk.data
69
+ #
70
+ # @return [ BSON::Binary ] The chunk data.
71
+ #
72
+ # @since 2.0.0
73
+ def data
74
+ document[:data]
75
+ end
76
+
77
+ # Get the chunk id.
78
+ #
79
+ # @example Get the chunk id.
80
+ # chunk.id
81
+ #
82
+ # @return [ BSON::ObjectId ] The chunk id.
83
+ #
84
+ # @since 2.0.0
85
+ def id
86
+ document[:_id]
87
+ end
88
+
89
+ # Get the files id.
90
+ #
91
+ # @example Get the files id.
92
+ # chunk.files_id
93
+ #
94
+ # @return [ BSON::ObjectId ] The files id.
95
+ #
96
+ # @since 2.0.0
97
+ def files_id
98
+ document[:files_id]
99
+ end
100
+
101
+ # Get the chunk position.
102
+ #
103
+ # @example Get the chunk position.
104
+ # chunk.n
105
+ #
106
+ # @return [ Integer ] The chunk position.
107
+ #
108
+ # @since 2.0.0
109
+ def n
110
+ document[:n]
111
+ end
112
+
113
+ # Create the new chunk.
114
+ #
115
+ # @example Create the chunk.
116
+ # Chunk.new(document)
117
+ #
118
+ # @param [ BSON::Document ] document The document to create the chunk
119
+ # from.
120
+ #
121
+ # @since 2.0.0
122
+ def initialize(document)
123
+ @document = BSON::Document.new(:_id => BSON::ObjectId.new).merge(document)
124
+ end
125
+
126
+ # Conver the chunk to BSON for storage.
127
+ #
128
+ # @example Convert the chunk to BSON.
129
+ # chunk.to_bson
130
+ #
131
+ # @param [ String ] encoded The encoded data to append to.
132
+ #
133
+ # @return [ String ] The raw BSON data.
134
+ #
135
+ # @since 2.0.0
136
+ def to_bson(encoded = ''.force_encoding(BSON::BINARY))
137
+ document.to_bson(encoded)
138
+ end
139
+
140
+ class << self
141
+
142
+ # Takes an array of chunks and assembles them back into the full
143
+ # piece of raw data.
144
+ #
145
+ # @example Assemble the chunks.
146
+ # Chunk.assemble(chunks)
147
+ #
148
+ # @param [ Array<Chunk> ] chunks The chunks.
149
+ #
150
+ # @return [ String ] The assembled data.
151
+ #
152
+ # @since 2.0.0
153
+ def assemble(chunks)
154
+ chunks.reduce(''){ |data, chunk| data << chunk.data.data }
155
+ end
156
+
157
+ # Split the provided data into multiple chunks.
158
+ #
159
+ # @example Split the data into chunks.
160
+ # Chunks.split(data)
161
+ #
162
+ # @param [ String ] data The raw bytes.
163
+ # @param [ Metadata ] metadata The file metadata.
164
+ #
165
+ # @return [ Array<Chunk> ] The chunks of the data.
166
+ #
167
+ # @since 2.0.0
168
+ def split(data, metadata)
169
+ chunks, index, n = [], 0, 0
170
+ while index < data.length
171
+ bytes = data.slice(index, metadata.chunk_size)
172
+ metadata.md5.update(bytes)
173
+ chunk = Chunk.new(:data => BSON::Binary.new(bytes), :files_id => metadata.id, :n => n)
174
+ chunks.push(chunk)
175
+ index += bytes.length
176
+ n += 1
177
+ end
178
+ chunks
179
+ end
180
+ end
181
+ end
182
+ end
183
+ end
184
+ end
@@ -0,0 +1,229 @@
1
+ # Copyright (C) 2014-2015 MongoDB, Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module Mongo
16
+ module Grid
17
+ class File
18
+
19
+ # Encapsulates behaviour around GridFS file metadata.
20
+ #
21
+ # @since 2.0.0
22
+ class Metadata
23
+
24
+ # Name of the files collection.
25
+ #
26
+ # @since 2.0.0
27
+ COLLECTION = 'files'.freeze
28
+
29
+ # Mappings of user supplied fields to db specification.
30
+ #
31
+ # @since 2.0.0
32
+ MAPPINGS = {
33
+ :chunk_size => :chunkSize,
34
+ :content_type => :contentType,
35
+ :filename => :filename,
36
+ :_id => :_id,
37
+ :md5 => :md5,
38
+ :metadata => :metadata,
39
+ :upload_date => :uploadDate
40
+ }.freeze
41
+
42
+ # Default content type for stored files.
43
+ #
44
+ # @since 2.0.0
45
+ DEFAULT_CONTENT_TYPE = 'binary/octet-stream'.freeze
46
+
47
+ # @return [ BSON::Document ] document The file metadata document.
48
+ attr_reader :document
49
+
50
+ # Is this metadata equal to another?
51
+ #
52
+ # @example Check metadata equality.
53
+ # metadata == other
54
+ #
55
+ # @param [ Object ] other The object to check against.
56
+ #
57
+ # @return [ true, false ] If the objects are equal.
58
+ #
59
+ # @since 2.0.0
60
+ def ==(other)
61
+ return false unless other.is_a?(Metadata)
62
+ document == other.document
63
+ end
64
+
65
+ # Get the BSON type for a metadata document.
66
+ #
67
+ # @example Get the BSON type.
68
+ # metadata.bson_type
69
+ #
70
+ # @return [ Integer ] The BSON type.
71
+ #
72
+ # @since 2.0.0
73
+ def bson_type
74
+ BSON::Hash::BSON_TYPE
75
+ end
76
+
77
+ # Get the metadata chunk size.
78
+ #
79
+ # @example Get the chunk size.
80
+ # metadata.chunk_size
81
+ #
82
+ # @return [ Integer ] The chunksize in bytes.
83
+ #
84
+ # @since 2.0.0
85
+ def chunk_size
86
+ document[:chunkSize]
87
+ end
88
+
89
+ # Get the metadata content type.
90
+ #
91
+ # @example Get the content type.
92
+ # metadata.content_type
93
+ #
94
+ # @return [ String ] The content type.
95
+ #
96
+ # @since 2.0.0
97
+ def content_type
98
+ document[:contentType]
99
+ end
100
+
101
+ # Get the metadata filename.
102
+ #
103
+ # @example Get the filename.
104
+ # metadata.filename
105
+ #
106
+ # @return [ String ] The filename.
107
+ def filename
108
+ document[:filename]
109
+ end
110
+
111
+ # Get the metadata id.
112
+ #
113
+ # @example Get the metadata id.
114
+ # metadata.id
115
+ #
116
+ # @return [ BSON::ObjectId ] The metadata id.
117
+ #
118
+ # @since 2.0.0
119
+ def id
120
+ document[:_id]
121
+ end
122
+
123
+ # Create the new metadata document.
124
+ #
125
+ # @example Create the new metadata document.
126
+ # Metadata.new(:filename => 'test.txt')
127
+ #
128
+ # @param [ BSON::Document ] document The document to create from.
129
+ #
130
+ # @since 2.0.0
131
+ def initialize(document)
132
+ @document = default_document.merge(Options::Mapper.transform(document, MAPPINGS))
133
+ @client_md5 = Digest::MD5.new
134
+ end
135
+
136
+ # Get a readable inspection for the object.
137
+ #
138
+ # @example Inspect the metadata.
139
+ # metadata.inspect
140
+ #
141
+ # @return [ String ] The nice inspection.
142
+ #
143
+ # @since 2.0.0
144
+ def inspect
145
+ "#<Mongo::Grid::File::Metadata:0x#{object_id} chunk_size=#{chunk_size} " +
146
+ "filename=#{filename} content_type=#{content_type} id=#{id} md5=#{md5}>"
147
+ end
148
+
149
+ # Get the length of the document in bytes.
150
+ #
151
+ # @example Get the length
152
+ # metadata.length
153
+ #
154
+ # @return [ Integer ] The length.
155
+ #
156
+ # @since 2.0.0
157
+ def length
158
+ document[:length]
159
+ end
160
+ alias :size :length
161
+
162
+ # Get the additional metadata.
163
+ #
164
+ # @example Get additional metadata.
165
+ # metadata.metadata
166
+ #
167
+ # @return [ String ] The additional metadata.
168
+ #
169
+ # @since 2.0.0
170
+ def metadata
171
+ document[:metadata]
172
+ end
173
+
174
+ # Get the md5 hash.
175
+ #
176
+ # @example Get the md5 hash.
177
+ # metadata.md5
178
+ #
179
+ # @return [ String ] The md5 hash as a string.
180
+ #
181
+ # @since 2.0.0
182
+ def md5
183
+ document[:md5] || @client_md5
184
+ end
185
+
186
+ # Conver the metadata to BSON for storage.
187
+ #
188
+ # @note If no md5 exists in the metadata (it was loaded from the server
189
+ # and is not a new file) then we digest the md5 and set it.
190
+ #
191
+ # @example Convert the metadata to BSON.
192
+ # metadata.to_bson
193
+ #
194
+ # @param [ String ] encoded The encoded data to append to.
195
+ #
196
+ # @return [ String ] The raw BSON data.
197
+ #
198
+ # @since 2.0.0
199
+ def to_bson(encoded = ''.force_encoding(BSON::BINARY))
200
+ document[:md5] ||= @client_md5.hexdigest
201
+ document.to_bson(encoded)
202
+ end
203
+
204
+ # Get the upload date.
205
+ #
206
+ # @example Get the upload date.
207
+ # metadata.upload_date
208
+ #
209
+ # @return [ Time ] The upload date.
210
+ #
211
+ # @since 2.0.0
212
+ def upload_date
213
+ document[:uploadDate]
214
+ end
215
+
216
+ private
217
+
218
+ def default_document
219
+ BSON::Document.new(
220
+ :_id => BSON::ObjectId.new,
221
+ :chunkSize => Chunk::DEFAULT_SIZE,
222
+ :uploadDate => Time.now.utc,
223
+ :contentType => DEFAULT_CONTENT_TYPE
224
+ )
225
+ end
226
+ end
227
+ end
228
+ end
229
+ end
@@ -0,0 +1,106 @@
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/grid/file/chunk'
16
+ require 'mongo/grid/file/metadata'
17
+
18
+ module Mongo
19
+ module Grid
20
+
21
+ # A representation of a file in the database.
22
+ #
23
+ # @since 2.0.0
24
+ class File
25
+ extend Forwardable
26
+
27
+ # Delegate to metadata for convenience.
28
+ def_delegators :metadata, :chunk_size, :content_type, :filename, :id, :md5, :upload_date
29
+
30
+ # @return [ Array<Chunk> ] chunks The file chunks.
31
+ attr_reader :chunks
32
+
33
+ # @return [ IO ] data The raw datafor the file.
34
+ attr_reader :data
35
+
36
+ # @return [ Metadata ] metadata The file metadata.
37
+ attr_reader :metadata
38
+
39
+ # Check equality of files.
40
+ #
41
+ # @example Check the equality of files.
42
+ # file == other
43
+ #
44
+ # @param [ Object ] other The object to check against.
45
+ #
46
+ # @return [ true, false ] If the objects are equal.
47
+ #
48
+ # @since 2.0.0
49
+ def ==(other)
50
+ return false unless other.is_a?(File)
51
+ chunks == other.chunks && data == other.data && metadata == other.metadata
52
+ end
53
+
54
+ # Initialize the file.
55
+ #
56
+ # @example Create the file.
57
+ # Grid::File.new(data, :filename => 'test.txt')
58
+ #
59
+ # @param [ IO, Array<BSON::Document> ] data The file or IO object or
60
+ # chunks.
61
+ # @param [ BSON::Document, Hash ] options The metadata options.
62
+ #
63
+ # @option options [ String ] :filename Required name of the file.
64
+ # @option options [ String ] :content_type The content type of the file.
65
+ # @option options [ String ] :metadata Optional file metadata.
66
+ # @option options [ Integer ] :chunk_size Override the default chunk
67
+ # size.
68
+ #
69
+ # @since 2.0.0
70
+ def initialize(data, options = {})
71
+ @metadata = Metadata.new({ :length => data.length }.merge(options))
72
+ initialize_chunks!(data)
73
+ end
74
+
75
+ # Gets a pretty inspection of the file.
76
+ #
77
+ # @example Get the file inspection.
78
+ # file.inspect
79
+ #
80
+ # @return [ String ] The file inspection.
81
+ #
82
+ # @since 2.0.0
83
+ def inspect
84
+ "#<Mongo::Grid::File:0x#{object_id} filename=#{filename}>"
85
+ end
86
+
87
+ private
88
+
89
+ # @note If we have provided an array of BSON::Documents to initialize
90
+ # with, we have an array of chunk documents and need to create the
91
+ # chunk objects and assemble the data. If we have an IO object, then
92
+ # it's the original file data and we must split it into chunks and set
93
+ # the original data itself.
94
+ def initialize_chunks!(value)
95
+ if value.is_a?(Array)
96
+ chks = value.map{ |doc| Chunk.new(doc) }
97
+ @chunks = chks
98
+ @data = Chunk.assemble(chks)
99
+ else
100
+ @chunks = Chunk.split(value, metadata)
101
+ @data = value
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end