App-Sqitch
view release on metacpan or search on metacpan
lib/App/Sqitch/Engine/snowflake.pm view on Meta::CPAN
default => sub {
my $self = shift;
my $uri = $self->uri;
my @ret = ( $self->client );
for my $spec (
[ accountname => $self->account ],
[ username => $self->username ],
[ dbname => $uri->dbname ],
[ rolename => $self->role ],
) {
push @ret, "--$spec->[0]" => $spec->[1] if $spec->[1];
}
if (my %vars = $self->variables) {
push @ret => map {; '--variable', "$_=$vars{$_}" } sort keys %vars;
}
push @ret => $self->_client_opts;
return \@ret;
},
);
sub snowsql { @{ shift->_snowsql } }
has _snowcfg => (
is => 'rw',
isa => HashRef,
lazy => 1,
default => sub {
my $hd = App::Sqitch::Config->home_dir;
return {} if not $hd;
my $fn = dir $hd, '.snowsql', 'config';
return {} unless -e $fn;
my $data = App::Sqitch::Config->new->load_file($fn);
my $cfg = {};
for my $k (keys %{ $data }) {
# We only want the default connections config. No named config.
# (For now, anyway; maybe use database as config name laster?)
next unless $k =~ /\Aconnections[.]([^.]+)\z/;
my $key = $1;
my $val = $data->{$k};
# Apparently snowsql config supports single quotes, while
# Config::GitLike does not.
# https://support.snowflake.net/s/case/5000Z000010xUYJQA2
# https://docs.snowflake.com/en/user-guide/snowsql-config.html#snowsql-config-file
if ($val =~ s/\A'//) {
$val = $data->{$k} unless $val =~ s/'\z//;
}
$cfg->{$key} = $val;
}
return $cfg;
},
);
has uri => (
is => 'ro',
isa => URIDB,
lazy => 1,
default => sub {
my $self = shift;
my $uri = $self->SUPER::uri;
# Set defaults in the URI.
$uri->host($self->_host($uri));
$uri->dbname(
$ENV{SNOWSQL_DATABASE}
|| $self->_snowcfg->{dbname}
|| $self->username
) if !$uri->dbname;
return $uri;
},
);
sub _def_user {
$ENV{SNOWSQL_USER} || $_[0]->_snowcfg->{username} || $_[0]->sqitch->sysuser
}
sub _def_pass { $ENV{SNOWSQL_PWD} || shift->_snowcfg->{password} }
sub _def_acct {
my $acct = $ENV{SNOWSQL_ACCOUNT} || $_[0]->_snowcfg->{accountname}
|| hurl engine => __('Cannot determine Snowflake account name');
# XXX Region is deprecated as a separate value, because the acount name may now be
# <account_name>.<region_id>.<cloud_platform_or_private_link>
# https://docs.snowflake.com/en/user-guide/snowsql-start.html#a-accountname
# Remove from here down and just return on the line above once Snowflake removes it.
my $region = $ENV{SNOWSQL_REGION} || $_[0]->_snowcfg->{region} or return $acct;
return "$acct.$region";
}
has account => (
is => 'ro',
isa => Str,
lazy => 1,
default => sub {
my $self = shift;
if (my $host = $self->uri->host) {
# <account_name>.<region_id>.<cloud_platform_or_privatelink>.snowflakecomputing.com
$host =~ s/[.]snowflakecomputing[.]com$//;
return $host;
}
return $self->_def_acct;
},
);
sub _host {
my ($self, $uri) = @_;
if (my $host = $uri->host) {
return $host if $host =~ /\.snowflakecomputing\.com$/;
return $host . ".snowflakecomputing.com";
}
# XXX SNOWSQL_HOST is deprecated; remove it once Snowflake removes it.
return $ENV{SNOWSQL_HOST} if $ENV{SNOWSQL_HOST};
return $self->_def_acct . '.snowflakecomputing.com';
}
has warehouse => (
is => 'ro',
isa => Str,
lazy => 1,
default => sub {
( run in 0.776 second using v1.01-cache-2.11-cpan-5a3173703d6 )