App-Sqitch
view release on metacpan or search on metacpan
lib/App/Sqitch/Engine/vertica.pm view on Meta::CPAN
return $self->dbh->selectcol_arrayref(q{
SELECT EXISTS(
SELECT TRUE FROM v_catalog.schemata WHERE schema_name = ?
)
}, undef, $self->registry)->[0];
}
sub _initialize {
my $self = shift;
my $schema = $self->registry;
hurl engine => __x(
'Sqitch schema "{schema}" already exists',
schema => $schema
) if $self->initialized;
$self->_run_registry_file( file(__FILE__)->dir->file('vertica.sql') );
$self->dbh->do('SET search_path = ' . $self->dbh->quote($schema));
$self->_register_release;
}
sub run_upgrade {
shift->_run_registry_file(@_);
}
sub _run_registry_file {
my ($self, $file) = @_;
# Check the database version.
my $vline = $self->dbh->selectcol_arrayref('SELECT version()')->[0];
my ($maj) = $vline =~ /\bv?(\d+)/;
# Need to write a temp file; no :"registry" variable syntax.
my ($schema) = $self->dbh->selectrow_array(
'SELECT quote_ident(?)', undef, $self->registry
);
(my $sql = scalar $file->slurp) =~ s{:"registry"}{$schema}g;
# Write out the temporary file.
require File::Temp;
my $fh = File::Temp->new;
print $fh $sql;
close $fh;
# Now we can execute the file.
$self->_run_with_verbosity( $fh->filename );
}
sub _no_table_error {
return $DBI::state && $DBI::state eq '42V01'; # ERRCODE_UNDEFINED_TABLE
}
sub _no_column_error {
return $DBI::state && $DBI::state eq '42703'; # ERRCODE_UNDEFINED_COLUMN
}
sub _unique_error {
return $DBI::state && $DBI::state eq '23505'; # ERRCODE_UNIQUE_VIOLATION
}
sub _dt($) {
require App::Sqitch::DateTime;
return App::Sqitch::DateTime->new(split /:/ => shift);
}
sub _multi_values {
my ($self, $count, $expr) = @_;
return join "\nUNION ALL ", ("SELECT $expr") x $count;
}
sub _dependency_placeholders {
return 'CAST(? AS CHAR(40)), CAST(? AS VARCHAR), CAST(? AS VARCHAR), CAST(? AS CHAR(40))';
}
sub _tag_placeholders {
my $self = shift;
return join(', ',
'CAST(? AS CHAR(40))',
'CAST(? AS VARCHAR)',
'CAST(? AS VARCHAR)',
'CAST(? AS CHAR(40))',
'CAST(? AS VARCHAR)',
'CAST(? AS VARCHAR)',
'CAST(? AS VARCHAR)',
'CAST(? AS TIMESTAMPTZ)',
'CAST(? AS VARCHAR)',
'CAST(? AS VARCHAR)',
$self->_ts_default,
);
}
sub _tag_subselect_columns {
my $self = shift;
return join(', ',
'CAST(? AS CHAR(40)) AS tid',
'CAST(? AS VARCHAR) AS tname',
'CAST(? AS VARCHAR) AS proj',
'CAST(? AS CHAR(40)) AS cid',
'CAST(? AS VARCHAR) AS note',
'CAST(? AS VARCHAR) AS cuser',
'CAST(? AS VARCHAR) AS cemail',
'CAST(? AS TIMESTAMPTZ) AS tts',
'CAST(? AS VARCHAR) AS puser',
'CAST(? AS VARCHAR) AS pemail',
$self->_ts_default,
);
}
sub _select_state {
my ( $self, $project, $with_hash ) = @_;
my $cdtcol = sprintf $self->_ts2char_format, 'c.committed_at';
my $pdtcol = sprintf $self->_ts2char_format, 'c.planned_at';
my $hshcol = $with_hash ? "c.script_hash\n , " : '';
return $self->dbh->selectrow_hashref(qq{
SELECT c.change_id
, ${hshcol}c.change
, c.project
, c.note
, c.committer_name
, c.committer_email
, $cdtcol AS committed_at
, c.planner_name
, c.planner_email
( run in 0.463 second using v1.01-cache-2.11-cpan-99c4e6809bf )