Bei Fehler LaTeX Tempfiles als UTF8 einlesen
[kivitendo-erp.git] / SL / DBUpgrade2.pm
index e3d61e6..6502583 100644 (file)
@@ -133,11 +133,16 @@ sub process_query {
   my ($self, $dbh, $filename, $version_or_control) = @_;
 
   my $form  = $self->{form};
-  my $fh    = IO::File->new($filename, "r") or $form->error("$filename : $!\n");
+  my $fh    = IO::File->new($filename, "r");
   my $query = "";
   my $sth;
   my @quote_chars;
 
+  if (!$fh) {
+    return "No such file: $filename" if $self->{return_on_error};
+    $form->error("$filename : $!\n");
+  }
+
   $dbh->begin_work();
 
   while (<$fh>) {
@@ -182,6 +187,7 @@ sub process_query {
           $sth = $dbh->prepare($query);
           if (!$sth->execute()) {
             my $errstr = $dbh->errstr;
+            return $errstr // '<unknown database error>' if $self->{return_on_error};
             $sth->finish();
             $dbh->rollback();
             $form->dberror("The database update/creation did not succeed. " .
@@ -217,6 +223,9 @@ sub process_query {
   $fh->close();
 
   $::lxdebug->leave_sub();
+
+  # Signal "no error"
+  return undef;
 }
 
 # Process a Perl script which updates the database.
@@ -229,11 +238,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(
@@ -246,8 +256,12 @@ 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));
+
   if (!defined($result)) {
     print $::form->parse_html_template("dbupgrade/error", { file  => $filename, error => $error });
     ::end_of_request();
@@ -261,7 +275,8 @@ sub process_perl_script {
   } elsif ($version_or_control) {
     $dbh->do("UPDATE defaults SET version = " . $dbh->quote($version_or_control));
   }
-  $dbh->commit();
+
+  $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
@@ -271,28 +286,15 @@ sub process_perl_script {
   $::form->{$_} = $form_values{$_} for keys %form_values;
 
   $::lxdebug->leave_sub();
+
+  return undef;
 }
 
 sub process_file {
   my ($self, $dbh, $filename, $version_or_control) = @_;
 
-  if ($filename =~ m/sql$/) {
-    $self->process_query($dbh, $filename, $version_or_control);
-  } else {
-    $self->process_perl_script($dbh, $filename, $version_or_control);
-  }
-}
-
-sub update_available {
-  my ($self, $cur_version) = @_;
-
-  local *SQLDIR;
-
-  opendir SQLDIR, "sql/Pg-upgrade" || error("", "sql/Pg-upgrade: $!");
-  my @upgradescripts = grep /Pg-upgrade-\Q$cur_version\E.*\.(sql|pl)$/, readdir SQLDIR;
-  closedir SQLDIR;
-
-  return ($#upgradescripts > -1);
+  return $filename =~ m/sql$/ ? $self->process_query(      $dbh, $filename, $version_or_control)
+                              : $self->process_perl_script($dbh, $filename, $version_or_control);
 }
 
 sub update2_available {
@@ -434,8 +436,7 @@ __END__
 =head1 NAME
 
 SL::DBUpgrade2 - Parse database upgrade files stored in
-C<sql/Pg-upgrade2> and C<sql/Pg-upgrade2-auth> (and also in
-C<SQL/Pg-upgrade>)
+C<sql/Pg-upgrade2> and C<sql/Pg-upgrade2-auth>
 
 =head1 SYNOPSIS
 
@@ -486,12 +487,6 @@ files. For both there are control fields that determine the order in
 which they're executed etc. The control fields are tag/value pairs
 contained in comments.
 
-=head1 OLD UPGRADE FILES
-
-The files in C<sql/Pg-upgrade> are so old that I don't bother
-documenting them. They're handled by this class, too, but new files
-are only created as C<Pg-upgrade2> files.
-
 =head1 CONTROL FIELDS
 
 =head2 SYNTAX