method
default_serializer
v7.1.3.4 -
Show latest stable
-
0 notes -
Class: ActiveSupport::Cache::MemCacheStore
- 1.0.0
- 1.1.6
- 1.2.6
- 2.0.3
- 2.1.0
- 2.2.1
- 2.3.8
- 3.0.0
- 3.0.9
- 3.1.0
- 3.2.1
- 3.2.8
- 3.2.13
- 4.0.2
- 4.1.8
- 4.2.1
- 4.2.7
- 4.2.9
- 5.0.0.1
- 5.1.7
- 5.2.3
- 6.0.0
- 6.1.3.1
- 6.1.7.7
- 7.0.0
- 7.1.3.2 (0)
- 7.1.3.4 (0)
- What's this?
default_serializer()
private
Hide source
# File activesupport/lib/active_support/cache/mem_cache_store.rb, line 225 def default_serializer if Cache.format_version == 6.1 ActiveSupport.deprecator.warn <<~EOM Support for `config.active_support.cache_format_version = 6.1` has been deprecated and will be removed in Rails 7.2. Check the Rails upgrade guide at https://guides.rubyonrails.org/upgrading_ruby_on_rails.html#new-activesupport-cache-serialization-format for more information on how to upgrade. EOM Cache::SerializerWithFallback[:passthrough] else super end end # Read an entry from the cache. def read_entry(key, **options) deserialize_entry(read_serialized_entry(key, **options), **options) end def read_serialized_entry(key, **options) rescue_error_with(nil) do @data.with { |c| c.get(key, options) } end end # Write an entry to the cache. def write_entry(key, entry, **options) write_serialized_entry(key, serialize_entry(entry, **options), **options) end def write_serialized_entry(key, payload, **options) method = options[:unless_exist] ? :add : :set expires_in = options[:expires_in].to_i if options[:race_condition_ttl] && expires_in > 0 && !options[:raw] # Set the memcache expire a few minutes in the future to support race condition ttls on read expires_in += 5.minutes end rescue_error_with false do # Don't pass compress option to Dalli since we are already dealing with compression. options.delete(:compress) @data.with { |c| c.send(method, key, payload, expires_in, **options) } end end # Reads multiple entries from the cache implementation. def read_multi_entries(names, **options) keys_to_names = names.index_by { |name| normalize_key(name, options) } raw_values = begin @data.with { |c| c.get_multi(keys_to_names.keys) } rescue Dalli::UnmarshalError {} end values = {} raw_values.each do |key, value| entry = deserialize_entry(value, raw: options[:raw]) unless entry.nil? || entry.expired? || entry.mismatched?(normalize_version(keys_to_names[key], options)) begin values[keys_to_names[key]] = entry.value rescue DeserializationError end end end values end # Delete an entry from the cache. def delete_entry(key, **options) rescue_error_with(false) { @data.with { |c| c.delete(key) } } end def serialize_entry(entry, raw: false, **options) if raw entry.value.to_s else super(entry, raw: raw, **options) end end # Memcache keys are binaries. So we need to force their encoding to binary # before applying the regular expression to ensure we are escaping all # characters properly. def normalize_key(key, options) key = super if key key = key.dup.force_encoding(Encoding::ASCII_8BIT) key = key.gsub(ESCAPE_KEY_CHARS) { |match| "%#{match.getbyte(0).to_s(16).upcase}" } if key.size > KEY_MAX_SIZE key_separator = ":hash:" key_hash = ActiveSupport::Digest.hexdigest(key) key_trim_size = KEY_MAX_SIZE - key_separator.size - key_hash.size key = "#{key[0, key_trim_size]}#{key_separator}#{key_hash}" end end key end def deserialize_entry(payload, raw: false, **) if payload && raw Entry.new(payload) else super(payload) end end def rescue_error_with(fallback) yield rescue Dalli::DalliError => error logger.error("DalliError (#{error}): #{error.message}") if logger ActiveSupport.error_reporter&.report( error, severity: :warning, source: "mem_cache_store.active_support", ) fallback end end end