X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FDBUpgrade2.pm;h=6de1fd258426dd19eeac498e15394b8557f3b419;hb=a6a6121c8a7b419bd4130c9374051dba76e4aac6;hp=a74e8ae82ed4a75504adb26655e3bc716af3713b;hpb=b2448c147778ca345decb911aee36f13eca610ae;p=kivitendo-erp.git diff --git a/SL/DBUpgrade2.pm b/SL/DBUpgrade2.pm index a74e8ae82..6de1fd258 100644 --- a/SL/DBUpgrade2.pm +++ b/SL/DBUpgrade2.pm @@ -4,6 +4,7 @@ use IO::File; use List::MoreUtils qw(any); use SL::Common; +use SL::DBUpgrade2::Base; use SL::DBUtils; use SL::Iconv; @@ -25,12 +26,17 @@ sub init { $params{path_suffix} ||= ''; $params{schema} ||= ''; + $params{path} = "sql/" . $params{dbdriver} . "-upgrade2" . $params{path_suffix}; map { $self->{$_} = $params{$_} } keys %params; return $self; } +sub path { + $_[0]{path}; +} + sub parse_dbupdate_controls { $::lxdebug->enter_sub(); @@ -42,7 +48,7 @@ sub parse_dbupdate_controls { local *IN; my %all_controls; - my $path = "sql/" . $self->{dbdriver} . "-upgrade2" . $self->{path_suffix}; + my $path = $self->path; foreach my $file_name (<$path/*.sql>, <$path/*.pl>) { next unless (open(IN, $file_name)); @@ -74,6 +80,7 @@ sub parse_dbupdate_controls { next if ($control->{ignore}); + $control->{charset} = 'UTF-8' if $file =~ m/\.pl$/; $control->{charset} = $control->{charset} || $control->{encoding} || Common::DEFAULT_CHARSET; if (!$control->{"tag"}) { @@ -163,9 +170,8 @@ sub process_query { if ($char eq $quote_chars[-1]) { pop(@quote_chars); } elsif (length $quote_chars[-1] > 1 - && substr($quote_chars[-1], 0, 1) eq $char && substr($_, $i, length $quote_chars[-1]) eq $quote_chars[-1]) { - $i += length $quote_chars[-1] - 1; + $i += length($quote_chars[-1]) - 1; $char = $quote_chars[-1]; pop(@quote_chars); } @@ -176,10 +182,10 @@ sub process_query { if (($char eq "'") || ($char eq "\"")) { push(@quote_chars, $char); - } elsif ($char eq '$' # start of dollar quoting - && ($tag_end = index($_, '$', $i + 1)) > -1 # ends on same line - && (do { substr($_, $i + 1, $tag_end - $i - 1); 1 }) # extract tag - && $tag =~ /^ (?= [A-Za-z_] [A-Za-z0-9_]* | ) $/x) { # tag is identifier + } elsif ($char eq '$' # start of dollar quoting + && ($tag_end = index($_, '$', $i + 1)) > -1 # ends on same line + && (do { $tag = substr($_, $i + 1, $tag_end - $i - 1); 1 }) # extract tag + && $tag =~ /^ (?= [A-Za-z_] [A-Za-z0-9_]* | ) $/x) { # tag is identifier push @quote_chars, $char = '$' . $tag . '$'; $i = $tag_end; } elsif ($char eq ";") { @@ -236,49 +242,25 @@ sub process_perl_script { my ($self, $dbh, $filename, $version_or_control, $db_charset) = @_; - my $form = $self->{form}; - my $fh = IO::File->new($filename, "r") or $form->error("$filename : $!\n"); - my $file_charset = Common::DEFAULT_CHARSET; + my %form_values = map { $_ => $::form->{$_} } qw(dbconnect dbdefault dbdriver dbhost dbmbkiviunstable dbname dboptions dbpasswd dbport dbupdate dbuser login template_object version); - if (ref($version_or_control) eq "HASH") { - $file_charset = $version_or_control->{charset}; + $dbh->begin_work; - } else { - while (<$fh>) { - last if !/^--/; - next if !/^--\s*\@(?:charset|encoding):\s*(.+)/; - $file_charset = $1; - last; - } - $fh->seek(0, SEEK_SET); - } - - my $contents = join "", <$fh>; - $fh->close(); - - $db_charset ||= Common::DEFAULT_CHARSET; - - my $iconv = SL::Iconv->new($file_charset, $db_charset); - - $dbh->begin_work(); - - # setup dbup_ export vars - my %dbup_myconfig = (); - map({ $dbup_myconfig{$_} = $form->{$_}; } qw(dbname dbuser dbpasswd dbhost dbport dbconnect)); - - my $dbup_locale = $::locale; - - my $result = eval($contents); + # setup dbup_ export vars & run script + my %dbup_myconfig = map { ($_ => $::form->{$_}) } qw(dbname dbuser dbpasswd dbhost dbport dbconnect); + my $result = SL::DBUpgrade2::Base::execute_script( + file_name => $filename, + tag => $version_or_control->{tag}, + dbh => $dbh, + myconfig => \%dbup_myconfig, + ); - if (1 != $result) { + if (1 != ($result // 1)) { $dbh->rollback(); - $dbh->disconnect(); } if (!defined($result)) { - print $form->parse_html_template("dbupgrade/error", - { "file" => $filename, - "error" => $@ }); + print $::form->parse_html_template("dbupgrade/error", { file => $filename, error => $@ }); ::end_of_request(); } elsif (1 != $result) { unlink("users/nologin") if (2 == $result); @@ -286,12 +268,19 @@ sub process_perl_script { } if (ref($version_or_control) eq "HASH") { - $dbh->do("INSERT INTO " . $self->{schema} . "schema_info (tag, login) VALUES (" . $dbh->quote($version_or_control->{"tag"}) . ", " . $dbh->quote($form->{"login"}) . ")"); + $dbh->do("INSERT INTO " . $self->{schema} . "schema_info (tag, login) VALUES (" . $dbh->quote($version_or_control->{tag}) . ", " . $dbh->quote($::form->{login}) . ")"); } elsif ($version_or_control) { $dbh->do("UPDATE defaults SET version = " . $dbh->quote($version_or_control)); } $dbh->commit(); + # 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 + # the usual 'continued' mechanism that's used for determining + # whether or not the upgrade form must be displayed). + delete @{ $::form }{ keys %{ $::form } }; + $::form->{$_} = $form_values{$_} for keys %form_values; + $::lxdebug->leave_sub(); } @@ -560,6 +549,7 @@ depends on. All other upgrades listed in C will be applied before the current one is applied. =item charset + =item encoding The charset this file uses. Defaults to C if