I am using DBI-1.37 and DBD::Oracle-1.06 successfully with the
application yasql-1.81 (an sqlplus replacement).  But when I tried
installing DBD::Oracle-1.14, yasql appeared to work as normal but
developed a strange timeout problem.  After working correctly for
about 20 seconds after login, it would print

    Warning: Connection lost (timeout: 20)

and then exit.  If no SQL commands had been sent to the database then
the message would be 'Alarm Clock' instead.

I mention these messages so that search engines will find them.  A bit
of digging shows that the problem is caused by an alarm signal being
received even though alarm(0) has been called.  In other words, code
like

    alarm(20);
    alarm(0);
    print "waiting\n";
    0 while 1;

will print 'waiting' and then get SIGALRM.  I have reduced the bug to
a test case of two files.  First a stripped-down DBI.pm:

    package DBI;
    use DynaLoader;
    @ISA = qw(DynaLoader);
    bootstrap DBI;
    sub install_driver {
        eval 'require DBD::Oracle;';
    }
    1;

Save this code as DBI.pm.min.  Then create another file:

    $SIG{ALRM} = sub { print "got alarm\n"; exit(0) };
    alarm(1); print "set alarm\n";
    package DBD::Oracle;
    require 'DBI.pm.min';
    @ISA = qw(DynaLoader);
    bootstrap DBD::Oracle;
    alarm(0); print "unset alarm\n";
    0 while 1;

Save this and run it with perl.  The expected output would be

set alarm
unset alarm

followed by an infinite loop which you can interrupt with C-c.  But on
my system it prints

set alarm
unset alarm
got alarm

showing that alarm(0) did not stop alarms from happening.

As likely as not this is a problem with my particular system:

% uname -a
SunOS ftidev1.london.kbcfp.com 5.8 Generic_108528-15 sun4u sparc SUNW,Sun-Fire-280R 
Solaris

but still I'd appreciate it if others could try this test case and see
what it does.  It needs DBD::Oracle installed; the strange thing is
that it works correctly with DBD::Oracle-1.06 but not with 1.14.  I
haven't yet narrowed down the versions further.

-- 
Ed Avis <[EMAIL PROTECTED]>

Reply via email to