package Jifty::Plugin::SetupWizard::Action::TestDatabaseConnectivity; use strict; use warnings; use base 'Jifty::Action'; use Jifty::Param::Schema; use Jifty::Action schema { param driver => is mandatory, type is 'text', default is defer { Jifty->config->framework('Database')->{Driver} }; param database => is mandatory, type is 'text', default is defer { Jifty->config->framework('Database')->{Database} }; param host => type is 'text', default is defer { Jifty->config->framework('Database')->{Host} }; param port => type is 'integer', default is defer { Jifty->config->framework('Database')->{Port} }; param user => type is 'text', default is defer { Jifty->config->framework('Database')->{User} }; param password => type is 'password', default is defer { Jifty->config->framework('Database')->{Password} }; param requiressl => type is 'boolean', default is defer { Jifty->config->framework('Database')->{RequireSSL} }; }; sub take_action { my $self = shift; # Remove empty arguments (empty port confuses DBI) # Maybe should go in Jifty::DBI. it does handle undef.. my %args = %{ $self->argument_values }; for my $key (keys %args) { delete $args{$key} if !defined($args{$key}) || !length($args{$key}); } my $handle = Jifty::DBI::Handle->new; my $ok = eval { local $SIG{__DIE__}; # Connect returns undef if there's already a connection, so we # only report failure to connect if an exception was thrown $handle->connect(%args); 1; }; my $error = $@; # database will be created, so not worth complaining about this $ok = 1 if $error =~ /Connection failed: Unknown database '/ || $error =~ /Connection failed: .* database ".*" does not exist/; if (!$ok) { $error ||= _("No handle created"); warn $error; $error =~ s/ at .* line \d+$//; return $self->result->error($error); } $self->result->message(_('Connection successful')); } 1; __END__ =head1 NAME Jifty::Plugin::SetupWizard::Action::TestDatabaseConnectivity - Test database connectivity action =head1 METHODS =head2 take_action Tests the database connectivity! =cut