Re: Announce DBD::Oracle 1.21

"H.Merijn Brand" <[email protected]>
Newsgroups gmane.comp.lang.perl.modules.dbi.sybase.devel
Message-ID <[email protected]>
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---

-- 
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/
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.