(dbi) add --exec-timeout option (#3921)
This commit is contained in:
parent
b261b6fad4
commit
165565652d
|
@ -24,6 +24,7 @@ use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use DBI;
|
use DBI;
|
||||||
use Digest::MD5 qw(md5_hex);
|
use Digest::MD5 qw(md5_hex);
|
||||||
|
use POSIX qw(:signal_h);
|
||||||
|
|
||||||
my %handlers = ( ALRM => {} );
|
my %handlers = ( ALRM => {} );
|
||||||
|
|
||||||
|
@ -54,6 +55,7 @@ sub new {
|
||||||
'connect-query:s@' => { name => 'connect_query' },
|
'connect-query:s@' => { name => 'connect_query' },
|
||||||
'sql-errors-exit:s' => { name => 'sql_errors_exit', default => 'unknown' },
|
'sql-errors-exit:s' => { name => 'sql_errors_exit', default => 'unknown' },
|
||||||
'timeout:s' => { name => 'timeout' },
|
'timeout:s' => { name => 'timeout' },
|
||||||
|
'exec-timeout:s' => { name => 'exec_timeout' }
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
$options{options}->add_help(package => __PACKAGE__, sections => 'DBI OPTIONS', once => 1);
|
$options{options}->add_help(package => __PACKAGE__, sections => 'DBI OPTIONS', once => 1);
|
||||||
|
@ -146,6 +148,10 @@ sub check_options {
|
||||||
$self->{option_results}->{timeout} > 0) {
|
$self->{option_results}->{timeout} > 0) {
|
||||||
$self->{timeout} = $self->{option_results}->{timeout};
|
$self->{timeout} = $self->{option_results}->{timeout};
|
||||||
}
|
}
|
||||||
|
if (defined($self->{option_results}->{exec_timeout}) && $self->{option_results}->{exec_timeout} =~ /^\d+$/ &&
|
||||||
|
$self->{option_results}->{exec_timeout} > 0) {
|
||||||
|
$self->{exec_timeout} = $self->{option_results}->{exec_timeout};
|
||||||
|
}
|
||||||
|
|
||||||
if (!defined($self->{data_source}) || $self->{data_source} eq '') {
|
if (!defined($self->{data_source}) || $self->{data_source} eq '') {
|
||||||
$self->{output}->add_option_msg(short_msg => 'Need to specify data_source arguments.');
|
$self->{output}->add_option_msg(short_msg => 'Need to specify data_source arguments.');
|
||||||
|
@ -303,7 +309,27 @@ sub query {
|
||||||
$self->{output}->option_exit(exit_litteral => $self->{sql_errors_exit});
|
$self->{output}->option_exit(exit_litteral => $self->{sql_errors_exit});
|
||||||
}
|
}
|
||||||
|
|
||||||
my $rv = $self->{statement_handle}->execute();
|
my $rv;
|
||||||
|
if (defined($self->{exec_timeout})) {
|
||||||
|
my $mask = POSIX::SigSet->new(SIGALRM);
|
||||||
|
my $action = POSIX::SigAction->new(
|
||||||
|
sub { $self->handle_ALRM() },
|
||||||
|
$mask,
|
||||||
|
);
|
||||||
|
my $oldaction = POSIX::SigAction->new();
|
||||||
|
sigaction(SIGALRM, $action, $oldaction);
|
||||||
|
eval {
|
||||||
|
eval {
|
||||||
|
alarm($self->{exec_timeout});
|
||||||
|
$rv = $self->{statement_handle}->execute();
|
||||||
|
};
|
||||||
|
alarm(0);
|
||||||
|
};
|
||||||
|
sigaction(SIGALRM, $oldaction);
|
||||||
|
} else {
|
||||||
|
$rv = $self->{statement_handle}->execute();
|
||||||
|
}
|
||||||
|
|
||||||
if (!$rv) {
|
if (!$rv) {
|
||||||
return 1 if ($continue_error == 1);
|
return 1 if ($continue_error == 1);
|
||||||
$self->{output}->add_option_msg(short_msg => 'Cannot execute query: ' . $self->{statement_handle}->errstr);
|
$self->{output}->add_option_msg(short_msg => 'Cannot execute query: ' . $self->{statement_handle}->errstr);
|
||||||
|
@ -359,6 +385,10 @@ Exit code for DB Errors (default: unknown)
|
||||||
|
|
||||||
Timeout in seconds for connection
|
Timeout in seconds for connection
|
||||||
|
|
||||||
|
=item B<--exec-timeout>
|
||||||
|
|
||||||
|
Timeout in seconds for query execution
|
||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
=head1 DESCRIPTION
|
||||||
|
|
Loading…
Reference in New Issue