File: Kein deep clone von Strukturen machen die SL::DB::* Objekte enthalten
authorSven Schöling <sven.schoeling@opendynamic.de>
Fri, 17 Jul 2020 15:13:03 +0000 (17:13 +0200)
committerBernd Bleßmann <bernd@kivitendo-premium.de>
Mon, 3 Aug 2020 10:15:45 +0000 (12:15 +0200)
Das führt zu Duplizierungen von Singletons, in diesem Fall der
Datenbankverbindung die dann beim abbauen kaputtgehen.

(cherry picked from commit 9a86234c1a5624573a3f2738cf25b526527796c8)

Behebt #358 (redmine).

SL/File.pm
SL/File/Object.pm

index 8305594..25c6d96 100644 (file)
@@ -4,7 +4,6 @@ use strict;
 
 use parent qw(Rose::Object);
 
-use Clone qw(clone);
 use SL::File::Backend;
 use SL::File::Object;
 use SL::DB::History;
@@ -78,7 +77,7 @@ sub get_all_versions {
       for my $version (2..$maxversion) {
         $main::lxdebug->message(LXDebug->DEBUG2(), "clone for version=".($maxversion-$version+1));
         eval {
-          my $clone = clone($fileobj);
+          my $clone = $fileobj->clone;
           $clone->version($maxversion-$version+1);
           $clone->newest(0);
           $main::lxdebug->message(LXDebug->DEBUG2(), "clone version=".$clone->version." mtime=". $clone->mtime);
index 7ac8706..3aa553d 100644 (file)
@@ -124,6 +124,10 @@ sub loaded_db_file {  # so, dass wir die nur einmal laden.
   $_[0]->db_file;
 }
 
+sub clone {
+  bless +{ %{ $_[0] } }, __PACKAGE__;
+}
+
 
 sub init_db_file { die 'must always have a db file'; }
 sub init_loaded  { 0 }