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

new(message, compressor, zlib_compression_level = nil) click to toggle source

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!() click to toggle source

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
replyable?() click to toggle source

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

serialize_fields(buffer, max_bson_size) click to toggle source
Calls superclass method
# 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