App-Sqitch
view release on metacpan or search on metacpan
lib/App/Sqitch/Engine/oracle.pm view on Meta::CPAN
my ($self, $file) = @_;
# Just use the file if no special character.
if ($file !~ /[@?%\$]/) {
$file =~ s/"/""/g;
return $file;
}
# Alias or copy the file to a temporary directory that's removed on exit.
(my $alias = $file->basename) =~ s/[@?%\$]/_/g;
$alias = $self->tmpdir->file($alias);
# Remove existing file.
if (-e $alias) {
$alias->remove or hurl oracle => __x(
'Cannot remove {file}: {error}',
file => $alias,
error => $!
);
}
if (App::Sqitch::ISWIN) {
# Copy it.
$file->copy_to($alias) or hurl oracle => __x(
'Cannot copy {file} to {alias}: {error}',
file => $file,
alias => $alias,
error => $!
);
} else {
# Symlink it.
$alias->remove;
symlink $file->absolute, $alias or hurl oracle => __x(
'Cannot symlink {file} to {alias}: {error}',
file => $file,
alias => $alias,
error => $!
);
}
# Return the alias.
$alias =~ s/"/""/g;
return $alias;
}
sub run_file {
my $self = shift;
my $file = $self->_file_for_script(shift);
$self->_run(qq{\@"$file"});
}
sub _run_with_verbosity {
my $self = shift;
my $file = $self->_file_for_script(shift);
# Suppress STDOUT unless we want extra verbosity.
my $meth = $self->can($self->sqitch->verbosity > 1 ? '_run' : '_capture');
$self->$meth(qq{\@"$file"});
}
sub run_upgrade { shift->_run_with_verbosity(@_) }
sub run_verify { shift->_run_with_verbosity(@_) }
sub run_handle {
my ($self, $fh) = @_;
my $conn = $self->_script;
open my $tfh, '<:utf8_strict', \$conn;
$self->sqitch->spool( [$tfh, $fh], $self->sqlplus );
}
# Override to take advantage of the RETURNING expression, and to save tags as
# an array rather than a space-delimited string.
sub log_revert_change {
my ($self, $change) = @_;
my $dbh = $self->dbh;
my $cid = $change->id;
# Delete tags.
my $sth = $dbh->prepare(
'DELETE FROM tags WHERE change_id = ? RETURNING tag INTO ?',
);
$sth->bind_param(1, $cid);
$sth->bind_param_inout_array(2, my $del_tags = [], 0, {
ora_type => DBD::Oracle::ORA_VARCHAR2()
});
$sth->execute;
# Retrieve dependencies.
my $depcol = sprintf $self->_listagg_format, 'dependency';
my ($req, $conf) = $dbh->selectrow_array(qq{
SELECT (
SELECT $depcol
FROM dependencies
WHERE change_id = ?
AND type = 'require'
),
(
SELECT $depcol
FROM dependencies
WHERE change_id = ?
AND type = 'conflict'
) FROM dual
}, undef, $cid, $cid);
# Delete the change record.
$dbh->do(
'DELETE FROM changes where change_id = ?',
undef, $change->id,
);
# Log it.
return $self->_log_event( revert => $change, $del_tags, $req, $conf );
}
sub _no_table_error {
return $DBI::err && $DBI::err == 942; # ORA-00942: table or view does not exist
}
sub _no_column_error {
return $DBI::err && $DBI::err == 904; # ORA-00904: invalid identifier
}
( run in 0.883 second using v1.01-cache-2.11-cpan-5a3173703d6 )