Bug 16044: Add deep cloning
authorJonathan Druart <jonathan.druart@bugs.koha-community.org>
Tue, 15 Mar 2016 16:17:32 +0000 (16:17 +0000)
committerBrendan A Gallagher <brendan@bywatersolutions.com>
Thu, 24 Mar 2016 19:44:44 +0000 (19:44 +0000)
To avoid the cache to be modified unfortunately, the default behavior of
get_from_cache will be to deep copy if we are getting a structure.
If the item is a scalar, it's simply returned.

Signed-off-by: Jesse Weaver <jweaver@bywatersolutions.com>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
Signed-off-by: Brendan A Gallagher <brendan@bywatersolutions.com>
Koha/Cache.pm

index 39a16d0..f389395 100644 (file)
@@ -38,6 +38,7 @@ The first, traditional OO interface provides the following functions:
 use strict;
 use warnings;
 use Carp;
+use Clone qw( clone );
 use Module::Load::Conditional qw(can_load);
 use Koha::Cache::Object;
 
@@ -313,7 +314,12 @@ sub get_from_cache {
     return unless ( $self->{$cache} && ref( $self->{$cache} ) =~ m/^Cache::/ );
 
     # Return L1 cache value if exists
-    return $L1_cache{$key} if exists $L1_cache{$key};
+    if ( exists $L1_cache{$key} ) {
+        # No need to deep copy if it's a scalar:
+        return $L1_cache{$key}
+            unless ref $L1_cache{$key};
+        return clone $L1_cache{$key};
+    }
 
     my $get_sub = $self->{ref($self->{$cache}) . "_get"};
     return $get_sub ? $get_sub->($key) : $self->{$cache}->get($key);