From 22c907230af9821d84127f9e2afbea9757aed2fa Mon Sep 17 00:00:00 2001 From: Jonathan Druart Date: Fri, 8 Apr 2016 12:54:44 +0100 Subject: [PATCH] Bug 16229: Add the unsafe flag to set_in_cache Could be useful later. Signed-off-by: Jacek Ablewicz Signed-off-by: Tomas Cohen Arazi Signed-off-by: Brendan Gallagher --- Koha/Cache.pm | 5 ++++- t/Cache.t | 9 ++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/Koha/Cache.pm b/Koha/Cache.pm index c717c5a85d..7e8970ddd4 100644 --- a/Koha/Cache.pm +++ b/Koha/Cache.pm @@ -267,6 +267,7 @@ sub set_in_cache { $new_options->{cache} = $_cache if defined $_cache; $options = $new_options; } + my $unsafe = $options->{unsafe} || 0; # the key mustn't contain whitespace (or control characters) for memcache # but shouldn't be any harm in applying it globally. @@ -281,7 +282,9 @@ sub set_in_cache { $expiry //= $self->{timeout}; my $set_sub = $self->{ref($self->{$cache}) . "_set"}; - $value = clone $value; + # Deep copy if it's not a scalar and unsafe is not passed + $value = clone( $value ) if ref($value) and not $unsafe; + # Set in L1 cache $L1_cache{ $key } = $value; diff --git a/t/Cache.t b/t/Cache.t index 8fa96e6c19..5a5c248474 100644 --- a/t/Cache.t +++ b/t/Cache.t @@ -17,7 +17,7 @@ use Modern::Perl; -use Test::More tests => 39; +use Test::More tests => 40; my $destructorcount = 0; @@ -196,8 +196,15 @@ SKIP: { $item_from_cache = $cache->get_from_cache('test_deep_copy_hash'); %$item_from_cache = ( another => 'hashref' ); is_deeply( $cache->get_from_cache('test_deep_copy_hash'), { a => 'hashref' }, 'A hash will be deep copied'); + %item = ( a_modified => 'hashref' ); is_deeply( $cache->get_from_cache('test_deep_copy_hash'), { a => 'hashref' }, 'A hash will be deep copied when set in cache'); + + %item = ( a => 'hashref' ); + $cache->set_in_cache('test_deep_copy_hash', \%item, { unsafe => 1}); + %item = ( a_modified => 'hashref' ); + is_deeply( $cache->get_from_cache('test_deep_copy_hash'), { a_modified => 'hashref' }, 'A hash will not be deep copied when set in cache if the unsafe flag is set'); + $item_from_cache = $cache->get_from_cache('test_deep_copy_hash', { unsafe => 1}); %$item_from_cache = ( another => 'hashref' ); is_deeply( $cache->get_from_cache('test_deep_copy_hash'), { another => 'hashref' }, 'A hash will not be deep copied if the unsafe flag is set'); -- 2.39.5