mongo 2.9.2 → 2.10.0.rc0
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 +0 -0
- data/lib/mongo.rb +1 -0
- data/lib/mongo/auth/user/view.rb +4 -4
- data/lib/mongo/bulk_write.rb +14 -8
- data/lib/mongo/bulk_write/result.rb +1 -1
- data/lib/mongo/bulk_write/result_combiner.rb +2 -2
- data/lib/mongo/bulk_write/transformable.rb +17 -9
- data/lib/mongo/client.rb +107 -16
- data/lib/mongo/cluster.rb +47 -25
- data/lib/mongo/cluster/topology/replica_set_no_primary.rb +1 -1
- data/lib/mongo/cluster_time.rb +139 -0
- data/lib/mongo/collection.rb +84 -25
- data/lib/mongo/collection/view.rb +7 -3
- data/lib/mongo/collection/view/aggregation.rb +4 -4
- data/lib/mongo/collection/view/builder/aggregation.rb +31 -6
- data/lib/mongo/collection/view/builder/find_command.rb +4 -1
- data/lib/mongo/collection/view/builder/map_reduce.rb +4 -1
- data/lib/mongo/collection/view/change_stream.rb +54 -66
- data/lib/mongo/collection/view/iterable.rb +2 -2
- data/lib/mongo/collection/view/map_reduce.rb +6 -4
- data/lib/mongo/collection/view/readable.rb +36 -16
- data/lib/mongo/collection/view/writable.rb +68 -22
- data/lib/mongo/cursor.rb +87 -20
- data/lib/mongo/database.rb +47 -43
- data/lib/mongo/database/view.rb +54 -11
- data/lib/mongo/error.rb +13 -4
- data/lib/mongo/error/invalid_write_concern.rb +2 -2
- data/lib/mongo/error/operation_failure.rb +65 -11
- data/lib/mongo/error/parser.rb +41 -8
- data/lib/mongo/grid/fs_bucket.rb +26 -6
- data/lib/mongo/grid/stream/read.rb +9 -2
- data/lib/mongo/grid/stream/write.rb +21 -5
- data/lib/mongo/index/view.rb +3 -3
- data/lib/mongo/lint.rb +10 -3
- data/lib/mongo/operation.rb +2 -0
- data/lib/mongo/operation/aggregate/result.rb +19 -6
- data/lib/mongo/operation/collections_info.rb +1 -1
- data/lib/mongo/operation/get_more/result.rb +9 -0
- data/lib/mongo/operation/list_collections/command.rb +1 -3
- data/lib/mongo/operation/list_collections/op_msg.rb +1 -2
- data/lib/mongo/operation/parallel_scan/command.rb +4 -1
- data/lib/mongo/operation/parallel_scan/op_msg.rb +4 -1
- data/lib/mongo/operation/result.rb +27 -4
- data/lib/mongo/operation/shared/executable.rb +19 -5
- data/lib/mongo/operation/shared/executable_no_validate.rb +1 -2
- data/lib/mongo/operation/shared/executable_transaction_label.rb +0 -9
- data/lib/mongo/operation/shared/polymorphic_result.rb +9 -1
- data/lib/mongo/operation/shared/result/aggregatable.rb +2 -2
- data/lib/mongo/operation/shared/sessions_supported.rb +42 -32
- data/lib/mongo/operation/shared/specifiable.rb +40 -0
- data/lib/mongo/operation/shared/unpinnable.rb +39 -0
- data/lib/mongo/operation/shared/write.rb +1 -1
- data/lib/mongo/protocol/update.rb +6 -2
- data/lib/mongo/retryable.rb +79 -39
- data/lib/mongo/server/connection.rb +10 -3
- data/lib/mongo/server/description.rb +25 -1
- data/lib/mongo/server/monitor/connection.rb +1 -1
- data/lib/mongo/server_selector.rb +10 -0
- data/lib/mongo/server_selector/selectable.rb +172 -32
- data/lib/mongo/session.rb +654 -581
- data/lib/mongo/session/session_pool.rb +1 -1
- data/lib/mongo/socket.rb +7 -28
- data/lib/mongo/socket/ssl.rb +26 -1
- data/lib/mongo/socket/tcp.rb +3 -0
- data/lib/mongo/socket/unix.rb +3 -0
- data/lib/mongo/uri.rb +112 -265
- data/lib/mongo/uri/srv_protocol.rb +4 -1
- data/lib/mongo/version.rb +1 -1
- data/lib/mongo/write_concern.rb +10 -29
- data/lib/mongo/write_concern/acknowledged.rb +12 -0
- data/lib/mongo/write_concern/base.rb +17 -13
- data/lib/mongo/write_concern/unacknowledged.rb +12 -0
- data/spec/atlas/atlas_connectivity_spec.rb +7 -37
- data/spec/atlas/operations_spec.rb +25 -0
- data/spec/integration/change_stream_examples_spec.rb +45 -31
- data/spec/integration/change_stream_spec.rb +305 -5
- data/spec/integration/client_spec.rb +44 -0
- data/spec/integration/command_monitoring_spec.rb +1 -0
- data/spec/integration/command_spec.rb +7 -1
- data/spec/integration/mmapv1_spec.rb +28 -0
- data/spec/integration/mongos_pinning_spec.rb +34 -0
- data/spec/integration/operation_failure_code_spec.rb +2 -2
- data/spec/integration/{read_concern.rb → read_concern_spec.rb} +7 -1
- data/spec/integration/read_preference_spec.rb +485 -0
- data/spec/integration/retryable_writes_spec.rb +8 -19
- data/spec/integration/sdam_error_handling_spec.rb +1 -1
- data/spec/integration/sdam_events_spec.rb +2 -2
- data/spec/integration/server_description_spec.rb +14 -17
- data/spec/integration/server_selector_spec.rb +7 -3
- data/spec/integration/server_spec.rb +48 -0
- data/spec/integration/ssl_uri_options_spec.rb +1 -1
- data/spec/integration/step_down_spec.rb +10 -4
- data/spec/integration/transactions_examples_spec.rb +11 -10
- data/spec/lite_spec_helper.rb +19 -16
- data/spec/mongo/auth/scram/negotiation_spec.rb +11 -8
- data/spec/mongo/bulk_write/ordered_combiner_spec.rb +6 -6
- data/spec/mongo/bulk_write/unordered_combiner_spec.rb +4 -4
- data/spec/mongo/bulk_write_spec.rb +12 -2
- data/spec/mongo/client_construction_spec.rb +160 -8
- data/spec/mongo/client_spec.rb +5 -4
- data/spec/mongo/cluster_spec.rb +6 -6
- data/spec/mongo/cluster_time_spec.rb +148 -0
- data/spec/mongo/collection/view/aggregation_spec.rb +34 -15
- data/spec/mongo/collection/view/change_stream_spec.rb +62 -3
- data/spec/mongo/collection/view/map_reduce_spec.rb +7 -5
- data/spec/mongo/collection/view/readable_spec.rb +4 -4
- data/spec/mongo/collection_spec.rb +331 -14
- data/spec/mongo/cursor_spec.rb +117 -5
- data/spec/mongo/database_spec.rb +240 -8
- data/spec/mongo/error/operation_failure_spec.rb +47 -1
- data/spec/mongo/error/parser_spec.rb +160 -23
- data/spec/mongo/operation/insert/bulk_spec.rb +2 -1
- data/spec/mongo/operation/result_spec.rb +27 -0
- data/spec/mongo/operation/update/bulk_spec.rb +1 -0
- data/spec/mongo/retryable_spec.rb +2 -0
- data/spec/mongo/server/app_metadata_spec.rb +2 -2
- data/spec/mongo/server/connection_spec.rb +13 -17
- data/spec/mongo/server/monitor/connection_spec.rb +13 -10
- data/spec/mongo/server_selector_spec.rb +34 -2
- data/spec/mongo/session/session_pool_spec.rb +14 -3
- data/spec/mongo/session_spec.rb +3 -3
- data/spec/mongo/session_transaction_spec.rb +4 -3
- data/spec/mongo/socket/ssl_spec.rb +19 -5
- data/spec/mongo/socket_spec.rb +1 -62
- data/spec/mongo/uri/srv_protocol_spec.rb +14 -20
- data/spec/mongo/uri_option_parsing_spec.rb +94 -8
- data/spec/mongo/uri_spec.rb +23 -10
- data/spec/mongo/write_concern_spec.rb +56 -3
- data/spec/spec_tests/change_streams_spec.rb +2 -1
- data/spec/spec_tests/cmap_spec.rb +1 -1
- data/spec/spec_tests/crud_spec.rb +12 -2
- data/spec/spec_tests/data/change_streams/change-streams-errors.yml +24 -1
- data/spec/spec_tests/data/change_streams/change-streams.yml +172 -3
- data/spec/spec_tests/data/command_monitoring/bulkWrite.yml +1 -1
- data/spec/spec_tests/data/command_monitoring/updateMany.yml +0 -2
- data/spec/spec_tests/data/command_monitoring/updateOne.yml +0 -5
- data/spec/spec_tests/data/crud/read/aggregate-out.yml +0 -6
- data/spec/spec_tests/data/crud/read/count-empty.yml +29 -0
- data/spec/spec_tests/data/crud/write/bulkWrite-arrayFilters.yml +1 -0
- data/spec/spec_tests/data/crud/write/bulkWrite-collation.yml +101 -0
- data/spec/spec_tests/data/crud/write/bulkWrite.yml +401 -0
- data/spec/spec_tests/data/crud/write/insertMany.yml +58 -2
- data/spec/spec_tests/data/crud/write/updateMany-arrayFilters.yml +3 -0
- data/spec/spec_tests/data/crud/write/updateOne-arrayFilters.yml +6 -1
- data/spec/spec_tests/data/crud_v2/aggregate-merge.yml +103 -0
- data/spec/spec_tests/data/crud_v2/aggregate-out-readConcern.yml +110 -0
- data/spec/spec_tests/data/crud_v2/bulkWrite-arrayFilters.yml +81 -0
- data/spec/spec_tests/data/crud_v2/db-aggregate.yml +38 -0
- data/spec/spec_tests/data/crud_v2/updateWithPipelines.yml +92 -0
- data/spec/spec_tests/data/retryable_writes/insertOne-serverErrors.yml +2 -2
- data/spec/spec_tests/data/transactions/abort.yml +3 -0
- data/spec/spec_tests/data/transactions/bulk.yml +3 -8
- data/spec/spec_tests/data/transactions/causal-consistency.yml +3 -8
- data/spec/spec_tests/data/transactions/commit.yml +3 -1
- data/spec/spec_tests/data/transactions/count.yml +3 -0
- data/spec/spec_tests/data/transactions/delete.yml +3 -0
- data/spec/spec_tests/data/transactions/error-labels.yml +4 -1
- data/spec/spec_tests/data/transactions/errors-client.yml +56 -0
- data/spec/spec_tests/data/transactions/errors.yml +3 -0
- data/spec/spec_tests/data/transactions/findOneAndDelete.yml +3 -0
- data/spec/spec_tests/data/transactions/findOneAndReplace.yml +3 -0
- data/spec/spec_tests/data/transactions/findOneAndUpdate.yml +3 -0
- data/spec/spec_tests/data/transactions/insert.yml +3 -0
- data/spec/spec_tests/data/transactions/isolation.yml +3 -0
- data/spec/spec_tests/data/transactions/mongos-pin-auto.yml +1671 -0
- data/spec/spec_tests/data/transactions/mongos-recovery-token.yml +347 -0
- data/spec/spec_tests/data/transactions/pin-mongos.yml +557 -0
- data/spec/spec_tests/data/transactions/read-concern.yml +3 -0
- data/spec/spec_tests/data/transactions/read-pref.yml +3 -0
- data/spec/spec_tests/data/transactions/reads.yml +3 -0
- data/spec/spec_tests/data/transactions/retryable-abort.yml +5 -2
- data/spec/spec_tests/data/transactions/retryable-commit.yml +4 -1
- data/spec/spec_tests/data/transactions/retryable-writes.yml +3 -0
- data/spec/spec_tests/data/transactions/run-command.yml +3 -0
- data/spec/spec_tests/data/transactions/transaction-options.yml +6 -0
- data/spec/spec_tests/data/transactions/update.yml +3 -8
- data/spec/spec_tests/data/transactions/write-concern.yml +348 -38
- data/spec/spec_tests/data/transactions_api/callback-aborts.yml +6 -0
- data/spec/spec_tests/data/transactions_api/callback-commits.yml +5 -0
- data/spec/spec_tests/data/transactions_api/callback-retry.yml +7 -2
- data/spec/spec_tests/data/transactions_api/commit-retry.yml +70 -15
- data/spec/spec_tests/data/transactions_api/commit-transienttransactionerror-4.2.yml +3 -0
- data/spec/spec_tests/data/transactions_api/commit-transienttransactionerror.yml +3 -0
- data/spec/spec_tests/data/transactions_api/commit-writeconcernerror.yml +59 -109
- data/spec/spec_tests/data/transactions_api/commit.yml +5 -0
- data/spec/spec_tests/data/transactions_api/transaction-options.yml +10 -0
- data/spec/spec_tests/retryable_reads_spec.rb +5 -2
- data/spec/spec_tests/retryable_writes_spec.rb +5 -2
- data/spec/spec_tests/sdam_monitoring_spec.rb +3 -3
- data/spec/spec_tests/sdam_spec.rb +2 -2
- data/spec/spec_tests/transactions_api_spec.rb +1 -67
- data/spec/spec_tests/transactions_spec.rb +2 -66
- data/spec/support/authorization.rb +4 -0
- data/spec/support/change_streams.rb +30 -10
- data/spec/support/change_streams/operation.rb +27 -0
- data/spec/support/client_registry.rb +44 -25
- data/spec/support/cluster_config.rb +25 -14
- data/spec/support/cluster_tools.rb +32 -10
- data/spec/support/command_monitoring.rb +1 -1
- data/spec/support/common_shortcuts.rb +30 -0
- data/spec/support/connection_string.rb +8 -3
- data/spec/support/constraints.rb +34 -0
- data/spec/support/crud.rb +31 -16
- data/spec/support/crud/context.rb +23 -0
- data/spec/support/crud/operation.rb +311 -14
- data/spec/support/crud/spec.rb +2 -1
- data/spec/support/crud/test.rb +24 -27
- data/spec/support/crud/test_base.rb +22 -0
- data/spec/support/crud/verifier.rb +15 -1
- data/spec/support/event_subscriber.rb +12 -0
- data/spec/support/sdam_formatter_integration.rb +12 -6
- data/spec/support/shared/server_selector.rb +10 -0
- data/spec/support/shared/session.rb +13 -12
- data/spec/support/spec_config.rb +32 -22
- data/spec/support/spec_setup.rb +2 -2
- data/spec/support/transactions.rb +87 -0
- data/spec/support/transactions/context.rb +33 -0
- data/spec/support/transactions/operation.rb +99 -349
- data/spec/support/transactions/spec.rb +1 -3
- data/spec/support/transactions/test.rb +110 -49
- data/spec/support/utils.rb +74 -1
- metadata +52 -10
- metadata.gz.sig +0 -0
- data/spec/support/crud/read.rb +0 -265
- data/spec/support/crud/write.rb +0 -284
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '08673c7408cfc3fce9f682577a1156fe312c5f6806b4ea4ecef3d946dd7b0d3b'
|
4
|
+
data.tar.gz: 4811269ce3f01bd7508de797bf32c68bc7f6e858ca3949d12fa604dd011e41ab
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fdfddf7f78f3eabb7d2c0249680ad0bacbfac5425f2ed8719a9dad96fc308cb969ee51edf290df7394a161819bb9c55f5180c765a2edf3f03ef3976c04f2be78
|
7
|
+
data.tar.gz: fe9b0f8aa59ce594ffef9da66a107e99f2d41d50ba29ae8fd318f15e53c9b574411d73c5d12450bdf4be7b6490820c847367a55157acdbbd8f59124cb74c075f
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/lib/mongo.rb
CHANGED
data/lib/mongo/auth/user/view.rb
CHANGED
@@ -48,7 +48,7 @@ module Mongo
|
|
48
48
|
user: user,
|
49
49
|
db_name: database.name,
|
50
50
|
session: session
|
51
|
-
).execute(next_primary)
|
51
|
+
).execute(next_primary(nil, session))
|
52
52
|
end
|
53
53
|
end
|
54
54
|
|
@@ -83,7 +83,7 @@ module Mongo
|
|
83
83
|
user_name: name,
|
84
84
|
db_name: database.name,
|
85
85
|
session: session
|
86
|
-
).execute(next_primary)
|
86
|
+
).execute(next_primary(nil, session))
|
87
87
|
end
|
88
88
|
end
|
89
89
|
|
@@ -107,7 +107,7 @@ module Mongo
|
|
107
107
|
user: user,
|
108
108
|
db_name: database.name,
|
109
109
|
session: session
|
110
|
-
).execute(next_primary)
|
110
|
+
).execute(next_primary(nil, session))
|
111
111
|
end
|
112
112
|
end
|
113
113
|
|
@@ -136,7 +136,7 @@ module Mongo
|
|
136
136
|
user_name: name,
|
137
137
|
db_name: database.name,
|
138
138
|
session: session
|
139
|
-
).execute(next_primary)
|
139
|
+
).execute(next_primary(nil, session))
|
140
140
|
end
|
141
141
|
end
|
142
142
|
|
data/lib/mongo/bulk_write.rb
CHANGED
@@ -23,7 +23,7 @@ require 'mongo/bulk_write/result_combiner'
|
|
23
23
|
module Mongo
|
24
24
|
class BulkWrite
|
25
25
|
extend Forwardable
|
26
|
-
include
|
26
|
+
include Operation::Unpinnable
|
27
27
|
|
28
28
|
# @return [ Mongo::Collection ] collection The collection.
|
29
29
|
attr_reader :collection
|
@@ -38,6 +38,8 @@ module Mongo
|
|
38
38
|
def_delegators :@collection,
|
39
39
|
:database,
|
40
40
|
:cluster,
|
41
|
+
:write_with_retry,
|
42
|
+
:nro_write_with_retry,
|
41
43
|
:next_primary
|
42
44
|
|
43
45
|
def_delegators :database, :client
|
@@ -58,6 +60,7 @@ module Mongo
|
|
58
60
|
client.send(:with_session, @options) do |session|
|
59
61
|
operations.each do |operation|
|
60
62
|
if single_statement?(operation)
|
63
|
+
write_concern = write_concern(session)
|
61
64
|
write_with_retry(session, write_concern) do |server, txn_num|
|
62
65
|
execute_operation(
|
63
66
|
operation.keys.first,
|
@@ -69,7 +72,7 @@ module Mongo
|
|
69
72
|
txn_num)
|
70
73
|
end
|
71
74
|
else
|
72
|
-
|
75
|
+
nro_write_with_retry(session, write_concern) do |server|
|
73
76
|
execute_operation(
|
74
77
|
operation.keys.first,
|
75
78
|
operation.values.flatten,
|
@@ -139,9 +142,10 @@ module Mongo
|
|
139
142
|
# @return [ WriteConcern ] The write concern.
|
140
143
|
#
|
141
144
|
# @since 2.1.0
|
142
|
-
def write_concern
|
145
|
+
def write_concern(session = nil)
|
143
146
|
@write_concern ||= options[:write_concern] ?
|
144
|
-
WriteConcern.get(options[:write_concern]) :
|
147
|
+
WriteConcern.get(options[:write_concern]) :
|
148
|
+
collection.write_concern_with_session(session)
|
145
149
|
end
|
146
150
|
|
147
151
|
private
|
@@ -158,7 +162,7 @@ module Mongo
|
|
158
162
|
{
|
159
163
|
:db_name => database.name,
|
160
164
|
:coll_name => collection.name,
|
161
|
-
:write_concern => write_concern,
|
165
|
+
:write_concern => write_concern(session),
|
162
166
|
:ordered => ordered?,
|
163
167
|
:operation_id => operation_id,
|
164
168
|
:bypass_document_validation => !!options[:bypass_document_validation],
|
@@ -171,15 +175,17 @@ module Mongo
|
|
171
175
|
def execute_operation(name, values, server, operation_id, result_combiner, session, txn_num = nil)
|
172
176
|
raise Error::UnsupportedCollation.new if op_combiner.has_collation && !server.features.collation_enabled?
|
173
177
|
raise Error::UnsupportedArrayFilters.new if op_combiner.has_array_filters && !server.features.array_filters_enabled?
|
174
|
-
|
178
|
+
unpin_maybe(session) do
|
175
179
|
if values.size > server.max_write_batch_size
|
176
180
|
split_execute(name, values, server, operation_id, result_combiner, session, txn_num)
|
177
181
|
else
|
178
182
|
result = send(name, values, server, operation_id, session, txn_num)
|
179
183
|
result_combiner.combine!(result, values.size)
|
180
184
|
end
|
181
|
-
|
182
|
-
|
185
|
+
end
|
186
|
+
rescue Error::MaxBSONSize, Error::MaxMessageSize => e
|
187
|
+
raise e if values.size <= 1
|
188
|
+
unpin_maybe(session) do
|
183
189
|
split_execute(name, values, server, operation_id, result_combiner, session, txn_num)
|
184
190
|
end
|
185
191
|
end
|
@@ -180,7 +180,7 @@ module Mongo
|
|
180
180
|
#
|
181
181
|
# @since 2.1.0
|
182
182
|
def validate!
|
183
|
-
if @results[
|
183
|
+
if @results['writeErrors'] || @results['writeConcernErrors']
|
184
184
|
raise Error::BulkWriteError.new(@results)
|
185
185
|
else
|
186
186
|
self
|
@@ -112,7 +112,7 @@ module Mongo
|
|
112
112
|
def combine_write_errors!(result)
|
113
113
|
if write_errors = result.aggregate_write_errors(count)
|
114
114
|
results.merge!(
|
115
|
-
|
115
|
+
'writeErrors' => ((results['writeErrors'] || []) << write_errors).flatten
|
116
116
|
)
|
117
117
|
else
|
118
118
|
result.validate!
|
@@ -121,7 +121,7 @@ module Mongo
|
|
121
121
|
|
122
122
|
def combine_write_concern_errors!(result)
|
123
123
|
if write_concern_errors = result.aggregate_write_concern_errors(count)
|
124
|
-
results[
|
124
|
+
results['writeConcernErrors'] = (results['writeConcernErrors'] || []) +
|
125
125
|
write_concern_errors
|
126
126
|
end
|
127
127
|
end
|
@@ -56,8 +56,10 @@ module Mongo
|
|
56
56
|
#
|
57
57
|
# @since 2.1.0
|
58
58
|
DELETE_MANY_TRANSFORM = ->(doc){
|
59
|
-
{
|
60
|
-
Operation::
|
59
|
+
{
|
60
|
+
Operation::Q => doc[:filter],
|
61
|
+
Operation::LIMIT => 0,
|
62
|
+
}.tap do |d|
|
61
63
|
d[Operation::COLLATION] = doc[:collation] if doc[:collation]
|
62
64
|
end
|
63
65
|
}
|
@@ -66,8 +68,10 @@ module Mongo
|
|
66
68
|
#
|
67
69
|
# @since 2.1.0
|
68
70
|
DELETE_ONE_TRANSFORM = ->(doc){
|
69
|
-
{
|
70
|
-
Operation::
|
71
|
+
{
|
72
|
+
Operation::Q => doc[:filter],
|
73
|
+
Operation::LIMIT => 1,
|
74
|
+
}.tap do |d|
|
71
75
|
d[Operation::COLLATION] = doc[:collation] if doc[:collation]
|
72
76
|
end
|
73
77
|
}
|
@@ -86,9 +90,10 @@ module Mongo
|
|
86
90
|
{
|
87
91
|
Operation::Q => doc[:filter],
|
88
92
|
Operation::U => doc[:replacement],
|
89
|
-
Operation::MULTI => false,
|
90
|
-
Operation::UPSERT => doc.fetch(:upsert, false)
|
91
93
|
}.tap do |d|
|
94
|
+
if doc[:upsert]
|
95
|
+
d[:upsert] = true
|
96
|
+
end
|
92
97
|
d[Operation::COLLATION] = doc[:collation] if doc[:collation]
|
93
98
|
end
|
94
99
|
}
|
@@ -101,8 +106,10 @@ module Mongo
|
|
101
106
|
Operation::Q => doc[:filter],
|
102
107
|
Operation::U => doc[:update],
|
103
108
|
Operation::MULTI => true,
|
104
|
-
Operation::UPSERT => doc.fetch(:upsert, false)
|
105
109
|
}.tap do |d|
|
110
|
+
if doc[:upsert]
|
111
|
+
d[:upsert] = true
|
112
|
+
end
|
106
113
|
d[Operation::COLLATION] = doc[:collation] if doc[:collation]
|
107
114
|
d[Operation::ARRAY_FILTERS] = doc[:array_filters] if doc[:array_filters]
|
108
115
|
end
|
@@ -115,9 +122,10 @@ module Mongo
|
|
115
122
|
{
|
116
123
|
Operation::Q => doc[:filter],
|
117
124
|
Operation::U => doc[:update],
|
118
|
-
Operation::MULTI => false,
|
119
|
-
Operation::UPSERT => doc.fetch(:upsert, false)
|
120
125
|
}.tap do |d|
|
126
|
+
if doc[:upsert]
|
127
|
+
d[:upsert] = true
|
128
|
+
end
|
121
129
|
d[Operation::COLLATION] = doc[:collation] if doc[:collation]
|
122
130
|
d[Operation::ARRAY_FILTERS] = doc[:array_filters] if doc[:array_filters]
|
123
131
|
end
|
data/lib/mongo/client.rb
CHANGED
@@ -27,8 +27,22 @@ module Mongo
|
|
27
27
|
#
|
28
28
|
# @since 2.1.0
|
29
29
|
CRUD_OPTIONS = [
|
30
|
-
:database,
|
31
|
-
:
|
30
|
+
:database,
|
31
|
+
:read, :read_concern,
|
32
|
+
:write, :write_concern,
|
33
|
+
:retry_reads, :max_read_retries, :read_retry_interval,
|
34
|
+
:retry_writes, :max_write_retries,
|
35
|
+
|
36
|
+
# Options which cannot currently be here:
|
37
|
+
#
|
38
|
+
# :server_selection_timeout
|
39
|
+
# Server selection timeout is used by cluster constructor to figure out
|
40
|
+
# how long to wait for initial scan in compatibility mode, but once
|
41
|
+
# the cluster is initialized it no longer uses this timeout.
|
42
|
+
# Unfortunately server selector reads server selection timeout out of
|
43
|
+
# the cluster, and this behavior is required by Cluster#next_primary
|
44
|
+
# which takes no arguments. When next_primary is removed we can revsit
|
45
|
+
# using the same cluster object with different server selection timeouts.
|
32
46
|
].freeze
|
33
47
|
|
34
48
|
# Valid client options.
|
@@ -39,6 +53,7 @@ module Mongo
|
|
39
53
|
:auth_mech,
|
40
54
|
:auth_mech_properties,
|
41
55
|
:auth_source,
|
56
|
+
:cleanup,
|
42
57
|
:compressors,
|
43
58
|
:connect,
|
44
59
|
:connect_timeout,
|
@@ -84,6 +99,7 @@ module Mongo
|
|
84
99
|
:user,
|
85
100
|
:wait_queue_timeout,
|
86
101
|
:write,
|
102
|
+
:write_concern,
|
87
103
|
:zlib_compression_level,
|
88
104
|
].freeze
|
89
105
|
|
@@ -231,6 +247,11 @@ module Mongo
|
|
231
247
|
# done by this client or servers under it. Note: setting this option
|
232
248
|
# to false will make the client non-functional. It is intended for
|
233
249
|
# use in tests which manually invoke SDAM state transitions.
|
250
|
+
# @option options [ true | false ] :cleanup For internal driver use only.
|
251
|
+
# Set to false to prevent endSessions command being sent to the server
|
252
|
+
# to clean up server sessions when the cluster is disconnected, and to
|
253
|
+
# to not start the periodic executor. If :monitoring_io is false,
|
254
|
+
# :cleanup automatically defaults to false as well.
|
234
255
|
# @option options [ String ] :password The user's password.
|
235
256
|
# @option options [ String ] :platform Platform information to include in
|
236
257
|
# the metadata printed to the mongod logs upon establishing a connection
|
@@ -334,8 +355,10 @@ module Mongo
|
|
334
355
|
# @option options [ String ] :user The user name.
|
335
356
|
# @option options [ Float ] :wait_queue_timeout The time to wait, in
|
336
357
|
# seconds, in the connection pool for a connection to be checked in.
|
337
|
-
# @option options [ Hash ] :write
|
338
|
-
#
|
358
|
+
# @option options [ Hash ] :write Deprecated. Equivalent to :write_concern
|
359
|
+
# option.
|
360
|
+
# @option options [ Hash ] :write_concern The write concern options.
|
361
|
+
# Can be :w => Integer|String, :fsync => Boolean, :j => Boolean.
|
339
362
|
# @option options [ Integer ] :zlib_compression_level The Zlib compression level to use, if using compression.
|
340
363
|
# See Ruby's Zlib module for valid levels.
|
341
364
|
#
|
@@ -347,13 +370,18 @@ module Mongo
|
|
347
370
|
options = {}
|
348
371
|
end
|
349
372
|
|
350
|
-
Lint.validate_underscore_read_preference(options[:read])
|
351
|
-
Lint.validate_read_concern_option(options[:read_concern])
|
352
|
-
|
353
373
|
if addresses_or_uri.is_a?(::String)
|
354
374
|
uri = URI.get(addresses_or_uri, options)
|
355
375
|
addresses = uri.servers
|
356
|
-
|
376
|
+
uri_options = uri.client_options.dup
|
377
|
+
# Special handing for :write and :write_concern: allow client Ruby
|
378
|
+
# options to override URI options, even when the Ruby option uses the
|
379
|
+
# deprecated :write key and the URI option uses the current
|
380
|
+
# :write_concern key
|
381
|
+
if options[:write]
|
382
|
+
uri_options.delete(:write_concern)
|
383
|
+
end
|
384
|
+
options = uri_options.merge(options)
|
357
385
|
else
|
358
386
|
addresses = addresses_or_uri
|
359
387
|
end
|
@@ -368,16 +396,31 @@ module Mongo
|
|
368
396
|
# Special handling for sdam_proc as it is only used during client
|
369
397
|
# construction
|
370
398
|
sdam_proc = options.delete(:sdam_proc)
|
371
|
-
|
399
|
+
|
400
|
+
@options = validate_new_options!(Database::DEFAULT_OPTIONS.merge(options))
|
401
|
+
=begin WriteConcern object support
|
402
|
+
if @options[:write_concern].is_a?(WriteConcern::Base)
|
403
|
+
# Cache the instance so that we do not needlessly reconstruct it.
|
404
|
+
@write_concern = @options[:write_concern]
|
405
|
+
@options[:write_concern] = @write_concern.options
|
406
|
+
end
|
407
|
+
=end
|
408
|
+
@options.freeze
|
409
|
+
validate_options!
|
410
|
+
|
372
411
|
@database = Database.new(self, @options[:database], @options)
|
412
|
+
|
373
413
|
# Temporarily set monitoring so that event subscriptions can be
|
374
414
|
# set up without there being a cluster
|
375
415
|
@monitoring = Monitoring.new(@options)
|
416
|
+
|
376
417
|
if sdam_proc
|
377
418
|
sdam_proc.call(self)
|
378
419
|
end
|
420
|
+
|
379
421
|
@server_selection_semaphore = Semaphore.new
|
380
422
|
@cluster = Cluster.new(addresses, @monitoring, cluster_options)
|
423
|
+
|
381
424
|
# Unset monitoring, it will be taken out of cluster from now on
|
382
425
|
remove_instance_variable('@monitoring')
|
383
426
|
|
@@ -472,7 +515,11 @@ module Mongo
|
|
472
515
|
#
|
473
516
|
# @since 2.5.0
|
474
517
|
def server_selector
|
475
|
-
@server_selector ||=
|
518
|
+
@server_selector ||= if read_preference
|
519
|
+
ServerSelector.get(read_preference)
|
520
|
+
else
|
521
|
+
ServerSelector.primary
|
522
|
+
end
|
476
523
|
end
|
477
524
|
|
478
525
|
# Get the read preference from the options passed to the client.
|
@@ -532,8 +579,7 @@ module Mongo
|
|
532
579
|
# @since 2.0.0
|
533
580
|
def with(new_options = Options::Redacted.new)
|
534
581
|
clone.tap do |client|
|
535
|
-
opts =
|
536
|
-
client.options.update(opts)
|
582
|
+
opts = client.update_options(new_options)
|
537
583
|
Database.create(client)
|
538
584
|
# We can't use the same cluster if some options that would affect it
|
539
585
|
# have changed.
|
@@ -543,6 +589,36 @@ module Mongo
|
|
543
589
|
end
|
544
590
|
end
|
545
591
|
|
592
|
+
# Updates this client's options from new_options, validating all options.
|
593
|
+
#
|
594
|
+
# The new options may be transformed according to various rules.
|
595
|
+
# The final hash of options actually applied to the client is returned.
|
596
|
+
#
|
597
|
+
# If options fail validation, this method may warn or raise an exception.
|
598
|
+
# If this method raises an exception, the client should be discarded
|
599
|
+
# (similarly to if a constructor raised an exception).
|
600
|
+
#
|
601
|
+
# @param [ Hash ] new_options The new options to use.
|
602
|
+
#
|
603
|
+
# @return [ Hash ] Modified new options written into the client.
|
604
|
+
#
|
605
|
+
# @api private
|
606
|
+
def update_options(new_options)
|
607
|
+
validate_new_options!(new_options).tap do |opts|
|
608
|
+
# Our options are frozen
|
609
|
+
options = @options.dup
|
610
|
+
if options[:write] && opts[:write_concern]
|
611
|
+
options.delete(:write)
|
612
|
+
end
|
613
|
+
if options[:write_concern] && opts[:write]
|
614
|
+
options.delete(:write_concern)
|
615
|
+
end
|
616
|
+
options.update(opts)
|
617
|
+
@options = options.freeze
|
618
|
+
validate_options!
|
619
|
+
end
|
620
|
+
end
|
621
|
+
|
546
622
|
# Get the read concern for this client.
|
547
623
|
#
|
548
624
|
# @example Get the client read concern.
|
@@ -566,7 +642,7 @@ module Mongo
|
|
566
642
|
#
|
567
643
|
# @since 2.0.0
|
568
644
|
def write_concern
|
569
|
-
@write_concern ||= WriteConcern.get(options[:write])
|
645
|
+
@write_concern ||= WriteConcern.get(options[:write_concern] || options[:write])
|
570
646
|
end
|
571
647
|
|
572
648
|
# Close all connections.
|
@@ -614,7 +690,7 @@ module Mongo
|
|
614
690
|
#
|
615
691
|
# @since 2.0.5
|
616
692
|
def database_names(filter = {}, opts = {})
|
617
|
-
list_databases(filter, true, opts).collect{ |info| info[
|
693
|
+
list_databases(filter, true, opts).collect{ |info| info['name'] }
|
618
694
|
end
|
619
695
|
|
620
696
|
# Get info for each database.
|
@@ -633,7 +709,7 @@ module Mongo
|
|
633
709
|
cmd = { listDatabases: 1 }
|
634
710
|
cmd[:nameOnly] = !!name_only
|
635
711
|
cmd[:filter] = filter unless filter.empty?
|
636
|
-
use(Database::ADMIN).
|
712
|
+
use(Database::ADMIN).command(cmd, opts).first[Database::DATABASES]
|
637
713
|
end
|
638
714
|
|
639
715
|
# Returns a list of Mongo::Database objects.
|
@@ -754,8 +830,14 @@ module Mongo
|
|
754
830
|
end
|
755
831
|
end
|
756
832
|
|
757
|
-
|
833
|
+
# Validates options in the provided argument for validity.
|
834
|
+
# The argument may contain a subset of options that the client will
|
835
|
+
# eventually have; this method validates each of the provided options
|
836
|
+
# but does not check for interactions between combinations of options.
|
837
|
+
def validate_new_options!(opts = Options::Redacted.new)
|
758
838
|
return Options::Redacted.new unless opts
|
839
|
+
Lint.validate_underscore_read_preference(opts[:read])
|
840
|
+
Lint.validate_read_concern_option(opts[:read_concern])
|
759
841
|
opts.each.inject(Options::Redacted.new) do |_options, (k, v)|
|
760
842
|
key = k.to_sym
|
761
843
|
if VALID_OPTIONS.include?(key)
|
@@ -774,6 +856,15 @@ module Mongo
|
|
774
856
|
end
|
775
857
|
end
|
776
858
|
|
859
|
+
# Validates all options after they are set on the client.
|
860
|
+
# This method is intended to catch combinations of options which do are
|
861
|
+
# not allowed.
|
862
|
+
def validate_options!
|
863
|
+
if options[:write] && options[:write_concern] && options[:write] != options[:write_concern]
|
864
|
+
raise ArgumentError, "If :write and :write_concern are both given, they must be identical: #{options.inspect}"
|
865
|
+
end
|
866
|
+
end
|
867
|
+
|
777
868
|
def valid_compressors(compressors)
|
778
869
|
compressors.select do |compressor|
|
779
870
|
if !VALID_COMPRESSORS.include?(compressor)
|