[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,'/')) {