class Mongo::Protocol::Compressed
MongoDB Wire protocol Compressed
message.
This is a bi-directional message that compresses another opcode.
@api semipublic
@since 2.5.0
Constants
- COMPRESSOR_ID_MAP
The compressor identifier to byte map.
@since 2.5.0
- OP_CODE
The operation code for a
Compressed
message. @return [ Fixnum ] the operation code.@since 2.5.0
- ZLIB
The Zlib compressor identifier.
@since 2.5.0
- ZLIB_BYTE
The byte signaling that the message has been compressed with Zlib.
@since 2.5.0
Public Class Methods
Creates a new OP_COMPRESSED message.
@example Create an OP_COMPRESSED message.
Compressed.new(original_message, 'zlib')
@param [ Mongo::Protocol::Message
] message The original message. @param [ String, Symbol
] compressor The compression algorithm to use. @param [ Integer ] zlib_compression_level The zlib compression level to use.
-1 and nil imply default.
@since 2.5.0
# File lib/mongo/protocol/compressed.rb, line 53 def initialize(message, compressor, zlib_compression_level = nil) @original_message = message @original_op_code = message.op_code @uncompressed_size = 0 @compressor_id = COMPRESSOR_ID_MAP[compressor] @compressed_message = '' @zlib_compression_level = zlib_compression_level if zlib_compression_level && zlib_compression_level != -1 @request_id = message.request_id end
Public Instance Methods
Inflate an OP_COMRESSED message and return the original message.
@example Inflate a compressed message.
message.inflate!
@return [ Protocol::Message
] The inflated message.
@since 2.5.0
# File lib/mongo/protocol/compressed.rb, line 71 def inflate! message = Registry.get(@original_op_code).allocate uncompressed_message = Zlib::Inflate.inflate(@compressed_message) buf = BSON::ByteBuffer.new(uncompressed_message) message.send(:fields).each do |field| if field[:multi] Message.deserialize_array(message, buf, field) else Message.deserialize_field(message, buf, field) end end message end
Whether the message expects a reply from the database.
@example Does the message require a reply?
message.replyable?
@return [ true, false ] If the message expects a reply.
@since 2.5.0
# File lib/mongo/protocol/compressed.rb, line 95 def replyable? @original_message.replyable? end
Private Instance Methods
# File lib/mongo/protocol/compressed.rb, line 123 def serialize_fields(buffer, max_bson_size) buf = BSON::ByteBuffer.new @original_message.send(:serialize_fields, buf, max_bson_size) @uncompressed_size = buf.length @compressed_message = Zlib::Deflate.deflate(buf.to_s, @zlib_compression_level).force_encoding(BSON::BINARY) super end