$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} ||= Common::DEFAULT_CHARSET;
+ $control->{charset} = $control->{charset} || $control->{encoding} || Common::DEFAULT_CHARSET;
if (!$control->{"tag"}) {
_control_error($form, $file_name, $locale->text("Missing 'tag' field.")) ;
my $file_charset = Common::DEFAULT_CHARSET;
while (<$fh>) {
last if !/^--/;
- next if !/^--\s*\@charset:\s*(.+)/;
+ next if !/^--\s*\@(?:charset|encoding):\s*(.+)/;
$file_charset = $1;
last;
}
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.
} else {
while (<$fh>) {
last if !/^--/;
- next if !/^--\s*\@charset:\s*(.+)/;
+ next if !/^--\s*\@(?:charset|encoding):\s*(.+)/;
$file_charset = $1;
last;
}
before the current one is applied.
=item charset
+=item encoding
-The charset this file uses. Defaults to C<ISO-8859-15> if missing.
+The charset this file uses. Defaults to C<ISO-8859-15> if
+missing. Both terms are recognized.
=item priority