On 28/10/11 16:09, Lyle Brooks wrote:
> Tim,
> 
> I have looked at the Oracle::OCI module.  I really like the
> concept, and it would undeniably be an extremely useful and
> powerful tool.  However, I couldn't get it to work (by that
> I mean...I couldn't get it to build).

I still use Oracle::OCI. There is a patch below which may
allow you to build it under Oracle 11.2.

As you will see, I have kept it going by botching things.
Whenever a new feature of OCI causes trouble, I add it to the
list of features to omit. I would like to do a better job, but
I simply don't have the time. All I can do is to offer this
patch on an as-seen basis, in the hope that it might inspire
some else to do a proper job of rescuing Oracle::OCI.


diff -ur Oracle-OCI-0.06.clean/01base.t Oracle-OCI-0.06.patched/01base.t
--- Oracle-OCI-0.06.clean/01base.t      2001-08-31 23:02:45.000000000 +0100
+++ Oracle-OCI-0.06.patched/01base.t    2011-10-17 10:52:24.204427839 +0100
@@ -96,7 +96,7 @@
 ok OCIAttrSet($$authp, OCI_HTYPE_SESSION, @user_buf_len, OCI_ATTR_USERNAME, 
$errhp), 0;
 ok OCIAttrSet($$authp, OCI_HTYPE_SESSION, @pass_buf_len, OCI_ATTR_PASSWORD, 
$errhp), 0;
 
-ok $status=OCISessionBegin($svchp, $errhp, $authp, OCI_CRED_RDBMS, 
OCI_DEFAULT), 0;
+ok $status=OCISessionBegin($svchp, $errhp, $authp, $user ? OCI_CRED_RDBMS : 
OCI_CRED_EXT, OCI_DEFAULT), 0;
 warn get_oci_error($errhp, $status) unless $status == OCI_SUCCESS;
 
 ok OCIAttrSet($$svchp, OCI_HTYPE_SVCCTX, $$authp, 0, OCI_ATTR_SESSION, 
$errhp), 0;
diff -ur Oracle-OCI-0.06.clean/boot Oracle-OCI-0.06.patched/boot
--- Oracle-OCI-0.06.clean/boot  2001-08-30 16:49:24.000000000 +0100
+++ Oracle-OCI-0.06.patched/boot        2011-10-17 11:31:37.856430344 +0100
@@ -1,9 +1,8 @@
-#!/opt/perl5/bin/perl -w
-
 require 5.6.0;
 use strict;
 
 use Carp;
+use Config;
 use File::Path;
 use File::Copy;
 use File::Basename;
@@ -17,6 +16,15 @@
 
 $| = 1;
 
+# The following is based on conventions entirely local to Jackdaw.
+# Perl install trees are at /usr/local/perl/<version>-<letter>.
+# Libraries for DBD::Oracle are at 
$ORACLE_HOME/PERL/<version>-<letter>/lib/DBD/Oracle.
+
+my $perlpath = $Config{perlpath};
+my $perlvl = (split /\//, $perlpath)[-3];
+my $ora_arch_dir = "$ENV{ORACLE_HOME}/PERL/$perlvl/lib/auto/DBD/Oracle";
+
+print "Oracle arch dir is $ora_arch_dir\n";
 
 ########################################################################
 # configuration section.  
@@ -99,6 +107,21 @@
        TypeArrayByRef  => "?",
        EnvCallback     => "?",
        SharedLibInit   => "uses 'dvoid *argv[]' type that we've not supported 
yet",
+        XmlDbInitXmlCtx => "",
+        XmlDbFreeXmlCtx => "",
+        XmlDbGetFullyQualifiedSchemaUrl => "",
+        XmlDbMemCallback => "",
+        XmlDbOrastreamFromLob => "",
+        XmlDbRewriteXMLDiff => "",
+        XmlDbStreamClose => "",
+        XmlDbStreamFromXMLType => "",
+        XmlDbStreamRead => "",
+        XmlFreeDRCtx => "",
+        XmlInitDRCtx => "",
+        LobGetDeduplicateRegions => "",
+        XStreamInLCRCallbackSend => "",
+        XStreamOutLCRCallbackReceive => "",
+       NumberToRealArray => "",
        '_ORACLE'       => "empty define - used to prevent multiple #includes",
        '_FLAGS'        => "empty define - used to prevent multiple #includes",
     } } ],
@@ -131,15 +154,14 @@
 -d $orahome  or croak "Error:  no such directory: $orahome";
 -r _ && -x _ or croak "Error:  bad mods on $orahome";
 
-my $demodir  = "$orahome/rdbms/demo";
--d $demodir  or croak "Error:  no directory '$demodir'";
--r _ && -x _ or croak "Error:  bad mods on '$demodir'";
-my $oci_hdr = "$demodir/oci.h";
+my $publicdir  = "$orahome/rdbms/public";
+-d $publicdir  or croak "Error:  no directory '$publicdir'";
+-r _ && -x _ or croak "Error:  bad mods on '$publicdir'";
+my $oci_hdr = "$publicdir/oci.h";
 -e $oci_hdr or croak "Error:  hit by a missing oci.h";
 -r _        or croak "Error:  unreadable $oci_hdr";
 
-my @ora_dirs = ($demodir,
-       "$orahome/rdbms/public",
+my @ora_dirs = ($publicdir,
        "$orahome/network/public",
        "$orahome/plsql/public",
 );
@@ -165,7 +187,8 @@
 my $skip_regex = '^OCI(?!' . join('|',@skip_list) . ')|^SQL';
 
 my @h2xsargz = (
-    qw( ./h2xs -d -O -n Oracle::OCI ),
+    $perlpath,
+    qw( h2xs -d -O -n Oracle::OCI ),
     "-F ".join(" ", map { "-I$_" } @ora_dirs),
     "-I".join(",", @ora_dirs),
     "-E get_oci_error,get_oci_handle,oci_buf_len,OCIAttrGet",
@@ -293,8 +316,7 @@
                use DBI::DBD;
                my $dbi_dir      = dbd_dbi_dir();
                my $dbi_arch_dir = dbd_dbi_arch_dir();
-               (my $ora_arch_dir = $dbi_arch_dir) =~ s!DBI$!DBD/Oracle!;
-       }."\n" if $. == 1;
+               my $ora_arch_dir = }."'$ora_arch_dir';\n\n" if $. == 1;
        s!^\);!      CONFIGURE => \\&wmf_config,\n);!;
        print $new_mk $_;
     }
@@ -323,7 +345,7 @@
 }
 
 print "Building...\n";
-system("perl Makefile.PL && make && make test");
+system("$perlpath Makefile.PL && make && make test") && exit 1;
 
 exit 0;
 
diff -ur Oracle-OCI-0.06.clean/extra.typemap 
Oracle-OCI-0.06.patched/extra.typemap
--- Oracle-OCI-0.06.clean/extra.typemap 2001-08-05 23:58:29.000000000 +0100
+++ Oracle-OCI-0.06.patched/extra.typemap       2011-10-17 10:52:24.212663069 
+0100
@@ -1,7 +1,10 @@
 OCIRaw *               T_PTROBJ
 OCIRef *               T_PTROBJ
+OCIString *            T_PTROBJ
 OCITrans *             T_PTROBJ
 OCIType *              T_PTROBJ
+OCITypeElem *          T_PTROBJ
+OCITypeMethod *                T_PTROBJ
 int *                  T_PTROBJ
 void *                 T_PTROBJ
 sb1                    T_IV
diff -ur Oracle-OCI-0.06.clean/extra.xsh Oracle-OCI-0.06.patched/extra.xsh
--- Oracle-OCI-0.06.clean/extra.xsh     2001-09-01 00:57:00.000000000 +0100
+++ Oracle-OCI-0.06.patched/extra.xsh   2011-10-17 10:52:24.220628981 +0100
@@ -82,8 +82,7 @@
         int ptr_len = (SvNIOK(result_type)) ? SvIV(result_type) : 0;
        if (ptr_len==0 && !looks_like_number(result_type) ) {
            /* result_type is the name of a class to bless pointer into */
-           /* so we set ptr_len 4 and arrange to return a blessed ref. */
-           ptr_len = 4;
+           /* so we arrange to return a blessed ref.                   */
            bless = SvPV(result_type,lna);
        }
        switch (ptr_len) {
@@ -92,14 +91,23 @@
            RETVAL = OCIAttrGet(trgthndlp, trghndltyp, (void*)&b4_val, 0, 
attrtype, errhp);
            if (RETVAL==OCI_SUCCESS || RETVAL==OCI_SUCCESS_WITH_INFO) {
                switch (ptr_len) {
-               case  1: sv_setiv(attributep_sv, (IV)*((ub1*)&b4_val)); break;
+               case  1: sv_setuv(attributep_sv, (UV)*((ub1*)&b4_val)); break;
                case -1: sv_setiv(attributep_sv, (IV)*((sb1*)&b4_val)); break;
-               case  2: sv_setiv(attributep_sv, (IV)*((ub2*)&b4_val)); break;
+               case  2: sv_setuv(attributep_sv, (UV)*((ub2*)&b4_val)); break;
                case -2: sv_setiv(attributep_sv, (IV)*((sb2*)&b4_val)); break;
                case  4: sv_setuv(attributep_sv, (UV)*((ub4*)&b4_val)); break;
                case -4: sv_setiv(attributep_sv, (IV)*((sb4*)&b4_val)); break;
                }
                if (bless) {
+               }
+           }
+           else SvOK_off(attributep_sv);
+           break;
+       case 0:
+           if (bless) {
+               RETVAL = OCIAttrGet(trgthndlp, trghndltyp, &ptr, 0, attrtype, 
errhp);
+               if (RETVAL==OCI_SUCCESS || RETVAL==OCI_SUCCESS_WITH_INFO) {
+                   sv_setuv(attributep_sv, (UV)ptr);
                    SV *rv = newRV(sv_mortalcopy(attributep_sv));
                    HV * bless_stash = gv_stashpv(bless, 0);
                    if (!bless_stash) {
@@ -111,20 +119,20 @@
                    sv_bless(rv, bless_stash);
                    sv_setsv(attributep_sv, rv);
                }
+               else SvOK_off(attributep_sv);
            }
-           else SvOK_off(attributep_sv);
-           break;
-       case 0:
-           RETVAL = OCIAttrGet(trgthndlp, trghndltyp, &ptr, &sizep, attrtype, 
errhp);
-           if (RETVAL==OCI_SUCCESS || RETVAL==OCI_SUCCESS_WITH_INFO) {
-               /* OCIAttrGet may set ptr to null, sv_setpvn() treats that as 
undef */
-               sv_setpvn(attributep_sv, ptr, sizep);
-               if (!SvREADONLY(sizep_sv)) {
-                   sv_setiv(sizep_sv, sizep);
-                   SvSETMAGIC(sizep_sv); /* redundant */
+           else {
+               RETVAL = OCIAttrGet(trgthndlp, trghndltyp, &ptr, &sizep, 
attrtype, errhp);
+               if (RETVAL==OCI_SUCCESS || RETVAL==OCI_SUCCESS_WITH_INFO) {
+                   /* OCIAttrGet may set ptr to null, sv_setpvn() treats that 
as undef */
+                   sv_setpvn(attributep_sv, ptr, sizep);
+                   if (!SvREADONLY(sizep_sv)) {
+                       sv_setiv(sizep_sv, sizep);
+                       SvSETMAGIC(sizep_sv); /* redundant */
+                   }
                }
+               else SvOK_off(attributep_sv);
            }
-           else SvOK_off(attributep_sv);
            break;
        default:
            croak("Invalid pointer width '%s' for OCIAttrGet", 
SvPV(result_type,lna));
diff -ur Oracle-OCI-0.06.clean/getptrdef.h Oracle-OCI-0.06.patched/getptrdef.h
--- Oracle-OCI-0.06.clean/getptrdef.h   2001-07-11 10:32:56.000000000 +0100
+++ Oracle-OCI-0.06.patched/getptrdef.h 2011-10-17 10:52:24.228616063 +0100
@@ -1,13 +1,25 @@
 #define ora_getptr_Lda_DefPtr ora_getptr_generic
+#define ora_getptr_OCIAdminPtr ora_getptr_generic
+#define ora_getptr_OCIAnyDataPtr ora_getptr_generic
+#define ora_getptr_OCIAnyDataSetPtr ora_getptr_generic
 #define ora_getptr_OCIAQDeqOptionsPtr ora_getptr_generic
 #define ora_getptr_OCIAQEnqOptionsPtr ora_getptr_generic
 #define ora_getptr_OCIAQMsgPropertiesPtr ora_getptr_generic
+#define ora_getptr_OCIAuthInfoPtr ora_getptr_generic
 #define ora_getptr_OCIBindPtr ora_getptr_generic
 #define ora_getptr_OCICallbackDefine ora_getptr_generic
 #define ora_getptr_OCICallbackInBind ora_getptr_generic
+#define ora_getptr_OCICallbackLobArrayRead ora_getptr_generic
+#define ora_getptr_OCICallbackLobArrayWrite ora_getptr_generic
+#define ora_getptr_OCICallbackLobRead ora_getptr_generic
+#define ora_getptr_OCICallbackLobRead2 ora_getptr_generic
+#define ora_getptr_OCICallbackLobWrite ora_getptr_generic
+#define ora_getptr_OCICallbackLobWrite2 ora_getptr_generic
 #define ora_getptr_OCICallbackOutBind ora_getptr_generic
 #define ora_getptr_OCICollPtr ora_getptr_generic
 #define ora_getptr_OCIComplexObjectPtr ora_getptr_generic
+#define ora_getptr_OCICPoolPtr ora_getptr_generic
+#define ora_getptr_OCIDOMDocumentPtr ora_getptr_generic
 #define ora_getptr_OCIDatePtr ora_getptr_generic
 #define ora_getptr_OCIDateTimePtr ora_getptr_generic
 #define ora_getptr_OCIDefinePtr ora_getptr_generic
@@ -18,6 +30,7 @@
 #define ora_getptr_OCIDurationPtr ora_getptr_generic
 #define ora_getptr_OCIEnvPtr ora_getptr_generic
 #define ora_getptr_OCIErrorPtr ora_getptr_generic
+#define ora_getptr_OCIEventPtr ora_getptr_generic
 #define ora_getptr_OCIFileObjectPtr ora_getptr_generic
 #define ora_getptr_OCIIndPtr ora_getptr_generic
 #define ora_getptr_OCIIntervalPtr ora_getptr_generic
@@ -27,6 +40,7 @@
 #define ora_getptr_OCIMsgPtr ora_getptr_generic
 #define ora_getptr_OCINumberPtr ora_getptr_generic
 #define ora_getptr_OCIObjectEvent ora_getptr_generic
+#define ora_getptr_OCIParamPtr ora_getptr_generic
 #define ora_getptr_OCIObjectProperty ora_getptr_generic
 #define ora_getptr_OCIPicklerFdoPtr ora_getptr_generic
 #define ora_getptr_OCIPicklerImagePtr ora_getptr_generic
@@ -38,10 +52,12 @@
 #define ora_getptr_OCIRefPtr ora_getptr_generic
 #define ora_getptr_OCIRefreshOpt ora_getptr_generic
 #define ora_getptr_OCIResultPtr ora_getptr_generic
+#define ora_getptr_OCIRowidPtr ora_getptr_generic
 #define ora_getptr_OCISecurityPtr ora_getptr_generic
 #define ora_getptr_OCIServerPtr ora_getptr_generic
 #define ora_getptr_OCISessionPtr ora_getptr_generic
 #define ora_getptr_OCISnapshotPtr ora_getptr_generic
+#define ora_getptr_OCISPoolPtr ora_getptr_generic
 #define ora_getptr_OCIStmtPtr ora_getptr_generic
 #define ora_getptr_OCIStringPtr ora_getptr_generic
 #define ora_getptr_OCISubscriptionPtr ora_getptr_generic
@@ -63,6 +79,10 @@
 #define ora_getptr_OCIUserCallback ora_getptr_generic
 #define ora_getptr_OCIUserCallbackPtr ora_getptr_generic
 #define ora_getptr_OCIWcharPtr ora_getptr_generic
+#define ora_getptr_OCIXADFieldPtr ora_getptr_generic
+#define ora_getptr_OCIXADTablePtr ora_getptr_generic
+#define ora_getptr_OCIXMLTypePtr ora_getptr_generic
+#define ora_getptr_OraTextPtr ora_getptr_generic
 #define ora_getptr_nzttBufferBlockPtr ora_getptr_generic
 #define ora_getptr_nzttCipherType ora_getptr_generic
 #define ora_getptr_nzttIdentType ora_getptr_generic
diff -ur Oracle-OCI-0.06.clean/h2xs Oracle-OCI-0.06.patched/h2xs
--- Oracle-OCI-0.06.clean/h2xs  2001-08-07 10:54:42.000000000 +0100
+++ Oracle-OCI-0.06.patched/h2xs        2011-10-17 10:52:24.236604422 +0100
@@ -1,7 +1,3 @@
-#!/opt/perl5/bin/perl
-    eval 'exec /opt/perl5/bin/perl -S $0 ${1+"$@"}'
-       if $running_under_some_shell;
-
 =head1 NAME
 
 h2xs - convert .h C header files to Perl extensions
@@ -557,6 +553,7 @@
     my @td;
     my @good_td;
     my $addflags = $opt_F || '';
+    $addflags = "-D__extension__= -D__inline= -P $addflags";
 
     # pass -I dirs on into C::Scan
     my @dirs_h = split /,/, $opt_I||'';
@@ -571,8 +568,10 @@
        $filter = $';
       }
       warn "Scanning $filename for functions...\n";
+      my @styles = $Config{gccversion} ? qw(C++ C9X GNU) : qw(C++ C9X);
+      warn "c_styles: " , join(' ', @styles), "\n";
       $c = new C::Scan 'filename' => $filename, 'filename_filter' => $filter,
-       'add_cppflags' => $addflags, 'c_styles' => [qw(C++ C9X)];
+       'add_cppflags' => $addflags, 'c_styles' => \@styles;
       $c->set('includeDirs' => [@dirs_h,"$Config::Config{archlib}/CORE"]);
 
       # force addition of __restrict into keywords (asap)
diff -ur Oracle-OCI-0.06.clean/utility.c Oracle-OCI-0.06.patched/utility.c
--- Oracle-OCI-0.06.clean/utility.c     2001-09-01 01:03:05.000000000 +0100
+++ Oracle-OCI-0.06.patched/utility.c   2011-10-17 10:52:24.240427617 +0100
@@ -39,7 +39,7 @@
 
 
 I32
-oci_buf_getmaxlen(IV svptr_iv, SV* len_sv)
+oci_buf_getmaxlen(pTHX_ IV svptr_iv, SV* len_sv)
 {
     STRLEN lna;
     SV *buf_sv = (SV*)svptr_iv;
@@ -50,7 +50,7 @@
 }
 
 I32
-oci_buf_setcurlen(IV svptr_iv, SV* len_sv)
+oci_buf_setcurlen(pTHX_ IV svptr_iv, SV* len_sv)
 {
     SV *buf_sv = (SV*)svptr_iv;
     IV len = SvIV(len_sv);
diff -ur Oracle-OCI-0.06.clean/utility.h Oracle-OCI-0.06.patched/utility.h
--- Oracle-OCI-0.06.clean/utility.h     2001-07-07 21:29:46.000000000 +0100
+++ Oracle-OCI-0.06.patched/utility.h   2011-10-17 10:52:24.244495169 +0100
@@ -9,8 +9,8 @@
 
 void *ora_getptr_generic(SV *arg, char *var, char *type, char *func);
 
-I32 oci_buf_getmaxlen(IV svptr_iv, SV* len_sv);
-I32 oci_buf_setcurlen(IV svptr_iv, SV* len_sv);
+I32 oci_buf_getmaxlen(pTHX_ IV svptr_iv, SV* len_sv);
+I32 oci_buf_setcurlen(pTHX_ IV svptr_iv, SV* len_sv);
 
 
 #include "getptrdef.h"


-- 
Charles Jardine - Computing Service, University of Cambridge
c...@cam.ac.uk    Tel: +44 1223 334506, Fax: +44 1223 334679

Reply via email to