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,147 @@
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 Protocol
17
+
18
+ # MongoDB Wire protocol Query message.
19
+ #
20
+ # This is a client request message that is sent to the server in order
21
+ # to retrieve documents matching provided query.
22
+ #
23
+ # Users may also provide additional options such as a projection, to
24
+ # select a subset of the fields, a number to skip or a limit on the
25
+ # number of returned documents.
26
+ #
27
+ # There are a variety of flags that can be used to adjust cursor
28
+ # parameters or the desired consistancy and integrity the results.
29
+ #
30
+ # @api semipublic
31
+ class Query < Message
32
+
33
+ # Creates a new Query message
34
+ #
35
+ # @example Find all users named Tyler.
36
+ # Query.new('xgen', 'users', {:name => 'Tyler'})
37
+ #
38
+ # @example Find all users named Tyler skipping 5 and returning 10.
39
+ # Query.new('xgen', 'users', {:name => 'Tyler'}, :skip => 5,
40
+ # :limit => 10)
41
+ #
42
+ # @example Find all users with slave ok bit set
43
+ # Query.new('xgen', 'users', {:name => 'Tyler'}, :flags => [:slave_ok])
44
+ #
45
+ # @example Find all user ids.
46
+ # Query.new('xgen', 'users', {}, :fields => {:id => 1})
47
+ #
48
+ # @param database [String, Symbol] The database to query.
49
+ # @param collection [String, Symbol] The collection to query.
50
+ # @param selector [Hash] The query selector.
51
+ # @param options [Hash] The additional query options.
52
+ #
53
+ # @option options :project [Hash] The projection.
54
+ # @option options :skip [Integer] The number of documents to skip.
55
+ # @option options :limit [Integer] The number of documents to return.
56
+ # @option options :flags [Array] The flags for the query message.
57
+ #
58
+ # Supported flags: +:tailable_cursor+, +:slave_ok+, +:oplog_replay+,
59
+ # +:no_cursor_timeout+, +:await_data+, +:exhaust+, +:partial+
60
+ def initialize(database, collection, selector, options = {})
61
+ @namespace = "#{database}.#{collection}"
62
+ @selector = selector
63
+ @project = options[:project]
64
+ @skip = options[:skip] || 0
65
+ @limit = options[:limit] || 0
66
+ @flags = options[:flags] || []
67
+ end
68
+
69
+ # The log message for a query operation.
70
+ #
71
+ # @example Get the log message.
72
+ # query.log_message
73
+ #
74
+ # @return [ String ] The log message
75
+ #
76
+ # @since 2.0.0
77
+ def log_message
78
+ fields = []
79
+ fields << ["%s |", "QUERY"]
80
+ fields << ["namespace=%s", namespace]
81
+ fields << ["selector=%s", selector.inspect]
82
+ fields << ["flags=%s", flags.inspect]
83
+ fields << ["limit=%s", limit.inspect]
84
+ fields << ["skip=%s", skip.inspect]
85
+ fields << ["project=%s", project.inspect]
86
+ f, v = fields.transpose
87
+ f.join(" ") % v
88
+ end
89
+
90
+ # Query messages require replies from the database.
91
+ #
92
+ # @example Does the message require a reply?
93
+ # message.replyable?
94
+ #
95
+ # @return [ true ] Always true for queries.
96
+ #
97
+ # @since 2.0.0
98
+ def replyable?
99
+ true
100
+ end
101
+
102
+ private
103
+
104
+ # The operation code required to specify a Query message.
105
+ # @return [Fixnum] the operation code.
106
+ def op_code
107
+ 2004
108
+ end
109
+
110
+ # Available flags for a Query message.
111
+ FLAGS = [
112
+ :reserved,
113
+ :tailable_cursor,
114
+ :slave_ok,
115
+ :oplog_replay,
116
+ :no_cursor_timeout,
117
+ :await_data,
118
+ :exhaust,
119
+ :partial
120
+ ]
121
+
122
+ # @!attribute
123
+ # @return [Array<Symbol>] The flags for this query message.
124
+ field :flags, BitVector.new(FLAGS)
125
+
126
+ # @!attribute
127
+ # @return [String] The namespace for this query message.
128
+ field :namespace, CString
129
+
130
+ # @!attribute
131
+ # @return [Integer] The number of documents to skip.
132
+ field :skip, Int32
133
+
134
+ # @!attribute
135
+ # @return [Integer] The number of documents to return.
136
+ field :limit, Int32
137
+
138
+ # @!attribute
139
+ # @return [Hash] The query selector.
140
+ field :selector, Document
141
+
142
+ # @!attribute
143
+ # @return [Hash] The projection.
144
+ field :project, Document
145
+ end
146
+ end
147
+ end
@@ -0,0 +1,72 @@
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 Protocol
17
+
18
+ # The MongoDB wire protocol message representing a reply
19
+ #
20
+ # @example
21
+ # socket = TCPSocket.new('localhost', 27017)
22
+ # query = Protocol::Query.new('xgen', 'users', {:name => 'Tyler'})
23
+ # socket.write(query)
24
+ # reply = Protocol::Reply::deserialize(socket)
25
+ #
26
+ # @api semipublic
27
+ class Reply < Message
28
+
29
+ private
30
+
31
+ # The operation code required to specify a Reply message.
32
+ # @return [Fixnum] the operation code.
33
+ def op_code
34
+ 1
35
+ end
36
+
37
+ # Available flags for a Reply message.
38
+ FLAGS = [
39
+ :cursor_not_found,
40
+ :query_failure,
41
+ :shard_config_stale,
42
+ :await_capable
43
+ ]
44
+
45
+ public
46
+
47
+ # @!attribute
48
+ # @return [Array<Symbol>] The flags for this reply.
49
+ #
50
+ # Supported flags: +:cursor_not_found+, +:query_failure+,
51
+ # +:shard_config_stale+, +:await_capable+
52
+ field :flags, BitVector.new(FLAGS)
53
+
54
+ # @!attribute
55
+ # @return [Fixnum] The cursor id for this response. Will be zero
56
+ # if there are no additional results.
57
+ field :cursor_id, Int64
58
+
59
+ # @!attribute
60
+ # @return [Fixnum] The starting position of the cursor for this Reply.
61
+ field :starting_from, Int32
62
+
63
+ # @!attribute
64
+ # @return [Fixnum] Number of documents in this Reply.
65
+ field :number_returned, Int32
66
+
67
+ # @!attribute
68
+ # @return [Array<Hash>] The documents in this Reply.
69
+ field :documents, Document, :@number_returned
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,180 @@
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 Protocol
17
+
18
+ # Container for various serialization strategies
19
+ #
20
+ # Each strategy must have a serialization method named +serailize+
21
+ # and a deserialization method named +deserialize+
22
+ #
23
+ # Serialize methods must take buffer and value arguements and
24
+ # serialize the value into the buffer
25
+ #
26
+ # Deserialize methods must take an IO stream argument and
27
+ # deserialize the value from the stream of bytes
28
+ #
29
+ # @api private
30
+ module Serializers
31
+
32
+ private
33
+
34
+ ZERO = 0.freeze
35
+ NULL = 0.chr.freeze
36
+ INT32_PACK = 'l<'.freeze
37
+ INT64_PACK = 'q<'.freeze
38
+ HEADER_PACK = 'l<l<l<l<'.freeze
39
+
40
+ # MongoDB wire protocol serialization strategy for message headers.
41
+ #
42
+ # Serializes and de-serializes four 32-bit integers consisting
43
+ # of the length of the message, the request id, the response id,
44
+ # and the op code for the operation.
45
+ module Header
46
+
47
+ # Serializes the header value into the buffer
48
+ #
49
+ # @param buffer [String] Buffer to receive the serialized value.
50
+ # @param value [String] Header value to be serialized.
51
+ # @return [String] Buffer with serialized value.
52
+ def self.serialize(buffer, value)
53
+ buffer << value.pack(HEADER_PACK)
54
+ end
55
+
56
+ # Deserializes the header value from the IO stream
57
+ #
58
+ # @param io [IO] IO stream containing the message header.
59
+ # @return [Array<Fixnum>] Array consisting of the deserialized
60
+ # length, request id, response id, and op code.
61
+ def self.deserialize(io)
62
+ io.read(16).unpack(HEADER_PACK)
63
+ end
64
+ end
65
+
66
+ # MongoDB wire protocol serialization strategy for C style strings.
67
+ #
68
+ # Serializes and de-serializes C style strings (null terminated).
69
+ module CString
70
+
71
+ # Serializes a C style string into the buffer
72
+ #
73
+ # @param buffer [String] Buffer to receive the serialized CString.
74
+ # @param value [String] The string to be serialized.
75
+ # @return [String] Buffer with serialized value.
76
+ def self.serialize(buffer, value)
77
+ buffer << value
78
+ buffer << NULL
79
+ end
80
+ end
81
+
82
+ # MongoDB wire protocol serialization strategy for 32-bit Zero.
83
+ #
84
+ # Serializes and de-serializes one 32-bit Zero.
85
+ module Zero
86
+
87
+ # Serializes a 32-bit Zero into the buffer
88
+ #
89
+ # @param buffer [String] Buffer to receive the serialized Zero.
90
+ # @param value [Fixnum] Ignored value.
91
+ # @return [String] Buffer with serialized value.
92
+ def self.serialize(buffer, value)
93
+ buffer << [ZERO].pack(INT32_PACK)
94
+ end
95
+ end
96
+
97
+ # MongoDB wire protocol serialization strategy for 32-bit integers.
98
+ #
99
+ # Serializes and de-serializes one 32-bit integer.
100
+ module Int32
101
+
102
+ # Serializes a fixnum to a 4-byte 32-bit integer
103
+ #
104
+ # @param buffer [String] Buffer to receive the serialized Int32.
105
+ # @param value [Fixnum] 32-bit integer to be serialized.
106
+ # @return [String] Buffer with serialized value.
107
+ def self.serialize(buffer, value)
108
+ buffer << [value].pack(INT32_PACK)
109
+ end
110
+
111
+ # Deserializes a 32-bit Fixnum from the IO stream
112
+ #
113
+ # @param io [IO] IO stream containing the 32-bit integer
114
+ # @return [Fixnum] Deserialized Int32
115
+ def self.deserialize(io)
116
+ io.read(4).unpack(INT32_PACK).first
117
+ end
118
+ end
119
+
120
+ # MongoDB wire protocol serialization strategy for 64-bit integers.
121
+ #
122
+ # Serializes and de-serializes one 64-bit integer.
123
+ module Int64
124
+
125
+ # Serializes a fixnum to an 8-byte 64-bit integer
126
+ #
127
+ # @param buffer [String] Buffer to receive the serialized Int64.
128
+ # @param value [Fixnum] 64-bit integer to be serialized.
129
+ # @return [String] Buffer with serialized value.
130
+ def self.serialize(buffer, value)
131
+ buffer << [value].pack(INT64_PACK)
132
+ end
133
+
134
+ # Deserializes a 64-bit Fixnum from the IO stream
135
+ #
136
+ # @param io [IO] IO stream containing the 64-bit integer.
137
+ # @return [Fixnum] Deserialized Int64.
138
+ def self.deserialize(io)
139
+ io.read(8).unpack(INT64_PACK).first
140
+ end
141
+ end
142
+
143
+ # MongoDB wire protocol serialization strategy for a BSON Document.
144
+ #
145
+ # Serializes and de-serializes a single document.
146
+ module Document
147
+
148
+ # Serializes a document into the buffer
149
+ #
150
+ # @param buffer [String] Buffer to receive the BSON encoded document.
151
+ # @param value [Hash] Document to serialize as BSON.
152
+ # @return [String] Buffer with serialized value.
153
+ def self.serialize(buffer, value, max_bson_size = nil)
154
+ start_size = buffer.size
155
+ value.to_bson(buffer)
156
+ if max_bson_size && buffer.size - start_size > max_bson_size
157
+ raise Error::MaxBSONSize.new(max_bson_size)
158
+ end
159
+ end
160
+
161
+ # Deserializes a document from the IO stream
162
+ #
163
+ # @param io [IO] IO stream containing the BSON encoded document.
164
+ # @return [Hash] The decoded BSON document.
165
+ def self.deserialize(io)
166
+ BSON::Document.from_bson(io)
167
+ end
168
+
169
+ # Whether there can be a size limit on this type after serialization.
170
+ #
171
+ # @return [ true ] Documents can be size limited upon serialization.
172
+ #
173
+ # @since 2.0.0
174
+ def self.size_limited?
175
+ true
176
+ end
177
+ end
178
+ end
179
+ end
180
+ end
@@ -0,0 +1,111 @@
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 Protocol
17
+
18
+ # MongoDB Wire protocol Update message.
19
+ #
20
+ # This is a client request message that is sent to the server in order
21
+ # to update documents matching the provided query.
22
+ #
23
+ # The default is to update a single document. In order to update many at
24
+ # a time users should set the +:multi_update+ flag for the update.
25
+ #
26
+ # If an upsert (update or insert) is desired, users can set the +:upsert+
27
+ # flag in order to indicate they would like to insert the merged selector
28
+ # and update if no document matching the update query currently exists.
29
+ #
30
+ # @api semipublic
31
+ class Update < Message
32
+
33
+ # Creates a new Update message
34
+ #
35
+ # @example Update single document
36
+ # Update.new('xgen', 'users', {:name => 'Tyler'}, {:name => 'Bob'})
37
+ #
38
+ # @example Perform a multi update
39
+ # Update.new('xgen', 'users',
40
+ # {:age => 20}, {:age => 21}, :flags => [:multi_update])
41
+ #
42
+ # @example Perform an upsert
43
+ # Update.new('xgen', 'users', {:name => 'Tyler'}, :flags => [:upsert])
44
+ #
45
+ # @param database [String, Symbol] The database to update.
46
+ # @param collection [String, Symbol] The collection to update.
47
+ # @param selector [Hash] The update selector.
48
+ # @param update [Hash] The update to perform.
49
+ # @param options [Hash] The additional query options.
50
+ #
51
+ # @option options :flags [Array] The flags for the update message.
52
+ #
53
+ # Supported flags: +:upsert+, +:multi_update+
54
+ def initialize(database, collection, selector, update, options = {})
55
+ @namespace = "#{database}.#{collection}"
56
+ @selector = selector
57
+ @update = update
58
+ @flags = options[:flags] || []
59
+ end
60
+
61
+ # The log message for an update operation.
62
+ #
63
+ # @example Get the log message.
64
+ # update.log_message
65
+ #
66
+ # @return [ String ] The log message
67
+ #
68
+ # @since 2.0.0
69
+ def log_message
70
+ fields = []
71
+ fields << ["%s |", "UPDATE"]
72
+ fields << ["namespace=%s", namespace]
73
+ fields << ["selector=%s", selector.inspect]
74
+ fields << ["udpdate=%s", update.inspect]
75
+ fields << ["flags=%s", flags.inspect]
76
+ f, v = fields.transpose
77
+ f.join(" ") % v
78
+ end
79
+
80
+ private
81
+
82
+ # The operation code required to specify an Update message.
83
+ # @return [Fixnum] the operation code.
84
+ def op_code
85
+ 2001
86
+ end
87
+
88
+ # Available flags for an Update message.
89
+ FLAGS = [:upsert, :multi_update]
90
+
91
+ # Field representing Zero encoded as an Int32.
92
+ field :zero, Zero
93
+
94
+ # @!attribute
95
+ # @return [String] The namespace for this Update message.
96
+ field :namespace, CString
97
+
98
+ # @!attribute
99
+ # @return [Array<Symbol>] The flags for this Update message.
100
+ field :flags, BitVector.new(FLAGS)
101
+
102
+ # @!attribute
103
+ # @return [Hash] The selector for this Update message.
104
+ field :selector, Document
105
+
106
+ # @!attribute
107
+ # @return [Hash] The update for this Delete message.
108
+ field :update, Document
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,15 @@
1
+ # Wire Protocol Base
2
+ require 'mongo/protocol/serializers'
3
+ require 'mongo/protocol/bit_vector'
4
+ require 'mongo/protocol/message'
5
+
6
+ # Client Requests
7
+ require 'mongo/protocol/delete'
8
+ require 'mongo/protocol/get_more'
9
+ require 'mongo/protocol/insert'
10
+ require 'mongo/protocol/kill_cursors'
11
+ require 'mongo/protocol/query'
12
+ require 'mongo/protocol/update'
13
+
14
+ # Server Responses
15
+ require 'mongo/protocol/reply'
@@ -0,0 +1,110 @@
1
+ # Copyright (C) 2015 MongoDB, Inc.
2
+
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module Mongo
16
+ class Server
17
+
18
+ # This provides common behaviour for connection objects.
19
+ #
20
+ # @since 2.0.0
21
+ module Connectable
22
+ include Loggable
23
+
24
+ # The default time in seconds to timeout a connection attempt.
25
+ #
26
+ # @since 2.0.0
27
+ TIMEOUT = 5.freeze
28
+
29
+ # @return [ Mongo::Address ] address The address to connect to.
30
+ attr_reader :address
31
+
32
+ # @return [ Hash ] options The passed in options.
33
+ attr_reader :options
34
+
35
+ # @return [ Integer ] pid The process id when the connection was created.
36
+ attr_reader :pid
37
+
38
+ # Determine if the connection is currently connected.
39
+ #
40
+ # @example Is the connection connected?
41
+ # connection.connected?
42
+ #
43
+ # @return [ true, false ] If connected.
44
+ #
45
+ # @since 2.0.0
46
+ def connected?
47
+ !!@socket && @socket.alive?
48
+ end
49
+
50
+ # Dispatch the provided messages to the connection. If the last message
51
+ # requires a response a reply will be returned.
52
+ #
53
+ # @example Dispatch the messages.
54
+ # connection.dispatch([ insert, command ])
55
+ #
56
+ # @note This method is named dispatch since 'send' is a core Ruby method on
57
+ # all objects.
58
+ #
59
+ # @param [ Array<Message> ] messages The messages to dispatch.
60
+ #
61
+ # @return [ Protocol::Reply ] The reply if needed.
62
+ #
63
+ # @since 2.0.0
64
+ def dispatch(messages)
65
+ log_debug(messages) do |msgs|
66
+ write(msgs)
67
+ msgs.last.replyable? ? read : nil
68
+ end
69
+ end
70
+
71
+ # Get the connection timeout.
72
+ #
73
+ # @example Get the connection timeout.
74
+ # connection.timeout
75
+ #
76
+ # @return [ Float ] The connection timeout in seconds.
77
+ #
78
+ # @since 2.0.0
79
+ def timeout
80
+ @timeout ||= options[:socket_timeout] || TIMEOUT
81
+ end
82
+
83
+ private
84
+
85
+ attr_reader :socket, :ssl_options
86
+
87
+ def ensure_connected
88
+ ensure_same_process!
89
+ connect! if socket.nil? || !socket.alive?
90
+ begin
91
+ yield socket
92
+ rescue Error::SocketError, Error::SocketTimeoutError => e
93
+ disconnect!
94
+ raise e
95
+ end
96
+ end
97
+
98
+ def ensure_same_process!
99
+ if pid != Process.pid
100
+ disconnect!
101
+ @pid = Process.pid
102
+ end
103
+ end
104
+
105
+ def read
106
+ ensure_connected{ |socket| Protocol::Reply.deserialize(socket) }
107
+ end
108
+ end
109
+ end
110
+ end