use List::MoreUtils qw(any);
use SL::Common;
+use SL::DBUpgrade2::Base;
use SL::DBUtils;
use SL::Iconv;
$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();
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));
next if ($control->{ignore});
+ $control->{charset} = 'UTF-8' if $file =~ m/\.pl$/;
$control->{charset} = $control->{charset} || $control->{encoding} || Common::DEFAULT_CHARSET;
if (!$control->{"tag"}) {
if (@quote_chars) {
if ($char eq $quote_chars[-1]) {
pop(@quote_chars);
+ } elsif (length $quote_chars[-1] > 1
+ && substr($_, $i, length $quote_chars[-1]) eq $quote_chars[-1]) {
+ $i += length($quote_chars[-1]) - 1;
+ $char = $quote_chars[-1];
+ pop(@quote_chars);
}
$query .= $char;
} else {
+ my ($tag, $tag_end);
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 { $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 ";") {
# Query is complete. Send it.
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;
-
- if (ref($version_or_control) eq "HASH") {
- $file_charset = $version_or_control->{charset};
-
- } 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();
+ my %form_values = map { $_ => $::form->{$_} } qw(dbconnect dbdefault dbdriver dbhost dbmbkiviunstable dbname dboptions dbpasswd dbport dbupdate dbuser login template_object version);
- # setup dbup_ export vars
- my %dbup_myconfig = ();
- map({ $dbup_myconfig{$_} = $form->{$_}; } qw(dbname dbuser dbpasswd dbhost dbport dbconnect));
+ $dbh->begin_work;
- 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);
}
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();
}
before the current one is applied.
=item charset
+
=item encoding
The charset this file uses. Defaults to C<ISO-8859-15> if