Browse Source
Merge branch 'pull-request/2459' into PHP-7.0
Merge branch 'pull-request/2459' into PHP-7.0
* pull-request/2459: oci8 - Implementation of Oracle TAF Callbackpull/2587/head
7 changed files with 250 additions and 4 deletions
-
4ext/oci8/config.m4
-
4ext/oci8/config.w32
-
38ext/oci8/oci8.c
-
162ext/oci8/oci8_failover.c
-
36ext/oci8/oci8_interface.c
-
1ext/oci8/php_oci8.h
-
9ext/oci8/php_oci8_int.h
@ -0,0 +1,162 @@ |
|||
/* |
|||
+----------------------------------------------------------------------+ |
|||
| PHP Version 5 | |
|||
+----------------------------------------------------------------------+ |
|||
| Copyright (c) 1997-2016 The PHP Group | |
|||
+----------------------------------------------------------------------+ |
|||
| This source file is subject to version 3.01 of the PHP license, | |
|||
| that is bundled with this package in the file LICENSE, and is | |
|||
| available through the world-wide-web at the following url: | |
|||
| http://www.php.net/license/3_01.txt | |
|||
| If you did not receive a copy of the PHP license and are unable to | |
|||
| obtain it through the world-wide-web, please send a note to | |
|||
| license@php.net so we can mail you a copy immediately. | |
|||
+----------------------------------------------------------------------+ |
|||
| Authors: Stig Sæther Bakken <ssb@php.net> | |
|||
| Thies C. Arntzen <thies@thieso.net> | |
|||
| | |
|||
| Collection support by Andy Sautins <asautins@veripost.net> | |
|||
| Temporary LOB support by David Benson <dbenson@mancala.com> | |
|||
| ZTS per process OCIPLogon by Harald Radi <harald.radi@nme.at> | |
|||
| | |
|||
| Redesigned by: Antony Dovgal <antony@zend.com> | |
|||
| Andi Gutmans <andi@zend.com> | |
|||
| Wez Furlong <wez@omniti.com> | |
|||
+----------------------------------------------------------------------+ |
|||
*/ |
|||
|
|||
|
|||
|
|||
#ifdef HAVE_CONFIG_H |
|||
#include "config.h" |
|||
#endif |
|||
|
|||
#include "php.h" |
|||
#include "ext/standard/info.h" |
|||
#include "php_ini.h" |
|||
|
|||
#if HAVE_OCI8 |
|||
|
|||
#include "php_oci8.h" |
|||
#include "php_oci8_int.h" |
|||
|
|||
/* {{{ callback_fn() |
|||
OCI TAF callback function, calling userspace function */ |
|||
sb4 callback_fn(OCISvcCtx *svchp, OCIEnv *envhp, php_oci_connection *fo_ctx, ub4 fo_type, ub4 fo_event) |
|||
{ |
|||
/* Create zval */ |
|||
zval retval, params[3]; |
|||
|
|||
/* Default return value */ |
|||
sb4 returnValue = 0; |
|||
|
|||
/* Check if userspace callback function was disabled */ |
|||
if (Z_ISUNDEF(fo_ctx->taf_callback) || Z_ISNULL(fo_ctx->taf_callback)) { |
|||
return 0; |
|||
} |
|||
|
|||
/* Initialize zval */ |
|||
ZVAL_RES(¶ms[0], fo_ctx->id); |
|||
ZVAL_LONG(¶ms[1], fo_event); |
|||
ZVAL_LONG(¶ms[2], fo_type); |
|||
|
|||
/* Call user function (if possible) */ |
|||
if (call_user_function(EG(function_table), NULL, &fo_ctx->taf_callback, &retval, 3, params) == FAILURE) { |
|||
php_error_docref(NULL, E_WARNING, "Unable to call taf callback function, is it defined?"); |
|||
} |
|||
|
|||
/* Set return value */ |
|||
if (Z_TYPE(retval) == IS_LONG) { |
|||
returnValue = (sb4) Z_LVAL(retval); |
|||
} |
|||
|
|||
/* Setting params[0] to null so ressource isn't destroyed on zval_dtor */ |
|||
ZVAL_NULL(¶ms[0]); |
|||
|
|||
/* Cleanup */ |
|||
zval_dtor(&retval); |
|||
zval_dtor(¶ms[0]); |
|||
zval_dtor(¶ms[1]); |
|||
zval_dtor(¶ms[2]); |
|||
|
|||
return returnValue; |
|||
} |
|||
/* }}} */ |
|||
|
|||
/* {{{ php_oci_disable_taf_callback() |
|||
Disables the userspace callback function for Oracle TAF, |
|||
while keeping the OCI callback alive */ |
|||
int php_oci_disable_taf_callback(php_oci_connection *connection) |
|||
{ |
|||
return php_oci_register_taf_callback(connection, NULL); |
|||
} |
|||
/* }}} */ |
|||
|
|||
/* {{{ php_oci_register_taf_callback() |
|||
Register a callback function for Oracle TAF */ |
|||
int php_oci_register_taf_callback(php_oci_connection *connection, zval *callback) |
|||
{ |
|||
sword errstatus; |
|||
int registered = 0; |
|||
|
|||
/* temporary failover callback structure */ |
|||
OCIFocbkStruct failover; |
|||
|
|||
if (!callback) { |
|||
/* Disable callback */ |
|||
if (Z_ISUNDEF(connection->taf_callback) || Z_ISNULL(connection->taf_callback)) { |
|||
return 0; // Nothing to disable |
|||
} |
|||
|
|||
registered = 1; |
|||
zval_ptr_dtor(&connection->taf_callback); |
|||
ZVAL_NULL(&connection->taf_callback); |
|||
} else { |
|||
if (!Z_ISUNDEF(connection->taf_callback)) { |
|||
registered = 1; |
|||
if (!Z_ISNULL(connection->taf_callback)) { |
|||
zval_ptr_dtor(&connection->taf_callback); |
|||
ZVAL_NULL(&connection->taf_callback); |
|||
} |
|||
} |
|||
|
|||
/* Set userspace callback function */ |
|||
ZVAL_COPY(&connection->taf_callback, callback); |
|||
} |
|||
|
|||
/* OCI callback function already registered */ |
|||
if (registered) { |
|||
return 0; |
|||
} |
|||
|
|||
/* set context */ |
|||
failover.fo_ctx = connection; |
|||
|
|||
/* set callback function */ |
|||
failover.callback_function = &callback_fn; |
|||
|
|||
/* do the registration */ |
|||
PHP_OCI_CALL_RETURN(errstatus, OCIAttrSet, (connection->server, (ub4) OCI_HTYPE_SERVER, (void *) &failover, (ub4) 0, (ub4) OCI_ATTR_FOCBK, connection->err)); |
|||
|
|||
if (errstatus != OCI_SUCCESS) { |
|||
zval_ptr_dtor(&connection->taf_callback); |
|||
ZVAL_UNDEF(&connection->taf_callback); |
|||
connection->errcode = php_oci_error(connection->err, errstatus); |
|||
return 1; |
|||
} |
|||
|
|||
/* successful conclusion */ |
|||
return 0; |
|||
} |
|||
/* }}} */ |
|||
|
|||
#endif /* HAVE_OCI8 */ |
|||
|
|||
/* |
|||
* Local variables: |
|||
* tab-width: 4 |
|||
* c-basic-offset: 4 |
|||
* End: |
|||
* vim600: noet sw=4 ts=4 fdm=marker |
|||
* vim<600: noet sw=4 ts=4 |
|||
*/ |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue