mongo 2.11.6 → 2.12.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 +2 -2
- data.tar.gz.sig +0 -0
- data/CONTRIBUTING.md +1 -1
- data/lib/mongo.rb +3 -0
- data/lib/mongo/address.rb +13 -2
- data/lib/mongo/auth.rb +1 -0
- data/lib/mongo/auth/credential_cache.rb +51 -0
- data/lib/mongo/auth/scram/conversation.rb +20 -16
- data/lib/mongo/auth/user.rb +0 -8
- data/lib/mongo/auth/user/view.rb +4 -4
- data/lib/mongo/background_thread.rb +1 -1
- data/lib/mongo/bulk_write.rb +5 -5
- data/lib/mongo/client.rb +126 -11
- data/lib/mongo/client_encryption.rb +103 -0
- data/lib/mongo/cluster.rb +2 -2
- data/lib/mongo/cluster/reapers/cursor_reaper.rb +18 -6
- data/lib/mongo/cluster/sdam_flow.rb +54 -58
- data/lib/mongo/cluster/srv_monitor.rb +1 -1
- data/lib/mongo/collection.rb +3 -3
- data/lib/mongo/collection/view.rb +1 -1
- data/lib/mongo/collection/view/aggregation.rb +1 -1
- data/lib/mongo/collection/view/change_stream.rb +12 -3
- data/lib/mongo/collection/view/iterable.rb +14 -5
- data/lib/mongo/collection/view/map_reduce.rb +2 -2
- data/lib/mongo/collection/view/readable.rb +7 -9
- data/lib/mongo/collection/view/writable.rb +7 -7
- data/lib/mongo/crypt.rb +33 -0
- data/lib/mongo/crypt/auto_decryption_context.rb +42 -0
- data/lib/mongo/crypt/auto_encrypter.rb +169 -0
- data/lib/mongo/crypt/auto_encryption_context.rb +44 -0
- data/lib/mongo/crypt/binary.rb +155 -0
- data/lib/mongo/crypt/binding.rb +1162 -0
- data/lib/mongo/crypt/context.rb +135 -0
- data/lib/mongo/crypt/data_key_context.rb +162 -0
- data/lib/mongo/crypt/encryption_io.rb +283 -0
- data/lib/mongo/crypt/explicit_decryption_context.rb +40 -0
- data/lib/mongo/crypt/explicit_encrypter.rb +117 -0
- data/lib/mongo/crypt/explicit_encryption_context.rb +89 -0
- data/lib/mongo/crypt/handle.rb +293 -0
- data/lib/mongo/crypt/hooks.rb +90 -0
- data/lib/mongo/crypt/kms_context.rb +67 -0
- data/lib/mongo/crypt/status.rb +131 -0
- data/lib/mongo/cursor.rb +64 -32
- data/lib/mongo/database.rb +13 -6
- data/lib/mongo/database/view.rb +13 -4
- data/lib/mongo/dbref.rb +9 -2
- data/lib/mongo/error.rb +5 -1
- data/lib/mongo/error/crypt_error.rb +31 -0
- data/lib/mongo/error/{failed_stringprep_validation.rb → failed_string_prep_validation.rb} +0 -0
- data/lib/mongo/error/invalid_cursor_operation.rb +27 -0
- data/lib/mongo/error/kms_error.rb +22 -0
- data/lib/mongo/error/max_bson_size.rb +14 -3
- data/lib/mongo/error/mongocryptd_spawn_error.rb +22 -0
- data/lib/mongo/error/no_server_available.rb +8 -3
- data/lib/mongo/error/operation_failure.rb +1 -0
- data/lib/mongo/grid/file.rb +0 -5
- data/lib/mongo/grid/file/chunk.rb +0 -2
- data/lib/mongo/grid/file/info.rb +2 -1
- data/lib/mongo/grid/fs_bucket.rb +13 -15
- data/lib/mongo/grid/stream/write.rb +3 -9
- data/lib/mongo/index/view.rb +3 -3
- data/lib/mongo/monitoring/event/command_started.rb +6 -1
- data/lib/mongo/operation/collections_info.rb +6 -3
- data/lib/mongo/operation/delete/op_msg.rb +1 -1
- data/lib/mongo/operation/find/op_msg.rb +4 -1
- data/lib/mongo/operation/get_more/op_msg.rb +4 -1
- data/lib/mongo/operation/insert/command.rb +2 -2
- data/lib/mongo/operation/insert/legacy.rb +2 -2
- data/lib/mongo/operation/insert/op_msg.rb +3 -3
- data/lib/mongo/operation/result.rb +36 -27
- data/lib/mongo/operation/shared/executable.rb +10 -8
- data/lib/mongo/operation/shared/executable_no_validate.rb +2 -2
- data/lib/mongo/operation/shared/op_msg_or_command.rb +2 -2
- data/lib/mongo/operation/shared/op_msg_or_find_command.rb +2 -2
- data/lib/mongo/operation/shared/op_msg_or_list_indexes_command.rb +2 -2
- data/lib/mongo/operation/shared/write.rb +17 -10
- data/lib/mongo/operation/update/op_msg.rb +1 -1
- data/lib/mongo/protocol/compressed.rb +6 -5
- data/lib/mongo/protocol/insert.rb +3 -1
- data/lib/mongo/protocol/message.rb +72 -8
- data/lib/mongo/protocol/msg.rb +191 -37
- data/lib/mongo/protocol/query.rb +7 -9
- data/lib/mongo/protocol/serializers.rb +6 -2
- data/lib/mongo/server.rb +10 -4
- data/lib/mongo/server/connection.rb +20 -9
- data/lib/mongo/server/connection_base.rb +81 -12
- data/lib/mongo/server/connection_common.rb +61 -0
- data/lib/mongo/server/connection_pool.rb +37 -1
- data/lib/mongo/server/description.rb +9 -11
- data/lib/mongo/server/monitor.rb +2 -0
- data/lib/mongo/server/monitor/connection.rb +3 -18
- data/lib/mongo/server/pending_connection.rb +2 -1
- data/lib/mongo/session.rb +2 -2
- data/lib/mongo/session/session_pool.rb +8 -3
- data/lib/mongo/socket.rb +29 -16
- data/lib/mongo/socket/ssl.rb +23 -8
- data/lib/mongo/socket/tcp.rb +12 -3
- data/lib/mongo/timeout.rb +49 -0
- data/lib/mongo/uri.rb +30 -1
- data/lib/mongo/version.rb +1 -1
- data/mongo.gemspec +1 -1
- data/spec/README.md +134 -7
- data/spec/integration/auth_spec.rb +53 -0
- data/spec/integration/{client_options_spec.rb → client_authentication_options_spec.rb} +10 -10
- data/spec/integration/client_construction_spec.rb +76 -1
- data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +351 -0
- data/spec/integration/client_side_encryption/auto_encryption_command_monitoring_spec.rb +301 -0
- data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +71 -0
- data/spec/integration/client_side_encryption/auto_encryption_old_wire_version_spec.rb +76 -0
- data/spec/integration/client_side_encryption/auto_encryption_reconnect_spec.rb +216 -0
- data/spec/integration/client_side_encryption/auto_encryption_spec.rb +600 -0
- data/spec/integration/client_side_encryption/bson_size_limit_spec.rb +183 -0
- data/spec/integration/client_side_encryption/bypass_mongocryptd_spawn_spec.rb +74 -0
- data/spec/integration/client_side_encryption/client_close_spec.rb +59 -0
- data/spec/integration/client_side_encryption/corpus_spec.rb +228 -0
- data/spec/integration/client_side_encryption/custom_endpoint_spec.rb +132 -0
- data/spec/integration/client_side_encryption/data_key_spec.rb +163 -0
- data/spec/integration/client_side_encryption/explicit_encryption_spec.rb +114 -0
- data/spec/integration/client_side_encryption/external_key_vault_spec.rb +137 -0
- data/spec/integration/client_side_encryption/views_spec.rb +42 -0
- data/spec/integration/client_update_spec.rb +120 -0
- data/spec/integration/command_monitoring_spec.rb +3 -1
- data/spec/integration/command_spec.rb +44 -10
- data/spec/integration/connection_spec.rb +57 -0
- data/spec/integration/reconnect_spec.rb +7 -6
- data/spec/integration/size_limit_spec.rb +94 -0
- data/spec/integration/srv_monitoring_spec.rb +14 -6
- data/spec/lite_spec_helper.rb +31 -22
- data/spec/mongo/auth/cr_spec.rb +8 -0
- data/spec/mongo/auth/ldap_spec.rb +5 -1
- data/spec/mongo/auth/scram/conversation_spec.rb +5 -6
- data/spec/mongo/auth/scram/negotiation_spec.rb +74 -75
- data/spec/mongo/auth/scram_spec.rb +45 -35
- data/spec/mongo/auth/x509_spec.rb +5 -1
- data/spec/mongo/client_construction_spec.rb +206 -3
- data/spec/mongo/client_encryption_spec.rb +408 -0
- data/spec/mongo/cluster/cursor_reaper_spec.rb +12 -8
- data/spec/mongo/cluster/socket_reaper_spec.rb +14 -3
- data/spec/mongo/collection/view/aggregation_spec.rb +0 -2
- data/spec/mongo/collection/view/change_stream_spec.rb +7 -7
- data/spec/mongo/collection/view/map_reduce_spec.rb +3 -3
- data/spec/mongo/collection/view_spec.rb +1 -1
- data/spec/mongo/collection_spec.rb +4 -33
- data/spec/mongo/crypt/auto_decryption_context_spec.rb +90 -0
- data/spec/mongo/crypt/auto_encrypter_spec.rb +182 -0
- data/spec/mongo/crypt/auto_encryption_context_spec.rb +107 -0
- data/spec/mongo/crypt/binary_spec.rb +115 -0
- data/spec/mongo/crypt/binding/binary_spec.rb +56 -0
- data/spec/mongo/crypt/binding/context_spec.rb +257 -0
- data/spec/mongo/crypt/binding/helpers_spec.rb +46 -0
- data/spec/mongo/crypt/binding/mongocrypt_spec.rb +144 -0
- data/spec/mongo/crypt/binding/status_spec.rb +99 -0
- data/spec/mongo/crypt/binding/version_spec.rb +22 -0
- data/spec/mongo/crypt/binding_unloaded_spec.rb +20 -0
- data/spec/mongo/crypt/data_key_context_spec.rb +213 -0
- data/spec/mongo/crypt/encryption_io_spec.rb +136 -0
- data/spec/mongo/crypt/explicit_decryption_context_spec.rb +72 -0
- data/spec/mongo/crypt/explicit_encryption_context_spec.rb +170 -0
- data/spec/mongo/crypt/handle_spec.rb +198 -0
- data/spec/mongo/crypt/helpers/mongo_crypt_spec_helper.rb +108 -0
- data/spec/mongo/crypt/status_spec.rb +152 -0
- data/spec/mongo/cursor_spec.rb +24 -4
- data/spec/mongo/database_spec.rb +20 -0
- data/spec/mongo/error/crypt_error_spec.rb +26 -0
- data/spec/mongo/error/max_bson_size_spec.rb +35 -0
- data/spec/mongo/error/no_server_available_spec.rb +11 -1
- data/spec/mongo/error/operation_failure_spec.rb +6 -6
- data/spec/mongo/operation/aggregate_spec.rb +1 -1
- data/spec/mongo/operation/collections_info_spec.rb +1 -1
- data/spec/mongo/operation/command_spec.rb +3 -3
- data/spec/mongo/operation/create_index_spec.rb +3 -3
- data/spec/mongo/operation/create_user_spec.rb +3 -3
- data/spec/mongo/operation/delete/bulk_spec.rb +6 -6
- data/spec/mongo/operation/delete/op_msg_spec.rb +1 -6
- data/spec/mongo/operation/delete_spec.rb +7 -7
- data/spec/mongo/operation/drop_index_spec.rb +2 -2
- data/spec/mongo/operation/find/legacy_spec.rb +1 -1
- data/spec/mongo/operation/get_more_spec.rb +1 -1
- data/spec/mongo/operation/indexes_spec.rb +1 -1
- data/spec/mongo/operation/insert/bulk_spec.rb +7 -7
- data/spec/mongo/operation/insert/op_msg_spec.rb +3 -6
- data/spec/mongo/operation/insert_spec.rb +12 -12
- data/spec/mongo/operation/map_reduce_spec.rb +2 -2
- data/spec/mongo/operation/remove_user_spec.rb +3 -3
- data/spec/mongo/operation/update/bulk_spec.rb +6 -6
- data/spec/mongo/operation/update/op_msg_spec.rb +3 -6
- data/spec/mongo/operation/update_spec.rb +7 -7
- data/spec/mongo/operation/update_user_spec.rb +1 -1
- data/spec/mongo/protocol/compressed_spec.rb +2 -3
- data/spec/mongo/protocol/delete_spec.rb +9 -8
- data/spec/mongo/protocol/get_more_spec.rb +9 -8
- data/spec/mongo/protocol/insert_spec.rb +9 -8
- data/spec/mongo/protocol/kill_cursors_spec.rb +6 -5
- data/spec/mongo/protocol/msg_spec.rb +57 -53
- data/spec/mongo/protocol/query_spec.rb +12 -12
- data/spec/mongo/protocol/registry_spec.rb +1 -1
- data/spec/mongo/protocol/reply_spec.rb +1 -1
- data/spec/mongo/protocol/update_spec.rb +10 -9
- data/spec/mongo/server/connection_pool_spec.rb +1 -1
- data/spec/mongo/server/connection_spec.rb +28 -7
- data/spec/mongo/socket_spec.rb +1 -1
- data/spec/mongo/timeout_spec.rb +85 -0
- data/spec/mongo/uri/srv_protocol_spec.rb +2 -2
- data/spec/mongo/uri_spec.rb +52 -5
- data/spec/mongo/write_concern_spec.rb +13 -1
- data/spec/{support → runners}/auth.rb +14 -1
- data/spec/{support → runners}/change_streams.rb +1 -1
- data/spec/{support → runners}/change_streams/operation.rb +0 -0
- data/spec/{support → runners}/cmap.rb +1 -1
- data/spec/{support → runners}/cmap/verifier.rb +0 -0
- data/spec/{support → runners}/command_monitoring.rb +0 -0
- data/spec/runners/connection_string.rb +358 -4
- data/spec/{support → runners}/crud.rb +9 -9
- data/spec/{support → runners}/crud/context.rb +0 -0
- data/spec/{support → runners}/crud/operation.rb +7 -3
- data/spec/{support → runners}/crud/outcome.rb +0 -0
- data/spec/{support → runners}/crud/requirement.rb +1 -1
- data/spec/{support → runners}/crud/spec.rb +12 -1
- data/spec/{support → runners}/crud/test.rb +0 -0
- data/spec/{support → runners}/crud/test_base.rb +0 -0
- data/spec/{support → runners}/crud/verifier.rb +10 -12
- data/spec/{support → runners}/gridfs.rb +0 -0
- data/spec/{support → runners}/sdam_monitoring.rb +0 -0
- data/spec/{support → runners}/server_discovery_and_monitoring.rb +0 -0
- data/spec/{support → runners}/server_selection.rb +0 -0
- data/spec/{support → runners}/server_selection_rtt.rb +0 -0
- data/spec/{support → runners}/transactions.rb +4 -4
- data/spec/{support → runners}/transactions/context.rb +0 -0
- data/spec/{support → runners}/transactions/operation.rb +0 -0
- data/spec/{support → runners}/transactions/spec.rb +0 -0
- data/spec/{support → runners}/transactions/test.rb +37 -5
- data/spec/spec_helper.rb +0 -5
- data/spec/spec_tests/auth_spec.rb +3 -3
- data/spec/spec_tests/client_side_encryption_spec.rb +13 -0
- data/spec/spec_tests/connection_string_spec.rb +1 -1
- data/spec/spec_tests/data/auth/connection-string.yml +13 -0
- data/spec/spec_tests/data/client_side_encryption/aggregate.yml +134 -0
- data/spec/spec_tests/data/client_side_encryption/badQueries.yml +526 -0
- data/spec/spec_tests/data/client_side_encryption/badSchema.yml +73 -0
- data/spec/spec_tests/data/client_side_encryption/basic.yml +116 -0
- data/spec/spec_tests/data/client_side_encryption/bulk.yml +85 -0
- data/spec/spec_tests/data/client_side_encryption/bypassAutoEncryption.yml +100 -0
- data/spec/spec_tests/data/client_side_encryption/bypassedCommand.yml +42 -0
- data/spec/spec_tests/data/client_side_encryption/count.yml +61 -0
- data/spec/spec_tests/data/client_side_encryption/countDocuments.yml +59 -0
- data/spec/spec_tests/data/client_side_encryption/delete.yml +105 -0
- data/spec/spec_tests/data/client_side_encryption/distinct.yml +73 -0
- data/spec/spec_tests/data/client_side_encryption/explain.yml +64 -0
- data/spec/spec_tests/data/client_side_encryption/find.yml +119 -0
- data/spec/spec_tests/data/client_side_encryption/findOneAndDelete.yml +57 -0
- data/spec/spec_tests/data/client_side_encryption/findOneAndReplace.yml +57 -0
- data/spec/spec_tests/data/client_side_encryption/findOneAndUpdate.yml +57 -0
- data/spec/spec_tests/data/client_side_encryption/getMore.yml +68 -0
- data/spec/spec_tests/data/client_side_encryption/insert.yml +102 -0
- data/spec/spec_tests/data/client_side_encryption/keyAltName.yml +71 -0
- data/spec/spec_tests/data/client_side_encryption/localKMS.yml +54 -0
- data/spec/spec_tests/data/client_side_encryption/localSchema.yml +72 -0
- data/spec/spec_tests/data/client_side_encryption/malformedCiphertext.yml +69 -0
- data/spec/spec_tests/data/client_side_encryption/maxWireVersion.yml +20 -0
- data/spec/spec_tests/data/client_side_encryption/missingKey.yml +49 -0
- data/spec/spec_tests/data/client_side_encryption/replaceOne.yml +61 -0
- data/spec/spec_tests/data/client_side_encryption/types.yml +527 -0
- data/spec/spec_tests/data/client_side_encryption/unsupportedCommand.yml +25 -0
- data/spec/spec_tests/data/client_side_encryption/updateMany.yml +77 -0
- data/spec/spec_tests/data/client_side_encryption/updateOne.yml +168 -0
- data/spec/spec_tests/data/read_write_concern/connection-string/write-concern.yml +1 -4
- data/spec/spec_tests/data/retryable_writes/insertOne-serverErrors.yml +21 -0
- data/spec/spec_tests/data/sdam/rs/incompatible_ghost.yml +2 -4
- data/spec/spec_tests/data/sdam/rs/incompatible_other.yml +1 -1
- data/spec/spec_tests/data/sdam/rs/primary_mismatched_me_not_removed.yml +73 -0
- data/spec/spec_tests/data/sdam/rs/primary_to_no_primary_mismatched_me.yml +1 -2
- data/spec/spec_tests/data/sdam/rs/repeated.yml +101 -0
- data/spec/spec_tests/data/sdam/rs/{primary_address_change.yml → ruby_primary_address_change.yml} +2 -0
- data/spec/spec_tests/data/sdam/rs/{secondary_wrong_set_name_with_primary_second.yml → ruby_secondary_wrong_set_name_with_primary_second.yml} +0 -0
- data/spec/spec_tests/data/sdam/sharded/ruby_discovered_single_mongos.yml +27 -0
- data/spec/spec_tests/data/sdam/sharded/{primary_address_change.yml → ruby_primary_different_address.yml} +1 -1
- data/spec/spec_tests/data/sdam/sharded/{primary_mismatched_me.yml → ruby_primary_mismatched_me.yml} +1 -1
- data/spec/spec_tests/data/sdam/single/{primary_address_change.yml → ruby_primary_different_address.yml} +1 -1
- data/spec/spec_tests/data/sdam/single/{primary_mismatched_me.yml → ruby_primary_mismatched_me.yml} +1 -1
- data/spec/spec_tests/data/sdam_monitoring/{replica_set_with_primary_change.yml → replica_set_primary_address_change.yml} +27 -5
- data/spec/spec_tests/data/sdam_monitoring/replica_set_with_me_mismatch.yml +26 -74
- data/spec/spec_tests/data/sdam_monitoring/replica_set_with_removal.yml +20 -16
- data/spec/spec_tests/data/sdam_monitoring/standalone_suppress_equal_description_changes.yml +73 -0
- data/spec/spec_tests/data/transactions/pin-mongos.yml +2 -3
- data/spec/spec_tests/data/uri_options/auth-options.yml +10 -0
- data/spec/spec_tests/data/uri_options/tls-options.yml +75 -4
- data/spec/spec_tests/read_write_concern_connection_string_spec.rb +1 -1
- data/spec/spec_tests/uri_options_spec.rb +6 -8
- data/spec/stress/connection_pool_timing_spec.rb +6 -3
- data/spec/support/certificates/README.md +4 -0
- data/spec/support/certificates/server-second-level-bundle.pem +77 -77
- data/spec/support/certificates/server-second-level.crt +52 -52
- data/spec/support/certificates/server-second-level.key +25 -25
- data/spec/support/certificates/server-second-level.pem +77 -77
- data/spec/support/client_registry.rb +19 -3
- data/spec/support/cluster_config.rb +9 -1
- data/spec/support/common_shortcuts.rb +12 -0
- data/spec/support/constraints.rb +16 -0
- data/spec/support/crypt.rb +140 -0
- data/spec/support/crypt/corpus/corpus-key-aws.json +33 -0
- data/spec/support/crypt/corpus/corpus-key-local.json +31 -0
- data/spec/support/crypt/corpus/corpus-schema.json +2057 -0
- data/spec/support/crypt/corpus/corpus.json +3657 -0
- data/spec/support/crypt/corpus/corpus_encrypted.json +4152 -0
- data/spec/support/crypt/data_keys/key_document_aws.json +34 -0
- data/spec/support/crypt/data_keys/key_document_local.json +31 -0
- data/spec/support/crypt/external/external-key.json +31 -0
- data/spec/support/crypt/external/external-schema.json +19 -0
- data/spec/support/crypt/limits/limits-doc.json +102 -0
- data/spec/support/crypt/limits/limits-key.json +31 -0
- data/spec/support/crypt/limits/limits-schema.json +1405 -0
- data/spec/support/crypt/schema_maps/schema_map_aws.json +17 -0
- data/spec/support/crypt/schema_maps/schema_map_aws_key_alt_names.json +12 -0
- data/spec/support/crypt/schema_maps/schema_map_local.json +18 -0
- data/spec/support/crypt/schema_maps/schema_map_local_key_alt_names.json +12 -0
- data/spec/support/lite_constraints.rb +17 -1
- data/spec/support/matchers.rb +19 -0
- data/spec/support/shared/protocol.rb +2 -0
- data/spec/support/spec_config.rb +43 -13
- data/spec/support/utils.rb +132 -10
- metadata +277 -81
- metadata.gz.sig +0 -0
- data/spec/integration/grid_fs_bucket_spec.rb +0 -48
- data/spec/integration/zlib_compression_spec.rb +0 -25
- data/spec/spec_tests/data/sdam/sharded/single_mongos.yml +0 -33
- data/spec/support/connection_string.rb +0 -354
@@ -239,7 +239,7 @@ module Mongo
|
|
239
239
|
server = cluster.next_primary(nil, session)
|
240
240
|
end
|
241
241
|
validate_collation!(server)
|
242
|
-
initial_query_op(session).execute(server)
|
242
|
+
initial_query_op(session).execute(server, client: client)
|
243
243
|
end
|
244
244
|
|
245
245
|
def fetch_query_spec
|
@@ -259,7 +259,7 @@ module Mongo
|
|
259
259
|
end
|
260
260
|
|
261
261
|
def send_fetch_query(server, session)
|
262
|
-
fetch_query_op(server, session).execute(server)
|
262
|
+
fetch_query_op(server, session).execute(server, client: client)
|
263
263
|
end
|
264
264
|
|
265
265
|
def validate_collation!(server)
|
@@ -155,7 +155,7 @@ module Mongo
|
|
155
155
|
:options => {:limit => -1},
|
156
156
|
:read => read_pref,
|
157
157
|
:session => session
|
158
|
-
).execute(server)
|
158
|
+
).execute(server, client: client)
|
159
159
|
end.n.to_i
|
160
160
|
end
|
161
161
|
end
|
@@ -185,9 +185,7 @@ module Mongo
|
|
185
185
|
pipeline << { :'$limit' => opts[:limit] } if opts[:limit]
|
186
186
|
pipeline << { :'$group' => { _id: 1, n: { :'$sum' => 1 } } }
|
187
187
|
|
188
|
-
opts
|
189
|
-
opts[:collation] ||= collation
|
190
|
-
|
188
|
+
opts.select! { |k, _| [:hint, :max_time_ms, :read, :collation, :session].include?(k) }
|
191
189
|
first = aggregate(pipeline, opts).first
|
192
190
|
return 0 unless first
|
193
191
|
first['n'].to_i
|
@@ -224,7 +222,7 @@ module Mongo
|
|
224
222
|
db_name: database.name,
|
225
223
|
read: read_pref,
|
226
224
|
session: session
|
227
|
-
).execute(server)
|
225
|
+
).execute(server, client: client)
|
228
226
|
end.n.to_i
|
229
227
|
end
|
230
228
|
end
|
@@ -269,7 +267,7 @@ module Mongo
|
|
269
267
|
:options => {:limit => -1},
|
270
268
|
:read => read_pref,
|
271
269
|
:session => session
|
272
|
-
}).execute(server)
|
270
|
+
}).execute(server, client: client)
|
273
271
|
end.first['values']
|
274
272
|
end
|
275
273
|
end
|
@@ -604,21 +602,21 @@ module Mongo
|
|
604
602
|
:read_concern => read_concern,
|
605
603
|
:session => session,
|
606
604
|
}.merge!(options))
|
607
|
-
cmd.execute(server).cursor_ids.map do |cursor_id|
|
605
|
+
cmd.execute(server, client: client).cursor_ids.map do |cursor_id|
|
608
606
|
result = if server.features.find_command_enabled?
|
609
607
|
Operation::GetMore.new({
|
610
608
|
:selector => {:getMore => BSON::Int64.new(cursor_id),
|
611
609
|
:collection => collection.name},
|
612
610
|
:db_name => database.name,
|
613
611
|
:session => session,
|
614
|
-
}).execute(server)
|
612
|
+
}).execute(server, client: client)
|
615
613
|
else
|
616
614
|
Operation::GetMore.new({
|
617
615
|
:to_return => 0,
|
618
616
|
:cursor_id => BSON::Int64.new(cursor_id),
|
619
617
|
:db_name => database.name,
|
620
618
|
:coll_name => collection.name
|
621
|
-
}).execute(server)
|
619
|
+
}).execute(server, client: client)
|
622
620
|
end
|
623
621
|
Cursor.new(self, result, server, session: session)
|
624
622
|
end
|
@@ -63,7 +63,7 @@ module Mongo
|
|
63
63
|
:db_name => database.name,
|
64
64
|
:session => session,
|
65
65
|
:txn_num => txn_num
|
66
|
-
).execute(server)
|
66
|
+
).execute(server, client: client)
|
67
67
|
end
|
68
68
|
end.first['value']
|
69
69
|
end
|
@@ -144,7 +144,7 @@ module Mongo
|
|
144
144
|
:db_name => database.name,
|
145
145
|
:session => session,
|
146
146
|
:txn_num => txn_num
|
147
|
-
).execute(server)
|
147
|
+
).execute(server, client: client)
|
148
148
|
end
|
149
149
|
end.first['value']
|
150
150
|
value unless value.nil? || value.empty?
|
@@ -175,7 +175,7 @@ module Mongo
|
|
175
175
|
:coll_name => collection.name,
|
176
176
|
:write_concern => write_concern,
|
177
177
|
:session => session
|
178
|
-
).execute(server)
|
178
|
+
).execute(server, client: client)
|
179
179
|
end
|
180
180
|
end
|
181
181
|
end
|
@@ -206,7 +206,7 @@ module Mongo
|
|
206
206
|
:write_concern => write_concern,
|
207
207
|
:session => session,
|
208
208
|
:txn_num => txn_num
|
209
|
-
).execute(server)
|
209
|
+
).execute(server, client: client)
|
210
210
|
end
|
211
211
|
end
|
212
212
|
end
|
@@ -250,7 +250,7 @@ module Mongo
|
|
250
250
|
:bypass_document_validation => !!opts[:bypass_document_validation],
|
251
251
|
:session => session,
|
252
252
|
:txn_num => txn_num
|
253
|
-
).execute(server)
|
253
|
+
).execute(server, client: client)
|
254
254
|
end
|
255
255
|
end
|
256
256
|
end
|
@@ -295,7 +295,7 @@ module Mongo
|
|
295
295
|
:write_concern => write_concern,
|
296
296
|
:bypass_document_validation => !!opts[:bypass_document_validation],
|
297
297
|
:session => session
|
298
|
-
).execute(server)
|
298
|
+
).execute(server, client: client)
|
299
299
|
end
|
300
300
|
end
|
301
301
|
end
|
@@ -341,7 +341,7 @@ module Mongo
|
|
341
341
|
:bypass_document_validation => !!opts[:bypass_document_validation],
|
342
342
|
:session => session,
|
343
343
|
:txn_num => txn_num
|
344
|
-
).execute(server)
|
344
|
+
).execute(server, client: client)
|
345
345
|
end
|
346
346
|
end
|
347
347
|
end
|
data/lib/mongo/crypt.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
# Copyright (C) 2019 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 Crypt
|
17
|
+
autoload(:Binding, 'mongo/crypt/binding')
|
18
|
+
autoload(:Binary, 'mongo/crypt/binary')
|
19
|
+
autoload(:Status, 'mongo/crypt/status')
|
20
|
+
autoload(:Hooks, 'mongo/crypt/hooks')
|
21
|
+
autoload(:Handle, 'mongo/crypt/handle')
|
22
|
+
autoload(:KmsContext, 'mongo/crypt/kms_context')
|
23
|
+
autoload(:Context, 'mongo/crypt/context')
|
24
|
+
autoload(:DataKeyContext, 'mongo/crypt/data_key_context')
|
25
|
+
autoload(:ExplicitEncryptionContext, 'mongo/crypt/explicit_encryption_context')
|
26
|
+
autoload(:AutoEncryptionContext, 'mongo/crypt/auto_encryption_context')
|
27
|
+
autoload(:ExplicitDecryptionContext, 'mongo/crypt/explicit_decryption_context')
|
28
|
+
autoload(:AutoDecryptionContext, 'mongo/crypt/auto_decryption_context')
|
29
|
+
autoload(:EncryptionIO, 'mongo/crypt/encryption_io')
|
30
|
+
autoload(:ExplicitEncrypter, 'mongo/crypt/explicit_encrypter')
|
31
|
+
autoload(:AutoEncrypter, 'mongo/crypt/auto_encrypter')
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# Copyright (C) 2019 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 Crypt
|
17
|
+
|
18
|
+
# A Context object initialized for auto decryption
|
19
|
+
#
|
20
|
+
# @api private
|
21
|
+
class AutoDecryptionContext < Context
|
22
|
+
|
23
|
+
# Create a new AutoEncryptionContext object
|
24
|
+
#
|
25
|
+
# @param [ Mongo::Crypt::Handle ] mongocrypt a Handle that
|
26
|
+
# wraps a mongocrypt_t object used to create a new mongocrypt_ctx_t
|
27
|
+
# @param [ ClientEncryption::IO ] io A instance of the IO class
|
28
|
+
# that implements driver I/O methods required to run the
|
29
|
+
# state machine
|
30
|
+
# @param [ String ] db_name The name of the database against which
|
31
|
+
# the command is being made
|
32
|
+
# @param [ Hash ] command The command to be encrypted
|
33
|
+
def initialize(mongocrypt, io, command)
|
34
|
+
super(mongocrypt, io)
|
35
|
+
|
36
|
+
@command = command
|
37
|
+
|
38
|
+
Binding.ctx_decrypt_init(self, @command)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,169 @@
|
|
1
|
+
# Copyright (C) 2019 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 Crypt
|
17
|
+
|
18
|
+
# An AutoEcnrypter is an object that encapsulates the behavior of
|
19
|
+
# automatic encryption. It controls all resources associated with
|
20
|
+
# auto-encryption, including the libmongocrypt handle, key vault client
|
21
|
+
# object, mongocryptd client object, and encryption I/O.
|
22
|
+
#
|
23
|
+
# The AutoEncrypter is kept as an instance on a Mongo::Client. Client
|
24
|
+
# objects with the same auto_encryption_options Hash may share
|
25
|
+
# AutoEncrypters.
|
26
|
+
#
|
27
|
+
# @api private
|
28
|
+
class AutoEncrypter
|
29
|
+
|
30
|
+
attr_reader :mongocryptd_client
|
31
|
+
attr_reader :key_vault_client
|
32
|
+
attr_reader :options
|
33
|
+
|
34
|
+
# A Hash of default values for the :extra_options option
|
35
|
+
DEFAULT_EXTRA_OPTIONS = Options::Redacted.new({
|
36
|
+
mongocryptd_uri: 'mongodb://localhost:27020',
|
37
|
+
mongocryptd_bypass_spawn: false,
|
38
|
+
mongocryptd_spawn_path: 'mongocryptd',
|
39
|
+
mongocryptd_spawn_args: ['--idleShutdownTimeoutSecs=60'],
|
40
|
+
})
|
41
|
+
|
42
|
+
# Set up encryption-related options and instance variables
|
43
|
+
# on the class that includes this module. Calls the same method
|
44
|
+
# on the Mongo::Crypt::Encrypter module.
|
45
|
+
#
|
46
|
+
# @param [ Hash ] options
|
47
|
+
#
|
48
|
+
# @option options [ Mongo::Client ] :client A client connected to the
|
49
|
+
# encrypted collection.
|
50
|
+
# @option options [ Mongo::Client | nil ] :key_vault_client A client connected
|
51
|
+
# to the MongoDB instance containing the encryption key vault; optional.
|
52
|
+
# If not provided, will default to :client option.
|
53
|
+
# @option options [ String ] :key_vault_namespace The namespace of the key
|
54
|
+
# vault in the format database.collection.
|
55
|
+
# @option options [ Hash | nil ] :schema_map The JSONSchema of the collection(s)
|
56
|
+
# with encrypted fields.
|
57
|
+
# @option options [ Boolean | nil ] :bypass_auto_encryption When true, disables
|
58
|
+
# auto-encryption. Default is false.
|
59
|
+
# @option options [ Hash | nil ] :extra_options Options related to spawning
|
60
|
+
# mongocryptd. These are set to default values if no option is passed in.
|
61
|
+
#
|
62
|
+
# @raise [ ArgumentError ] If required options are missing or incorrectly
|
63
|
+
# formatted.
|
64
|
+
def initialize(options)
|
65
|
+
@options = set_default_options(options).freeze
|
66
|
+
|
67
|
+
@crypt_handle = Crypt::Handle.new(
|
68
|
+
@options[:kms_providers],
|
69
|
+
schema_map: @options[:schema_map]
|
70
|
+
)
|
71
|
+
|
72
|
+
@key_vault_client = @options[:key_vault_client]
|
73
|
+
|
74
|
+
# Set server selection timeout to 1 to prevent the client waiting for a
|
75
|
+
# long timeout before spawning mongocryptd
|
76
|
+
@mongocryptd_client = Client.new(
|
77
|
+
@options[:extra_options][:mongocryptd_uri],
|
78
|
+
monitoring_io: @options[:client].options[:monitoring_io],
|
79
|
+
server_selection_timeout: 1,
|
80
|
+
)
|
81
|
+
|
82
|
+
@encryption_io = EncryptionIO.new(
|
83
|
+
client: @options[:client],
|
84
|
+
mongocryptd_client: @mongocryptd_client,
|
85
|
+
key_vault_namespace: @options[:key_vault_namespace],
|
86
|
+
key_vault_client: @key_vault_client,
|
87
|
+
mongocryptd_options: @options[:extra_options]
|
88
|
+
)
|
89
|
+
end
|
90
|
+
|
91
|
+
# Whether this encrypter should perform encryption (returns false if
|
92
|
+
# the :bypass_auto_encryption option is set to true).
|
93
|
+
#
|
94
|
+
# @return [ Boolean ] Whether to perform encryption.
|
95
|
+
def encrypt?
|
96
|
+
!@options[:bypass_auto_encryption]
|
97
|
+
end
|
98
|
+
|
99
|
+
# Encrypt a database command.
|
100
|
+
#
|
101
|
+
# @param [ String ] database_name The name of the database on which the
|
102
|
+
# command is being run.
|
103
|
+
# @param [ Hash ] command The command to be encrypted.
|
104
|
+
#
|
105
|
+
# @return [ BSON::Document ] The encrypted command.
|
106
|
+
def encrypt(database_name, command)
|
107
|
+
AutoEncryptionContext.new(
|
108
|
+
@crypt_handle,
|
109
|
+
@encryption_io,
|
110
|
+
database_name,
|
111
|
+
command
|
112
|
+
).run_state_machine
|
113
|
+
end
|
114
|
+
|
115
|
+
# Decrypt a database command.
|
116
|
+
#
|
117
|
+
# @param [ Hash ] command The command with encrypted fields.
|
118
|
+
#
|
119
|
+
# @return [ BSON::Document ] The decrypted command.
|
120
|
+
def decrypt(command)
|
121
|
+
AutoDecryptionContext.new(
|
122
|
+
@crypt_handle,
|
123
|
+
@encryption_io,
|
124
|
+
command
|
125
|
+
).run_state_machine
|
126
|
+
end
|
127
|
+
|
128
|
+
# Close the resources created by the AutoEncrypter.
|
129
|
+
#
|
130
|
+
# @return [ true ] Always true.
|
131
|
+
def close
|
132
|
+
@mongocryptd_client.close if @mongocryptd_client
|
133
|
+
|
134
|
+
true
|
135
|
+
end
|
136
|
+
|
137
|
+
private
|
138
|
+
|
139
|
+
# Returns a new set of options with the following changes:
|
140
|
+
# - sets default values for all extra_options
|
141
|
+
# - adds --idleShtudownTimeoutSecs=60 to extra_options[:mongocryptd_spawn_args]
|
142
|
+
# if not already present
|
143
|
+
# - sets bypass_auto_encryption to false
|
144
|
+
# - sets default key vault client
|
145
|
+
def set_default_options(options)
|
146
|
+
opts = options.dup
|
147
|
+
|
148
|
+
extra_options = opts.delete(:extra_options) || Options::Redacted.new
|
149
|
+
extra_options = DEFAULT_EXTRA_OPTIONS.merge(extra_options)
|
150
|
+
|
151
|
+
has_timeout_string_arg = extra_options[:mongocryptd_spawn_args].any? do |elem|
|
152
|
+
elem.is_a?(String) && elem.match(/\A--idleShutdownTimeoutSecs=\d+\z/)
|
153
|
+
end
|
154
|
+
|
155
|
+
timeout_int_arg_idx = extra_options[:mongocryptd_spawn_args].index('--idleShutdownTimeoutSecs')
|
156
|
+
has_timeout_int_arg = timeout_int_arg_idx && extra_options[:mongocryptd_spawn_args][timeout_int_arg_idx + 1].is_a?(Integer)
|
157
|
+
|
158
|
+
unless has_timeout_string_arg || has_timeout_int_arg
|
159
|
+
extra_options[:mongocryptd_spawn_args] << '--idleShutdownTimeoutSecs=60'
|
160
|
+
end
|
161
|
+
|
162
|
+
opts[:bypass_auto_encryption] ||= false
|
163
|
+
opts[:key_vault_client] ||= opts[:client]
|
164
|
+
|
165
|
+
Options::Redacted.new(opts).merge(extra_options: extra_options)
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# Copyright (C) 2019 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 Crypt
|
17
|
+
|
18
|
+
# A Context object initialized for auto encryption
|
19
|
+
#
|
20
|
+
# @api private
|
21
|
+
class AutoEncryptionContext < Context
|
22
|
+
|
23
|
+
# Create a new AutoEncryptionContext object
|
24
|
+
#
|
25
|
+
# @param [ Mongo::Crypt::Handle ] mongocrypt a Handle that
|
26
|
+
# wraps a mongocrypt_t object used to create a new mongocrypt_ctx_t
|
27
|
+
# @param [ ClientEncryption::IO ] io A instance of the IO class
|
28
|
+
# that implements driver I/O methods required to run the
|
29
|
+
# state machine
|
30
|
+
# @param [ String ] db_name The name of the database against which
|
31
|
+
# the command is being made
|
32
|
+
# @param [ Hash ] command The command to be encrypted
|
33
|
+
def initialize(mongocrypt, io, db_name, command)
|
34
|
+
super(mongocrypt, io)
|
35
|
+
|
36
|
+
@db_name = db_name
|
37
|
+
@command = command
|
38
|
+
|
39
|
+
# Initialize the ctx object for auto encryption
|
40
|
+
Binding.ctx_encrypt_init(self, @db_name, @command)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,155 @@
|
|
1
|
+
# Copyright (C) 2019 MongoDB, Inc.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
require 'ffi'
|
16
|
+
|
17
|
+
module Mongo
|
18
|
+
module Crypt
|
19
|
+
|
20
|
+
# A wrapper around mongocrypt_binary_t, a non-owning buffer of
|
21
|
+
# uint-8 byte data. Each Binary instance keeps a copy of the data
|
22
|
+
# passed to it in order to keep that data alive.
|
23
|
+
#
|
24
|
+
# @api private
|
25
|
+
class Binary
|
26
|
+
# Create a new Binary object that wraps a byte string
|
27
|
+
#
|
28
|
+
# @param [ String ] data The data string wrapped by the
|
29
|
+
# byte buffer (optional)
|
30
|
+
# @param [ FFI::Pointer ] pointer A pointer to an existing
|
31
|
+
# mongocrypt_binary_t object
|
32
|
+
#
|
33
|
+
# @note When initializing a Binary object with a string or a pointer,
|
34
|
+
# it is recommended that you use #self.from_pointer or #self.from_data
|
35
|
+
# methods
|
36
|
+
def initialize(data: nil, pointer: nil)
|
37
|
+
if data
|
38
|
+
# Represent data string as array of uint-8 bytes
|
39
|
+
bytes = data.unpack('C*')
|
40
|
+
|
41
|
+
# FFI::MemoryPointer automatically frees memory when it goes out of scope
|
42
|
+
@data_p = FFI::MemoryPointer.new(bytes.length)
|
43
|
+
.write_array_of_uint8(bytes)
|
44
|
+
|
45
|
+
# FFI::AutoPointer uses a custom release strategy to automatically free
|
46
|
+
# the pointer once this object goes out of scope
|
47
|
+
@bin = FFI::AutoPointer.new(
|
48
|
+
Binding.mongocrypt_binary_new_from_data(@data_p, bytes.length),
|
49
|
+
Binding.method(:mongocrypt_binary_destroy)
|
50
|
+
)
|
51
|
+
elsif pointer
|
52
|
+
# If the Binary class is used this way, it means that the pointer
|
53
|
+
# for the underlying mongocrypt_binary_t object is allocated somewhere
|
54
|
+
# else. It is not the responsibility of this class to de-allocate data.
|
55
|
+
@bin = pointer
|
56
|
+
else
|
57
|
+
# FFI::AutoPointer uses a custom release strategy to automatically free
|
58
|
+
# the pointer once this object goes out of scope
|
59
|
+
@bin = FFI::AutoPointer.new(
|
60
|
+
Binding.mongocrypt_binary_new,
|
61
|
+
Binding.method(:mongocrypt_binary_destroy)
|
62
|
+
)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
# Initialize a Binary object from an existing pointer to a mongocrypt_binary_t
|
67
|
+
# object.
|
68
|
+
#
|
69
|
+
# @param [ FFI::Pointer ] pointer A pointer to an existing
|
70
|
+
# mongocrypt_binary_t object
|
71
|
+
#
|
72
|
+
# @return [ Mongo::Crypt::Binary ] A new binary object
|
73
|
+
def self.from_pointer(pointer)
|
74
|
+
self.new(pointer: pointer)
|
75
|
+
end
|
76
|
+
|
77
|
+
# Initialize a Binary object with a string. The Binary object will store a
|
78
|
+
# copy of the specified string and destroy the allocated memory when
|
79
|
+
# it goes out of scope.
|
80
|
+
#
|
81
|
+
# @param [ String ] data A string to be wrapped by the Binary object
|
82
|
+
#
|
83
|
+
# @return [ Mongo::Crypt::Binary ] A new binary object
|
84
|
+
def self.from_data(data)
|
85
|
+
self.new(data: data)
|
86
|
+
end
|
87
|
+
|
88
|
+
# Overwrite the existing data wrapped by this Binary object
|
89
|
+
#
|
90
|
+
# @note The data passed in must not take up more memory than the
|
91
|
+
# original memory allocated to the underlying mongocrypt_binary_t
|
92
|
+
# object. Do NOT use this method unless required to do so by libmongocrypt.
|
93
|
+
#
|
94
|
+
# @param [ String ] data The new string data to be wrapped by this binary object
|
95
|
+
#
|
96
|
+
# @return [ true ] Always true
|
97
|
+
#
|
98
|
+
# @raise [ ArgumentError ] Raises when trying to write more data
|
99
|
+
# than was originally allocated or when writing to an object that
|
100
|
+
# already owns data.
|
101
|
+
def write(data)
|
102
|
+
if @data
|
103
|
+
raise ArgumentError, 'Cannot write to an owned Binary'
|
104
|
+
end
|
105
|
+
|
106
|
+
# Cannot write a string that's longer than the space currently allocated
|
107
|
+
# by the mongocrypt_binary_t object
|
108
|
+
str_p = Binding.mongocrypt_binary_data(ref)
|
109
|
+
len = Binding.mongocrypt_binary_len(ref)
|
110
|
+
|
111
|
+
if len < data.bytesize
|
112
|
+
raise ArgumentError.new(
|
113
|
+
"Cannot write #{data.bytesize} bytes of data to a Binary object " +
|
114
|
+
"that was initialized with #{Binding.mongocrypt_binary_len(@bin)} bytes."
|
115
|
+
)
|
116
|
+
end
|
117
|
+
|
118
|
+
str_p.put_bytes(0, data)
|
119
|
+
|
120
|
+
true
|
121
|
+
end
|
122
|
+
|
123
|
+
# Returns the data stored as a string
|
124
|
+
#
|
125
|
+
# @return [ String ] Data stored in the mongocrypt_binary_t as a string
|
126
|
+
def to_s
|
127
|
+
str_p = Binding.mongocrypt_binary_data(ref)
|
128
|
+
len = Binding.mongocrypt_binary_len(ref)
|
129
|
+
str_p.read_string(len)
|
130
|
+
end
|
131
|
+
|
132
|
+
# Returns the reference to the underlying mongocrypt_binary_t
|
133
|
+
# object
|
134
|
+
#
|
135
|
+
# @return [ FFI::Pointer ] The underlying mongocrypt_binary_t object
|
136
|
+
def ref
|
137
|
+
@bin
|
138
|
+
end
|
139
|
+
|
140
|
+
# Wraps a String with a mongocrypt_binary_t, yielding an FFI::Pointer
|
141
|
+
# to the wrapped struct.
|
142
|
+
def self.wrap_string(str)
|
143
|
+
binary_p = Binding.mongocrypt_binary_new_from_data(
|
144
|
+
FFI::MemoryPointer.from_string(str),
|
145
|
+
str.bytesize,
|
146
|
+
)
|
147
|
+
begin
|
148
|
+
yield binary_p
|
149
|
+
ensure
|
150
|
+
Binding.mongocrypt_binary_destroy(binary_p)
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|