Incompatibility with DBI v1.56 / DBD::Sybase v1.08 / DBIx::ContextualFetch v1.03

Incompatibility with DBI v1.56 / DBD::Sybase v1.08 / DBIx::ContextualFetch v1.03

Post by David.Woo » Thu, 31 May 2007 11:45:37


Hello,

We're running Perl v5.8.6 on Linux, Solaris Sparc, and Solaris x86.
We're using the latest DBI/DBD related modules:
o DBI v1.56
o DBD::Sybase v1.08
o DBIx::ContextualFetch v1.03
o Class::DBI v3.0.16
o Class::DBI::Sybase v0.5
o Ima::DBI v0.34
o etc

We recently upgraded DBD::Sybase from v1.07 to v1.08. The upgrade
resulted in the following problem on all platforms:

Undefined subroutine &DBIx::ContextualFetch::st::DELETE

I mentioned the problem to Michael Peppler; however, I don't think he's
very familiar with DBIx::ContextualFetch and friends ... nor am I sure
this is a DBD::Sybase problem. I narrowed down the failure to this
piece of code (DBD-Sybase/dbdimp.c):

static void clear_cache(SV *sth, imp_sth_t *imp_sth)
{
dTHX;

/* Code from DBI::DBD */
/* Clear cached statement handle attributes, if necessary */

hv_delete((HV*)SvRV(sth), "NAME", 4, G_DISCARD);
hv_delete((HV*)SvRV(sth), "NULLABLE", 8, G_DISCARD);
hv_delete((HV*)SvRV(sth), "NUM_OF_FIELDS", 13, G_DISCARD);
hv_delete((HV*)SvRV(sth), "PRECISION", 9, G_DISCARD);
hv_delete((HV*)SvRV(sth), "SCALE", 5, G_DISCARD);
hv_delete((HV*)SvRV(sth), "TYPE", 4, G_DISCARD);
}

It seems Michael was implementing the changes described here:

http://www.yqcomputer.com/ @XXXXX.COM /msg04663.html

http://www.yqcomputer.com/ ~timb/DBI-1.56/lib/DBI/DBD.pm#The_more_results_me
thod

I decided to e-mail dbi-users since the motivation for this change came
from here. If this isn't the correct list ... hopefully someone can
direct me to a more appropriate list. David
 
 
 

Incompatibility with DBI v1.56 / DBD::Sybase v1.08 / DBIx::ContextualFetch v1.03

Post by Tim.Bunc » Thu, 31 May 2007 19:00:16

Thanks for the report David.

I believe clear_cache() is only called on an 'inner' handle, which is
not tied. So I can't see why you'd get this error. (Or why the error
would say "Undefined subroutine" and not "Can't find method".)

To be able to look into this I'll need a very small test case that uses as
few modules as possible. Ideally just DBI + DBD::Sybase + DBIx::ContextualFetch.

Tim.

 
 
 

Incompatibility with DBI v1.56 / DBD::Sybase v1.08 / DBIx::ContextualFetch v1.03

Post by David.Woo » Fri, 08 Jun 2007 08:45:45

It took us a while to whittle this down into a small test case; however,
the fruits of labour seem to have paid off:

% perl -MDBI -e 'my $dbh =
DBI->connect("dbi:Sybase:server=MYSERVER","janedoe","janepass"); my
$arr_ref = $dbh->selectall_arrayref("execute sp_who"); print
@{$arr_ref->[0]},"\n";
Can't locate object method "DELETE" via package "DBI::st" at -e line 1.
%

The problem only seems to occur executing stored procedures ... notice a
"select" is fine:

% perl -MDBI -e 'my $dbh =
DBI->connect("dbi:Sybase:server=MYSERVER","janedoe","janepass"); my
$arr_ref = $dbh->selectall_arrayref("select 1"); print
@{$arr_ref->[0]},"\n";
1
%

The error with this small test case is different than the original
problem report ... but I'm hoping it uncovers whatever the underlying
problem is. David

-----Original Message-----
From: Tim Bunce [mailto: XXXX@XXXXX.COM ]
Sent: Wednesday, May 30, 2007 6:00 AM
To: Wood, David
Cc: XXXX@XXXXX.COM
Subject: Re: Incompatibility with DBI v1.56 / DBD::Sybase v1.08 /
DBIx::ContextualFetch v1.03

Thanks for the report David.

I believe clear_cache() is only called on an 'inner' handle, which is
not tied. So I can't see why you'd get this error. (Or why the error
would say "Undefined subroutine" and not "Can't find method".)

To be able to look into this I'll need a very small test case that uses
as
few modules as possible. Ideally just DBI + DBD::Sybase +
DBIx::ContextualFetch.

Tim.


he's
http://www.yqcomputer.com/ ~timb/DBI-1.56/lib/DBI/DBD.pm#The_more_results_me
came
 
 
 

Incompatibility with DBI v1.56 / DBD::Sybase v1.08 / DBIx::ContextualFetch v1.03

Post by mgaint » Fri, 08 Jun 2007 10:11:03

ood Evening David-

You will need BOTH DBI and DBIx::Procedure::DBName packages (where DBName is
name of DBVendor)
*assume* both of these packages are available from CPAN

so the 1st 3 lines of your perl script should look something like

#@/usr/local/bin/perl -w
use DBI:
use DBIx::Procedure::DBName

#then the code which works for Oracle....

my $dbh = DBI->connect( 'dbi:Oracle:',
qq{$db_username/$db_password@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=$db_host)(PORT=1521))(CONNECT_DATA=(SID=$db_SID)))}
)|| die "Database connection not made: $DBI::errstr";

print 'About to my $proc = DBIx::Procedure::Oracle->new($dbh, object_name =>
NameOfProcedure)';

#first set the object (change NameOfProcedure to actual NameOfProcedure)
my $proc = DBIx::Procedure::Oracle->new($dbh, object_name =>
'NameOfProcedure');

HTH/
Martin--
This email message and any files transmitted with it contain confidential
information intended only for the person(s) to whom this email message is
addressed. If you have received this email message in error, please notify
the sender immediately by telephone or email and destroy the original
message without making a copy. Thank you.

----- Original Message -----
From: "Wood, David" < XXXX@XXXXX.COM >
To: "Tim Bunce" < XXXX@XXXXX.COM >
Cc: < XXXX@XXXXX.COM >; < XXXX@XXXXX.COM >
Sent: Wednesday, June 06, 2007 7:45 PM
Subject: RE: Incompatibility with DBI v1.56 / DBD::Sybase v1.08 /
DBIx::ContextualFetch v1.03


It took us a while to whittle this down into a small test case; however,
the fruits of labour seem to have paid off:

% perl -MDBI -e 'my $dbh =
DBI->connect("dbi:Sybase:server=MYSERVER","janedoe","janepass"); my
$arr_ref = $dbh->selectall_arrayref("execute sp_who"); print
@{$arr_ref->[0]},"\n";
Can't locate object method "DELETE" via package "DBI::st" at -e line 1.
%

The problem only seems to occur executing stored procedures ... notice a
"select" is fine:

% perl -MDBI -e 'my $dbh =
DBI->connect("dbi:Sybase:server=MYSERVER","janedoe","janepass"); my
$arr_ref = $dbh->selectall_arrayref("select 1"); print
@{$arr_ref->[0]},"\n";
1
%

The error with this small test case is different than the original
problem report ... but I'm hoping it uncovers whatever the underlying
problem is. David

-----Original Message-----
From: Tim Bunce [mailto: XXXX@XXXXX.COM ]
Sent: Wednesday, May 30, 2007 6:00 AM
To: Wood, David
Cc: XXXX@XXXXX.COM
Subject: Re: Incompatibility with DBI v1.56 / DBD::Sybase v1.08 /
DBIx::ContextualFetch v1.03

Thanks for the report David.

I believe clear_cache() is only called on an 'inner' handle, which is
not tied. So I can't see why you'd get this error. (Or why the error
would say "Undefined subroutine" and not "Can't find method".)

To be able to look into this I'll need a very small test case that uses
as
few modules as possible. Ideally just DBI + DBD::Sybase +
DBIx::ContextualFetch.

Tim.

On Tue, May 29, 2007 at 10:45:37PM -0400, Wood, David wrote:
he's
http://search.cpan.org/~timb/DBI-1.56/lib/DBI/DBD.pm#The_more_results_me
came

 
 
 

Incompatibility with DBI v1.56 / DBD::Sybase v1.08 / DBIx::ContextualFetch v1.03

Post by Tim.Bunc » Fri, 08 Jun 2007 19:54:53


Excellent! Good small test cases lead to quick fixes...

The real bug here is an old one - almost 5 years old - in the DBI.
Here's a quick fix for DBD::Sybase 1.08 till DBI 1.57 is released:

--- dbdimp.c.orig 2007-04-19 11:31:19.000000000 -0700
+++ dbdimp.c 2007-06-07 03:40:57.000000000 -0700
@@ -3834,6 +3834,11 @@
return Nullav;
}

+ /* workaround for bug in DBI < 1.57: fetch was called with outer */
+ /* handle by XS versions of selectall_arrayref() etc. */
+ if (SvMAGICAL(SvRV(sth)) && mg_find(SvRV(sth),'P'))
+ sth = mg_find(SvRV(sth),'P')->mg_obj; /* switch to inner handle */
+
ChopBlanks = DBIc_has(imp_sth, DBIcf_ChopBlanks);

TryAgain:


Tim.
 
 
 

Incompatibility with DBI v1.56 / DBD::Sybase v1.08 / DBIx::ContextualFetch v1.03

Post by David.Woo » Sat, 09 Jun 2007 11:01:52

Much obliged for the quick fix Tim! I found another problem with
DBD::Sybase v1.08 and Ima::DBI ... although it was easy to work around.
I created these bug reports:

http://www.yqcomputer.com/
http://www.yqcomputer.com/

Everything now seems to be working with both of these patches. Yippee
:-). David

-----Original Message-----
From: Tim Bunce [mailto: XXXX@XXXXX.COM ]
Sent: Thursday, June 07, 2007 6:55 AM
To: Wood, David
Cc: Tim Bunce; XXXX@XXXXX.COM ; XXXX@XXXXX.COM
Subject: Re: Incompatibility with DBI v1.56 / DBD::Sybase v1.08 /
DBIx::ContextualFetch v1.03


however,
1.

Excellent! Good small test cases lead to quick fixes...

The real bug here is an old one - almost 5 years old - in the DBI.
Here's a quick fix for DBD::Sybase 1.08 till DBI 1.57 is released:

--- dbdimp.c.orig 2007-04-19 11:31:19.000000000 -0700
+++ dbdimp.c 2007-06-07 03:40:57.000000000 -0700
@@ -3834,6 +3834,11 @@
return Nullav;
}

+ /* workaround for bug in DBI < 1.57: fetch was called with outer
*/
+ /* handle by XS versions of selectall_arrayref() etc.
*/
+ if (SvMAGICAL(SvRV(sth)) && mg_find(SvRV(sth),'P'))
+ sth = mg_find(SvRV(sth),'P')->mg_obj; /* switch to inner
handle */
+
ChopBlanks = DBIc_has(imp_sth, DBIcf_ChopBlanks);

TryAgain:


Tim.