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/[EMAIL PROTECTED]
   and
   > sqlplus ORAUSER/[EMAIL PROTECTED]/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/[EMAIL PROTECTED] and USER/[EMAIL 
PROTECTED]/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---

Reply via email to