Bug 16229: Add the unsafe flag to set_in_cache
authorJonathan Druart <jonathan.druart@bugs.koha-community.org>
Fri, 8 Apr 2016 11:54:44 +0000 (12:54 +0100)
committerBrendan Gallagher <bredan@bywatersolutions.com>
Wed, 20 Apr 2016 17:17:21 +0000 (17:17 +0000)
Could be useful later.

Signed-off-by: Jacek Ablewicz <abl@biblos.pk.edu.pl>
Signed-off-by: Tomas Cohen Arazi <tomascohen@unc.edu.ar>
Signed-off-by: Brendan Gallagher <bredan@bywatersolutions.com>
Koha/Cache.pm
t/Cache.t

index c717c5a..7e8970d 100644 (file)
@@ -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;
 
index 8fa96e6..5a5c248 100644 (file)
--- 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');