Re: Trying to track down bug in DBD::Multi
Jens Rehsack <[email protected]>
| Newsgroups | gmane.comp.lang.perl.modules.dbi.sybase.devel |
|---|---|
| Message-ID | <[email protected]> |
On 08/11/10 15:46, Jens Rehsack wrote: > 2010/8/11 Dan<[email protected]>: >> Hi, > > Hi Dan, > >> I received a bug report (#60193) regarding the following error with >> DBD::Multi: >> >> DBD::Multi initialisation failed: invalid method name 'versions' at >> /usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi/DBI/DBD/ >> SqlEngine.pm line 88 >> at t/dbd-multi-db.t line 10 >> >> From what I can tell, that "invalid method name" error originates from >> DBI::install_method: >> >> Carp::croak("invalid method name '$method'") >> unless $method =~ m/^([a-z]+_)\w+$/; >> >> From what I can gather, DBI::DBD::SqlEngine is calling DBI- >>> driver_prefix('DBD::multi'), getting back undef, concatenating that >> undef with 'versions', and then making a call to >> DBD::_::common::install_method('DBD::Multi::db', 'versions'). This >> dying because the method name is lacking an underscore. > > No, it's dying because install_method allows only method names > with valid driver prefixes. DBD::Multi isn't registered in > $dbd_prefix_registry in DBI.pm, but it probably should be there ;) > > I'm sorry, I didn't recognize that DBD::Multi is derived from DBD::File, > this is my fault, I should add a registry key for it. > >> Here's a call stack from the perl debugger right before it dies: >> >> . = DBD::_::common::install_method('DBD::Multi::db', 'versions') >> called from file `/usr/local/lib/perl5/site_perl/5.10.1/i386-freebsd/ >> DBI/DBD/SqlEngine.pm' line 88 >> $ = DBI::DBD::SqlEngine::driver('DBD::Multi', ref(HASH)) called from >> file `/usr/local/lib/perl5/site_perl/5.10.1/i386-freebsd/DBD/File.pm' >> line 73 >> $ = DBD::File::driver('DBD::Multi', ref(HASH)) called from file `/usr/ >> local/lib/perl5/site_perl/5.10.1/DBD/Multi.pm' line 20 >> $ = DBD::Multi::driver('DBD::Multi', ref(HASH)) called from file `/usr/ >> local/lib/perl5/site_perl/5.10.1/i386-freebsd/DBI.pm' line 811 >> $ = eval {...} called from file `/usr/local/lib/perl5/site_perl/5.10.1/ >> i386-freebsd/DBI.pm' line 811 >> $ = DBI::install_driver('DBI', 'Multi') called from file `/usr/local/ >> lib/perl5/site_perl/5.10.1/i386-freebsd/DBI.pm' line 643 >> $ = DBI::connect('DBI', 'DBI:Multi:') called from file `t/dbd-multi- >> dr.t' line 9 >> >> This appears to be a chance in functionality of DBD::File that was >> introduced in 1.611_90. Prior to that, I don't think it attempted to >> inject the versions method. >> >> So, I have two questions: >> >> 1. Does my analysis seem correct? > > Mostly, especially the relevant parts. > >> 2. Any suggestions on the best way to allow DBD::Multi to continue to >> work with both older releases of DBI and also work with revisions>= >> 1.612? > > I can do two fixes: > 1) DBD::File can skip method injection when no prefix found > 2) Add a registry key for DBD::Multi to DBI > > But this will keep you failing for DBI between 1.612 and 1.614. > > You can add following code to your DBD::Multi::db: > > if( DBI->version lt '1.614' ) { > *version = sub {}; > *get_meta = sub {}; > *set_meta = sub {}; > *clear_meta = sub {}; > } > > This will lead DBD::File (and DBI::DBD::SqlEngine) to skip the > method injection and installing. > > I fear, this won't be the only issues you will encounter when > using old DBD::File based code with DBD::File>= 0.39. > Probably you've recognized (I hope you are subscribed on this > mailing-list) the issues Steffen had while porting DBD::PO to > new DBD::File. > > But you do not need any of the features provided by DBD::File > or DBI::DBD::SqlEngine - you can avoid deriving from both and > derive directly from DBD::_::* by calling DBI->setup_driver > somewhere in your DBD::Multi module. I didn't read any response. Does it mean, the issue is solved from our point of view or weren't my explanations not understandable? /Jens