Re: Announce DBD::Oracle 1.21
John Scoles <[email protected]>
| Newsgroups | gmane.comp.lang.perl.modules.dbi.sybase.devel |
|---|---|
| Organization | The Pythian Group |
| Message-ID | <[email protected]> |
Thanks Merijn That will defiantly make it into the next release. I will try to get it into trunk later this week Cheers John Scoles H.Merijn Brand wrote: > On Mon, 14 Apr 2008 09:48:41 -0400, John Scoles <[email protected]> > wrote: > > >> DBD::Oracle 1.21 Released >> April 14th, 2008 - by John Scoles >> The latest release of DBD::Oracle is now ready and can be found at: CPAN >> DBD::Oracle. It is a Perl module that works with the DBI module to >> provide access to Oracle databases. It is maintained by me, John Scoles, >> under the auspices of The Pythian Group as open source/free software. >> > > I finally got round trying Oracle Instant Client on Linux with no > Oracle installed, connecting to a 64bit Oracle 9.2.0.8 on HP-UX > 11.11/64. I had to do some fiddling with Makefile.PL (see bottom). > Sorry for this being long. Feel free to mold it into anything useful. > > 1. Before you start on DBD::Oracle, make sure DBD::ODBC works. That will > assure your DSN works. Install unixODBC before anything else. > > 2. Assuming you've got OIC from the rpm's, you will have it here: > > /usr/include/oracle/11.1.0.1/client > /usr/lib/oracle/11.1.0.1/client > /usr/share/oracle/11.1.0.1/client > > 3. To make DBD::ODBC work, I had to create a tnsnames.ora, and I chose > > /usr/lib/oracle/11.1.0.1/admin/tnsnames.ora > > /usr/lib/oracle/11.1.0.1/admin > cat sqlnet.ora > NAMES.DIRECTORY_PATH = (TNSNAMES, ONAMES, HOSTNAME) > /usr/lib/oracle/11.1.0.1/admin > cat tnsnames.ora > ODBCO = ( > DESCRIPTION = > ( ADDRESS_LIST = > ( ADDRESS = > ( PROTOCOL = TCP ) > ( PORT = 1521 ) > ( HOST = rhost ) > ) > ) > ( CONNECT_DATA = > ( SERVICE_NAME = odbctest ) > ) > ) > /usr/lib/oracle/11.1.0.1/admin > > > Real world example changed to hide the obvious. Important bits are > "ODBCO", which is the ODBC name, and it can be anything, as long as > you use this in ORACLE_DSN too (please don't use whitespace, colons, > semicolons and/or slashes. "rhost" is the hostname of where the DB > is running, and "odbctest" is the service the listener > > Set the environment (TWO_TASK is not needed) > > > setenv LD_LIBRARY_PATH /usr/lib/oracle/11.1.0.1/client/lib > > setenv TNS_ADMIN /usr/lib/oracle/11.1.0.1/admin > > setenv ORACLE_HOME /usr/lib/oracle/11.1.0.1/client > > setenv ORACLE_DSN dbi:Oracle:ODBCO > > setenv ORACLE_USERID ORAUSER/ORAPASS > > Check if the connection works: > > isql -v ODBCO > > And for Oracle: > > sqlplus ORAUSER/ORAPASS@ODBCO > and > > sqlplus ORAUSER/ORAPASS@rhost/odbctest > > should both work > > 4. Modify Makefile.PL (see below) > > 5. > perl Makefile.PL > > make > > make test > PERL_DL_NONLAZY=1 /pro/bin/perl "-MExtUtils::Command::MM" "-e" > "test_harness(0, 'blib/lib', 'blib/arch')" t/*.t > t/01base..................ok > t/10general...............ok > t/12impdata...............ok > t/14threads...............skipped: this linux perl 5.010000 not > configured to su pport iThreads > t/15nls...................ok > t/20select................ok > t/21nchar................. Database and client versions and > character sets: Database 9.2.0.8.0 CHAR set is US7ASCII (Non-Unicode), > NCHAR set is AL16UTF16 (U nicode) > Client 11.1.0.6 NLS_LANG is '<unset>', NLS_NCHAR is '<unset>' > t/21nchar.................ok > t/22nchar_al32utf8........ok > t/22nchar_utf8............ok > t/23wide_db...............skipped: Database character set is not > Unicode t/23wide_db_8bit..........skipped: Database character set is > not Unicode t/23wide_db_al32utf8......skipped: Database character set > is not Unicode t/24implicit_utf8.........ok > t/25plsql.................ok > t/26exe_array.............ok > t/28array_bind............ok > t/30long..................ok > t/31lob...................ok > t/32xmltype...............ok > t/34pres_lobs.............ok > t/40ph_type...............1/19 Placeholder behaviour for ora_type=1 (the default) varies with Oracle version. > Oracle 7 didn't strip trailing spaces, Oracle 8 did, until 9.2.x > Your system doesn't. If that seems odd, let us know. > t/40ph_type...............ok > t/50cursor................ok > t/51scroll................ok > t/55nested................ok > t/56embbeded..............ok > t/60reauth................ORACLE_USERID_2 not defined. Tests > skipped. t/60reauth................skipped: (no reason given) > t/70meta..................ok > t/80ora_charset...........1/14 > # Failed test 'match char' > # at t/80ora_charset.t line 83. > # got: '?' > # expected: '�' > > # Failed test 'match char' > # at t/80ora_charset.t line 84. > # got: '?' > # expected: '�' > > # Failed test 'match char' > # at t/80ora_charset.t line 83. > # got: '?' > # expected: '�' > > # Failed test 'match char' > # at t/80ora_charset.t line 84. > # got: '?' > # expected: '�' > # Looks like you failed 4 tests of 14. > t/80ora_charset........... Dubious, test returned 4 (wstat 1024, > 0x400) Failed 4/14 subtests > > Test Summary Report > ------------------- > t/80ora_charset.t (Wstat: 1024 Tests: 14 Failed: 4) > Failed tests: 9-10, 13-14 > Non-zero exit status: 4 > Files=28, Tests=2014, 24 wallclock secs ( 0.46 usr 0.02 sys + > 7.56 cusr 0.56 csys = 8.60 CPU) > Result: FAIL > Failed 1/28 test programs. 4/2014 subtests failed. > make: *** [test_dynamic] Error 4 > > Same for ORACLE_DSN as USER/PASS@ODBCO and USER/PASS@rhost/odbctest > > --8<--- Makefile.PL.diff > --- Makefile.PL 2008-01-28 19:20:05.000000000 +0100 > +++ Makefile.PL 2008-04-29 14:09:12.000000000 +0200 > @@ -156,6 +156,9 @@ die qq{ The $ORACLE_ENV environment var > > print "Using Oracle in $OH\n"; > > +my $iclient_version = $OH =~ m{oracle/([0-9.]+)/client}i ? $1 : ""; > +print STDERR "Instant Client Version: $iclient_version\n"; > + > # $client_version => Major.Minor, $client_version_full => Major.Minor.X.Y.Z > my ($client_version, $client_version_full) = get_client_version($::opt_V); > > @@ -188,6 +191,7 @@ my @mkfiles; # $mkfile plus any files it > my $linkwith = ""; > my $linkwith_msg = ""; > my $need_ldlp_env; > +my @libclntsh; > > if ($os eq 'VMS') { > my $OCIINCLUDE = join " ", vmsify("$OH/rdbms/"), > @@ -312,7 +316,7 @@ elsif ($::opt_l and # use -l to enable t > > # --- special case for Oracle 10g instant client (note lack of ../lib/...) > > -elsif (my @libclntsh = glob("$OH/libclntsh.$so*")) { > +elsif (@libclntsh = glob("$OH/libclntsh.$so*")) { > > print "Looks like an Instant Client installation, okay\n"; > > @@ -341,6 +345,35 @@ elsif (my @libclntsh = glob("$OH/libclnt > $opts{INC} = "$inc -I$dbi_arch_dir"; > } > > +elsif ($iclient_version and @libclntsh = glob ("$OH/lib/libclntsh.$so*")) { > + > + print "Looks like an Instant Client installation, okay\n"; > + > + # the libclntsh.$so (without version suffix) may be missing > + # we need it to link to so try to create it > + eval { > + print "You don't have a libclntsh.$so file, only @libclntsh\n"; > + my $libclntsh_v = (grep { /\d$/ } sort @libclntsh)[0]; # tacky but sufficient > + print "So I'm going to create a $OH/lib/libclntsh.$so symlink to $libclntsh_v\n"; > + symlink($libclntsh_v, "$OH/lib/libclntsh.$so") > + or warn "Can't create symlink $OH/lib/libclntsh.$so to $libclntsh_v: $!\n"; > + } unless -e "$OH/lib/libclntsh.$so"; > + > + check_ldlibpthname($OH); > + > + my $syslibs = read_sysliblist(); > + print "Oracle sysliblist: $syslibs\n"; > + > + $opts{dynamic_lib} = { OTHERLDFLAGS => "$::opt_g" }; > + > + my $lib = "clntsh"; > + $linkwith_msg = "-l$lib."; > + $opts{LIBS} = [ "-L$OH/lib -l$lib $syslibs" ]; > + > + my $inc = join " ", map { "-I$_" } find_headers(); > + $opts{INC} = "$inc -I$dbi_arch_dir"; > +} > + > elsif ($mkfile = find_mkfile() and $mkfile =~ /\bdemo_xe.mk$/) { # Oracle XE > > print "Looks like Oracle XE ($mkfile)\n"; > @@ -1059,6 +1092,8 @@ sub find_mkfile { > 'rdbms/demo/oracle.mk', > 'rdbms/demo/demo_rdbms.mk', > ); > + $iclient_version and push @mk_proc, # Oracle Instant Client > + "/usr/share/oracle/$iclient_version/client/demo.mk"; > my @mkplaces = ($::opt_p) ? (@mk_proc,@mk_oci) : (@mk_oci,@mk_proc); > if ($::opt_m) { > $::opt_m = cwd()."/$::opt_m" unless $::opt_m =~ m:^/:; > @@ -1424,6 +1459,7 @@ sub find_headers { > "/usr/include/oracle/$client_version_trim/client", # Instant Client for RedHat FC4 > "/include/oracle/$client_version_full/client", # Instant Client for RedHat FC3 > "/include/oracle/$client_version_trim/client", # Instant Client for RedHat FC3 > + "/usr/include/oracle/$iclient_version/client", # Instant Client 11.1 and up > ); > unshift @try, $::opt_h if $::opt_h; > @try = grep { -d $_ } @try; > @@ -1476,7 +1512,7 @@ sub get_client_version { > local $ENV{PATH} = join $Config{path_sep}, "$OH_path/bin", $OH_path, $ENV{PATH} if $OH; > print "PATH=$ENV{PATH}\n" if $::opt_v; > > - if (find_bin($sqlplus_exe)) { > + if (find_bin($sqlplus_exe) || -x "$OH_path/bin/$sqlplus_exe") { > local $ENV{SQLPATH} = ""; # avoid $SQLPATH/login.sql causing sqlplus to hang > # Try to use the _SQLPLUS_RELEASE predefined variable from sqlplus > # Documented in the SQL*Plus reference guide: > -->8--- > >