mongo 2.13.1 → 2.14.0.rc1
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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +1 -4
- data/lib/mongo.rb +9 -0
- data/lib/mongo/address/ipv4.rb +1 -1
- data/lib/mongo/address/ipv6.rb +1 -1
- data/lib/mongo/bulk_write.rb +17 -0
- data/lib/mongo/caching_cursor.rb +74 -0
- data/lib/mongo/client.rb +47 -8
- data/lib/mongo/cluster.rb +3 -3
- data/lib/mongo/cluster/topology/single.rb +1 -1
- data/lib/mongo/collection.rb +26 -0
- data/lib/mongo/collection/view.rb +24 -20
- data/lib/mongo/collection/view/aggregation.rb +25 -4
- data/lib/mongo/collection/view/builder/find_command.rb +38 -18
- data/lib/mongo/collection/view/explainable.rb +27 -8
- data/lib/mongo/collection/view/iterable.rb +72 -12
- data/lib/mongo/collection/view/readable.rb +12 -2
- data/lib/mongo/collection/view/writable.rb +15 -1
- data/lib/mongo/crypt/encryption_io.rb +6 -6
- data/lib/mongo/cursor.rb +1 -0
- data/lib/mongo/database.rb +6 -0
- data/lib/mongo/error.rb +2 -0
- data/lib/mongo/error/invalid_read_concern.rb +28 -0
- data/lib/mongo/error/server_certificate_revoked.rb +22 -0
- data/lib/mongo/error/unsupported_option.rb +14 -12
- data/lib/mongo/lint.rb +2 -1
- data/lib/mongo/logger.rb +3 -3
- data/lib/mongo/operation.rb +2 -0
- data/lib/mongo/operation/aggregate/result.rb +9 -8
- data/lib/mongo/operation/collections_info/result.rb +2 -0
- data/lib/mongo/operation/delete/bulk_result.rb +2 -0
- data/lib/mongo/operation/delete/result.rb +3 -0
- data/lib/mongo/operation/explain/command.rb +4 -0
- data/lib/mongo/operation/explain/legacy.rb +4 -0
- data/lib/mongo/operation/explain/op_msg.rb +6 -0
- data/lib/mongo/operation/explain/result.rb +3 -0
- data/lib/mongo/operation/find/legacy/result.rb +2 -0
- data/lib/mongo/operation/find/result.rb +3 -0
- data/lib/mongo/operation/get_more/result.rb +3 -0
- data/lib/mongo/operation/indexes/result.rb +5 -0
- data/lib/mongo/operation/insert/bulk_result.rb +5 -0
- data/lib/mongo/operation/insert/result.rb +5 -0
- data/lib/mongo/operation/list_collections/result.rb +5 -0
- data/lib/mongo/operation/map_reduce/result.rb +10 -0
- data/lib/mongo/operation/parallel_scan/result.rb +4 -0
- data/lib/mongo/operation/result.rb +35 -6
- data/lib/mongo/operation/shared/bypass_document_validation.rb +1 -0
- data/lib/mongo/operation/shared/causal_consistency_supported.rb +1 -0
- data/lib/mongo/operation/shared/collections_info_or_list_collections.rb +2 -0
- data/lib/mongo/operation/shared/executable.rb +1 -0
- data/lib/mongo/operation/shared/idable.rb +2 -1
- data/lib/mongo/operation/shared/limited.rb +1 -0
- data/lib/mongo/operation/shared/object_id_generator.rb +1 -0
- data/lib/mongo/operation/shared/result/aggregatable.rb +1 -0
- data/lib/mongo/operation/shared/sessions_supported.rb +1 -0
- data/lib/mongo/operation/shared/specifiable.rb +1 -0
- data/lib/mongo/operation/shared/write.rb +1 -0
- data/lib/mongo/operation/shared/write_concern_supported.rb +1 -0
- data/lib/mongo/operation/update/legacy/result.rb +7 -0
- data/lib/mongo/operation/update/result.rb +8 -0
- data/lib/mongo/operation/users_info/result.rb +3 -0
- data/lib/mongo/query_cache.rb +242 -0
- data/lib/mongo/retryable.rb +8 -1
- data/lib/mongo/server.rb +5 -1
- data/lib/mongo/server/connection_common.rb +2 -2
- data/lib/mongo/server/connection_pool.rb +3 -0
- data/lib/mongo/server/monitor.rb +1 -1
- data/lib/mongo/server/monitor/connection.rb +3 -3
- data/lib/mongo/server/pending_connection.rb +2 -2
- data/lib/mongo/server/push_monitor.rb +1 -1
- data/lib/mongo/server_selector/base.rb +5 -1
- data/lib/mongo/session.rb +3 -0
- data/lib/mongo/socket.rb +6 -4
- data/lib/mongo/socket/ocsp_cache.rb +97 -0
- data/lib/mongo/socket/ocsp_verifier.rb +368 -0
- data/lib/mongo/socket/ssl.rb +45 -24
- data/lib/mongo/srv/monitor.rb +7 -13
- data/lib/mongo/srv/resolver.rb +14 -10
- data/lib/mongo/timeout.rb +2 -0
- data/lib/mongo/uri.rb +21 -390
- data/lib/mongo/uri/options_mapper.rb +582 -0
- data/lib/mongo/uri/srv_protocol.rb +3 -2
- data/lib/mongo/utils.rb +12 -1
- data/lib/mongo/version.rb +1 -1
- data/spec/NOTES.aws-auth.md +12 -7
- data/spec/README.md +56 -1
- data/spec/integration/bulk_write_spec.rb +48 -0
- data/spec/integration/client_authentication_options_spec.rb +55 -28
- data/spec/integration/connection_pool_populator_spec.rb +3 -1
- data/spec/integration/cursor_reaping_spec.rb +53 -17
- data/spec/integration/ocsp_connectivity_spec.rb +26 -0
- data/spec/integration/ocsp_verifier_cache_spec.rb +188 -0
- data/spec/integration/ocsp_verifier_spec.rb +334 -0
- data/spec/integration/query_cache_spec.rb +1045 -0
- data/spec/integration/query_cache_transactions_spec.rb +179 -0
- data/spec/integration/retryable_writes/retryable_writes_40_and_newer_spec.rb +1 -0
- data/spec/integration/retryable_writes/shared/performs_legacy_retries.rb +2 -0
- data/spec/integration/sdam_error_handling_spec.rb +68 -0
- data/spec/integration/server_selection_spec.rb +36 -0
- data/spec/integration/srv_monitoring_spec.rb +38 -3
- data/spec/integration/srv_spec.rb +56 -0
- data/spec/lite_spec_helper.rb +3 -1
- data/spec/mongo/address_spec.rb +1 -1
- data/spec/mongo/caching_cursor_spec.rb +70 -0
- data/spec/mongo/client_construction_spec.rb +54 -1
- data/spec/mongo/client_spec.rb +40 -0
- data/spec/mongo/cluster/topology/single_spec.rb +14 -5
- data/spec/mongo/cluster_spec.rb +3 -0
- data/spec/mongo/collection/view/explainable_spec.rb +87 -4
- data/spec/mongo/collection/view/map_reduce_spec.rb +2 -0
- data/spec/mongo/collection_spec.rb +60 -0
- data/spec/mongo/crypt/auto_decryption_context_spec.rb +1 -1
- data/spec/mongo/crypt/auto_encryption_context_spec.rb +1 -1
- data/spec/mongo/crypt/explicit_decryption_context_spec.rb +1 -1
- data/spec/mongo/crypt/explicit_encryption_context_spec.rb +1 -1
- data/spec/mongo/database_spec.rb +44 -0
- data/spec/mongo/error/no_server_available_spec.rb +1 -1
- data/spec/mongo/logger_spec.rb +13 -11
- data/spec/mongo/query_cache_spec.rb +279 -0
- data/spec/mongo/server/connection_pool_spec.rb +7 -3
- data/spec/mongo/server/connection_spec.rb +14 -7
- data/spec/mongo/socket/ssl_spec.rb +1 -1
- data/spec/mongo/socket_spec.rb +1 -1
- data/spec/mongo/uri/srv_protocol_spec.rb +64 -33
- data/spec/mongo/uri_option_parsing_spec.rb +11 -11
- data/spec/mongo/uri_spec.rb +68 -41
- data/spec/mongo/utils_spec.rb +39 -0
- data/spec/runners/auth.rb +3 -0
- data/spec/runners/connection_string.rb +35 -124
- data/spec/spec_tests/cmap_spec.rb +7 -3
- data/spec/spec_tests/data/change_streams/change-streams-errors.yml +0 -1
- data/spec/spec_tests/data/change_streams/change-streams.yml +0 -1
- data/spec/spec_tests/data/cmap/pool-checkout-connection.yml +6 -2
- data/spec/spec_tests/data/cmap/pool-create-min-size.yml +3 -0
- data/spec/spec_tests/data/connection_string/valid-warnings.yml +24 -0
- data/spec/spec_tests/data/sdam_monitoring/discovered_standalone.yml +1 -3
- data/spec/spec_tests/data/sdam_monitoring/standalone.yml +2 -2
- data/spec/spec_tests/data/sdam_monitoring/standalone_repeated.yml +2 -2
- data/spec/spec_tests/data/sdam_monitoring/standalone_suppress_equal_description_changes.yml +2 -2
- data/spec/spec_tests/data/sdam_monitoring/standalone_to_rs_with_me_mismatch.yml +2 -2
- data/spec/spec_tests/data/uri_options/auth-options.yml +25 -0
- data/spec/spec_tests/data/uri_options/compression-options.yml +6 -3
- data/spec/spec_tests/data/uri_options/read-preference-options.yml +24 -0
- data/spec/spec_tests/data/uri_options/ruby-connection-options.yml +1 -0
- data/spec/spec_tests/data/uri_options/tls-options.yml +160 -4
- data/spec/spec_tests/dns_seedlist_discovery_spec.rb +9 -1
- data/spec/spec_tests/uri_options_spec.rb +31 -33
- data/spec/support/certificates/atlas-ocsp-ca.crt +28 -0
- data/spec/support/certificates/atlas-ocsp.crt +41 -0
- data/spec/support/client_registry_macros.rb +11 -2
- data/spec/support/common_shortcuts.rb +45 -0
- data/spec/support/constraints.rb +23 -0
- data/spec/support/lite_constraints.rb +24 -0
- data/spec/support/matchers.rb +16 -0
- data/spec/support/ocsp +1 -0
- data/spec/support/session_registry.rb +52 -0
- data/spec/support/spec_config.rb +22 -0
- data/spec/support/utils.rb +19 -1
- metadata +38 -3
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 493d0cb29d48d80c7fe4c87691500c078b6667bd214dcc021e0074938229be83
|
4
|
+
data.tar.gz: 44507b68e42abadad6987f50c3b3ae1b8ae70f046812607755ffbe292013ccc4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ea39c71265e24349b018a8e5f5699b556d1ed43107135da46790ad8496c4bcd8a3917ca6fd0c7b405c5e6cff968d6e18cedf35ac33fe660f19f2869f663cdf64
|
7
|
+
data.tar.gz: 30ca549b30bec1889f622f7002658c918b6686e417bd9a636777bbc7f321d06094278b5a7ff4b04a9395f61bf90e28f99f26ff9ec404b0e3687dbc1b4a77ec1f
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
data/lib/mongo.rb
CHANGED
@@ -51,6 +51,7 @@ require 'mongo/protocol'
|
|
51
51
|
require 'mongo/background_thread'
|
52
52
|
require 'mongo/cluster'
|
53
53
|
require 'mongo/cursor'
|
54
|
+
require 'mongo/caching_cursor'
|
54
55
|
require 'mongo/collection'
|
55
56
|
require 'mongo/database'
|
56
57
|
require 'mongo/crypt'
|
@@ -60,6 +61,7 @@ require 'mongo/dbref'
|
|
60
61
|
require 'mongo/grid'
|
61
62
|
require 'mongo/index'
|
62
63
|
require 'mongo/lint'
|
64
|
+
require 'mongo/query_cache'
|
63
65
|
require 'mongo/server'
|
64
66
|
require 'mongo/server_selector'
|
65
67
|
require 'mongo/session'
|
@@ -70,3 +72,10 @@ require 'mongo/uri'
|
|
70
72
|
require 'mongo/version'
|
71
73
|
require 'mongo/write_concern'
|
72
74
|
require 'mongo/utils'
|
75
|
+
|
76
|
+
module Mongo
|
77
|
+
# Clears the driver's OCSP response cache.
|
78
|
+
module_function def clear_ocsp_cache
|
79
|
+
Socket::OcspCache.clear
|
80
|
+
end
|
81
|
+
end
|
data/lib/mongo/address/ipv4.rb
CHANGED
@@ -81,7 +81,7 @@ module Mongo
|
|
81
81
|
# @param [ Hash ] options The options.
|
82
82
|
#
|
83
83
|
# @option options [ Float ] :connect_timeout Connect timeout.
|
84
|
-
# @option options [ true | false ] :ssl Whether to use
|
84
|
+
# @option options [ true | false ] :ssl Whether to use TLS.
|
85
85
|
# @option options [ String ] :ssl_ca_cert
|
86
86
|
# Same as the corresponding Client/Socket::SSL option.
|
87
87
|
# @option options [ Array<OpenSSL::X509::Certificate> ] :ssl_ca_cert_object
|
data/lib/mongo/address/ipv6.rb
CHANGED
@@ -95,7 +95,7 @@ module Mongo
|
|
95
95
|
# @param [ Hash ] options The options.
|
96
96
|
#
|
97
97
|
# @option options [ Float ] :connect_timeout Connect timeout.
|
98
|
-
# @option options [ true | false ] :ssl Whether to use
|
98
|
+
# @option options [ true | false ] :ssl Whether to use TLS.
|
99
99
|
# @option options [ String ] :ssl_ca_cert
|
100
100
|
# Same as the corresponding Client/Socket::SSL option.
|
101
101
|
# @option options [ Array<OpenSSL::X509::Certificate> ] :ssl_ca_cert_object
|
data/lib/mongo/bulk_write.rb
CHANGED
@@ -195,6 +195,13 @@ module Mongo
|
|
195
195
|
end
|
196
196
|
end
|
197
197
|
end
|
198
|
+
# With OP_MSG (3.6+ servers), the size of each section in the message
|
199
|
+
# is independently capped at 16m and each bulk operation becomes
|
200
|
+
# its own section. The size of the entire bulk write is limited to 48m.
|
201
|
+
# With OP_QUERY (pre-3.6 servers), the entire bulk write is sent as a
|
202
|
+
# single document and is thus subject to the 16m document size limit.
|
203
|
+
# This means the splits differ between pre-3.6 and 3.6+ servers, with
|
204
|
+
# 3.6+ servers being able to split less.
|
198
205
|
rescue Error::MaxBSONSize, Error::MaxMessageSize => e
|
199
206
|
raise e if values.size <= 1
|
200
207
|
unpin_maybe(session) do
|
@@ -214,27 +221,37 @@ module Mongo
|
|
214
221
|
end
|
215
222
|
|
216
223
|
def delete_one(documents, connection, operation_id, session, txn_num)
|
224
|
+
QueryCache.clear_namespace(collection.namespace)
|
225
|
+
|
217
226
|
spec = base_spec(operation_id, session).merge(:deletes => documents, :txn_num => txn_num)
|
218
227
|
Operation::Delete.new(spec).bulk_execute(connection, client: client)
|
219
228
|
end
|
220
229
|
|
221
230
|
def delete_many(documents, connection, operation_id, session, txn_num)
|
231
|
+
QueryCache.clear_namespace(collection.namespace)
|
232
|
+
|
222
233
|
spec = base_spec(operation_id, session).merge(:deletes => documents)
|
223
234
|
Operation::Delete.new(spec).bulk_execute(connection, client: client)
|
224
235
|
end
|
225
236
|
|
226
237
|
def insert_one(documents, connection, operation_id, session, txn_num)
|
238
|
+
QueryCache.clear_namespace(collection.namespace)
|
239
|
+
|
227
240
|
spec = base_spec(operation_id, session).merge(:documents => documents, :txn_num => txn_num)
|
228
241
|
Operation::Insert.new(spec).bulk_execute(connection, client: client)
|
229
242
|
end
|
230
243
|
|
231
244
|
def update_one(documents, connection, operation_id, session, txn_num)
|
245
|
+
QueryCache.clear_namespace(collection.namespace)
|
246
|
+
|
232
247
|
spec = base_spec(operation_id, session).merge(:updates => documents, :txn_num => txn_num)
|
233
248
|
Operation::Update.new(spec).bulk_execute(connection, client: client)
|
234
249
|
end
|
235
250
|
alias :replace_one :update_one
|
236
251
|
|
237
252
|
def update_many(documents, connection, operation_id, session, txn_num)
|
253
|
+
QueryCache.clear_namespace(collection.namespace)
|
254
|
+
|
238
255
|
spec = base_spec(operation_id, session).merge(:updates => documents)
|
239
256
|
Operation::Update.new(spec).bulk_execute(connection, client: client)
|
240
257
|
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
# Copyright (C) 2020 MongoDB Inc.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
module Mongo
|
16
|
+
|
17
|
+
# A Cursor that attempts to load documents from memory first before hitting
|
18
|
+
# the database if the same query has already been executed.
|
19
|
+
#
|
20
|
+
# @api semiprivate
|
21
|
+
class CachingCursor < Cursor
|
22
|
+
|
23
|
+
# @return [ Array <BSON::Document> ] The cursor's cached documents.
|
24
|
+
# @api private
|
25
|
+
attr_reader :cached_docs
|
26
|
+
|
27
|
+
# We iterate over the cached documents if they exist already in the
|
28
|
+
# cursor otherwise proceed as normal.
|
29
|
+
#
|
30
|
+
# @example Iterate over the documents.
|
31
|
+
# cursor.each do |doc|
|
32
|
+
# # ...
|
33
|
+
# end
|
34
|
+
def each
|
35
|
+
if @cached_docs
|
36
|
+
@cached_docs.each do |doc|
|
37
|
+
yield doc
|
38
|
+
end
|
39
|
+
|
40
|
+
unless closed?
|
41
|
+
# StopIteration raised by try_next ends this loop.
|
42
|
+
loop do
|
43
|
+
document = try_next
|
44
|
+
yield document if document
|
45
|
+
end
|
46
|
+
end
|
47
|
+
else
|
48
|
+
super
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
# Get a human-readable string representation of +Cursor+.
|
53
|
+
#
|
54
|
+
# @example Inspect the cursor.
|
55
|
+
# cursor.inspect
|
56
|
+
#
|
57
|
+
# @return [ String ] A string representation of a +Cursor+ instance.
|
58
|
+
def inspect
|
59
|
+
"#<Mongo::CachingCursor:0x#{object_id} @view=#{@view.inspect}>"
|
60
|
+
end
|
61
|
+
|
62
|
+
# Acquires the next document for cursor iteration and then
|
63
|
+
# inserts that document in the @cached_docs array.
|
64
|
+
#
|
65
|
+
# @api private
|
66
|
+
def try_next
|
67
|
+
@cached_docs ||= []
|
68
|
+
document = super
|
69
|
+
@cached_docs << document if document
|
70
|
+
|
71
|
+
document
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
data/lib/mongo/client.rb
CHANGED
@@ -101,6 +101,7 @@ module Mongo
|
|
101
101
|
:ssl_verify,
|
102
102
|
:ssl_verify_certificate,
|
103
103
|
:ssl_verify_hostname,
|
104
|
+
:ssl_verify_ocsp_endpoint,
|
104
105
|
:truncate_logs,
|
105
106
|
:user,
|
106
107
|
:wait_queue_timeout,
|
@@ -315,7 +316,7 @@ module Mongo
|
|
315
316
|
# for selecting a server for an operation.
|
316
317
|
# @option options [ Float ] :socket_timeout The timeout, in seconds, to
|
317
318
|
# execute operations on a socket.
|
318
|
-
# @option options [ true, false ] :ssl Whether to use
|
319
|
+
# @option options [ true, false ] :ssl Whether to use TLS.
|
319
320
|
# @option options [ String ] :ssl_ca_cert The file containing concatenated
|
320
321
|
# certificate authority certificates used to validate certs passed from the
|
321
322
|
# other end of the connection. Intermediate certificates should NOT be
|
@@ -462,6 +463,8 @@ module Mongo
|
|
462
463
|
@srv_records = nil
|
463
464
|
end
|
464
465
|
|
466
|
+
options = self.class.canonicalize_ruby_options(options)
|
467
|
+
|
465
468
|
# Special handling for sdam_proc as it is only used during client
|
466
469
|
# construction
|
467
470
|
sdam_proc = options.delete(:sdam_proc)
|
@@ -478,6 +481,12 @@ module Mongo
|
|
478
481
|
end
|
479
482
|
options = merged_options
|
480
483
|
|
484
|
+
options.keys.each do |k|
|
485
|
+
if options[k].nil?
|
486
|
+
options.delete(k)
|
487
|
+
end
|
488
|
+
end
|
489
|
+
|
481
490
|
@options = validate_new_options!(options)
|
482
491
|
=begin WriteConcern object support
|
483
492
|
if @options[:write_concern].is_a?(WriteConcern::Base)
|
@@ -605,15 +614,12 @@ module Mongo
|
|
605
614
|
|
606
615
|
# Get a summary of the client state.
|
607
616
|
#
|
608
|
-
# @note
|
617
|
+
# @note The exact format and layout of the returned summary string is
|
618
|
+
# not part of the driver's public API and may be changed at any time.
|
609
619
|
#
|
610
|
-
# @
|
611
|
-
# client.summary
|
612
|
-
#
|
613
|
-
# @return [ String ] Summary string.
|
620
|
+
# @return [ String ] The summary string.
|
614
621
|
#
|
615
622
|
# @since 2.7.0
|
616
|
-
# @api experimental
|
617
623
|
def summary
|
618
624
|
"#<Client cluster=#{cluster.summary}>"
|
619
625
|
end
|
@@ -769,7 +775,6 @@ module Mongo
|
|
769
775
|
options[:read_concern]
|
770
776
|
end
|
771
777
|
|
772
|
-
|
773
778
|
# Get the write concern for this client. If no option was provided, then a
|
774
779
|
# default single server acknowledgement will be used.
|
775
780
|
#
|
@@ -1022,6 +1027,23 @@ module Mongo
|
|
1022
1027
|
end
|
1023
1028
|
end
|
1024
1029
|
|
1030
|
+
class << self
|
1031
|
+
# Lowercases auth mechanism properties, if given, in the specified
|
1032
|
+
# options, then converts the options to an instance of Options::Redacted.
|
1033
|
+
#
|
1034
|
+
# @api private
|
1035
|
+
def canonicalize_ruby_options(options)
|
1036
|
+
Options::Redacted.new(Hash[options.map do |k, v|
|
1037
|
+
if k == :auth_mech_properties || k == 'auth_mech_properties'
|
1038
|
+
if v
|
1039
|
+
v = Hash[v.map { |pk, pv| [pk.downcase, pv] }]
|
1040
|
+
end
|
1041
|
+
end
|
1042
|
+
[k, v]
|
1043
|
+
end])
|
1044
|
+
end
|
1045
|
+
end
|
1046
|
+
|
1025
1047
|
private
|
1026
1048
|
|
1027
1049
|
# Create a new encrypter object using the client's auto encryption options
|
@@ -1107,6 +1129,23 @@ module Mongo
|
|
1107
1129
|
# but does not check for interactions between combinations of options.
|
1108
1130
|
def validate_new_options!(opts = Options::Redacted.new)
|
1109
1131
|
return Options::Redacted.new unless opts
|
1132
|
+
if opts[:read_concern]
|
1133
|
+
# Raise an error for non user-settable options
|
1134
|
+
if opts[:read_concern][:after_cluster_time]
|
1135
|
+
raise Mongo::Error::InvalidReadConcern.new(
|
1136
|
+
'The after_cluster_time read_concern option cannot be specified by the user'
|
1137
|
+
)
|
1138
|
+
end
|
1139
|
+
|
1140
|
+
given_keys = opts[:read_concern].keys.map(&:to_s)
|
1141
|
+
allowed_keys = ['level']
|
1142
|
+
invalid_keys = given_keys - allowed_keys
|
1143
|
+
# Warn that options are invalid but keep it and forward to the server
|
1144
|
+
unless invalid_keys.empty?
|
1145
|
+
log_warn("Read concern has invalid keys: #{invalid_keys.join(',')}.")
|
1146
|
+
end
|
1147
|
+
end
|
1148
|
+
|
1110
1149
|
Lint.validate_underscore_read_preference(opts[:read])
|
1111
1150
|
Lint.validate_read_concern_option(opts[:read_concern])
|
1112
1151
|
opts.each.inject(Options::Redacted.new) do |_options, (k, v)|
|
data/lib/mongo/cluster.rb
CHANGED
@@ -950,9 +950,9 @@ module Mongo
|
|
950
950
|
# Start SRV monitor
|
951
951
|
@srv_monitor_lock.synchronize do
|
952
952
|
unless @srv_monitor
|
953
|
-
monitor_options = options.merge(
|
954
|
-
timeout: options[:connect_timeout] || Server::CONNECT_TIMEOUT)
|
955
|
-
@srv_monitor = _srv_monitor = Srv::Monitor.new(self, monitor_options)
|
953
|
+
monitor_options = Utils.shallow_symbolize_keys(options.merge(
|
954
|
+
timeout: options[:connect_timeout] || Server::CONNECT_TIMEOUT))
|
955
|
+
@srv_monitor = _srv_monitor = Srv::Monitor.new(self, **monitor_options)
|
956
956
|
finalizer = lambda do
|
957
957
|
_srv_monitor.stop!
|
958
958
|
end
|
@@ -133,7 +133,7 @@ module Mongo
|
|
133
133
|
|
134
134
|
def validate_options(options, cluster)
|
135
135
|
if cluster.servers_list.length > 1
|
136
|
-
raise ArgumentError,
|
136
|
+
raise ArgumentError, "Cannot instantiate a single topology with more than one server in the cluster: #{cluster.servers_list.map(&:address).map(&:seed).join(', ')}"
|
137
137
|
end
|
138
138
|
|
139
139
|
super(options, cluster)
|
data/lib/mongo/collection.rb
CHANGED
@@ -223,6 +223,7 @@ module Mongo
|
|
223
223
|
# @param [ Hash ] opts The options for the create operation.
|
224
224
|
#
|
225
225
|
# @option options [ Session ] :session The session to use for the operation.
|
226
|
+
# @option opts [ Hash ] :write_concern The write concern options.
|
226
227
|
#
|
227
228
|
# @return [ Result ] The result of the command.
|
228
229
|
#
|
@@ -239,6 +240,11 @@ module Mongo
|
|
239
240
|
operation.delete(:write)
|
240
241
|
operation.delete(:write_concern)
|
241
242
|
client.send(:with_session, opts) do |session|
|
243
|
+
write_concern = if opts[:write_concern]
|
244
|
+
WriteConcern.get(opts[:write_concern])
|
245
|
+
else
|
246
|
+
self.write_concern
|
247
|
+
end
|
242
248
|
server = next_primary(nil, session)
|
243
249
|
if (options[:collation] || options[Operation::COLLATION]) && !server.with_connection { |connection| connection.features }.collation_enabled?
|
244
250
|
raise Error::UnsupportedCollation
|
@@ -264,12 +270,19 @@ module Mongo
|
|
264
270
|
# @param [ Hash ] opts The options for the drop operation.
|
265
271
|
#
|
266
272
|
# @option options [ Session ] :session The session to use for the operation.
|
273
|
+
# @option opts [ Hash ] :write_concern The write concern options.
|
267
274
|
#
|
268
275
|
# @return [ Result ] The result of the command.
|
269
276
|
#
|
270
277
|
# @since 2.0.0
|
271
278
|
def drop(opts = {})
|
272
279
|
client.send(:with_session, opts) do |session|
|
280
|
+
temp_write_concern = write_concern
|
281
|
+
write_concern = if opts[:write_concern]
|
282
|
+
WriteConcern.get(opts[:write_concern])
|
283
|
+
else
|
284
|
+
temp_write_concern
|
285
|
+
end
|
273
286
|
Operation::Drop.new({
|
274
287
|
selector: { :drop => name },
|
275
288
|
db_name: database.name,
|
@@ -543,6 +556,8 @@ module Mongo
|
|
543
556
|
#
|
544
557
|
# @since 2.0.0
|
545
558
|
def insert_one(document, opts = {})
|
559
|
+
QueryCache.clear_namespace(namespace)
|
560
|
+
|
546
561
|
client.send(:with_session, opts) do |session|
|
547
562
|
write_concern = if opts[:write_concern]
|
548
563
|
WriteConcern.get(opts[:write_concern])
|
@@ -579,6 +594,8 @@ module Mongo
|
|
579
594
|
#
|
580
595
|
# @since 2.0.0
|
581
596
|
def insert_many(documents, options = {})
|
597
|
+
QueryCache.clear_namespace(namespace)
|
598
|
+
|
582
599
|
inserts = documents.map{ |doc| { :insert_one => doc }}
|
583
600
|
bulk_write(inserts, options)
|
584
601
|
end
|
@@ -861,5 +878,14 @@ module Mongo
|
|
861
878
|
def namespace
|
862
879
|
"#{database.name}.#{name}"
|
863
880
|
end
|
881
|
+
|
882
|
+
# Whether the collection is a system collection.
|
883
|
+
#
|
884
|
+
# @return [ Boolean ] Whether the system is a system collection.
|
885
|
+
#
|
886
|
+
# @api private
|
887
|
+
def system_collection?
|
888
|
+
name.start_with?('system.')
|
889
|
+
end
|
864
890
|
end
|
865
891
|
end
|
@@ -120,27 +120,31 @@ module Mongo
|
|
120
120
|
# server can write temporary data to disk while executing the find
|
121
121
|
# operation. This option is only available on MongoDB server versions
|
122
122
|
# 4.4 and newer.
|
123
|
-
# @option options
|
124
|
-
#
|
125
|
-
# each response from MongoDB.
|
126
|
-
# @option options :projection [ Hash ] The fields to include or exclude in
|
127
|
-
# returned docs.
|
128
|
-
# @option options :hint [ Hash ] Override default index selection and force
|
129
|
-
# MongoDB to use a specific index for the query.
|
130
|
-
# @option options :limit [ Integer ] Max number of docs to return.
|
131
|
-
# @option options :max_scan [ Integer ] Constrain the query to only scan the
|
132
|
-
# specified number of docs. Use to prevent queries from running too long.
|
133
|
-
# Deprecated as of MongoDB server version 4.0.
|
134
|
-
# @option options :read [ Symbol ] The read preference to use for the query.
|
135
|
-
# If none is provided, the collection's default read preference is used.
|
136
|
-
# @option options :show_disk_loc [ true, false ] Return disk location info as
|
137
|
-
# a field in each doc.
|
138
|
-
# @option options :skip [ Integer ] The number of documents to skip.
|
139
|
-
# @option options :snapshot [ true, false ] Prevents returning a doc more than
|
140
|
-
# once. Deprecated as of MongoDB server version 4.0.
|
141
|
-
# @option options :sort [ Hash ] The key and direction pairs used to sort the
|
142
|
-
# results.
|
123
|
+
# @option options [ Integer ] :batch_size The number of documents to
|
124
|
+
# return in each response from MongoDB.
|
143
125
|
# @option options [ Hash ] :collation The collation to use.
|
126
|
+
# @option options [ String ] :comment Associate a comment with the query.
|
127
|
+
# @option options [ Hash ] :explain Execute an explain with the provided
|
128
|
+
# explain options (known options are :verbose and :verbosity) rather
|
129
|
+
# than a find.
|
130
|
+
# @option options [ Hash ] :hint Override the default index selection and
|
131
|
+
# force MongoDB to use a specific index for the query.
|
132
|
+
# @option options [ Integer ] :limit Max number of documents to return.
|
133
|
+
# @option options [ Integer ] :max_scan Constrain the query to only scan
|
134
|
+
# the specified number of documents. Use to prevent queries from
|
135
|
+
# running for too long. Deprecated as of MongoDB server version 4.0.
|
136
|
+
# @option options [ Hash ] :projection The fields to include or exclude
|
137
|
+
# in the returned documents.
|
138
|
+
# @option options [ Hash ] :read The read preference to use for the
|
139
|
+
# query. If none is provided, the collection's default read preference
|
140
|
+
# is used.
|
141
|
+
# @option options [ true | false ] :show_disk_loc Return disk location
|
142
|
+
# info as a field in each doc.
|
143
|
+
# @option options [ Integer ] :skip The number of documents to skip.
|
144
|
+
# @option options [ true | false ] :snapshot Prevents returning a
|
145
|
+
# document more than once. Deprecated as of MongoDB server version 4.0.
|
146
|
+
# @option options [ Hash ] :sort The key and direction pairs used to sort
|
147
|
+
# the results.
|
144
148
|
#
|
145
149
|
# @since 2.0.0
|
146
150
|
def initialize(collection, filter = {}, options = {})
|