Re: New to Inline::Java and a quick question
[email protected] (Russ Tremain) Sun, 5 Jan 2014 08:47:38 -0800
| Newsgroups | perl.inline |
|---|---|
| Message-ID | <p06240802ceee8de6ea6e@[204.68.225.24]> |
Awesome Patrick! My program is now working against 5.18.1...
% perl --version
This is perl 5, version 18, subversion 1
(v5.18.1) built for darwin-thread-multi-2level
...
% cat derbytestdb.props
JDBC_CLASSPATH=/Users/russt/proj/rttl/devtools/tl/src/cmn/sqlpj/regress/drivers/derby.jar
JDBC_DRIVER_CLASS=org.apache.derby.jdbc.EmbeddedDriver
JDBC_URL=jdbc:derby:testDB;create=true
JDBC_USER=test
JDBC_PASSWORD=test
% sqlpj -props derbytestdb.props
studying classes
running
derbydb> show conn
getURL() jdbc:derby:testDB
getUserName() test
getDriverName()
Apache Derby Embedded JDBC Driver
getDriverVersion() 10.9.1.0 - (1344872)
getDatabaseProductName() Apache Derby
getDatabaseProductVersion() 10.9.1.0 - (1344872)
Based on this comment re: the "mro" pragma introduced in perl 5.10.0:
Also, the cache *::ISA::CACHE:: no longer
exists; to force reset the @ISA cache,
you now need to use the mro API, or more
simply to assign to @ISA (e.g. with @ISA = @ISA ).
I tried this alternate fix and it works as well
(tested against 5.8.9 and 5.18.1):
$ diff -c JDBC.pm.installed lib/myJDBC.pm
*** JDBC.pm.installed 2014-01-05 08:04:52.000000000 -0800
--- lib/myJDBC.pm 2014-01-05 08:05:14.000000000 -0800
***************
*** 106,111 ****
--- 106,113 ----
warn "studying classes\n" if $debug;
study_classes(\@classes, 'main');
+ @ISA = @ISA;
+
# Driver => java.sql.Driver, RowSet => javax.sql.RowSet etc
my %class_base = map { m/^(.*\.(\w+))$/ or die; ( $2 => $1) } @classes;
Tim, any chance of getting a cpan update with a patch for JDBC.pm?
This would allow bug
https://rt.cpan.org/Public/Bug/Display.html?id=50307
to be closed.
Patrick, might be worth a usage note for Inline::Java.
The obscurity of this problem could make such a note quite valuable.
best,
-Russ
At 10:02 PM -0500 1/4/14, Patrick LeBoutillier wrote:
>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>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
><<mailto:[email protected]>[email protected]>
>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>https://rt.cpan.org/Public/Bug/Display.html?id=50307
>Also a note to perl-monks:
><http://www.perlmonks.org/?node_id=505979>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
><<mailto:[email protected]>[email protected]>
>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 <<mailto:[email protected]>[email protected]>
>To: David Wang <<mailto:[email protected]>[email protected]>
>Cc: David Mertens
><<mailto:[email protected]>[email protected]>;
>"<mailto:[email protected]>[email protected]"
><<mailto:[email protected]>[email protected]>
>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>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
><<mailto:[email protected]>[email protected]>
>To: David Wang <<mailto:[email protected]>[email protected]>
>Cc: "<mailto:[email protected]>[email protected]"
><<mailto:[email protected]>[email protected]>
>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
><<mailto:[email protected]>[email protected]>
>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 <<mailto:[email protected]>[email protected]>
>To: "<mailto:[email protected]>[email protected]"
><<mailto:[email protected]>[email protected]>
>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