posaune
[kivitendo-erp.git] / SL / DBUpgrade2.pm
index f6ad6eb..4fb1ba9 100644 (file)
@@ -7,7 +7,6 @@ use List::MoreUtils qw(any);
 use SL::Common;
 use SL::DBUpgrade2::Base;
 use SL::DBUtils;
-use SL::Iconv;
 
 use strict;
 
@@ -27,7 +26,7 @@ sub init {
 
   $params{path_suffix} ||= '';
   $params{schema}      ||= '';
-  $params{path}          = "sql/Pg-upgrade2" . $params{path_suffix};
+  $params{path}        ||= "sql/Pg-upgrade2" . $params{path_suffix};
 
   map { $self->{$_} = $params{$_} } keys %params;
 
@@ -39,8 +38,6 @@ sub path {
 }
 
 sub parse_dbupdate_controls {
-  $::lxdebug->enter_sub();
-
   my ($self) = @_;
 
   my $form   = $self->{form};
@@ -52,7 +49,7 @@ sub parse_dbupdate_controls {
   my $path = $self->path;
 
   foreach my $file_name (<$path/*.sql>, <$path/*.pl>) {
-    next unless (open(IN, $file_name));
+    next unless (open(IN, "<:encoding(UTF-8)", $file_name));
 
     my $file = $file_name;
     $file =~ s|.*/||;
@@ -60,6 +57,7 @@ sub parse_dbupdate_controls {
     my $control = {
       "priority" => 1000,
       "depends"  => [],
+      "locales"  => [],
     };
 
     while (<IN>) {
@@ -74,6 +72,8 @@ sub parse_dbupdate_controls {
 
       if ($fields[0] eq "depends") {
         push(@{$control->{"depends"}}, split(/\s+/, $fields[1]));
+      } elsif ($fields[0] eq "locales") {
+        push @{$control->{locales}}, $fields[1];
       } else {
         $control->{$fields[0]} = $fields[1];
       }
@@ -122,8 +122,6 @@ sub parse_dbupdate_controls {
 
   $self->{all_controls} = \%all_controls;
 
-  $::lxdebug->leave_sub();
-
   return $self;
 }
 
@@ -133,7 +131,7 @@ sub process_query {
   my ($self, $dbh, $filename, $version_or_control) = @_;
 
   my $form  = $self->{form};
-  my $fh    = IO::File->new($filename, "r");
+  my $fh    = IO::File->new($filename, "<:encoding(UTF-8)");
   my $query = "";
   my $sth;
   my @quote_chars;
@@ -146,8 +144,6 @@ sub process_query {
   $dbh->begin_work();
 
   while (<$fh>) {
-    $_ = SL::Iconv::convert('UTF-8', 'UTF-8', $_);
-
     # Remove DOS and Unix style line endings.
     chomp;
 
@@ -238,11 +234,12 @@ sub process_perl_script {
 
   my ($self, $dbh, $filename, $version_or_control) = @_;
 
-  my %form_values = map { $_ => $::form->{$_} } qw(dbconnect dbdefault dbhost dbmbkiviunstable dbname dboptions dbpasswd dbport dbupdate dbuser login template_object version);
+  my %form_values = map { $_ => $::form->{$_} } qw(dbconnect dbdefault dbhost dbname dboptions dbpasswd dbport dbupdate dbuser login template_object version);
 
   $dbh->begin_work;
 
   # setup dbup_ export vars & run script
+  my $old_dbh       = $::form->set_standard_dbh($dbh);
   my %dbup_myconfig = map { ($_ => $::form->{$_}) } qw(dbname dbuser dbpasswd dbhost dbport dbconnect);
   my $result        = eval {
     SL::DBUpgrade2::Base::execute_script(
@@ -255,6 +252,8 @@ sub process_perl_script {
 
   my $error = $EVAL_ERROR;
 
+  $::form->set_standard_dbh($old_dbh);
+
   $dbh->rollback if 1 != ($result // -1);
 
   return $error if $self->{return_on_error} && (1 != ($result // -1));
@@ -273,7 +272,7 @@ sub process_perl_script {
     $dbh->do("UPDATE defaults SET version = " . $dbh->quote($version_or_control));
   }
 
-  $dbh->commit if $dbh->{AutoCommit} && $dbh->{BegunWork};
+  $dbh->commit if !$dbh->{AutoCommit} || $dbh->{BegunWork};
 
   # Clear $::form of values that may have been set so that following
   # Perl upgrade scripts won't have to work with old data (think of
@@ -294,28 +293,6 @@ sub process_file {
                               : $self->process_perl_script($dbh, $filename, $version_or_control);
 }
 
-sub update2_available {
-  $::lxdebug->enter_sub();
-
-  my ($self, $dbh) = @_;
-
-  map { $_->{applied} = 0; } values %{ $self->{all_controls} };
-
-  my $sth = $dbh->prepare(qq|SELECT tag FROM | . $self->{schema} . qq|schema_info|);
-  if ($sth->execute) {
-    while (my ($tag) = $sth->fetchrow_array) {
-      $self->{all_controls}->{$tag}->{applied} = 1 if defined $self->{all_controls}->{$tag};
-    }
-  }
-  $sth->finish();
-
-  my $needs_update = any { !$_->{applied} } values %{ $self->{all_controls} };
-
-  $::lxdebug->leave_sub();
-
-  return $needs_update;
-}
-
 sub unapplied_upgrade_scripts {
   my ($self, $dbh) = @_;
 
@@ -332,6 +309,14 @@ sub unapplied_upgrade_scripts {
   return grep { !$_->{applied} } @all_scripts;
 }
 
+sub update2_available {
+  my ($self, $dbh) = @_;
+
+  my @unapplied_scripts = $self->unapplied_upgrade_scripts($dbh);
+
+  return !!@unapplied_scripts;
+}
+
 sub apply_admin_dbupgrade_scripts {
   my ($self, $called_from_admin) = @_;
 
@@ -344,8 +329,6 @@ sub apply_admin_dbupgrade_scripts {
 
   $self->{form}->{login} ||= 'admin';
 
-  map { $_->{description} = SL::Iconv::convert('UTF-8', 'UTF-8', $_->{description}) } values %{ $self->{all_controls} };
-
   if ($called_from_admin) {
     $self->{form}->{title} = $::locale->text('Dataset upgrade');
     $self->{form}->header;
@@ -394,13 +377,11 @@ sub _control_error {
 }
 
 sub _dbupdate2_calculate_depth {
-  $::lxdebug->enter_sub(2);
-
   my ($tree, $tag) = @_;
 
   my $node = $tree->{$tag};
 
-  return $::lxdebug->leave_sub(2) if (defined($node->{"depth"}));
+  return if (defined($node->{"depth"}));
 
   my $max_depth = 0;
 
@@ -411,8 +392,6 @@ sub _dbupdate2_calculate_depth {
   }
 
   $node->{"depth"} = $max_depth + 1;
-
-  $::lxdebug->leave_sub(2);
 }
 
 sub sort_dbupdate_controls {