App-Sqitch
view release on metacpan or search on metacpan
lib/App/Sqitch/Engine/pg.pm view on Meta::CPAN
package App::Sqitch::Engine::pg;
use 5.010;
use Moo;
use utf8;
use Path::Class;
use DBI;
use Try::Tiny;
use App::Sqitch::X qw(hurl);
use Locale::TextDomain qw(App-Sqitch);
use App::Sqitch::Plan::Change;
use List::Util qw(first);
use App::Sqitch::Types qw(DBH ArrayRef);
use Type::Utils qw(enum);
use namespace::autoclean;
extends 'App::Sqitch::Engine';
our $VERSION = 'v1.6.1'; # VERSION
sub destination {
my $self = shift;
# Just use the target name if it doesn't look like a URI or if the URI
# includes the database name.
return $self->target->name if $self->target->name !~ /:/
|| $self->target->uri->dbname;
# Use the URI sans password, and with the database name added.
my $uri = $self->target->uri->clone;
$uri->password(undef) if $uri->password;
$uri->dbname(
$ENV{PGDATABASE}
|| $self->username
|| $ENV{PGUSER}
|| $self->sqitch->sysuser
);
return $uri->as_string;
}
# DBD::pg and psql use fallbacks consistently, thanks to libpq. These include
# environment variables, system info (username), the password file, and the
# connection service file. Best for us not to second-guess these values,
# though we admittedly try when setting the database name in the destination
# URI for unnamed targets a few lines up from here.
sub _def_user { }
sub _def_pass { }
has _psql => (
is => 'ro',
isa => ArrayRef,
lazy => 1,
default => sub {
my $self = shift;
my $uri = $self->uri;
my @ret = ( $self->client );
my %query_params = $uri->query_params;
my @conninfo;
# Use _port instead of port so it's empty if no port is in the URI.
# https://github.com/sqitchers/sqitch/issues/675
for my $spec (
[ user => $self->username ],
[ dbname => $uri->dbname ],
[ host => $uri->host ],
[ port => $uri->_port ],
map { [ $_ => $query_params{$_} ] }
sort keys %query_params,
) {
next unless defined $spec->[1] && length $spec->[1];
if ($spec->[1] =~ /[ "'\\]/) {
$spec->[1] =~ s/([ "'\\])/\\$1/g;
}
push @conninfo, "$spec->[0]=$spec->[1]";
}
push @ret => '--dbname', join ' ', @conninfo if @conninfo;
if (my %vars = $self->variables) {
push @ret => map {; '--set', "$_=$vars{$_}" } sort keys %vars;
}
push @ret => $self->_client_opts;
return \@ret;
},
);
sub _client_opts {
my $self = shift;
return (
'--quiet',
'--no-psqlrc',
'--no-align',
'--tuples-only',
'--set' => 'ON_ERROR_STOP=1',
'--set' => 'registry=' . $self->registry,
);
}
sub psql { @{ shift->_psql } }
sub key { 'pg' }
sub name { 'PostgreSQL' }
( run in 1.196 second using v1.01-cache-2.11-cpan-39bf76dae61 )