Class: Dalli::Protocol::ValueCompressor
- Inherits:
-
Object
- Object
- Dalli::Protocol::ValueCompressor
- Defined in:
- lib/dalli/protocol/value_compressor.rb
Overview
Dalli::Protocol::ValueCompressor compartmentalizes the logic for managing compression and decompression of stored values. It manages interpreting relevant options from both client and request, determining whether to compress/decompress on store/retrieve, and processes bitflags as necessary.
Constant Summary collapse
- DEFAULTS =
{ compress: true, compressor: ::Dalli::Compressor, # min byte size to attempt compression compression_min_size: 4 * 1024 # 4K }.freeze
- OPTIONS =
DEFAULTS.keys.freeze
Instance Method Summary collapse
- #compress_by_default? ⇒ Boolean
-
#compress_value?(value, req_options) ⇒ Boolean
Checks whether we should apply compression when serializing a value based on the specified options.
- #compression_min_size ⇒ Object
- #compressor ⇒ Object
-
#initialize(client_options) ⇒ ValueCompressor
constructor
A new instance of ValueCompressor.
- #retrieve(value, bitflags) ⇒ Object
- #store(value, req_options, bitflags) ⇒ Object
Constructor Details
#initialize(client_options) ⇒ ValueCompressor
Returns a new instance of ValueCompressor.
23 24 25 26 |
# File 'lib/dalli/protocol/value_compressor.rb', line 23 def initialize() @compression_options = DEFAULTS.merge(.slice(*OPTIONS)) end |
Instance Method Details
#compress_by_default? ⇒ Boolean
47 48 49 |
# File 'lib/dalli/protocol/value_compressor.rb', line 47 def compress_by_default? @compression_options[:compress] end |
#compress_value?(value, req_options) ⇒ Boolean
Checks whether we should apply compression when serializing a value based on the specified options. Returns false unless the value is greater than the minimum compression size. Otherwise returns based on a method-level option if specified, falling back to the server default.
64 65 66 67 68 69 |
# File 'lib/dalli/protocol/value_compressor.rb', line 64 def compress_value?(value, ) return false unless value.bytesize >= compression_min_size return compress_by_default? unless && ![:compress].nil? [:compress] end |
#compression_min_size ⇒ Object
55 56 57 |
# File 'lib/dalli/protocol/value_compressor.rb', line 55 def compression_min_size @compression_options[:compression_min_size] end |
#compressor ⇒ Object
51 52 53 |
# File 'lib/dalli/protocol/value_compressor.rb', line 51 def compressor @compression_options[:compressor] end |
#retrieve(value, bitflags) ⇒ Object
36 37 38 39 40 41 42 43 44 45 |
# File 'lib/dalli/protocol/value_compressor.rb', line 36 def retrieve(value, bitflags) compressed = bitflags.anybits?(Flags::COMPRESSED) compressed ? compressor.decompress(value) : value # TODO: We likely want to move this rescue into the Dalli::Compressor / Dalli::GzipCompressor # itself, since not all compressors necessarily use Zlib. For now keep it here, so the behavior # of custom compressors doesn't change. rescue Zlib::Error raise UnmarshalError, "Unable to uncompress value: #{$ERROR_INFO.}" end |
#store(value, req_options, bitflags) ⇒ Object
28 29 30 31 32 33 34 |
# File 'lib/dalli/protocol/value_compressor.rb', line 28 def store(value, , bitflags) do_compress = compress_value?(value, ) store_value = do_compress ? compressor.compress(value) : value bitflags |= Flags::COMPRESSED if do_compress [store_value, bitflags] end |