Here's the issue in syb_st_finish() ( when $sth->finish is called):
finish() is called. If flush_finish, then while the statement is active and the connect isn't dead, fetch all the rows one after the other until the return value is null.
Now in the case where there's an error in the dbh, you risk an infinite loop because the dbh isn't dead, the statement is still active, and you're trying to fetch all the rows. On every fetch the db connect returns the same dbh error that isn't doing you any good and isn't triggering any of the exit statements.
This case can and does happen in some arcane setups such as when using openswitch which doesn't kill your dbh but invalidates it. All we need to do is put a check for a dbh error.
--- DBD-Sybase-1.02/dbdimp.c.orig 2003-10-28 13:21:27.000000000 -0800
+++ DBD-Sybase-1.02/dbdimp.c 2003-10-28 13:25:26.000000000 -0800
@@ -2762,7 +2762,8 @@
connection = imp_sth->connection ? imp_sth->connection :
imp_dbh->connection;
- if (imp_dbh->flushFinish) {
+ if (imp_dbh->flushFinish && !(SvOK(DBIc_ERR(imp_dbh)))) {
+ /* only flush if there is no error, otherwise we risk an infinite
loop */
if(DBIS->debug >= 2)
PerlIO_printf(DBILOGFP, " syb_st_finish() -> flushing\n");
while (DBIc_ACTIVE(imp_sth) && !imp_dbh->isDead) {
On Jul 2, 2004, at 10:56 PM, Michael Peppler wrote:
On Fri, 2004-07-02 at 22:06, David Good wrote:On Fri, Jul 02, 2004 at 08:37:43PM +0200, Michael Peppler <[EMAIL PROTECTED]> wrote:On Fri, 2004-07-02 at 20:19, David Good wrote:I'm having trouble with DBD::Sybase 1.04 on ActivePerl 5.8.4 (build 810)
on Windows. It seems to hang when connecting. Here's a sample script
that exercises the problem:
-> DESTROY for DBD::Sybase::st (DBI::st=HASH(0x1c1ca7c)~INNER) thr#15d4a54DESTROY DISPATCH (DBI::st=HASH(0x1c1ca7c) rc1/1 @1 g0 ima4 pid#2184) at c:/Perl/site/lib/DBD/Sybase.pm line 99 via foo line 10
syb_st_finish() -> ct_cancel(CS_CANCEL_ALL)
I don't know why, but the ct_cancel() call often causes problems - in
particular if the client and the server aren't on the same network (i.e.
firewalls, routers, etc.)
Try adding the syb_flush_finish => 1 attribute in the connect() call, and read about this attribute in the DBD::Sybase docs.
Well, that fixed it, but the client and server are on the same network, so
I'm not sure what the deal is. Oh well, as long as it works :-)
It might also be a bug in the ct_cancel() implementation on Windows for this version of the SDK.
Michael -- Michael Peppler Data Migrations, Inc. [EMAIL PROTECTED] http://www.peppler.org/ Sybase T-SQL/OpenClient/OpenServer/C/Perl developer available for short or long term contract positions - http://www.peppler.org/resume.html
