>[оверквотинг удален]
> undef($@);
> eval {
> local $SIG{ALRM} = sub { &$timeoutaction_ref(@$$timeout_param_ref);
>};
> print "set timeout: $timeout sec .\n";
>
> alarm($timeout); #implement N second time out
>
> $result_ref = $obj->$action_symref( @$$param_ref);
>....у меня немного другая задумка была - так примерно:
в DBI есть, например, функции do, prepare и execute
есть так же функция errstr, в которая возвращает текст возникающих ошибок
т.е. я создаю класс и делаю запрос:
####### подключаюсь к серверу
my $db = DBI->new( 'DBI:mysql:database=base;host=host', $user, $psaaword );
####### пусть тут у меня неожиднно пропадает коннект к базе
####### где-то маршрутизатор сломался, например
sleep 5;
####### вот эта функция не выполнится о-о-очень долго из-за потери связи
####### она должна быть "обернута в таймаут уловитель"
my $res = $db->do( 'SELECT * FROM duel' );
unless( $res ) {
print $db->errstr;
}
вот как бы сделать так, чтобы я по прежнему мог использовать do функцию DBI модуля без всяческих ухищрений, а если будет ошибка по таймауту, то эта ошибка так же будет в доступна через errstr?
т.е. я так понимаю, что нужно унаследовать DBI класс и перегрузить все функции - do, prepare и execute - так, что бы они работали через "таймаут уловитель", т.е. что то типа этого:
package MyDBI;
use DBI;
### тут перегрузить все функци, что мне нужны
sub do {
## оборачиваю родительскую функцию в "таймаут уловитель"
}
sub errstr {
## если будет таймаут, то эта функция будет возвращать текст ошибки таймаута
}
package main;
# использую MyDBI вместо DBI
my $db = MyDBI->new( 'DBI:mysql:database=base;host=host', $user, $psaaword );
sleep 5;
my $res = $db->do( 'SELECT * FROM duel' );
unless( $res ) {
print $db->errstr;
}
не хватает знаний по классам, что бы такую штуку сделать...