Skip to Content.
Sympa Menu

freetds - RE: followup on infinite loop issue

freetds AT lists.ibiblio.org

Subject: FreeTDS Development Group

List archive

Chronological Thread  
  • From: Michael Peppler <mpeppler AT peppler.org>
  • To: TDS Development Group <freetds AT franklin.metalab.unc.edu>
  • Subject: RE: followup on infinite loop issue
  • Date: 28 Oct 2002 08:14:05 -0800

I'm almost 100% certain that this is a FreeTDS problem, as this works
perfectly well when using the Sybase libraries.

Anyway, to clarify what ct_sql() does:


while(($rc = $db->ct_results($res_type)) == &CS_SUCCEED) {
# The $rc variable is used *after* the loop to check for other types of
# failures (i.e. if ct_results returns CS_FAIL, for example)

# If the $res_type == CS_CMD_DONE, then fetch the rowcount and store it
# in $db->{ROW_COUNT}
$db->{'ROW_COUNT'} = $db->ct_res_info(&CS_ROW_COUNT)
if $res_type == &CS_CMD_DONE;

# If the $res_type == CS_CMD_FAIL then set a "fail" flag (used below)
$fail = 1 if ($res_type == &CS_CMD_FAIL);

# Go to next result if the current result type is not "fetchable"
# (CS_ROW_RESULT, CS_STATUS_RESULT, etc)
next unless $fetchable{$res_type};

# If the ct_sql_nostatus variable is set, and if the result type
# is a CS_STATUS_RESULT, then fetch the data and throw it away.
# The point here being that if you execute a stored proc and are
# looking for the rows SELECTed in the proc, having an additional
# entry in the array returned from ct_sql() with the procs return status
# can be annoying
if($Sybase::CTlib::ct_sql_nostatus && $res_type == &CS_STATUS_RESULT)
{
while ($data = $db->ct_fetch(0, 1)) {
; #skip return codes from procs...
}
}

# Now fetch any rows, in either hash or array format.
while ($data = $db->ct_fetch($flag, 1)) {
if (defined $sub) {
if($flag) {
&$sub(%$data);
} else {
&$sub(@$data);
}
} else {
if($flag) {
push(@res, {%$data});
} else {
push(@res, [@$data]);
}
}
}
}
if($db->{'MaxRows'}) {
$db->ct_options(&CS_SET, &CS_OPT_ROWCOUNT, 0, &CS_INT_TYPE);
}
$db->{RC} = $fail ? CS_FAIL : $rc;
wantarray ? @res : \@res; # return the result array


I don't know where this goes into an infinite loop. You could try
running it with debugging turned on (Sybase::CTlib::debug(0xffffffff))
and see what calls it tries to execute...

Michael

On Mon, 2002-10-28 at 06:20, Wilson, John wrote:
> Thanks Bill,
> I also noticed this:
> at 1) I don't understand why there is an if statement here.
> Was this ment to be an assignment?
> at 2) was there some intent on using $data within the while loop here?
>
> Hopefully Michael can shed some light on this one.
> In the mean time, I'll try and use nsql().
> thanks
> jd wilson
> _______________________________________________________________
> while(($rc = $db->ct_results($res_type)) == &CS_SUCCEED) {
> $db->{'ROW_COUNT'} = $db->ct_res_info(&CS_ROW_COUNT)
>
> 1) if $res_type == &CS_CMD_DONE;
>
> $fail = 1 if ($res_type == &CS_CMD_FAIL);
> next unless $fetchable{$res_type};
>
> if($Sybase::CTlib::ct_sql_nostatus && $res_type ==
> &CS_STATUS_RESULT) {
> 2) while ($data = $db->ct_fetch(0, 1)) {
> ; #skip return codes from procs...
> }
> }
> ....
> }
> _________________________________________________________________
>
> -----Original Message-----
> From: Thompson, Bill D (London) [mailto:ThompBil AT exchange.uk.ml.com]
> Sent: Monday, October 28, 2002 3:40 AM
> To: TDS Development Group
> Subject: [freetds] RE: followup on infinite loop issue
>
>
> I'm no expert by ANY MEANS, but it appears that nsql() and ct_sql are subtly
> different in one respect, although whether this is significant I don't know:
>
> ct_sql :
>
> while(($rc = $db->ct_results($res_type)) == &CS_SUCCEED) {
> ...
> next unless $fetchable{$res_type};
> ...
> }
>
> nsql:
>
> while($db->ct_results($restype) == &CS_SUCCEED) {
> ...
> next unless $db->ct_fetchable($restype);
> ...
> }
>
>
> Certainly, an inability to spot that there is some data that needs fetching
> before looping round and calling ct_results again would explain the symptoms
> you are seeing...
>
>
> Bill
> > -----Original Message-----
> > From: Wilson, John [SMTP:John.Wilson AT savvis.net]
> > Sent: Monday, October 28, 2002 12:36 AM
> > To: TDS Development Group
> > Subject: [freetds] followup on infinite loop issue
> >
> >
> > This problem is also documented the Sybperl Bug list..
> >
> > I have been trying to figure out why ct_sql() is getting caught in an
> > infinite loop. In running some perl code that used to work under OCS12.0,
> > it now goes into an infinite loop under FreeTDS.
> >
> > I'm not 100% sure this is a sybperl issue or FreeTDS issue, but the
> > sybperl
> > test code ct_sql.pl modified to access my DB, is also failing in a similar
> > way as my (inherited) source code.
> >
> > Here is the modified ct_sql.pl code which is just calling "select
> > @@version".
> > ________________________________________________________
> > #!/usr/local/bin/perl
> > #
> > # @(#)ct_sql.pl 1.2 8/7/95
> >
> > # Using the special one step query routine ct_sql().
> >
> > use Sybase::CTlib;
> >
> > print "creating new CTlib object...\n";
> > $d = new Sybase::CTlib my_user, my_pass, RTDBASESQL;
> >
> > # ct_sql() returns a 'reference' to an array:
> > $ref = $d->ct_sql("select \@\@version");
> >
> > foreach $line (@$ref) # 'de-reference' the pointer
> > {
> > print "@$line\n";
> > }
> >
> > ...
> >
> > it does not get past this point...
> > _____________________________________________________
> >
> > Here it the TDSDUMP, note comments below:
> > _____________________________________________________
> > 2002-10-27 17:13:07.947192 inside ct_command()
> > 2002-10-27 17:13:07.947429 inside ct_send()
> > Sending packet @ 2002-10-27 17:13:07.947688
> > 0000 01 01 00 28 00 00 01 00 73 00 65 00 6c 00 65 00 |...(....s
> > .e.l.e.|
> > 0010 63 00 74 00 20 00 40 00 40 00 76 00 65 00 72 00 |c.t. .@.@
> > .v.e.r.|
> > 0020 73 00 69 00 6f 00 6e 00 |s.i.o.n.|
> >
> >
> > 2002-10-27 17:13:07.948044 ct_send() succeeded
> > 2002-10-27 17:13:07.948547 inside ct_results()
> > Received header @ 2002-10-27 17:13:07.948925
> > 0000 04 01 01 97 00 37 01 00 |.....7..|
> >
> >
> > Received packet @ 2002-10-27 17:13:07.949189
> > 0000 81 01 00 00 00 01 00 e7 58 02 00 d1 78 01 4d 00 |........X
> > ...x.M.|
> > 0010 69 00 63 00 72 00 6f 00 73 00 6f 00 66 00 74 00 |i.c.r.o.s
> > .o.f.t.|
> > 0020 20 00 53 00 51 00 4c 00 20 00 53 00 65 00 72 00 | .S.Q.L.
> > .S.e.r.|
> > 0030 76 00 65 00 72 00 20 00 20 00 32 00 30 00 30 00 |v.e.r. .
> > .2.0.0.|
> > 0040 30 00 20 00 2d 00 20 00 38 00 2e 00 30 00 30 00 |0. .-. .8
> > ...0.0.|
> > 0050 2e 00 31 00 39 00 34 00 20 00 28 00 49 00 6e 00 |..1.9.4.
> > .(.I.n.|
> > 0060 74 00 65 00 6c 00 20 00 58 00 38 00 36 00 29 00 |t.e.l. .X
> > .8.6.).|
> > 0070 20 00 0a 00 09 00 41 00 75 00 67 00 20 00 20 00 | .....A.u .g. .
> > .|
> > 0080 36 00 20 00 32 00 30 00 30 00 30 00 20 00 30 00 |6. .2.0.0 .0.
> > .0.|
> > 0090 30 00 3a 00 35 00 37 00 3a 00 34 00 38 00 20 00 |0.:.5.7.: .4.8.
> > .|
> > 00a0 0a 00 09 00 43 00 6f 00 70 00 79 00 72 00 69 00 |....C.o.p
> > .y.r.i.|
> > 00b0 67 00 68 00 74 00 20 00 28 00 63 00 29 00 20 00 |g.h.t. .( .c.).
> > .|
> > 00c0 31 00 39 00 38 00 38 00 2d 00 32 00 30 00 30 00 |1.9.8.8.-
> > .2.0.0.|
> > 00d0 30 00 20 00 4d 00 69 00 63 00 72 00 6f 00 73 00 |0. .M.i.c
> > .r.o.s.|
> > 00e0 6f 00 66 00 74 00 20 00 43 00 6f 00 72 00 70 00 |o.f.t. .C
> > .o.r.p.|
> > 00f0 6f 00 72 00 61 00 74 00 69 00 6f 00 6e 00 0a 00 |o.r.a.t.i
> > .o.n...|
> > 0100 09 00 45 00 6e 00 74 00 65 00 72 00 70 00 72 00 |..E.n.t.e
> > .r.p.r.|
> > 0110 69 00 73 00 65 00 20 00 45 00 64 00 69 00 74 00 |i.s.e. .E
> > .d.i.t.|
> > 0120 69 00 6f 00 6e 00 20 00 6f 00 6e 00 20 00 57 00 |i.o.n. .o .n.
> > .W.|
> > 0130 69 00 6e 00 64 00 6f 00 77 00 73 00 20 00 4e 00 |i.n.d.o.w .s.
> > .N.|
> > 0140 54 00 20 00 35 00 2e 00 30 00 20 00 28 00 42 00 |T. .5...0 .
> > .(.B.|
> > 0150 75 00 69 00 6c 00 64 00 20 00 32 00 31 00 39 00 |u.i.l.d.
> > .2.1.9.|
> > 0160 35 00 3a 00 20 00 53 00 65 00 72 00 76 00 69 00 |5.:. .S.e
> > .r.v.i.|
> > 0170 63 00 65 00 20 00 50 00 61 00 63 00 6b 00 20 00 |c.e. .P.a .c.k.
> > .|
> > 0180 32 00 29 00 0a 00 fd 10 00 c1 00 01 00 00 00 |2.)......
> > ......|
> >
> >
> > 2002-10-27 17:13:07.950061 processing result tokens. marker is 81
> > 2002-10-27 17:13:07.950296 inside ct_results() process_result_tokens
> > returned 1 (type 4049)
> > 2002-10-27 17:13:07.950516 processing result tokens. marker is d1
> > 2002-10-27 17:13:07.950837 inside ct_results() process_result_tokens
> > returned 1 (type 4040)
> > 2002-10-27 17:13:07.951441 inside ct_results()
> > 2002-10-27 17:13:07.951671 processing result tokens. marker is d1
> > 2002-10-27 17:13:07.951885 inside ct_results() process_result_tokens
> > returned 1 (type 4040)
> > 2002-10-27 17:13:07.952142 inside ct_results()
> > [... etc ...]
> >
> > _____________________________________________________
> >
> > Note this is the same problem I had with my code. ct_sql goes into a
> > loop.
> > I have FreeTDS setup as Version 7.0 accessing MS SQL Server 2000. This
> > function has never worked to my knowledge in the current configuration.
> > Also, note that the ct_results() returns what is expected.
> > I hope this helps determine what the problem is, I could really use this
> > code. I'll also look into using nsql() as it appears to be handling the
> > returns codes differently.
> > thanks
> >
> > jd wilson
> >
> >
> > ---
> > You are currently subscribed to freetds as: [thompbil AT exchange.uk.ml.com]
> > To unsubscribe, forward this message to
> > $subst('Email.Unsub')
>
>
> ---
> You are currently subscribed to freetds as: [john.wilson AT savvis.net]
> To unsubscribe, forward this message to
> $subst('Email.Unsub')
>
> ---
> You are currently subscribed to freetds as: [mpeppler AT peppler.org]
> To unsubscribe, forward this message to
> leave-freetds-91463H AT franklin.oit.unc.edu
>
--
Michael Peppler / mpeppler AT peppler.org / http://www.mbay.net/~mpeppler
mpeppler AT zetatools.com / ZetaTools, Inc / http://www.zetatools.com
ZetaTools: Call perl functions as Sybase stored procedures!

Attachment: signature.asc
Description: This is a digitally signed message part




Archive powered by MHonArc 2.6.24.

Top of Page