App-Sqitch
view release on metacpan or search on metacpan
lib/App/Sqitch/Engine/snowflake.pm view on Meta::CPAN
}
has warehouse => (
is => 'ro',
isa => Str,
lazy => 1,
default => sub {
my $self = shift;
my $uri = $self->uri;
require URI::QueryParam;
$uri->query_param('warehouse')
|| $ENV{SNOWSQL_WAREHOUSE}
|| $self->_snowcfg->{warehousename}
|| 'sqitch';
},
);
has role => (
is => 'ro',
isa => Str,
lazy => 1,
default => sub {
my $self = shift;
my $uri = $self->uri;
require URI::QueryParam;
$uri->query_param('role')
|| $ENV{SNOWSQL_ROLE}
|| $self->_snowcfg->{rolename}
|| '';
},
);
has dbh => (
is => 'rw',
isa => DBH,
lazy => 1,
default => sub {
my $self = shift;
$self->use_driver;
my $wh = $self->warehouse;
my $role = $self->role;
DBI->connect($self->_dsn, $self->username, $self->password, {
PrintError => 0,
RaiseError => 0,
AutoCommit => 1,
odbc_utf8_on => 1,
FetchHashKeyName => 'NAME_lc',
HandleError => $self->error_handler,
Callbacks => {
connected => sub {
my $dbh = shift;
my $role = $self->role;
# Use LITERAL(), but not for WAREHOUSE, which might be
# database-qualified (db.wh). Details on IDENTIFIER():
# https://docs.snowflake.com/en/sql-reference/identifier-literal
$dbh->do($_) or return for (
($role ? ('USE ROLE IDENTIFIER(' . $dbh->quote($role) . ')') : ()),
"ALTER WAREHOUSE $wh RESUME IF SUSPENDED",
"USE WAREHOUSE $wh",
'ALTER SESSION SET TIMESTAMP_TYPE_MAPPING=TIMESTAMP_LTZ',
"ALTER SESSION SET TIMESTAMP_OUTPUT_FORMAT='YYYY-MM-DD HH24:MI:SS'",
"ALTER SESSION SET TIMEZONE='UTC'",
);
$dbh->do('USE SCHEMA IDENTIFIER(' . $dbh->quote($self->registry) . ')')
or $self->_handle_no_registry($dbh);
return;
},
disconnect => sub {
my $dbh = shift;
$dbh->do("ALTER WAREHOUSE $wh SUSPEND");
return;
},
},
});
}
);
# Need to wait until dbh is defined.
with 'App::Sqitch::Role::DBIEngine';
sub _client_opts {
return (
'--noup',
'--option' => 'auto_completion=false',
'--option' => 'echo=false',
'--option' => 'execution_only=false',
'--option' => 'friendly=false',
'--option' => 'header=false',
'--option' => 'exit_on_error=true',
'--option' => 'stop_on_error=true',
'--option' => 'output_format=csv',
'--option' => 'paging=false',
'--option' => 'timing=false',
# results=false suppresses errors! Bug report:
# https://support.snowflake.net/s/case/5000Z000010wm6BQAQ/
'--option' => 'results=true',
'--option' => 'wrap=false',
'--option' => 'rowset_size=1000',
'--option' => 'syntax_style=default',
'--option' => 'variable_substitution=true',
'--variable' => 'registry=' . $_[0]->registry,
'--variable' => 'warehouse=' . $_[0]->warehouse,
);
}
sub _quiet_opts {
return (
'--option' => 'quiet=true',
);
}
sub _verbose_opts {
return (
'--option' => 'quiet=false',
);
}
# Not using arrays, but delimited strings that are the default in
# App::Sqitch::Role::DBIEngine, because:
# * There is currently no literal syntax for arrays
# https://support.snowflake.net/s/case/5000Z000010wXBRQA2/
( run in 0.763 second using v1.01-cache-2.11-cpan-ceb78f64989 )