[svn:dbd-oracle] r14761 - dbd-oracle/branches/TAF

[email protected] Sat, 19 Mar 2011 05:23:52 -0700 (PDT)
Newsgroups perl.dbd.oracle.changes
Message-ID <[email protected]>
Author: byterock
Date: Sat Mar 19 05:23:51 2011
New Revision: 14761

Modified:
   dbd-oracle/branches/TAF/Oracle.pm
   dbd-oracle/branches/TAF/Oracle.xs
   dbd-oracle/branches/TAF/dbdimp.c
   dbd-oracle/branches/TAF/dbdimp.h
   dbd-oracle/branches/TAF/oci8.c

Log:
Working version

with external  perl function

Modified: dbd-oracle/branches/TAF/Oracle.pm
==============================================================================
--- dbd-oracle/branches/TAF/Oracle.pm	(original)
+++ dbd-oracle/branches/TAF/Oracle.pm	Sat Mar 19 05:23:51 2011
@@ -31,12 +31,15 @@
         ora_fetch_orient  => [ qw( OCI_FETCH_NEXT OCI_FETCH_CURRENT OCI_FETCH_FIRST 
         			   OCI_FETCH_LAST OCI_FETCH_PRIOR OCI_FETCH_ABSOLUTE 
         			   OCI_FETCH_RELATIVE)],
-    	ora_exe_modes     => [ qw(OCI_STMT_SCROLLABLE_READONLY)],
+    	ora_exe_modes     => [ qw( OCI_STMT_SCROLLABLE_READONLY)],
+    	ora_fail_over     => [ qw( OCI_FO_END OCI_FO_ABORT OCI_FO_REAUTH OCI_FO_BEGIN
+    				   OCI_FO_ERROR OCI_FO_NONE OCI_FO_SESSION OCI_FO_SELECT 
+    				   OCI_FO_TXNAL)],
     );
     @EXPORT_OK = qw(OCI_FETCH_NEXT OCI_FETCH_CURRENT OCI_FETCH_FIRST OCI_FETCH_LAST OCI_FETCH_PRIOR
     		    OCI_FETCH_ABSOLUTE 	OCI_FETCH_RELATIVE ORA_OCI SQLCS_IMPLICIT SQLCS_NCHAR ora_env_var ora_cygwin_set_env );
     #unshift @EXPORT_OK, 'ora_cygwin_set_env' if $^O eq 'cygwin';
-    Exporter::export_ok_tags(qw(ora_types ora_session_modes ora_fetch_orient ora_exe_modes));
+    Exporter::export_ok_tags(qw(ora_types ora_session_modes ora_fetch_orient ora_exe_modes ora_fail_over));
 
     my $Revision = substr(q$Revision: 1.103 $, 10);
 
@@ -380,7 +383,7 @@
                  ora_client_identifier	=> undef,
                  ora_action		=> undef,
                  ora_taf		=> undef,
-                 ora_taf_attempts	=> undef,
+                 ora_taf_function	=> undef,
                  ora_taf_sleep		=> undef,
                
                  };
@@ -1077,6 +1080,7 @@
 		ora_rowid		=> undef,
 		ora_est_row_width	=> undef,
 		ora_type		=> undef,
+		ora_fail_over		=> undef,
     };
    }
 }

Modified: dbd-oracle/branches/TAF/Oracle.xs
==============================================================================
--- dbd-oracle/branches/TAF/Oracle.xs	(original)
+++ dbd-oracle/branches/TAF/Oracle.xs	Sat Mar 19 05:23:51 2011
@@ -25,31 +25,40 @@
 	ORA_CLOB	 = ORA_CLOB
 	ORA_BLOB	 = ORA_BLOB
 	ORA_RSET	 = ORA_RSET
-	ORA_VARCHAR2_TABLE = ORA_VARCHAR2_TABLE
-	ORA_NUMBER_TABLE   = ORA_NUMBER_TABLE
-	ORA_SYSDBA	 		  = 0x0002
-	ORA_SYSOPER	 		  = 0x0004
-	SQLCS_IMPLICIT 		  = SQLCS_IMPLICIT
-	SQLCS_NCHAR			  = SQLCS_NCHAR
-	SQLT_INT	 		  = SQLT_INT
-	SQLT_FLT	 		  = SQLT_FLT
+	ORA_VARCHAR2_TABLE	= ORA_VARCHAR2_TABLE
+	ORA_NUMBER_TABLE	= ORA_NUMBER_TABLE
+	ORA_SYSDBA	 		= 0x0002
+	ORA_SYSOPER	 		= 0x0004
+	SQLCS_IMPLICIT 		= SQLCS_IMPLICIT
+	SQLCS_NCHAR			= SQLCS_NCHAR
+	SQLT_INT	 		= SQLT_INT
+	SQLT_FLT	 		= SQLT_FLT
 	OCI_BATCH_MODE		= 0x01
-	OCI_EXACT_FETCH	   = 0x02
-	OCI_KEEP_FETCH_STATE  = 0x04
-	OCI_DESCRIBE_ONLY	 = 0x10
-	OCI_COMMIT_ON_SUCCESS = 0x20
-	OCI_NON_BLOCKING	  = 0x40
-	OCI_BATCH_ERRORS	  = 0x80
-	OCI_PARSE_ONLY		= 0x100
-	OCI_SHOW_DML_WARNINGS = 0x400
+	OCI_EXACT_FETCH		= 0x02
+	OCI_KEEP_FETCH_STATE	= 0x04
+	OCI_DESCRIBE_ONLY		= 0x10
+	OCI_COMMIT_ON_SUCCESS	= 0x20
+	OCI_NON_BLOCKING		= 0x40
+	OCI_BATCH_ERRORS		= 0x80
+	OCI_PARSE_ONLY			= 0x100
+	OCI_SHOW_DML_WARNINGS	= 0x400
+  	OCI_FETCH_CURRENT 		= OCI_FETCH_CURRENT
+	OCI_FETCH_NEXT 			= OCI_FETCH_NEXT
+	OCI_FETCH_FIRST			= OCI_FETCH_FIRST
+	OCI_FETCH_LAST 			= OCI_FETCH_LAST
+	OCI_FETCH_PRIOR 		= OCI_FETCH_PRIOR
+	OCI_FETCH_ABSOLUTE 		= OCI_FETCH_ABSOLUTE
+	OCI_FETCH_RELATIVE		= OCI_FETCH_RELATIVE
+	OCI_FO_END				= OCI_FO_END
+	OCI_FO_ABORT			= OCI_FO_ABORT
+	OCI_FO_REAUTH			= OCI_FO_REAUTH
+	OCI_FO_BEGIN			= OCI_FO_BEGIN
+	OCI_FO_ERROR			= OCI_FO_ERROR
+	OCI_FO_NONE				= OCI_FO_NONE
+	OCI_FO_SESSION			= OCI_FO_SESSION
+	OCI_FO_SELECT			= OCI_FO_SELECT
+	OCI_FO_TXNAL			= OCI_FO_TXNAL
 	OCI_STMT_SCROLLABLE_READONLY = 0x08
-  	OCI_FETCH_CURRENT 	= OCI_FETCH_CURRENT
-	OCI_FETCH_NEXT 		= OCI_FETCH_NEXT
-	OCI_FETCH_FIRST		= OCI_FETCH_FIRST
-	OCI_FETCH_LAST 		= OCI_FETCH_LAST
-	OCI_FETCH_PRIOR 	= OCI_FETCH_PRIOR
-	OCI_FETCH_ABSOLUTE 	= OCI_FETCH_ABSOLUTE
-	OCI_FETCH_RELATIVE	= OCI_FETCH_RELATIVE
 	SQLT_CHR	= SQLT_CHR
 	SQLT_BIN	= SQLT_BIN
 	CODE:

Modified: dbd-oracle/branches/TAF/dbdimp.c
==============================================================================
--- dbd-oracle/branches/TAF/dbdimp.c	(original)
+++ dbd-oracle/branches/TAF/dbdimp.c	Sat Mar 19 05:23:51 2011
@@ -496,9 +496,16 @@
 	if (DBD_ATTRIB_TRUE(attr,"ora_taf",7,svp)){
 		imp_dbh->using_taf = 1;
 		imp_dbh->taf_sleep = 5; /* 5 second default */
-    	DBD_ATTRIB_GET_IV( attr, "ora_taf_attempts",  16, svp, imp_dbh->taf_attempts);
+
     	DBD_ATTRIB_GET_IV( attr, "ora_taf_sleep",  13, svp, imp_dbh->taf_sleep);
 
+		if ((svp=DBD_ATTRIB_GET_SVP(attr, "ora_taf_function",  16)) && SvOK(*svp)) {
+			STRLEN  svp_len;
+			if (!SvPOK(*svp))
+				croak("ora_taf_function is not a string");
+			imp_dbh->taf_function = (char *) SvPV (*svp, svp_len );
+
+		}
 	}
 
     imp_dbh->server_version = 0;
@@ -1301,8 +1308,8 @@
 	else if (kl==7 && strEQ(key, "ora_taf") ) {
 		imp_dbh->using_taf = 1;
 	}
-	else if (kl==16 && strEQ(key, "ora_taf_attempts") ) {
-		imp_dbh->taf_attempts = SvIV (valuesv);
+	else if (kl==16 && strEQ(key, "ora_taf_function") ) {
+			imp_dbh->taf_function = (char *) SvPV (valuesv, vl );
 	}
 	else if (kl==13 && strEQ(key, "ora_taf_sleep") ) {
 			imp_dbh->taf_sleep = SvIV (valuesv);
@@ -1420,8 +1427,8 @@
 	else if (kl==7 && strEQ(key, "ora_taf") ) {
 		retsv = newSViv(imp_dbh->using_taf);
 	}
-	else if (kl==16 && strEQ(key, "ora_taf_attempts") ) {
-		retsv = newSViv(imp_dbh->taf_attempts);
+	else if (kl==16 && strEQ(key, "ora_taf_function") ) {
+		retsv = newSVpv((char *)imp_dbh->taf_function,0);
 	}
 	else if (kl==13 && strEQ(key, "ora_taf_sleep") ) {
 		retsv = newSViv(imp_dbh->taf_sleep);

Modified: dbd-oracle/branches/TAF/dbdimp.h
==============================================================================
--- dbd-oracle/branches/TAF/dbdimp.h	(original)
+++ dbd-oracle/branches/TAF/dbdimp.h	Sat Mar 19 05:23:51 2011
@@ -54,7 +54,7 @@
 	ub4			driver_namel;
 #endif
     bool		using_taf; /*TAF stuff*/
-    int			taf_attempts;
+    char		*taf_function; /*User supplied TAF functiomn*/
     int			taf_sleep;
     char		*client_info;  /*user defined*/
     ub4			client_infol;

Modified: dbd-oracle/branches/TAF/oci8.c
==============================================================================
--- dbd-oracle/branches/TAF/oci8.c	(original)
+++ dbd-oracle/branches/TAF/oci8.c	Sat Mar 19 05:23:51 2011
@@ -1318,82 +1318,62 @@
 	dTHX;
 	imp_dbh_t *dbh =(imp_dbh_t*)fo_ctx;
 
-  switch (fo_event)
-  {
-   case OCI_FO_BEGIN:
-   {
-     printf(" Failing Over ... Please stand by \n");
-     printf(" Failover type was found to be %s \n",
-                     ((fo_type==OCI_FO_NONE) ? "NONE"
-                     :(fo_type==OCI_FO_SESSION) ? "SESSION"
-                     :(fo_type==OCI_FO_SELECT) ? "SELECT"
-                     : "UNKNOWN!"));
-     printf(" Failover Context is :%s\n",
-            (fo_ctx?(char *)fo_ctx:"NULL POINTER!"));
-     break;
-   }
-
-   case OCI_FO_ABORT:
-   {
-     printf(" Failover aborted. Failover will not take place.\n");
-     break;
-   }
-
-   case OCI_FO_END:
-   {
-     printf(" Failover ended ...resuming services\n");
-     break;
-   }
-
-   case OCI_FO_REAUTH:
-   {
-     printf(" Failed over user. Resuming services\n");
-
-                    /* Application can check the OCI_ATTR_SESSION attribute of
-                       the service handle to find out the user being
-                       re-authenticated.
-
-                       After this, the application can replay any ALTER SESSION
-                       commands associated with this session.  These must have
-                      been saved by the application in the fo_ctx
-                     */
-     break;
-   }
-
-
-   case OCI_FO_ERROR:
-   {
-     printf(" Failover error gotten. Sleeping...\n");
-     sleep(dbh->taf_sleep);
-     return OCI_FO_RETRY;
-     break;
-   }
-
-   default:
-   {
-     printf("Bad Failover Event: %d.\n",  fo_event);
-     break;
-   }
-  }
-  return 0;
+	dSP;
+	PUSHMARK(SP);
+	XPUSHs(sv_2mortal(newSViv(fo_event)));
+	XPUSHs(sv_2mortal(newSViv(fo_type)));
+	PUTBACK;
+
+	PerlIO_printf(DBILOGFP, "taf_cbk mp_drh=%p\n",dbh);
+PerlIO_printf(DBILOGFP, "taf_cbk ora_taf_function=%s\n",dbh);
+PerlIO_printf(DBILOGFP, " taf_cbk=%s\n",dbh->client_info);
+
+PerlIO_printf(DBILOGFP, " taf_sleep=%d\n",dbh->taf_sleep);
+	call_pv(dbh->taf_function, G_DISCARD);
+
+	switch (fo_event){
+
+		case OCI_FO_BEGIN:
+		case OCI_FO_ABORT:
+		case OCI_FO_END:
+		case OCI_FO_REAUTH:
+		{
+			break;
+		}
+		case OCI_FO_ERROR:
+		{
+			sleep(dbh->taf_sleep);
+			return OCI_FO_RETRY;
+			break;
+		}
+
+		default:
+		{
+			break;
+		}
+	}
+	return 0;
 }
 
 
 sb4
-reg_taf_callback(imp_dbh_t *imp_dbh)
+reg_taf_callback( imp_dbh_t *imp_dbh)
 {
 	dTHX;
 	OCIFocbkStruct 	tafailover;
 	sword 			status;
 
+
   	if (dbd_verbose >= 5 ) {
   		PerlIO_printf(DBILOGFP, " In reg_taf_callback\n");
 	}
 /* set the context up as a pointer to the handle*/
-    tafailover.fo_ctx = imp_dbh;
-
+    tafailover.fo_ctx = &imp_dbh;
   	tafailover.callback_function = &taf_cbk;
 
+PerlIO_printf(DBILOGFP, " reg_taf_callback=%s\n",imp_dbh->taf_function);
+PerlIO_printf(DBILOGFP, " reg_taf_callback=%s\n",imp_dbh->client_info);
+PerlIO_printf(DBILOGFP, " reg_taf_callback=%p\n",imp_dbh);
     OCIAttrSet_log_stat(imp_dbh->srvhp, (ub4) OCI_HTYPE_SERVER,
 								(dvoid *) &tafailover, (ub4) 0,
                                  (ub4) OCI_ATTR_FOCBK, imp_dbh->errhp, status);
@@ -4055,6 +4035,7 @@
 {
 	dTHX;
 	sword status;
+
 	/* OCI 8 does not seem to allow uid to be "name/pass" :-( */
 	/* so we have to split it up ourselves */
 	if (strlen(*pwdp)==0 && strchr(*uidp,'/')) {