I would like to timeout this statement after about 15 secs
You want to set an alarm for 15 seconds, and attempt the connection in an eval block.
my $db;
eval {
local $SIG{ALRM} = sub { die "connect timeout\n" };
alarm 15;
$db = DBI->connect("DBI:Oracle:".... ) or die $DBI::errstr;
alarm 0;
};
if ($@) {
# timed out
die unless $@ eq "connect timeout\n";
}
elsif (!$db) {
# didn't connect
die "no database connection\n";
}
# $db is ok here
If you're running on Win32, I believe you're out of luck, because alarm isn't implemented. Or it could be that it is now implemented in 5.8.8 and/or there's another technique that taps Win32::API to achieve the same functionality.
update: it looks like alarm is implemented in Active Perl build 819 (version 5.8.8) at least (don't know which exact version introduced this).
H:\>perl -wle "eval {$SIG{ALRM}=sub{die qq{ook\n}}; alarm(3); 1 while
+1; alarm(0)}; print
$@"
ook
• another intruder with the mooring in the heart of the Perl
|