perl.dbi.dev
[Top] [All Lists]

Re: Announce DBD::Oracle 1.21

Subject: Re: Announce DBD::Oracle 1.21
From: H.Merijn Brand
Date: Tue, 29 Apr 2008 14:29:23 +0200
Newsgroups: perl.dbi.dev

On Mon, 14 Apr 2008 09:48:41 -0400, John Scoles <scoles@xxxxxxxxxxx>
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---

-- 
H.Merijn Brand         Amsterdam Perl Mongers (http://amsterdam.pm.org/)
using & porting perl 5.6.2, 5.8.x, 5.10.x  on HP-UX 10.20, 11.00, 11.11,
& 11.23, SuSE 10.1 & 10.2, AIX 5.2, and Cygwin.       http://qa.perl.org
http://mirrors.develooper.com/hpux/            http://www.test-smoke.org
                        http://www.goldmark.org/jeff/stupid-disclaimers/

<Prev in Thread] Current Thread [Next in Thread>