Russ,

With that info I was able to reproduce the problem:

[patrickl@pc259 JDBC-0.01]$ perl -Mblib t/01-driver.t
1..4
CLASSPATH=/tmp/JDBC-0.01/drivers/db-derby-10.1.1.0.jar
ok 1 - driver class loaded
Can't locate object method "__validate_prototype" via package "JDBC" at
(eval 31) line 344, <GEN6> line 5.
# Looks like you planned 4 tests but ran 1.
# Looks like your test exited with 255 just after 1.

To answer your question, the __validate_prototype is part of the
Inline::Java::Object class, which JDBC derives via
java::sql::DriverManager.

Anyway, here's a quick patch to JDBC that fixes the problem:

--- JDBC.pm.ori 2014-01-04 21:55:24.845018833 -0500
+++ JDBC.pm     2014-01-04 21:55:49.782943330 -0500
@@ -43,8 +43,6 @@

 =cut

-our @ISA = qw(Exporter java::sql::DriverManager);
-
 {   # the Inline package needs to be use'd in main in order to
     # get the studied classes to be rooted in main
     package main;
@@ -106,6 +104,9 @@
 warn "studying classes\n" if $debug;
 study_classes(\@classes, 'main');

+
+our @ISA = qw(Exporter java::sql::DriverManager);
+
 # Driver => java.sql.Driver, RowSet => javax.sql.RowSet etc
 my %class_base   = map { m/^(.*\.(\w+))$/ or die; (  $2  => $1) } @classes;

It seems like initialising the @ISA array later (once the Java methods are
loaded) fixes the problem.

After some poking around, I found that there was some changes in Perl 5.10
regarding multiple inheritance (see
http://perldoc.perl.org/perl5100delta.html). I believe something changed in
that release with the way some of
this stuff is handled. Just a theory...


Patrick




On Thu, Jan 2, 2014 at 7:06 PM, Russ Tremain <ru...@releasetools.org> wrote:

>  Hi Patrick,
>
> To add to the discussion, I ran a modified version of JDBC.pm using DEBUG
> => 4 setting, first under perl 5.8.9, and under perl 5.18.1
>
> I also ran under perl 5.12.4 and got the same error as 5.18.1.
>
> There is a bug report filed for JDBC.pm:
> https://rt.cpan.org/Public/Bug/Display.html?id=50307
> Also a note to perl-monks:  http://www.perlmonks.org/?node_id=505979  but
> it is a different error.
>
> It seems to initialize fine, but then aborts with an error as Inline tries
> to match the first call to jdbc.
>
> Here are some diffs for the debug output (truncated for clarity) - 5.18.1
> on the left, 5.8.9 on the right:
>
> [perl][3]   perl doesn't know about 'org.apache.derby.jdbc.EmbeddedDriver'
> ('main::o    [perl][3]   perl doesn't know about
> 'org.apache.derby.jdbc.EmbeddedDriver' ('main::o
> [perl][2]  creating object in java
> (main::org::apache::derby::jdbc::EmbeddedDriver):    [perl][2]  creating
> object in java (main::org::apache::derby::jdbc::EmbeddedDriver):
> sqlpj::sqlpjImpl::sql_init_connection[738]: eval FAILED:  Can't locate
> object method |  [perl][3]   matching arguments to
> getConnection(java.lang.String)
>
>                    |  [perl][3]   error trying to fit args to prototype:
> Wrong number of arguments at /usr
> sqlpj::sqlpjImpl::sqlsession[254]:  cannot get a database connection:
> ABORT         |  [perl][3]   matching arguments to
> getConnection(java.lang.String, java.lang.String,
> [perl][1] killed by natural death.
>                    |  [perl][3]   match successful: score is 6
>
> the full error I get back from my eval is:
>
>         [perl][3]   perl doesn't know about
> 'org.apache.derby.jdbc.EmbeddedDriver'
> ('main::org::apache::derby::jdbc::EmbeddedDriver')
>    [perl][2]  creating object in java
> (main::org::apache::derby::jdbc::EmbeddedDriver):
>         sqlpj::sqlpjImpl::sql_init_connection[738]: eval FAILED:  Can't
> locate object method "__validate_prototype" via package "JDBC" at (eval 41)
> line 206, <GEN8> line 5.
>
>     sqlpj::sqlpjImpl::sqlsession[254]:  cannot get a database
> connection:  ABORT
>     [perl][1] killed by natural death.
>       [perl][1] JVM owner exiting...
>  JDBC.pm is a pretty simple module that basically just maps java.sql.*
> classes into the JDBC namespace:
>
>         our @ISA = qw(Exporter java::sql::DriverManager);
>
>        {   # the Inline package needs to be use'd in main in order to
>       # get the studied classes to be rooted in main
>           package main;
>            use Inline ( Java => q{ }, AUTOSTUDY => 1, DEBUG => 4 );
>     }
>
>        use Inline::Java qw(cast caught study_classes);
>
>  our @EXPORT_OK = qw(cast caught study_classes);
>
>  our $debug = $ENV{PERL_JDBC_DEBUG} || 0;
>
>         #java.sql.ParameterMetaData
>      my @classes = (qw(
>           java.sql.Array
>           java.sql.BatchUpdateException
>            java.sql.Blob
>             java.sql.CallableStatement
>         ...
>         ));
>
>      warn "studying classes\n" if $debug;
>     study_classes(\@classes, 'main');
>
> Any ideas?  Possible it is something to do with a namespace mismatch?
> Is __validate_prototype a symbol that is supposed to be injected by
> Inline::Java?
>
> -Russ
>
> P.S. I can get the Inline::Java module tests to pass as well, but not the
> JDBC tests.
> P.P.S.  Error is not peculiar to Derby db, it happens with any driver I've
> tried.
>
> At 9:30 PM -0500 12/16/13, Patrick LeBoutillier wrote:
>
> Hi,
>
> I just ran the tests without issues on Fedora 17, Perl 5.14 and Java 1.7.0.
>
> There's really not much in Inline::Java that is dependant on the perl
> version.
>
> Patrick
>
>
>
>  On Mon, Dec 16, 2013 at 9:08 PM, Russ Tremain <ru...@releasetools.org>
> wrote:
>
> Well, I'm using JDBC.pm to access the inline::Java stuff, and I could
> never get it to work with >5.8.9, and never got any response from Tim Bunce
> or Patrick, so I eventually gave up on it.
>
>
> It is possible that JDBC is doing something different, but I doubt it, as
> it is a very simple module.  It basically does a lot of runtime "studying"
> in order to add all the java.sql classes to main:: to make it easier to
> call.
>
>
> Best you can do is to write some tests and try the later environment.
>
>
> I could not get the JDBC tests to run in a later env, and the tests have
> been broken on CPAN testers for a long time.
>
>
> -Russ
>
>
>
> At 4:40 PM -0800 12/16/13, David Wang wrote:
>
> Hi Russ
>
>
> So I got the Inline:Java including JAXB to work on my v5.8.8 perfectly .
> Then, I remember you mentioned that you never got it/Java to work on any
> Perl version later than 5.8.9 . Now, I am starting to worry since my deploy
> machine uses v5.10.0 . The Inline version I use is Inline-0.53 . Can
> someone confirm if this will or will not work on Perl version v5.10.0?
>
>
> Thanks
>
>
> David
>
>
>  ------------------------------
>
> *From:* Russ Tremain <ru...@releasetools.org>
> *To:* David Wang <kuoweiw...@yahoo.com>
> *Cc:* David Mertens <dcmertens.p...@gmail.com>; "inline@perl.org" <
> inline@perl.org>
> *Sent:* Thursday, December 12, 2013 5:05 PM
> *Subject:* Re: New to Inline::Java and a quick question
>
>
> #yiv1198785418 #yiv1198785418 -- blockquote, #yiv1198785418 dl,
> #yiv1198785418 ul, #yiv1198785418 ol, #yiv1198785418 li
> {padding-top:0;padding-bottom:0;} #yiv1198785418 Re: New to Inline::Java
> and a quick question
>
> one thing I can tell you is I have never gotten Inline::Java to work with
> any perl later than 5.8.9.
>
> I have used it extensively with JDBC.pm.  Example of this can be found
> here:
>
>
>         https://github.com/russt/sqlpj
>
>
> best of luck!
>
> -Russ
>
>
>
> At 4:57 PM -0800 12/12/13, David Wang wrote:
>
> Thanks
>
>
> I am not sure if anybody has any experience with perl Inline::Java to call
> Java JAXB . Basically, I have added some code in my perl script to call
> some of my Java API that calls JAXB.
>
>
> System.out.println("before·");
>
> JAXBContext context = JAXBContext.newInstance("SomeXMLPackage");
>
> System.out.println("after·");
>
>
> and it fails on the JAXB statement above. I then added Debug and AUTOSTUDY
>  option in perl like below
>
>
> use Inline (
>
>     Java => 'DATA',
>
>     J2SDK => $ENV{JAVA_HOME},
>
>     CLASSPATH => 'classes',
>
>     AUTOSTUDY => 1,
>
>     DEBUG => 4,
>
> );
>
>
> then I see
>
> [java][3]   packet sent is ok java_object:1:1:javax.xml.bind.JAXBException
>
> [perl][3]   packet recv is ok java_object:1:1:javax.xml.bind.JAXBException
>
> [perl][3]   checking if stub is array...
>
> [perl][3]   perl doesn't know about 'javax.xml.bind.JAXBException'
> ('perlAPI::javax::xml::bind::JAXBException')
>
> [perl][2]  autostudying javax.xml.bind.JAXBException...
>
> [perl][3]   perl doesn't know about 'javax.xml.bind.JAXBException'
> ('perlAPI::javax::xml::bind::JAXBException')
>
> [perl][3]   reporting on javax.xml.bind.JAXBException
>
>
> I hope perl inline works with JAXB . BTW, my Java API works fine meaning I
> use a Java main to call this
>
> API and the xml file is loaded without problem.
>
>
> thanks,
>
>
> David
>
>
>
>
>
>  ------------------------------
>
> *From:* David Mertens <dcmertens.p...@gmail.com>
> *To:* David Wang <kuoweiw...@yahoo.com>
> *Cc:* "inline@perl.org" <inline@perl.org>
> *Sent:* Thursday, December 12, 2013 5:37 AM
> *Subject:* Re: New to Inline::Java and a quick question
>
>
> Yep, as a rule, if you need to install a Perl module, a simple "cpan
> Module::Name" should do it. If you are on a Unixish system, you may have
> installation permission issues, in which case there are known work-arounds.
> But I'm sure you'll ask when you come to those. :-)
>
> Good luck, and don't be afraid to ask more questions as they come up!
>
> David
>
>
>
>  On Wed, Dec 11, 2013 at 7:38 PM, David Wang <kuoweiw...@yahoo.com> wrote:
>
> Ok, I figured it out. Hope it can be documented somewhere.
>
>
> Download Inline-0.53
>
>
> go to the dir
>
> cpan Inline::Java  << was instructed by some nice guy
>
>
> Thanks
>
>
> David
>
>
>
>  ------------------------------
>
> *From:* David Wang <kuoweiw...@yahoo.com>
> *To:* "inline@perl.org" <inline@perl.org>
> *Sent:* Wednesday, December 11, 2013 4:25 PM
> *Subject:* New to Inline::Java and a quick question
>
>
> Hi
>
>
> I am very new to this stuff, just started to hear about it today. I looked
> around the web and I find the installation
>
>
> instructions for inline::c like the following
>
>
> perl Makefile.PL;
>
> make;
>
> make test;
>
> make install;
>
>
> But I can't find anywhere else that tells us how to install inline::Java ?
> BTW, I found the latest Inline is Inline-0.53.tar.gz  and I use Redhat 5
>
>
> Thanks
>
>
> David
>
>
>
>
>
>
>
>
> --
>  "Debugging is twice as hard as writing the code in the first place.
>   Therefore, if you write the code as cleverly as possible, you are,
>   by definition, not smart enough to debug it." -- Brian Kernighan
>
>
>
>
>
> --
> =====================
> Patrick LeBoutillier
> Rosemère, Québec, Canada
>
>
>


-- 
=====================
Patrick LeBoutillier
Rosemère, Québec, Canada

Reply via email to