1999-04-21 22:49:16 +00:00
/*
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
2004-01-08 08:18:22 +00:00
| PHP Version 5 |
1999-04-21 22:49:16 +00:00
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
2007-12-31 07:17:19 +00:00
| Copyright ( c ) 1997 - 2008 The PHP Group |
1999-04-21 22:49:16 +00:00
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
2006-01-01 12:51:34 +00:00
| This source file is subject to version 3.01 of the PHP license , |
1999-07-16 13:13:16 +00:00
| that is bundled with this package in the file LICENSE , and is |
2003-06-10 20:04:29 +00:00
| available through the world - wide - web at the following url : |
2006-01-01 12:51:34 +00:00
| http : //www.php.net/license/3_01.txt |
1999-07-16 13:13:16 +00:00
| 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 . |
1999-04-21 22:49:16 +00:00
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
2004-02-12 19:05:41 +00:00
| Authors : Stig S <EFBFBD> ther Bakken < ssb @ php . net > |
2002-02-28 08:29:35 +00:00
| Thies C . Arntzen < thies @ thieso . net > |
2003-01-29 18:31:48 +00:00
| Maxim Maletsky < maxim @ maxim . cx > |
2002-02-28 08:29:35 +00:00
| |
2001-04-13 14:43:39 +00:00
| Collection support by Andy Sautins < asautins @ veripost . net > |
2002-02-28 08:29:35 +00:00
| Temporary LOB support by David Benson < dbenson @ mancala . com > |
2003-12-16 10:29:11 +00:00
| ZTS per process OCIPLogon by Harald Radi < harald . radi @ nme . at > |
2005-12-01 13:39:48 +00:00
| |
| Redesigned by : Antony Dovgal < antony @ zend . com > |
| Andi Gutmans < andi @ zend . com > |
| Wez Furlong < wez @ omniti . com > |
1999-04-21 22:49:16 +00:00
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
2005-12-01 13:39:48 +00:00
*/
2000-02-01 14:39:59 +00:00
1999-04-21 22:49:16 +00:00
/* $Id$ */
2001-05-24 10:07:29 +00:00
# ifdef HAVE_CONFIG_H
# include "config.h"
# endif
1999-04-21 22:49:16 +00:00
# include "php.h"
2000-04-06 21:07:44 +00:00
# include "ext/standard/info.h"
2003-12-16 10:29:11 +00:00
# include "php_ini.h"
2005-12-01 13:39:48 +00:00
# include "ext/standard/php_smart_str.h"
1999-04-24 18:54:02 +00:00
1999-08-10 14:33:59 +00:00
# if HAVE_OCI8
1999-07-08 14:12:07 +00:00
1999-12-04 19:19:57 +00:00
# include "php_oci8.h"
2005-12-01 13:39:48 +00:00
# include "php_oci8_int.h"
2006-08-05 20:56:43 +00:00
# include "zend_hash.h"
1999-04-21 22:49:16 +00:00
2005-12-01 13:39:48 +00:00
ZEND_DECLARE_MODULE_GLOBALS ( oci )
2006-08-24 12:05:19 +00:00
# if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 1) || (PHP_MAJOR_VERSION > 5)
2008-01-31 01:33:30 +00:00
/* This "if" allows PECL builds from this file to be portable to older PHP releases */
2006-06-15 18:33:09 +00:00
static PHP_GINIT_FUNCTION ( oci ) ;
2006-08-24 12:05:19 +00:00
# endif
2003-12-16 10:29:11 +00:00
2008-01-31 01:33:30 +00:00
/* Allow PHP 5.3 branch to be used in PECL for 5.x compatible builds */
# ifndef Z_ADDREF_P
# define Z_ADDREF_P(x) ZVAL_ADDREF(x)
# endif
1999-08-17 13:54:25 +00:00
/* True globals, no need for thread safety */
2005-12-01 13:39:48 +00:00
int le_connection ;
int le_pconnection ;
int le_statement ;
int le_descriptor ;
2008-01-31 01:33:30 +00:00
int le_psessionpool ;
2005-12-01 13:39:48 +00:00
int le_collection ;
zend_class_entry * oci_lob_class_entry_ptr ;
zend_class_entry * oci_coll_class_entry_ptr ;
1999-04-24 18:54:02 +00:00
# ifndef SQLT_BFILEE
1999-12-23 08:18:35 +00:00
# define SQLT_BFILEE 114
1999-04-24 18:54:02 +00:00
# endif
# ifndef SQLT_CFILEE
1999-12-23 08:18:35 +00:00
# define SQLT_CFILEE 115
1999-04-24 18:54:02 +00:00
# endif
2005-12-01 13:39:48 +00:00
# define PHP_OCI_ERRBUF_LEN 512
1999-04-21 22:49:16 +00:00
2005-12-01 13:39:48 +00:00
# if ZEND_MODULE_API_NO > 20020429
# define ONUPDATELONGFUNC OnUpdateLong
2003-12-16 10:29:11 +00:00
# else
2005-12-01 13:39:48 +00:00
# define ONUPDATELONGFUNC OnUpdateInt
2003-12-16 10:29:11 +00:00
# endif
2001-08-15 16:00:56 +00:00
2005-12-01 13:39:48 +00:00
/* static protos {{{ */
static void php_oci_connection_list_dtor ( zend_rsrc_list_entry * TSRMLS_DC ) ;
static void php_oci_pconnection_list_dtor ( zend_rsrc_list_entry * TSRMLS_DC ) ;
2008-03-12 01:26:44 +00:00
static void php_oci_pconnection_list_np_dtor ( zend_rsrc_list_entry * TSRMLS_DC ) ;
2005-12-01 13:39:48 +00:00
static void php_oci_statement_list_dtor ( zend_rsrc_list_entry * TSRMLS_DC ) ;
static void php_oci_descriptor_list_dtor ( zend_rsrc_list_entry * TSRMLS_DC ) ;
2008-01-31 01:33:30 +00:00
static void php_oci_spool_list_dtor ( zend_rsrc_list_entry * entry TSRMLS_DC ) ;
2005-12-01 13:39:48 +00:00
static void php_oci_collection_list_dtor ( zend_rsrc_list_entry * TSRMLS_DC ) ;
1999-04-21 22:49:16 +00:00
2005-12-05 23:38:04 +00:00
static int php_oci_persistent_helper ( zend_rsrc_list_entry * le TSRMLS_DC ) ;
2006-01-10 08:34:28 +00:00
# ifdef ZTS
2006-01-18 10:12:34 +00:00
static int php_oci_list_helper ( zend_rsrc_list_entry * le , void * le_type TSRMLS_DC ) ;
2006-01-10 08:34:28 +00:00
# endif
2005-12-01 13:39:48 +00:00
static int php_oci_connection_ping ( php_oci_connection * TSRMLS_DC ) ;
static int php_oci_connection_status ( php_oci_connection * TSRMLS_DC ) ;
static int php_oci_connection_close ( php_oci_connection * TSRMLS_DC ) ;
2008-01-31 01:33:30 +00:00
static void php_oci_spool_close ( php_oci_spool * session_pool TSRMLS_DC ) ;
2008-03-12 01:26:44 +00:00
static OCIEnv * php_oci_create_env ( ub2 charsetid TSRMLS_DC ) ;
2008-01-31 01:33:30 +00:00
static int php_oci_create_session ( php_oci_connection * connection , php_oci_spool * session_pool , char * dbname , int dbname_len , char * username , int username_len , char * password , int password_len , char * new_password , int new_password_len , int session_mode TSRMLS_DC ) ;
static int php_oci_old_create_session ( php_oci_connection * connection , char * dbname , int dbname_len , char * username , int username_len , char * password , int password_len , char * new_password , int new_password_len , int session_mode TSRMLS_DC ) ;
static php_oci_spool * php_oci_get_spool ( char * username , int username_len , char * password , int password_len , char * dbname , int dbname_len , int charsetid TSRMLS_DC ) ;
static php_oci_spool * php_oci_create_spool ( char * username , int username_len , char * password , int password_len , char * dbname , int dbname_len , char * hash_key , int hash_key_len , int charsetid TSRMLS_DC ) ;
2008-03-12 01:26:44 +00:00
static sword php_oci_ping_init ( php_oci_connection * connection , OCIError * errh TSRMLS_DC ) ;
1999-04-21 22:49:16 +00:00
/* }}} */
/* {{{ dynamically loadable module stuff */
2000-05-23 09:33:51 +00:00
# ifdef COMPILE_DL_OCI8
2000-05-02 00:30:36 +00:00
ZEND_GET_MODULE ( oci8 )
1999-04-21 22:49:16 +00:00
# endif /* COMPILE_DL */
2003-12-25 13:54:50 +00:00
/* }}} */
2005-12-01 13:39:48 +00:00
# ifdef ZEND_ENGINE_2
ZEND_BEGIN_ARG_INFO ( oci_second_arg_force_ref , 0 )
ZEND_ARG_PASS_INFO ( 0 )
ZEND_ARG_PASS_INFO ( 1 )
ZEND_END_ARG_INFO ( )
ZEND_BEGIN_ARG_INFO ( oci_third_arg_force_ref , 0 )
ZEND_ARG_PASS_INFO ( 0 )
ZEND_ARG_PASS_INFO ( 0 )
ZEND_ARG_PASS_INFO ( 1 )
ZEND_END_ARG_INFO ( )
# else
static unsigned char oci_second_arg_force_ref [ ] = { 2 , BYREF_NONE , BYREF_FORCE } ;
static unsigned char oci_third_arg_force_ref [ ] = { 3 , BYREF_NONE , BYREF_NONE , BYREF_FORCE } ;
2003-12-25 13:54:50 +00:00
# endif
2004-01-02 15:32:09 +00:00
/* {{{ extension function prototypes
*/
2003-12-23 15:45:36 +00:00
PHP_FUNCTION ( oci_bind_by_name ) ;
2005-12-01 13:39:48 +00:00
PHP_FUNCTION ( oci_bind_array_by_name ) ;
2003-12-23 15:45:36 +00:00
PHP_FUNCTION ( oci_define_by_name ) ;
PHP_FUNCTION ( oci_field_is_null ) ;
PHP_FUNCTION ( oci_field_name ) ;
PHP_FUNCTION ( oci_field_size ) ;
PHP_FUNCTION ( oci_field_scale ) ;
PHP_FUNCTION ( oci_field_precision ) ;
PHP_FUNCTION ( oci_field_type ) ;
PHP_FUNCTION ( oci_field_type_raw ) ;
PHP_FUNCTION ( oci_execute ) ;
PHP_FUNCTION ( oci_fetch ) ;
PHP_FUNCTION ( oci_cancel ) ;
1999-08-10 14:33:59 +00:00
PHP_FUNCTION ( ocifetchinto ) ;
2003-12-23 16:02:53 +00:00
PHP_FUNCTION ( oci_fetch_object ) ;
PHP_FUNCTION ( oci_fetch_row ) ;
PHP_FUNCTION ( oci_fetch_assoc ) ;
PHP_FUNCTION ( oci_fetch_array ) ;
PHP_FUNCTION ( ocifetchstatement ) ;
2003-12-23 15:45:36 +00:00
PHP_FUNCTION ( oci_fetch_all ) ;
PHP_FUNCTION ( oci_free_statement ) ;
PHP_FUNCTION ( oci_internal_debug ) ;
PHP_FUNCTION ( oci_close ) ;
PHP_FUNCTION ( oci_connect ) ;
PHP_FUNCTION ( oci_new_connect ) ;
PHP_FUNCTION ( oci_pconnect ) ;
PHP_FUNCTION ( oci_error ) ;
PHP_FUNCTION ( oci_free_descriptor ) ;
PHP_FUNCTION ( oci_commit ) ;
PHP_FUNCTION ( oci_rollback ) ;
PHP_FUNCTION ( oci_new_descriptor ) ;
PHP_FUNCTION ( oci_num_fields ) ;
PHP_FUNCTION ( oci_parse ) ;
PHP_FUNCTION ( oci_new_cursor ) ;
PHP_FUNCTION ( oci_result ) ;
PHP_FUNCTION ( oci_server_version ) ;
PHP_FUNCTION ( oci_statement_type ) ;
PHP_FUNCTION ( oci_num_rows ) ;
PHP_FUNCTION ( oci_set_prefetch ) ;
PHP_FUNCTION ( oci_password_change ) ;
PHP_FUNCTION ( oci_lob_save ) ;
PHP_FUNCTION ( oci_lob_import ) ;
PHP_FUNCTION ( oci_lob_export ) ;
PHP_FUNCTION ( oci_lob_load ) ;
PHP_FUNCTION ( oci_lob_tell ) ;
PHP_FUNCTION ( oci_lob_write ) ;
PHP_FUNCTION ( oci_lob_append ) ;
PHP_FUNCTION ( oci_lob_copy ) ;
PHP_FUNCTION ( oci_lob_truncate ) ;
PHP_FUNCTION ( oci_lob_erase ) ;
PHP_FUNCTION ( oci_lob_flush ) ;
2003-12-15 13:53:01 +00:00
PHP_FUNCTION ( ocisetbufferinglob ) ;
PHP_FUNCTION ( ocigetbufferinglob ) ;
2003-12-23 15:45:36 +00:00
PHP_FUNCTION ( oci_lob_is_equal ) ;
PHP_FUNCTION ( oci_lob_rewind ) ;
PHP_FUNCTION ( oci_lob_read ) ;
PHP_FUNCTION ( oci_lob_eof ) ;
PHP_FUNCTION ( oci_lob_seek ) ;
PHP_FUNCTION ( oci_lob_size ) ;
PHP_FUNCTION ( oci_lob_write_temporary ) ;
PHP_FUNCTION ( oci_lob_close ) ;
PHP_FUNCTION ( oci_new_collection ) ;
PHP_FUNCTION ( oci_free_collection ) ;
PHP_FUNCTION ( oci_collection_append ) ;
PHP_FUNCTION ( oci_collection_element_get ) ;
PHP_FUNCTION ( oci_collection_element_assign ) ;
PHP_FUNCTION ( oci_collection_assign ) ;
PHP_FUNCTION ( oci_collection_size ) ;
PHP_FUNCTION ( oci_collection_max ) ;
PHP_FUNCTION ( oci_collection_trim ) ;
1999-04-21 22:49:16 +00:00
/* }}} */
2004-01-02 15:32:09 +00:00
/* {{{ extension definition structures
*/
2008-01-31 01:33:30 +00:00
static
# if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 2) || (PHP_MAJOR_VERSION > 5)
/* This "if" allows PECL builds from this file to be portable to older PHP releases */
const
# endif
zend_function_entry php_oci_functions [ ] = {
2008-03-12 01:26:44 +00:00
PHP_FE ( oci_define_by_name , oci_third_arg_force_ref )
PHP_FE ( oci_bind_by_name , oci_third_arg_force_ref )
PHP_FE ( oci_bind_array_by_name , oci_third_arg_force_ref )
PHP_FE ( oci_field_is_null , NULL )
PHP_FE ( oci_field_name , NULL )
PHP_FE ( oci_field_size , NULL )
PHP_FE ( oci_field_scale , NULL )
PHP_FE ( oci_field_precision , NULL )
PHP_FE ( oci_field_type , NULL )
PHP_FE ( oci_field_type_raw , NULL )
PHP_FE ( oci_execute , NULL )
PHP_FE ( oci_cancel , NULL )
PHP_FE ( oci_fetch , NULL )
PHP_FE ( oci_fetch_object , NULL )
PHP_FE ( oci_fetch_row , NULL )
PHP_FE ( oci_fetch_assoc , NULL )
PHP_FE ( oci_fetch_array , NULL )
PHP_FE ( ocifetchinto , oci_second_arg_force_ref )
PHP_FE ( oci_fetch_all , oci_second_arg_force_ref )
PHP_FE ( oci_free_statement , NULL )
PHP_FE ( oci_internal_debug , NULL )
PHP_FE ( oci_num_fields , NULL )
PHP_FE ( oci_parse , NULL )
PHP_FE ( oci_new_cursor , NULL )
PHP_FE ( oci_result , NULL )
PHP_FE ( oci_server_version , NULL )
PHP_FE ( oci_statement_type , NULL )
PHP_FE ( oci_num_rows , NULL )
PHP_FE ( oci_close , NULL )
PHP_FE ( oci_connect , NULL )
PHP_FE ( oci_new_connect , NULL )
PHP_FE ( oci_pconnect , NULL )
PHP_FE ( oci_error , NULL )
PHP_FE ( oci_free_descriptor , NULL )
PHP_FE ( oci_lob_save , NULL )
PHP_FE ( oci_lob_import , NULL )
PHP_FE ( oci_lob_size , NULL )
PHP_FE ( oci_lob_load , NULL )
PHP_FE ( oci_lob_read , NULL )
PHP_FE ( oci_lob_eof , NULL )
PHP_FE ( oci_lob_tell , NULL )
PHP_FE ( oci_lob_truncate , NULL )
PHP_FE ( oci_lob_erase , NULL )
PHP_FE ( oci_lob_flush , NULL )
PHP_FE ( ocisetbufferinglob , NULL )
PHP_FE ( ocigetbufferinglob , NULL )
PHP_FE ( oci_lob_is_equal , NULL )
PHP_FE ( oci_lob_rewind , NULL )
PHP_FE ( oci_lob_write , NULL )
PHP_FE ( oci_lob_append , NULL )
PHP_FE ( oci_lob_copy , NULL )
PHP_FE ( oci_lob_export , NULL )
PHP_FE ( oci_lob_seek , NULL )
PHP_FE ( oci_commit , NULL )
PHP_FE ( oci_rollback , NULL )
PHP_FE ( oci_new_descriptor , NULL )
PHP_FE ( oci_set_prefetch , NULL )
PHP_FE ( oci_password_change , NULL )
PHP_FE ( oci_free_collection , NULL )
PHP_FE ( oci_collection_append , NULL )
PHP_FE ( oci_collection_element_get , NULL )
PHP_FE ( oci_collection_element_assign , NULL )
PHP_FE ( oci_collection_assign , NULL )
PHP_FE ( oci_collection_size , NULL )
PHP_FE ( oci_collection_max , NULL )
PHP_FE ( oci_collection_trim , NULL )
PHP_FE ( oci_new_collection , NULL )
PHP_FALIAS ( oci_free_cursor , oci_free_statement , NULL )
PHP_FALIAS ( ocifreecursor , oci_free_statement , NULL )
PHP_FALIAS ( ocibindbyname , oci_bind_by_name , oci_third_arg_force_ref )
PHP_FALIAS ( ocidefinebyname , oci_define_by_name , oci_third_arg_force_ref )
PHP_FALIAS ( ocicolumnisnull , oci_field_is_null , NULL )
PHP_FALIAS ( ocicolumnname , oci_field_name , NULL )
PHP_FALIAS ( ocicolumnsize , oci_field_size , NULL )
PHP_FALIAS ( ocicolumnscale , oci_field_scale , NULL )
PHP_FALIAS ( ocicolumnprecision , oci_field_precision , NULL )
PHP_FALIAS ( ocicolumntype , oci_field_type , NULL )
PHP_FALIAS ( ocicolumntyperaw , oci_field_type_raw , NULL )
PHP_FALIAS ( ociexecute , oci_execute , NULL )
PHP_FALIAS ( ocicancel , oci_cancel , NULL )
PHP_FALIAS ( ocifetch , oci_fetch , NULL )
PHP_FALIAS ( ocifetchstatement , oci_fetch_all , oci_second_arg_force_ref )
PHP_FALIAS ( ocifreestatement , oci_free_statement , NULL )
PHP_FALIAS ( ociinternaldebug , oci_internal_debug , NULL )
PHP_FALIAS ( ocinumcols , oci_num_fields , NULL )
PHP_FALIAS ( ociparse , oci_parse , NULL )
PHP_FALIAS ( ocinewcursor , oci_new_cursor , NULL )
PHP_FALIAS ( ociresult , oci_result , NULL )
PHP_FALIAS ( ociserverversion , oci_server_version , NULL )
PHP_FALIAS ( ocistatementtype , oci_statement_type , NULL )
PHP_FALIAS ( ocirowcount , oci_num_rows , NULL )
PHP_FALIAS ( ocilogoff , oci_close , NULL )
PHP_FALIAS ( ocilogon , oci_connect , NULL )
PHP_FALIAS ( ocinlogon , oci_new_connect , NULL )
PHP_FALIAS ( ociplogon , oci_pconnect , NULL )
PHP_FALIAS ( ocierror , oci_error , NULL )
PHP_FALIAS ( ocifreedesc , oci_free_descriptor , NULL )
PHP_FALIAS ( ocisavelob , oci_lob_save , NULL )
PHP_FALIAS ( ocisavelobfile , oci_lob_import , NULL )
PHP_FALIAS ( ociwritelobtofile , oci_lob_export , NULL )
PHP_FALIAS ( ociloadlob , oci_lob_load , NULL )
PHP_FALIAS ( ocicommit , oci_commit , NULL )
PHP_FALIAS ( ocirollback , oci_rollback , NULL )
PHP_FALIAS ( ocinewdescriptor , oci_new_descriptor , NULL )
PHP_FALIAS ( ocisetprefetch , oci_set_prefetch , NULL )
PHP_FALIAS ( ocipasswordchange , oci_password_change , NULL )
PHP_FALIAS ( ocifreecollection , oci_free_collection , NULL )
PHP_FALIAS ( ocinewcollection , oci_new_collection , NULL )
PHP_FALIAS ( ocicollappend , oci_collection_append , NULL )
PHP_FALIAS ( ocicollgetelem , oci_collection_element_get , NULL )
PHP_FALIAS ( ocicollassignelem , oci_collection_element_assign , NULL )
PHP_FALIAS ( ocicollsize , oci_collection_size , NULL )
PHP_FALIAS ( ocicollmax , oci_collection_max , NULL )
PHP_FALIAS ( ocicolltrim , oci_collection_trim , NULL )
2004-01-02 15:32:09 +00:00
{ NULL , NULL , NULL }
1999-04-21 22:49:16 +00:00
} ;
2008-01-31 01:33:30 +00:00
static
# if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 2) || (PHP_MAJOR_VERSION > 5)
/* This "if" allows PECL builds from this file to be portable to older PHP releases */
const
# endif
zend_function_entry php_oci_lob_class_functions [ ] = {
2008-03-12 01:26:44 +00:00
PHP_FALIAS ( load , oci_lob_load , NULL )
PHP_FALIAS ( tell , oci_lob_tell , NULL )
PHP_FALIAS ( truncate , oci_lob_truncate , NULL )
PHP_FALIAS ( erase , oci_lob_erase , NULL )
PHP_FALIAS ( flush , oci_lob_flush , NULL )
PHP_FALIAS ( setbuffering , ocisetbufferinglob , NULL )
PHP_FALIAS ( getbuffering , ocigetbufferinglob , NULL )
PHP_FALIAS ( rewind , oci_lob_rewind , NULL )
PHP_FALIAS ( read , oci_lob_read , NULL )
PHP_FALIAS ( eof , oci_lob_eof , NULL )
PHP_FALIAS ( seek , oci_lob_seek , NULL )
PHP_FALIAS ( write , oci_lob_write , NULL )
PHP_FALIAS ( append , oci_lob_append , NULL )
PHP_FALIAS ( size , oci_lob_size , NULL )
PHP_FALIAS ( writetofile , oci_lob_export , NULL )
PHP_FALIAS ( export , oci_lob_export , NULL )
PHP_FALIAS ( import , oci_lob_import , NULL )
PHP_FALIAS ( writetemporary , oci_lob_write_temporary , NULL )
PHP_FALIAS ( close , oci_lob_close , NULL )
PHP_FALIAS ( save , oci_lob_save , NULL )
PHP_FALIAS ( savefile , oci_lob_import , NULL )
PHP_FALIAS ( free , oci_free_descriptor , NULL )
2002-11-15 17:59:19 +00:00
{ NULL , NULL , NULL }
1999-09-13 10:52:54 +00:00
} ;
2008-02-16 01:20:22 +00:00
static
2008-01-31 01:33:30 +00:00
# if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 2) || (PHP_MAJOR_VERSION > 5)
/* This "if" allows PECL builds from this file to be portable to older PHP releases */
const
# endif
zend_function_entry php_oci_coll_class_functions [ ] = {
2008-03-12 01:26:44 +00:00
PHP_FALIAS ( append , oci_collection_append , NULL )
PHP_FALIAS ( getelem , oci_collection_element_get , NULL )
PHP_FALIAS ( assignelem , oci_collection_element_assign , NULL )
PHP_FALIAS ( assign , oci_collection_assign , NULL )
PHP_FALIAS ( size , oci_collection_size , NULL )
PHP_FALIAS ( max , oci_collection_max , NULL )
PHP_FALIAS ( trim , oci_collection_trim , NULL )
PHP_FALIAS ( free , oci_free_collection , NULL )
2002-11-15 17:59:19 +00:00
{ NULL , NULL , NULL }
2001-04-13 14:43:39 +00:00
} ;
1999-12-17 20:55:31 +00:00
zend_module_entry oci8_module_entry = {
2001-10-11 23:33:59 +00:00
STANDARD_MODULE_HEADER ,
2008-03-12 01:26:44 +00:00
" oci8 " , /* extension name */
php_oci_functions , /* extension function list */
PHP_MINIT ( oci ) , /* extension-wide startup function */
PHP_MSHUTDOWN ( oci ) , /* extension-wide shutdown function */
PHP_RINIT ( oci ) , /* per-request startup function */
PHP_RSHUTDOWN ( oci ) , /* per-request shutdown function */
PHP_MINFO ( oci ) , /* information function */
2008-04-01 18:37:32 +00:00
PHP_OCI8_VERSION ,
2006-08-24 12:05:19 +00:00
# if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 1) || (PHP_MAJOR_VERSION > 5)
2008-01-31 01:33:30 +00:00
/* This check allows PECL builds from this file to be portable to older PHP releases */
2006-06-15 18:33:09 +00:00
PHP_MODULE_GLOBALS ( oci ) , /* globals descriptor */
2008-03-12 01:26:44 +00:00
PHP_GINIT ( oci ) , /* globals ctor */
NULL , /* globals dtor */
NULL , /* post deactivate */
2006-06-15 18:33:09 +00:00
STANDARD_MODULE_PROPERTIES_EX
2006-08-24 12:05:19 +00:00
# else
STANDARD_MODULE_PROPERTIES
# endif
1999-04-21 22:49:16 +00:00
} ;
/* }}} */
2005-12-01 13:39:48 +00:00
/* {{{ PHP_INI */
PHP_INI_BEGIN ( )
2008-02-26 02:21:04 +00:00
STD_PHP_INI_ENTRY ( " oci8.max_persistent " , " -1 " , PHP_INI_SYSTEM , ONUPDATELONGFUNC , max_persistent , zend_oci_globals , oci_globals )
STD_PHP_INI_ENTRY ( " oci8.persistent_timeout " , " -1 " , PHP_INI_SYSTEM , ONUPDATELONGFUNC , persistent_timeout , zend_oci_globals , oci_globals )
STD_PHP_INI_ENTRY ( " oci8.ping_interval " , " 60 " , PHP_INI_SYSTEM , ONUPDATELONGFUNC , ping_interval , zend_oci_globals , oci_globals )
STD_PHP_INI_BOOLEAN ( " oci8.privileged_connect " , " 0 " , PHP_INI_SYSTEM , OnUpdateBool , privileged_connect , zend_oci_globals , oci_globals )
STD_PHP_INI_ENTRY ( " oci8.statement_cache_size " , " 20 " , PHP_INI_SYSTEM , ONUPDATELONGFUNC , statement_cache_size , zend_oci_globals , oci_globals )
STD_PHP_INI_ENTRY ( " oci8.default_prefetch " , " 10 " , PHP_INI_SYSTEM , ONUPDATELONGFUNC , default_prefetch , zend_oci_globals , oci_globals )
STD_PHP_INI_BOOLEAN ( " oci8.old_oci_close_semantics " , " 0 " , PHP_INI_SYSTEM , OnUpdateBool , old_oci_close_semantics , zend_oci_globals , oci_globals )
STD_PHP_INI_ENTRY ( " oci8.connection_class " , " " , PHP_INI_ALL , OnUpdateString , connection_class , zend_oci_globals , oci_globals )
STD_PHP_INI_BOOLEAN ( " oci8.events " , " 0 " , PHP_INI_SYSTEM , OnUpdateBool , events , zend_oci_globals , oci_globals )
2005-12-01 13:39:48 +00:00
PHP_INI_END ( )
/* }}} */
2004-01-02 15:32:09 +00:00
/* {{{ startup, shutdown and info functions
*/
1999-04-21 22:49:16 +00:00
2008-03-12 01:26:44 +00:00
/* {{{ php_oci_init_global_handles()
2008-04-18 00:05:27 +00:00
*
* Initialize global handles only when they are needed
*/
2005-12-01 13:39:48 +00:00
static void php_oci_init_global_handles ( TSRMLS_D )
2003-12-16 10:29:11 +00:00
{
2005-12-01 13:39:48 +00:00
sword errcode ;
sb4 error_code = 0 ;
text tmp_buf [ PHP_OCI_ERRBUF_LEN ] ;
2003-12-16 10:29:11 +00:00
2008-06-05 23:43:10 +00:00
errcode = OCIEnvNlsCreate ( & OCI_G ( env ) , OCI_DEFAULT , 0 , NULL , NULL , NULL , 0 , NULL , 0 , 0 ) ;
2008-03-12 01:26:44 +00:00
2005-12-01 13:39:48 +00:00
if ( errcode = = OCI_ERROR ) {
goto oci_error ;
}
2008-03-12 01:26:44 +00:00
2005-12-01 13:39:48 +00:00
errcode = OCIHandleAlloc ( OCI_G ( env ) , ( dvoid * * ) & OCI_G ( err ) , OCI_HTYPE_ERROR , 0 , NULL ) ;
2008-03-12 01:26:44 +00:00
2005-12-01 13:39:48 +00:00
if ( errcode = = OCI_ERROR | | errcode = = OCI_SUCCESS_WITH_INFO ) {
goto oci_error ;
}
2003-12-16 10:29:11 +00:00
2005-12-01 13:39:48 +00:00
return ;
2008-03-12 01:26:44 +00:00
2005-12-01 13:39:48 +00:00
oci_error :
2008-03-12 01:26:44 +00:00
2005-12-01 13:39:48 +00:00
OCIErrorGet ( OCI_G ( env ) , ( ub4 ) 1 , NULL , & error_code , tmp_buf , ( ub4 ) PHP_OCI_ERRBUF_LEN , ( ub4 ) OCI_HTYPE_ERROR ) ;
2003-12-16 10:29:11 +00:00
2005-12-01 13:39:48 +00:00
if ( error_code ) {
2007-07-18 15:10:42 +00:00
int tmp_buf_len = strlen ( ( char * ) tmp_buf ) ;
2005-12-01 13:39:48 +00:00
2006-08-15 12:27:24 +00:00
if ( tmp_buf_len > 0 & & tmp_buf [ tmp_buf_len - 1 ] = = ' \n ' ) {
2005-12-01 13:39:48 +00:00
tmp_buf [ tmp_buf_len - 1 ] = ' \0 ' ;
}
2008-03-12 01:26:44 +00:00
2005-12-01 13:39:48 +00:00
if ( errcode ! = OCI_SUCCESS_WITH_INFO ) {
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " OCI_ERROR: %s " , tmp_buf ) ;
2008-03-12 01:26:44 +00:00
2005-12-01 13:39:48 +00:00
OCIHandleFree ( ( dvoid * ) OCI_G ( env ) , OCI_HTYPE_ENV ) ;
2008-03-12 01:26:44 +00:00
2005-12-01 13:39:48 +00:00
OCI_G ( env ) = NULL ;
OCI_G ( err ) = NULL ;
2006-08-15 13:08:34 +00:00
} else {
2005-12-01 13:39:48 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " OCI_SUCCESS_WITH_INFO: %s " , tmp_buf ) ;
}
}
} /* }}} */
2003-12-16 10:29:11 +00:00
2005-12-01 13:39:48 +00:00
/* {{{ php_oci_cleanup_global_handles()
2008-04-18 00:05:27 +00:00
*
* Free global handles ( if they were initialized before )
*/
2005-12-01 13:39:48 +00:00
static void php_oci_cleanup_global_handles ( TSRMLS_D )
2003-12-16 10:29:11 +00:00
{
2005-12-01 13:39:48 +00:00
if ( OCI_G ( err ) ) {
PHP_OCI_CALL ( OCIHandleFree , ( ( dvoid * ) OCI_G ( err ) , OCI_HTYPE_ERROR ) ) ;
OCI_G ( err ) = NULL ;
}
2008-03-12 01:26:44 +00:00
2005-12-01 13:39:48 +00:00
if ( OCI_G ( env ) ) {
PHP_OCI_CALL ( OCIHandleFree , ( ( dvoid * ) OCI_G ( env ) , OCI_HTYPE_ENV ) ) ;
OCI_G ( env ) = NULL ;
}
} /* }}} */
2003-12-16 10:29:11 +00:00
2006-06-15 18:33:09 +00:00
/* {{{ PHP_GINIT_FUNCTION
2008-04-18 00:05:27 +00:00
*
* Zerofill globals during module init
*/
2006-08-24 12:05:19 +00:00
# if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 1) || (PHP_MAJOR_VERSION > 5)
2008-01-31 01:33:30 +00:00
/* This check allows PECL builds from this file to be portable to older PHP releases */
2006-06-15 18:33:09 +00:00
static PHP_GINIT_FUNCTION ( oci )
2006-08-24 12:05:19 +00:00
# else
static void php_oci_init_globals ( zend_oci_globals * oci_globals TSRMLS_DC )
# endif
2005-12-01 13:39:48 +00:00
{
memset ( oci_globals , 0 , sizeof ( zend_oci_globals ) ) ;
2003-12-16 10:29:11 +00:00
}
2005-12-01 13:39:48 +00:00
/* }}} */
2003-12-16 10:29:11 +00:00
1999-08-17 13:54:25 +00:00
PHP_MINIT_FUNCTION ( oci )
{
1999-09-13 10:52:54 +00:00
zend_class_entry oci_lob_class_entry ;
2002-11-15 17:59:19 +00:00
zend_class_entry oci_coll_class_entry ;
2000-02-01 14:39:59 +00:00
2003-12-16 15:58:10 +00:00
# define PHP_OCI_INIT_MODE_TMP OCI_DEFAULT | OCI_OBJECT
1999-04-21 22:49:16 +00:00
2003-12-16 15:58:10 +00:00
# ifdef ZTS
# define PHP_OCI_INIT_MODE PHP_OCI_INIT_MODE_TMP | OCI_THREADED
# else
# define PHP_OCI_INIT_MODE PHP_OCI_INIT_MODE_TMP
# endif
2004-01-02 15:32:09 +00:00
2006-08-24 12:05:19 +00:00
# if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 1) || (PHP_MAJOR_VERSION > 5)
2008-01-31 01:33:30 +00:00
/* This check allows PECL builds from this file to be portable to older PHP releases */
2006-08-24 12:05:19 +00:00
/* this is handled by new globals management code */
# else
ZEND_INIT_MODULE_GLOBALS ( oci , php_oci_init_globals , NULL ) ;
# endif
2005-12-01 13:39:48 +00:00
REGISTER_INI_ENTRIES ( ) ;
le_statement = zend_register_list_destructors_ex ( php_oci_statement_list_dtor , NULL , " oci8 statement " , module_number ) ;
le_connection = zend_register_list_destructors_ex ( php_oci_connection_list_dtor , NULL , " oci8 connection " , module_number ) ;
2008-03-12 01:26:44 +00:00
le_pconnection = zend_register_list_destructors_ex ( php_oci_pconnection_list_np_dtor , php_oci_pconnection_list_dtor , " oci8 persistent connection " , module_number ) ;
2008-01-31 01:33:30 +00:00
le_psessionpool = zend_register_list_destructors_ex ( NULL , php_oci_spool_list_dtor , " oci8 persistent session pool " , module_number ) ;
2005-12-01 13:39:48 +00:00
le_descriptor = zend_register_list_destructors_ex ( php_oci_descriptor_list_dtor , NULL , " oci8 descriptor " , module_number ) ;
le_collection = zend_register_list_destructors_ex ( php_oci_collection_list_dtor , NULL , " oci8 collection " , module_number ) ;
1999-08-17 13:54:25 +00:00
1999-09-13 10:52:54 +00:00
INIT_CLASS_ENTRY ( oci_lob_class_entry , " OCI-Lob " , php_oci_lob_class_functions ) ;
2002-11-15 17:59:19 +00:00
INIT_CLASS_ENTRY ( oci_coll_class_entry , " OCI-Collection " , php_oci_coll_class_functions ) ;
1999-09-13 10:52:54 +00:00
2002-11-15 17:59:19 +00:00
oci_lob_class_entry_ptr = zend_register_internal_class ( & oci_lob_class_entry TSRMLS_CC ) ;
oci_coll_class_entry_ptr = zend_register_internal_class ( & oci_coll_class_entry TSRMLS_CC ) ;
1999-04-21 22:49:16 +00:00
2000-10-29 09:14:55 +00:00
/* thies@thieso.net 990203 i do not think that we will need all of them - just in here for completeness for now! */
1999-04-21 22:49:16 +00:00
REGISTER_LONG_CONSTANT ( " OCI_DEFAULT " , OCI_DEFAULT , CONST_CS | CONST_PERSISTENT ) ;
2005-12-01 13:39:48 +00:00
REGISTER_LONG_CONSTANT ( " OCI_SYSOPER " , OCI_SYSOPER , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " OCI_SYSDBA " , OCI_SYSDBA , CONST_CS | CONST_PERSISTENT ) ;
1999-04-21 22:49:16 +00:00
REGISTER_LONG_CONSTANT ( " OCI_DESCRIBE_ONLY " , OCI_DESCRIBE_ONLY , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " OCI_COMMIT_ON_SUCCESS " , OCI_COMMIT_ON_SUCCESS , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " OCI_EXACT_FETCH " , OCI_EXACT_FETCH , CONST_CS | CONST_PERSISTENT ) ;
2003-12-15 13:53:01 +00:00
/* for $LOB->seek() */
2005-12-01 13:39:48 +00:00
REGISTER_LONG_CONSTANT ( " OCI_SEEK_SET " , PHP_OCI_SEEK_SET , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " OCI_SEEK_CUR " , PHP_OCI_SEEK_CUR , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " OCI_SEEK_END " , PHP_OCI_SEEK_END , CONST_CS | CONST_PERSISTENT ) ;
2003-12-15 13:53:01 +00:00
/* for $LOB->flush() */
REGISTER_LONG_CONSTANT ( " OCI_LOB_BUFFER_FREE " , OCI_LOB_BUFFER_FREE , CONST_CS | CONST_PERSISTENT ) ;
2008-03-12 01:26:44 +00:00
/* for OCIBindByName (real "oci" names + short "php" names */
1999-04-21 22:49:16 +00:00
REGISTER_LONG_CONSTANT ( " SQLT_BFILEE " , SQLT_BFILEE , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " SQLT_CFILEE " , SQLT_CFILEE , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " SQLT_CLOB " , SQLT_CLOB , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " SQLT_BLOB " , SQLT_BLOB , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " SQLT_RDD " , SQLT_RDD , CONST_CS | CONST_PERSISTENT ) ;
2008-03-12 01:26:44 +00:00
REGISTER_LONG_CONSTANT ( " SQLT_INT " , SQLT_INT , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " SQLT_NUM " , SQLT_NUM , CONST_CS | CONST_PERSISTENT ) ;
2005-12-01 13:39:48 +00:00
REGISTER_LONG_CONSTANT ( " SQLT_RSET " , SQLT_RSET , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " SQLT_AFC " , SQLT_AFC , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " SQLT_CHR " , SQLT_CHR , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " SQLT_VCS " , SQLT_VCS , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " SQLT_AVC " , SQLT_AVC , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " SQLT_STR " , SQLT_STR , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " SQLT_LVC " , SQLT_LVC , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " SQLT_FLT " , SQLT_FLT , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " SQLT_UIN " , SQLT_UIN , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " SQLT_LNG " , SQLT_LNG , CONST_CS | CONST_PERSISTENT ) ;
2006-04-12 19:21:35 +00:00
REGISTER_LONG_CONSTANT ( " SQLT_LBI " , SQLT_LBI , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " SQLT_BIN " , SQLT_BIN , CONST_CS | CONST_PERSISTENT ) ;
2005-12-01 13:39:48 +00:00
REGISTER_LONG_CONSTANT ( " SQLT_ODT " , SQLT_ODT , CONST_CS | CONST_PERSISTENT ) ;
# if defined(HAVE_OCI_INSTANT_CLIENT) || (defined(OCI_MAJOR_VERSION) && OCI_MAJOR_VERSION > 10)
REGISTER_LONG_CONSTANT ( " SQLT_BDOUBLE " , SQLT_BDOUBLE , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " SQLT_BFLOAT " , SQLT_BFLOAT , CONST_CS | CONST_PERSISTENT ) ;
# endif
1999-04-21 22:49:16 +00:00
2004-01-21 16:18:58 +00:00
REGISTER_LONG_CONSTANT ( " OCI_B_NTY " , SQLT_NTY , CONST_CS | CONST_PERSISTENT ) ;
2008-03-12 01:26:44 +00:00
REGISTER_LONG_CONSTANT ( " SQLT_NTY " , SQLT_NTY , CONST_CS | CONST_PERSISTENT ) ;
2005-12-01 13:39:48 +00:00
REGISTER_STRING_CONSTANT ( " OCI_SYSDATE " , " SYSDATE " , CONST_CS | CONST_PERSISTENT ) ;
2001-04-13 14:43:39 +00:00
1999-04-21 22:49:16 +00:00
REGISTER_LONG_CONSTANT ( " OCI_B_BFILE " , SQLT_BFILEE , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " OCI_B_CFILEE " , SQLT_CFILEE , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " OCI_B_CLOB " , SQLT_CLOB , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " OCI_B_BLOB " , SQLT_BLOB , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " OCI_B_ROWID " , SQLT_RDD , CONST_CS | CONST_PERSISTENT ) ;
1999-05-12 14:28:01 +00:00
REGISTER_LONG_CONSTANT ( " OCI_B_CURSOR " , SQLT_RSET , CONST_CS | CONST_PERSISTENT ) ;
1999-06-09 10:40:08 +00:00
REGISTER_LONG_CONSTANT ( " OCI_B_BIN " , SQLT_BIN , CONST_CS | CONST_PERSISTENT ) ;
2005-12-01 13:39:48 +00:00
REGISTER_LONG_CONSTANT ( " OCI_B_INT " , SQLT_INT , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " OCI_B_NUM " , SQLT_NUM , CONST_CS | CONST_PERSISTENT ) ;
1999-04-21 22:49:16 +00:00
2002-01-17 18:40:59 +00:00
/* for OCIFetchStatement */
2005-12-01 13:39:48 +00:00
REGISTER_LONG_CONSTANT ( " OCI_FETCHSTATEMENT_BY_COLUMN " , PHP_OCI_FETCHSTATEMENT_BY_COLUMN , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " OCI_FETCHSTATEMENT_BY_ROW " , PHP_OCI_FETCHSTATEMENT_BY_ROW , CONST_CS | CONST_PERSISTENT ) ;
2002-01-17 18:40:59 +00:00
2008-06-05 23:43:10 +00:00
/* for OCIFetchInto & OCIResult */
2005-12-01 13:39:48 +00:00
REGISTER_LONG_CONSTANT ( " OCI_ASSOC " , PHP_OCI_ASSOC , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " OCI_NUM " , PHP_OCI_NUM , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " OCI_BOTH " , PHP_OCI_BOTH , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " OCI_RETURN_NULLS " , PHP_OCI_RETURN_NULLS , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " OCI_RETURN_LOBS " , PHP_OCI_RETURN_LOBS , CONST_CS | CONST_PERSISTENT ) ;
1999-04-21 22:49:16 +00:00
2008-03-12 01:26:44 +00:00
/* for OCINewDescriptor (real "oci" names + short "php" names */
1999-04-21 22:49:16 +00:00
REGISTER_LONG_CONSTANT ( " OCI_DTYPE_FILE " , OCI_DTYPE_FILE , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " OCI_DTYPE_LOB " , OCI_DTYPE_LOB , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " OCI_DTYPE_ROWID " , OCI_DTYPE_ROWID , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " OCI_D_FILE " , OCI_DTYPE_FILE , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " OCI_D_LOB " , OCI_DTYPE_LOB , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " OCI_D_ROWID " , OCI_DTYPE_ROWID , CONST_CS | CONST_PERSISTENT ) ;
2003-07-22 10:38:34 +00:00
/* for OCIWriteTemporaryLob */
REGISTER_LONG_CONSTANT ( " OCI_TEMP_CLOB " , OCI_TEMP_CLOB , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " OCI_TEMP_BLOB " , OCI_TEMP_BLOB , CONST_CS | CONST_PERSISTENT ) ;
1999-04-21 22:49:16 +00:00
return SUCCESS ;
}
/* ----------------------------------------------------------------- */
1999-08-17 13:54:25 +00:00
PHP_RINIT_FUNCTION ( oci )
1999-04-21 22:49:16 +00:00
{
2005-12-01 13:39:48 +00:00
OCI_G ( debug_mode ) = 0 ; /* start "fresh" */
OCI_G ( num_links ) = OCI_G ( num_persistent ) ;
OCI_G ( errcode ) = 0 ;
1999-04-21 22:49:16 +00:00
2002-11-15 17:59:19 +00:00
return SUCCESS ;
1999-04-21 22:49:16 +00:00
}
1999-08-17 13:54:25 +00:00
PHP_MSHUTDOWN_FUNCTION ( oci )
1999-04-21 22:49:16 +00:00
{
2005-12-01 13:39:48 +00:00
OCI_G ( shutdown ) = 1 ;
2008-03-12 01:26:44 +00:00
2005-12-01 13:39:48 +00:00
UNREGISTER_INI_ENTRIES ( ) ;
1999-04-24 18:54:02 +00:00
2005-12-01 13:39:48 +00:00
# ifndef ZTS
php_oci_cleanup_global_handles ( TSRMLS_C ) ;
# endif
1999-04-24 18:54:02 +00:00
2000-01-16 13:30:57 +00:00
return SUCCESS ;
1999-06-09 10:40:08 +00:00
}
1999-08-17 13:54:25 +00:00
PHP_RSHUTDOWN_FUNCTION ( oci )
1999-04-21 22:49:16 +00:00
{
2008-03-22 01:27:50 +00:00
/* Set this to indicate request shutdown for all further processing */
2006-01-17 23:44:51 +00:00
# ifdef ZTS
2006-01-18 10:12:34 +00:00
zend_hash_apply_with_argument ( & EG ( regular_list ) , ( apply_func_arg_t ) php_oci_list_helper , ( void * ) le_descriptor TSRMLS_CC ) ;
zend_hash_apply_with_argument ( & EG ( regular_list ) , ( apply_func_arg_t ) php_oci_list_helper , ( void * ) le_collection TSRMLS_CC ) ;
2008-02-16 01:20:22 +00:00
while ( OCI_G ( num_statements ) ) {
2006-11-10 16:33:41 +00:00
zend_hash_apply_with_argument ( & EG ( regular_list ) , ( apply_func_arg_t ) php_oci_list_helper , ( void * ) le_statement TSRMLS_CC ) ;
}
2006-01-17 23:44:51 +00:00
# endif
2008-04-18 00:05:27 +00:00
/* Check persistent connections and do the necessary actions if needed. If persistent_helper is
* unable to process a pconnection because of a refcount , the processing would happen from
* np - destructor which is called when refcount goes to zero - php_oci_pconnection_list_np_dtor
*/
2005-12-01 13:39:48 +00:00
zend_hash_apply ( & EG ( persistent_list ) , ( apply_func_t ) php_oci_persistent_helper TSRMLS_CC ) ;
2000-01-16 13:30:57 +00:00
2005-12-01 13:39:48 +00:00
# ifdef ZTS
2006-01-18 10:12:34 +00:00
zend_hash_apply_with_argument ( & EG ( regular_list ) , ( apply_func_arg_t ) php_oci_list_helper , ( void * ) le_connection TSRMLS_CC ) ;
2005-12-01 13:39:48 +00:00
php_oci_cleanup_global_handles ( TSRMLS_C ) ;
2000-02-01 14:39:59 +00:00
# endif
1999-04-24 18:54:02 +00:00
2002-11-15 17:59:19 +00:00
return SUCCESS ;
1999-04-21 22:49:16 +00:00
}
1999-08-17 13:54:25 +00:00
PHP_MINFO_FUNCTION ( oci )
1999-04-21 22:49:16 +00:00
{
2003-12-16 10:29:11 +00:00
char buf [ 32 ] ;
2000-04-06 21:07:44 +00:00
php_info_print_table_start ( ) ;
php_info_print_table_row ( 2 , " OCI8 Support " , " enabled " ) ;
2008-03-25 02:00:32 +00:00
php_info_print_table_row ( 2 , " Version " , PHP_OCI8_VERSION ) ;
2000-08-07 11:34:48 +00:00
php_info_print_table_row ( 2 , " Revision " , " $Revision$ " ) ;
2003-12-16 10:29:11 +00:00
2007-02-24 02:17:47 +00:00
snprintf ( buf , sizeof ( buf ) , " %ld " , OCI_G ( num_persistent ) ) ;
2005-12-01 13:39:48 +00:00
php_info_print_table_row ( 2 , " Active Persistent Connections " , buf ) ;
2007-02-24 02:17:47 +00:00
snprintf ( buf , sizeof ( buf ) , " %ld " , OCI_G ( num_links ) ) ;
2005-12-01 13:39:48 +00:00
php_info_print_table_row ( 2 , " Active Connections " , buf ) ;
2003-12-16 10:29:11 +00:00
2005-12-01 13:39:48 +00:00
# if !defined(PHP_WIN32) && !defined(HAVE_OCI_INSTANT_CLIENT)
2008-04-01 18:37:32 +00:00
# ifdef PHP_OCI8_ORACLE_VERSION
2008-04-18 00:05:27 +00:00
php_info_print_table_row ( 2 , " Oracle Version " , PHP_OCI8_ORACLE_VERSION ) ;
# endif
# ifdef PHP_OCI8_DIR
php_info_print_table_row ( 2 , " Compile-time ORACLE_HOME " , PHP_OCI8_DIR ) ;
# endif
# ifdef PHP_OCI8_SHARED_LIBADD
php_info_print_table_row ( 2 , " Libraries Used " , PHP_OCI8_SHARED_LIBADD ) ;
2008-04-01 18:37:32 +00:00
# endif
2008-02-16 01:20:22 +00:00
# else
2008-04-18 00:05:27 +00:00
# if defined(HAVE_OCI_INSTANT_CLIENT) && defined(OCI_MAJOR_VERSION) && defined(OCI_MINOR_VERSION)
2007-02-24 02:17:47 +00:00
snprintf ( buf , sizeof ( buf ) , " %d.%d " , OCI_MAJOR_VERSION , OCI_MINOR_VERSION ) ;
2005-12-01 13:39:48 +00:00
php_info_print_table_row ( 2 , " Oracle Instant Client Version " , buf ) ;
2008-04-18 00:05:27 +00:00
# endif
1999-04-21 22:49:16 +00:00
# endif
2003-12-16 15:58:10 +00:00
2008-04-18 00:05:27 +00:00
php_info_print_table_row ( 2 , " Temporary Lob support " , " enabled " ) ;
php_info_print_table_row ( 2 , " Collections support " , " enabled " ) ;
2004-01-02 15:32:09 +00:00
php_info_print_table_end ( ) ;
2005-12-01 13:39:48 +00:00
DISPLAY_INI_ENTRIES ( ) ;
1999-04-21 22:49:16 +00:00
}
/* }}} */
2005-12-01 13:39:48 +00:00
/* list destructors {{{ */
1999-09-13 11:13:53 +00:00
2005-12-01 13:39:48 +00:00
/* {{{ php_oci_connection_list_dtor()
2008-04-18 00:05:27 +00:00
*
* Non - persistent connection destructor
*/
2005-12-01 13:39:48 +00:00
static void php_oci_connection_list_dtor ( zend_rsrc_list_entry * entry TSRMLS_DC )
{
php_oci_connection * connection = ( php_oci_connection * ) entry - > ptr ;
2008-03-12 01:26:44 +00:00
if ( connection ) {
php_oci_connection_close ( connection TSRMLS_CC ) ;
OCI_G ( num_links ) - - ;
}
2005-12-01 13:39:48 +00:00
} /* }}} */
1999-04-21 22:49:16 +00:00
2005-12-01 13:39:48 +00:00
/* {{{ php_oci_pconnection_list_dtor()
2008-04-18 00:05:27 +00:00
*
* Persistent connection destructor
*/
2005-12-01 13:39:48 +00:00
static void php_oci_pconnection_list_dtor ( zend_rsrc_list_entry * entry TSRMLS_DC )
{
php_oci_connection * connection = ( php_oci_connection * ) entry - > ptr ;
2008-03-12 01:26:44 +00:00
if ( connection ) {
php_oci_connection_close ( connection TSRMLS_CC ) ;
OCI_G ( num_persistent ) - - ;
}
} /* }}} */
/* {{{ php_oci_pconnection_list_np_dtor()
2008-04-18 00:05:27 +00:00
*
* Non - Persistent destructor for persistent connection - This gets invoked when
* the refcount of this goes to zero in the regular list
*/
2008-03-12 01:26:44 +00:00
static void php_oci_pconnection_list_np_dtor ( zend_rsrc_list_entry * entry TSRMLS_DC )
{
php_oci_connection * connection = ( php_oci_connection * ) entry - > ptr ;
2008-04-18 00:05:27 +00:00
zend_rsrc_list_entry * le ;
2008-03-12 01:26:44 +00:00
2008-04-18 00:05:27 +00:00
/*
* We cannot get connection as NULL or as a stub in this function . This is the function that
* turns a pconnection to a stub
*
* If oci_password_change ( ) changed the password of a persistent connection , close the
* connection and remove it from the persistent connection cache . This means subsequent scripts
* will be prevented from being able to present the old ( now invalid ) password to a usable
* connection to the database ; they must use the new password .
*
* Check for conditions that warrant removal of the hash entry
*/
2008-03-22 01:27:50 +00:00
2008-04-18 00:05:27 +00:00
if ( ! connection - > is_open | |
connection - > passwd_changed | |
( PG ( connection_status ) & PHP_CONNECTION_TIMEOUT ) | |
OCI_G ( in_call ) ) {
/* Remove the hash entry if present */
if ( ( zend_hash_find ( & EG ( persistent_list ) , connection - > hash_key , strlen ( connection - > hash_key ) + 1 , ( void * * ) & le ) = = SUCCESS ) & & ( le - > type = = le_pconnection ) & & ( le - > ptr = = connection ) ) {
zend_hash_del ( & EG ( persistent_list ) , connection - > hash_key , strlen ( connection - > hash_key ) + 1 ) ;
}
else {
php_oci_connection_close ( connection TSRMLS_CC ) ;
2008-03-22 01:27:50 +00:00
OCI_G ( num_persistent ) - - ;
2008-04-18 00:05:27 +00:00
}
2008-03-22 01:27:50 +00:00
2008-04-18 00:05:27 +00:00
if ( OCI_G ( debug_mode ) ) {
php_printf ( " OCI8 DEBUG L1: np_dtor cleaning up: (%p) at (%s:%d) \n " , connection , __FILE__ , __LINE__ ) ;
2008-03-22 01:27:50 +00:00
}
2008-04-18 00:05:27 +00:00
}
else {
/*
* Release the connection to underlying pool . We do this unconditionally so that
* out - of - scope pconnects are now consistent with oci_close and out - of - scope new connect
* semantics . With the PECL OCI 1.3 . x extensions , we release pconnections when oci_close
* takes the refcount to zero .
*
* If oci_old_close_semantics is set , we artifically bump up the refcount and decremented
* only at request shutdown .
*/
php_oci_connection_release ( connection TSRMLS_CC ) ;
2008-03-22 01:27:50 +00:00
2008-04-18 00:05:27 +00:00
if ( OCI_G ( debug_mode ) ) {
php_printf ( " OCI8 DEBUG L1: np_dtor releasing: (%p) at (%s:%d) \n " , connection , __FILE__ , __LINE__ ) ;
2008-03-22 01:27:50 +00:00
}
2008-03-12 01:26:44 +00:00
}
2005-12-01 13:39:48 +00:00
} /* }}} */
2004-01-02 15:32:09 +00:00
2005-12-01 13:39:48 +00:00
/* {{{ php_oci_statement_list_dtor()
2008-04-18 00:05:27 +00:00
*
* Statement destructor
*/
2005-12-01 13:39:48 +00:00
static void php_oci_statement_list_dtor ( zend_rsrc_list_entry * entry TSRMLS_DC )
2003-12-25 13:54:50 +00:00
{
2005-12-01 13:39:48 +00:00
php_oci_statement * statement = ( php_oci_statement * ) entry - > ptr ;
php_oci_statement_free ( statement TSRMLS_CC ) ;
} /* }}} */
1999-04-21 22:49:16 +00:00
2005-12-01 13:39:48 +00:00
/* {{{ php_oci_descriptor_list_dtor()
2008-04-18 00:05:27 +00:00
*
* Descriptor destructor
*/
2005-12-01 13:39:48 +00:00
static void php_oci_descriptor_list_dtor ( zend_rsrc_list_entry * entry TSRMLS_DC )
2000-01-16 13:30:57 +00:00
{
2005-12-01 13:39:48 +00:00
php_oci_descriptor * descriptor = ( php_oci_descriptor * ) entry - > ptr ;
php_oci_lob_free ( descriptor TSRMLS_CC ) ;
} /* }}} */
2000-01-16 13:30:57 +00:00
2005-12-01 13:39:48 +00:00
/* {{{ php_oci_collection_list_dtor()
2008-04-18 00:05:27 +00:00
*
* Collection destructor
*/
2005-12-01 13:39:48 +00:00
static void php_oci_collection_list_dtor ( zend_rsrc_list_entry * entry TSRMLS_DC )
{
php_oci_collection * collection = ( php_oci_collection * ) entry - > ptr ;
php_oci_collection_close ( collection TSRMLS_CC ) ;
} /* }}} */
2000-01-16 13:30:57 +00:00
/* }}} */
2008-04-18 00:05:27 +00:00
/* Hash Destructors {{{ */
2000-01-16 13:30:57 +00:00
2005-12-01 13:39:48 +00:00
/* {{{ php_oci_define_hash_dtor()
2008-04-18 00:05:27 +00:00
*
* Define hash destructor
*/
2005-12-01 13:39:48 +00:00
void php_oci_define_hash_dtor ( void * data )
{
php_oci_define * define = ( php_oci_define * ) data ;
2000-01-16 13:30:57 +00:00
2005-12-01 13:39:48 +00:00
zval_ptr_dtor ( & define - > zval ) ;
2000-01-16 13:30:57 +00:00
2005-12-01 13:39:48 +00:00
if ( define - > name ) {
efree ( define - > name ) ;
define - > name = NULL ;
}
2000-01-16 13:30:57 +00:00
}
2000-02-07 10:31:43 +00:00
/* }}} */
2005-12-01 13:39:48 +00:00
/* {{{ php_oci_bind_hash_dtor()
2008-04-18 00:05:27 +00:00
*
* Bind hash destructor
*/
2005-12-01 13:39:48 +00:00
void php_oci_bind_hash_dtor ( void * data )
2000-02-07 10:31:43 +00:00
{
2005-12-01 13:39:48 +00:00
php_oci_bind * bind = ( php_oci_bind * ) data ;
2000-02-07 10:31:43 +00:00
2005-12-01 13:39:48 +00:00
if ( bind - > array . elements ) {
efree ( bind - > array . elements ) ;
2000-02-07 10:31:43 +00:00
}
2007-01-11 11:27:52 +00:00
2006-07-31 10:30:23 +00:00
if ( bind - > array . element_lengths ) {
2005-12-01 13:39:48 +00:00
efree ( bind - > array . element_lengths ) ;
}
2007-01-11 11:27:52 +00:00
2005-12-01 13:39:48 +00:00
if ( bind - > array . indicators ) {
efree ( bind - > array . indicators ) ;
2007-01-11 11:27:52 +00:00
}
2005-12-01 13:39:48 +00:00
zval_ptr_dtor ( & bind - > zval ) ;
2000-02-07 10:31:43 +00:00
}
2000-01-16 13:30:57 +00:00
/* }}} */
2005-12-01 13:39:48 +00:00
/* {{{ php_oci_column_hash_dtor()
2008-04-18 00:05:27 +00:00
*
* Column hash destructor
*/
2005-12-01 13:39:48 +00:00
void php_oci_column_hash_dtor ( void * data )
2006-01-05 13:42:35 +00:00
{
2005-12-01 13:39:48 +00:00
php_oci_out_column * column = ( php_oci_out_column * ) data ;
2001-08-07 19:56:33 +00:00
TSRMLS_FETCH ( ) ;
1999-04-21 22:49:16 +00:00
2000-01-16 13:30:57 +00:00
if ( column - > stmtid ) {
zend_list_delete ( column - > stmtid ) ;
}
if ( column - > is_descr ) {
zend_list_delete ( column - > descid ) ;
1999-04-21 22:49:16 +00:00
}
2005-12-01 13:39:48 +00:00
if ( column - > data ) {
efree ( column - > data ) ;
}
1999-09-29 14:20:27 +00:00
1999-04-21 22:49:16 +00:00
if ( column - > name ) {
efree ( column - > name ) ;
}
}
/* }}} */
2004-01-02 15:32:09 +00:00
2005-12-01 13:39:48 +00:00
/* {{{ php_oci_descriptor_flush_hash_dtor()
2008-04-18 00:05:27 +00:00
*
* Flush descriptors on commit
*/
2005-12-01 13:39:48 +00:00
void php_oci_descriptor_flush_hash_dtor ( void * data )
1999-04-21 22:49:16 +00:00
{
2005-12-01 13:39:48 +00:00
php_oci_descriptor * descriptor = * ( php_oci_descriptor * * ) data ;
TSRMLS_FETCH ( ) ;
2008-03-12 01:26:44 +00:00
2006-01-05 13:42:35 +00:00
if ( descriptor & & descriptor - > buffering = = PHP_OCI_LOB_BUFFER_USED & & ( descriptor - > type = = OCI_DTYPE_LOB | | descriptor - > type = = OCI_DTYPE_FILE ) ) {
2005-12-01 13:39:48 +00:00
php_oci_lob_flush ( descriptor , OCI_LOB_BUFFER_FREE TSRMLS_CC ) ;
descriptor - > buffering = PHP_OCI_LOB_BUFFER_ENABLED ;
2003-12-16 10:29:11 +00:00
}
2006-01-05 13:42:35 +00:00
data = NULL ;
}
/* }}} */
/* {{{ php_oci_descriptor_delete_from_hash()
2008-04-18 00:05:27 +00:00
*
* Delete descriptor from the hash
*/
2006-01-05 13:42:35 +00:00
int php_oci_descriptor_delete_from_hash ( void * data , void * id TSRMLS_DC )
{
php_oci_descriptor * descriptor = * ( php_oci_descriptor * * ) data ;
int * desc_id = ( int * ) id ;
2008-03-12 01:26:44 +00:00
2006-01-05 13:42:35 +00:00
if ( descriptor & & desc_id & & descriptor - > id = = * desc_id ) {
return 1 ;
}
return 0 ;
2000-02-01 14:39:59 +00:00
}
1999-04-21 22:49:16 +00:00
/* }}} */
2001-02-12 14:36:28 +00:00
2001-06-05 13:12:10 +00:00
/* }}} */
2001-02-12 14:36:28 +00:00
2005-12-01 13:39:48 +00:00
/* {{{ php_oci_error()
2008-04-18 00:05:27 +00:00
*
* Fetch & print out error message if we get an error
*/
2005-12-01 13:39:48 +00:00
sb4 php_oci_error ( OCIError * err_p , sword status TSRMLS_DC )
1999-04-21 22:49:16 +00:00
{
2005-12-01 13:39:48 +00:00
text * errbuf = ( text * ) NULL ;
2002-11-15 17:59:19 +00:00
sb4 errcode = 0 ;
1999-04-21 22:49:16 +00:00
2002-11-15 17:59:19 +00:00
switch ( status ) {
2004-01-02 15:32:09 +00:00
case OCI_SUCCESS :
break ;
case OCI_SUCCESS_WITH_INFO :
2005-12-01 13:39:48 +00:00
errcode = php_oci_fetch_errmsg ( err_p , & errbuf TSRMLS_CC ) ;
2006-08-15 12:27:24 +00:00
if ( errbuf ) {
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " OCI_SUCCESS_WITH_INFO: %s " , errbuf ) ;
efree ( errbuf ) ;
} else {
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " OCI_SUCCESS_WITH_INFO: failed to fetch error message " ) ;
}
2004-01-02 15:32:09 +00:00
break ;
case OCI_NEED_DATA :
2005-12-01 13:39:48 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " OCI_NEED_DATA " ) ;
2004-01-02 15:32:09 +00:00
break ;
case OCI_NO_DATA :
2005-12-01 13:39:48 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " OCI_NO_DATA " ) ;
2004-01-02 15:32:09 +00:00
break ;
2008-02-16 01:20:22 +00:00
case OCI_ERROR :
2005-12-01 13:39:48 +00:00
errcode = php_oci_fetch_errmsg ( err_p , & errbuf TSRMLS_CC ) ;
2006-08-15 12:27:24 +00:00
if ( errbuf ) {
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " %s " , errbuf ) ;
efree ( errbuf ) ;
} else {
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " failed to fetch error message " ) ;
}
2001-08-15 16:00:56 +00:00
break ;
2004-01-02 15:32:09 +00:00
case OCI_INVALID_HANDLE :
2005-12-01 13:39:48 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " OCI_INVALID_HANDLE " ) ;
2004-01-02 15:32:09 +00:00
break ;
case OCI_STILL_EXECUTING :
2005-12-01 13:39:48 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " OCI_STILL_EXECUTING " ) ;
2004-01-02 15:32:09 +00:00
break ;
case OCI_CONTINUE :
2005-12-01 13:39:48 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " OCI_CONTINUE " ) ;
2004-01-02 15:32:09 +00:00
break ;
default :
2005-12-01 13:39:48 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Unknown OCI error code: %d " , status ) ;
2004-01-02 15:32:09 +00:00
break ;
2002-11-15 17:59:19 +00:00
}
return errcode ;
1999-04-21 22:49:16 +00:00
}
/* }}} */
2005-12-01 13:39:48 +00:00
/* {{{ php_oci_fetch_errmsg()
2008-04-18 00:05:27 +00:00
*
* Fetch error message into the buffer from the error handle provided
*/
2005-12-01 13:39:48 +00:00
sb4 php_oci_fetch_errmsg ( OCIError * error_handle , text * * error_buf TSRMLS_DC )
1999-04-21 22:49:16 +00:00
{
2005-12-01 13:39:48 +00:00
sb4 error_code = 0 ;
2008-03-12 01:26:44 +00:00
text err_buf [ PHP_OCI_ERRBUF_LEN ] ;
err_buf [ 0 ] = ' \0 ' ;
memset ( err_buf , 0 , sizeof ( err_buf ) ) ;
PHP_OCI_CALL ( OCIErrorGet , ( error_handle , ( ub4 ) 1 , NULL , & error_code , err_buf , ( ub4 ) PHP_OCI_ERRBUF_LEN , ( ub4 ) OCI_HTYPE_ERROR ) ) ;
2005-12-01 13:39:48 +00:00
if ( error_code ) {
2008-03-12 01:26:44 +00:00
int err_buf_len = strlen ( ( char * ) err_buf ) ;
if ( err_buf_len & & err_buf [ err_buf_len - 1 ] = = ' \n ' ) {
err_buf [ err_buf_len - 1 ] = ' \0 ' ;
2005-12-01 13:39:48 +00:00
}
2008-03-12 01:26:44 +00:00
if ( err_buf_len & & error_buf ) {
2005-12-01 13:39:48 +00:00
* error_buf = NULL ;
2008-03-12 01:26:44 +00:00
* error_buf = ( text * ) estrndup ( ( char * ) err_buf , err_buf_len ) ;
2005-12-01 13:39:48 +00:00
}
1999-09-30 08:41:45 +00:00
}
2005-12-01 13:39:48 +00:00
return error_code ;
} /* }}} */
1999-09-30 08:41:45 +00:00
2005-12-01 13:39:48 +00:00
/* {{{ php_oci_fetch_sqltext_offset()
2008-04-18 00:05:27 +00:00
*
* Compute offset in the SQL statement
*/
2005-12-01 13:39:48 +00:00
int php_oci_fetch_sqltext_offset ( php_oci_statement * statement , text * * sqltext , ub2 * error_offset TSRMLS_DC )
1999-04-21 22:49:16 +00:00
{
2005-12-01 13:39:48 +00:00
* sqltext = NULL ;
* error_offset = 0 ;
1999-04-21 22:49:16 +00:00
2008-03-12 01:26:44 +00:00
PHP_OCI_CALL_RETURN ( statement - > errcode , OCIAttrGet , ( ( dvoid * ) statement - > stmt , OCI_HTYPE_STMT , ( dvoid * ) sqltext , ( ub4 * ) 0 , OCI_ATTR_STATEMENT , statement - > err ) ) ;
2008-02-16 01:20:22 +00:00
if ( statement - > errcode ! = OCI_SUCCESS ) {
2008-03-22 01:27:50 +00:00
statement - > errcode = php_oci_error ( statement - > err , statement - > errcode TSRMLS_CC ) ;
PHP_OCI_HANDLE_ERROR ( statement - > connection , statement - > errcode ) ;
2005-12-01 13:39:48 +00:00
return 1 ;
1999-04-24 18:54:02 +00:00
}
2000-01-16 13:30:57 +00:00
2006-08-21 16:41:13 +00:00
PHP_OCI_CALL_RETURN ( statement - > errcode , OCIAttrGet , ( ( dvoid * ) statement - > stmt , OCI_HTYPE_STMT , ( ub2 * ) error_offset , ( ub4 * ) 0 , OCI_ATTR_PARSE_ERROR_OFFSET , statement - > err ) ) ;
2008-03-12 01:26:44 +00:00
2008-02-16 01:20:22 +00:00
if ( statement - > errcode ! = OCI_SUCCESS ) {
2008-03-22 01:27:50 +00:00
statement - > errcode = php_oci_error ( statement - > err , statement - > errcode TSRMLS_CC ) ;
PHP_OCI_HANDLE_ERROR ( statement - > connection , statement - > errcode ) ;
2005-12-01 13:39:48 +00:00
return 1 ;
2000-01-16 13:30:57 +00:00
}
2005-12-01 13:39:48 +00:00
return 0 ;
} /* }}} */
1999-04-21 22:49:16 +00:00
2008-02-16 01:20:22 +00:00
/* {{{ php_oci_do_connect()
2008-04-18 00:05:27 +00:00
*
* Connect wrapper
*/
2005-12-01 13:39:48 +00:00
void php_oci_do_connect ( INTERNAL_FUNCTION_PARAMETERS , int persistent , int exclusive )
1999-04-21 22:49:16 +00:00
{
2005-12-01 13:39:48 +00:00
php_oci_connection * connection ;
char * username , * password ;
char * dbname = NULL , * charset = NULL ;
int username_len = 0 , password_len = 0 ;
int dbname_len = 0 , charset_len = 0 ;
long session_mode = OCI_DEFAULT ;
1999-04-21 22:49:16 +00:00
2005-12-01 13:39:48 +00:00
/* if a fourth parameter is handed over, it is the charset identifier (but is only used in Oracle 9i+) */
if ( zend_parse_parameters ( ZEND_NUM_ARGS ( ) TSRMLS_CC , " ss|ssl " , & username , & username_len , & password , & password_len , & dbname , & dbname_len , & charset , & charset_len , & session_mode ) = = FAILURE ) {
return ;
2008-02-16 01:20:22 +00:00
}
2008-03-12 01:26:44 +00:00
2005-12-01 13:39:48 +00:00
if ( ! charset_len ) {
charset = NULL ;
1999-06-09 10:40:08 +00:00
}
2008-03-12 01:26:44 +00:00
2005-12-01 13:39:48 +00:00
connection = php_oci_do_connect_ex ( username , username_len , password , password_len , NULL , 0 , dbname , dbname_len , charset , session_mode , persistent , exclusive TSRMLS_CC ) ;
1999-06-09 10:40:08 +00:00
2005-12-01 13:39:48 +00:00
if ( ! connection ) {
RETURN_FALSE ;
1999-04-21 22:49:16 +00:00
}
2005-12-01 13:39:48 +00:00
RETURN_RESOURCE ( connection - > rsrc_id ) ;
2008-03-12 01:26:44 +00:00
2005-12-01 13:39:48 +00:00
} /* }}} */
1999-04-21 22:49:16 +00:00
2005-12-01 13:39:48 +00:00
/* {{{ php_oci_do_connect_ex()
2008-04-18 00:05:27 +00:00
*
* The real connect function . Allocates all the resources needed , establishes the connection and
* returns the result handle ( or NULL )
*/
2008-02-16 01:20:22 +00:00
php_oci_connection * php_oci_do_connect_ex ( char * username , int username_len , char * password , int password_len , char * new_password , int new_password_len , char * dbname , int dbname_len , char * charset , long session_mode , int persistent , int exclusive TSRMLS_DC )
2000-01-16 13:30:57 +00:00
{
2005-12-05 23:38:04 +00:00
zend_rsrc_list_entry * le ;
zend_rsrc_list_entry new_le ;
2005-12-01 13:39:48 +00:00
php_oci_connection * connection = NULL ;
smart_str hashed_details = { 0 } ;
time_t timestamp ;
2008-01-31 01:33:30 +00:00
php_oci_spool * session_pool = NULL ;
2008-03-12 01:26:44 +00:00
zend_bool use_spool = 1 ; /* Default is to use client-side session pool */
zend_bool ping_done = 0 ;
2008-01-31 01:33:30 +00:00
2005-12-01 13:39:48 +00:00
ub2 charsetid = 0 ;
2006-08-10 12:15:58 +00:00
ub2 charsetid_nls_lang = 0 ;
2008-03-12 01:26:44 +00:00
2005-12-01 13:39:48 +00:00
switch ( session_mode ) {
case OCI_DEFAULT :
break ;
case OCI_SYSOPER :
case OCI_SYSDBA :
if ( ! OCI_G ( privileged_connect ) ) {
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Privileged connect is disabled. Enable oci8.privileged_connect to be able to connect as SYSOPER or SYSDBA " ) ;
return NULL ;
}
2008-04-18 00:05:27 +00:00
/* Disable privileged connections in Safe Mode (N.b. safe mode has been removed in PHP
* 6 anyway )
*/
2007-08-02 22:39:54 +00:00
if ( PG ( safe_mode ) ) {
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Privileged connect is disabled in Safe Mode " ) ;
return NULL ;
}
2008-04-18 00:05:27 +00:00
/* Increase security by not caching privileged oci_pconnect() connections. The
* connection becomes equivalent to oci_connect ( ) or oci_new_connect ( ) .
2007-08-02 22:39:54 +00:00
*/
persistent = 0 ;
2000-01-16 13:30:57 +00:00
break ;
2002-11-15 17:59:19 +00:00
default :
2005-12-01 13:39:48 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Invalid session mode specified (%ld) " , session_mode ) ;
return NULL ;
break ;
2000-01-16 13:30:57 +00:00
}
2008-04-18 00:05:27 +00:00
/* We cannot use the new session create logic (OCISessionGet from client-side session pool) when
* privileged connect or password change is attempted . TODO : Remove this once OCI provides
2008-02-16 01:20:22 +00:00
* capability
2008-01-31 01:33:30 +00:00
*/
2008-03-12 01:26:44 +00:00
if ( ( session_mode = = OCI_SYSOPER ) | | ( session_mode = = OCI_SYSDBA ) | | ( new_password_len ) ) {
2008-01-31 01:33:30 +00:00
use_spool = 0 ;
}
2008-03-12 01:26:44 +00:00
smart_str_appendl_ex ( & hashed_details , " oci8*** " , sizeof ( " oci8*** " ) - 1 , 0 ) ;
2005-12-01 13:39:48 +00:00
smart_str_appendl_ex ( & hashed_details , username , username_len , 0 ) ;
2008-03-12 01:26:44 +00:00
smart_str_appendl_ex ( & hashed_details , " ** " , sizeof ( " ** " ) - 1 , 0 ) ;
/* DRCP: connection_class is an attribute of a connection */
if ( OCI_G ( connection_class ) ) {
smart_str_appendl_ex ( & hashed_details , OCI_G ( connection_class ) , strlen ( OCI_G ( connection_class ) ) , 0 ) ;
}
smart_str_appendl_ex ( & hashed_details , " ** " , sizeof ( " ** " ) - 1 , 0 ) ;
2006-08-05 20:56:43 +00:00
if ( password_len ) {
ulong password_hash ;
password_hash = zend_inline_hash_func ( password , password_len ) ;
smart_str_append_unsigned_ex ( & hashed_details , password_hash , 0 ) ;
}
2008-03-12 01:26:44 +00:00
smart_str_appendl_ex ( & hashed_details , " ** " , sizeof ( " ** " ) - 1 , 0 ) ;
2006-08-05 20:56:43 +00:00
2005-12-01 13:39:48 +00:00
if ( dbname ) {
smart_str_appendl_ex ( & hashed_details , dbname , dbname_len , 0 ) ;
2004-01-02 15:32:09 +00:00
}
2008-03-12 01:26:44 +00:00
smart_str_appendl_ex ( & hashed_details , " ** " , sizeof ( " ** " ) - 1 , 0 ) ;
2000-01-16 13:30:57 +00:00
2008-03-12 01:26:44 +00:00
/* Initialize global handles if they weren't initialized before */
2006-08-10 12:15:58 +00:00
if ( OCI_G ( env ) = = NULL ) {
php_oci_init_global_handles ( TSRMLS_C ) ;
}
2005-12-01 13:39:48 +00:00
if ( charset & & * charset ) {
2007-07-18 15:10:42 +00:00
PHP_OCI_CALL_RETURN ( charsetid , OCINlsCharSetNameToId , ( OCI_G ( env ) , ( CONST oratext * ) charset ) ) ;
2006-08-10 12:15:58 +00:00
if ( ! charsetid ) {
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Invalid character set name: %s " , charset ) ;
} else {
smart_str_append_unsigned_ex ( & hashed_details , charsetid , 0 ) ;
}
2005-12-01 13:39:48 +00:00
}
2006-08-10 12:15:58 +00:00
/* use NLS_LANG if no or invalid charset specified */
if ( ! charsetid ) {
2006-03-07 07:47:43 +00:00
size_t rsize = 0 ;
2006-08-10 12:15:58 +00:00
sword result ;
2001-04-13 14:43:39 +00:00
2007-02-12 09:36:23 +00:00
PHP_OCI_CALL_RETURN ( result , OCINlsEnvironmentVariableGet , ( & charsetid_nls_lang , 0 , OCI_NLS_CHARSET_ID , 0 , & rsize ) ) ;
2006-08-10 12:15:58 +00:00
if ( result ! = OCI_SUCCESS ) {
charsetid_nls_lang = 0 ;
}
smart_str_append_unsigned_ex ( & hashed_details , charsetid_nls_lang , 0 ) ;
2002-11-15 17:59:19 +00:00
}
2001-04-13 14:43:39 +00:00
2005-12-01 13:39:48 +00:00
timestamp = time ( NULL ) ;
2008-03-12 01:26:44 +00:00
2005-12-01 13:39:48 +00:00
smart_str_append_unsigned_ex ( & hashed_details , session_mode , 0 ) ;
smart_str_0 ( & hashed_details ) ;
1999-04-21 22:49:16 +00:00
2005-12-01 13:39:48 +00:00
/* make it lowercase */
php_strtolower ( hashed_details . c , hashed_details . len ) ;
2008-03-12 01:26:44 +00:00
2005-12-01 13:39:48 +00:00
if ( ! exclusive & & ! new_password ) {
2006-08-05 20:56:43 +00:00
zend_bool found = 0 ;
2005-12-01 13:39:48 +00:00
if ( persistent & & zend_hash_find ( & EG ( persistent_list ) , hashed_details . c , hashed_details . len + 1 , ( void * * ) & le ) = = SUCCESS ) {
2006-08-05 20:56:43 +00:00
found = 1 ;
2005-12-01 13:39:48 +00:00
/* found */
if ( le - > type = = le_pconnection ) {
2008-03-12 01:26:44 +00:00
connection = ( php_oci_connection * ) le - > ptr ;
2005-12-01 13:39:48 +00:00
}
2006-08-15 13:08:34 +00:00
} else if ( ! persistent & & zend_hash_find ( & EG ( regular_list ) , hashed_details . c , hashed_details . len + 1 , ( void * * ) & le ) = = SUCCESS ) {
2006-08-05 20:56:43 +00:00
found = 1 ;
2005-12-01 13:39:48 +00:00
if ( le - > type = = le_index_ptr ) {
2006-08-06 14:09:58 +00:00
int type , link ;
2005-12-01 13:39:48 +00:00
void * ptr ;
2006-08-06 14:09:58 +00:00
link = ( int ) le - > ptr ;
2005-12-01 13:39:48 +00:00
ptr = zend_list_find ( link , & type ) ;
if ( ptr & & ( type = = le_connection ) ) {
connection = ( php_oci_connection * ) ptr ;
}
2002-11-15 17:59:19 +00:00
}
2005-12-01 13:39:48 +00:00
}
2008-02-16 01:20:22 +00:00
/* Debug statements {{{ */
if ( OCI_G ( debug_mode ) ) {
if ( connection & & connection - > is_stub ) {
php_printf ( " OCI8 DEBUG L1: Got a cached stub: (%p) at (%s:%d) \n " , connection , __FILE__ , __LINE__ ) ;
2008-03-12 01:26:44 +00:00
} else if ( connection ) {
2008-02-16 01:20:22 +00:00
php_printf ( " OCI8 DEBUG L1: Got a cached connection: (%p) at (%s:%d) \n " , connection , __FILE__ , __LINE__ ) ;
2008-03-12 01:26:44 +00:00
} else {
2008-02-16 01:20:22 +00:00
php_printf ( " OCI8 DEBUG L1: Got NO cached connection at (%s:%d) \n " , __FILE__ , __LINE__ ) ;
}
} /* }}} */
2008-04-18 00:05:27 +00:00
/* If we got a pconnection stub, then 'load'(OCISessionGet) the real connection from its
* private spool A connection is a stub if it is only a cached structure and the real
* connection is released to its underlying private session pool . We currently do not have
* stub support for non - persistent conns .
2008-02-16 01:20:22 +00:00
*
* TODO : put in negative code for non - persistent stubs
2008-01-31 01:33:30 +00:00
*/
2008-02-16 01:20:22 +00:00
if ( connection & & connection - > is_persistent & & connection - > is_stub ) {
if ( php_oci_create_session ( connection , NULL , dbname , dbname_len , username , username_len , password , password_len , new_password , new_password_len , session_mode TSRMLS_CC ) ) {
smart_str_free_ex ( & hashed_details , 0 ) ;
zend_hash_del ( & EG ( persistent_list ) , connection - > hash_key , strlen ( connection - > hash_key ) + 1 ) ;
return NULL ;
}
2008-03-12 01:26:44 +00:00
/* We do the ping in php_oci_create_session, no need to ping again below */
ping_done = 1 ;
2008-02-16 01:20:22 +00:00
}
2008-03-12 01:26:44 +00:00
2008-02-16 01:20:22 +00:00
if ( connection ) {
2005-12-01 13:39:48 +00:00
if ( connection - > is_open ) {
/* found an open connection. now ping it */
if ( connection - > is_persistent ) {
2008-03-12 01:26:44 +00:00
int rsrc_type ;
2008-04-18 00:05:27 +00:00
/* Check connection liveness in the following order:
2005-12-01 13:39:48 +00:00
* 1 ) always check OCI_ATTR_SERVER_STATUS
* 2 ) see if it ' s time to ping it
2008-02-16 01:20:22 +00:00
* 3 ) ping it if needed
2008-03-12 01:26:44 +00:00
*/
2005-12-01 13:39:48 +00:00
if ( php_oci_connection_status ( connection TSRMLS_CC ) ) {
2008-04-18 00:05:27 +00:00
/* Only ping if:
*
2005-12-01 13:39:48 +00:00
* 1 ) next_ping > 0 , which means that ping_interval is not - 1 ( aka " Off " )
2008-04-18 00:05:27 +00:00
*
* 2 ) current_timestamp > next_ping , which means " it's time to check if it's
* still alive "
2008-03-12 01:26:44 +00:00
*/
2008-04-18 00:05:27 +00:00
if ( ! ping_done & & ( * ( connection - > next_pingp ) > 0 ) & & ( timestamp > = * ( connection - > next_pingp ) ) & & ! php_oci_connection_ping ( connection TSRMLS_CC ) ) {
2005-12-01 13:39:48 +00:00
/* server died */
2006-08-15 13:08:34 +00:00
} else {
2006-10-18 14:23:23 +00:00
php_oci_connection * tmp ;
2006-05-29 10:59:30 +00:00
2005-12-01 13:39:48 +00:00
/* okay, the connection is open and the server is still alive */
connection - > used_this_request = 1 ;
2006-10-18 14:23:23 +00:00
tmp = ( php_oci_connection * ) zend_list_find ( connection - > rsrc_id , & rsrc_type ) ;
if ( tmp ! = NULL & & rsrc_type = = le_pconnection & & strlen ( tmp - > hash_key ) = = hashed_details . len & &
memcmp ( tmp - > hash_key , hashed_details . c , hashed_details . len ) = = 0 & & zend_list_addref ( connection - > rsrc_id ) = = SUCCESS ) {
2006-05-29 10:59:30 +00:00
/* do nothing */
} else {
2006-04-12 17:59:32 +00:00
connection - > rsrc_id = zend_list_insert ( connection , le_pconnection ) ;
2008-04-18 00:05:27 +00:00
/* Persistent connections: For old close semantics we artificially
* bump up the refcount to prevent the non - persistent destructor
* from getting called until request shutdown . The refcount is
* decremented in the persistent helper
*/
if ( OCI_G ( old_oci_close_semantics ) ) {
zend_list_addref ( connection - > rsrc_id ) ;
}
2006-04-12 17:59:32 +00:00
}
2006-10-18 14:23:23 +00:00
smart_str_free_ex ( & hashed_details , 0 ) ;
2005-12-01 13:39:48 +00:00
return connection ;
}
}
/* server died */
2006-08-15 13:08:34 +00:00
} else {
2005-12-01 13:39:48 +00:00
/* we do not ping non-persistent connections */
smart_str_free_ex ( & hashed_details , 0 ) ;
zend_list_addref ( connection - > rsrc_id ) ;
return connection ;
2005-10-10 10:44:39 +00:00
}
2008-03-22 01:27:50 +00:00
} /* is_open is true? */
2008-04-18 00:05:27 +00:00
/* Server died - connection not usable. The is_open=true can also fall through to here,
* if ping fails
*/
2008-03-22 01:27:50 +00:00
if ( persistent ) {
int rsrc_type ;
connection - > is_open = 0 ;
connection - > used_this_request = 1 ;
2008-04-18 00:05:27 +00:00
/* We have to do a hash_del but need to preserve the resource if there is a positive
* refcount . Set the data pointer in the list entry to NULL
*/
if ( connection = = zend_list_find ( connection - > rsrc_id , & rsrc_type ) & & rsrc_type = = le_pconnection ) {
2008-03-22 01:27:50 +00:00
le - > ptr = NULL ;
}
zend_hash_del ( & EG ( persistent_list ) , hashed_details . c , hashed_details . len + 1 ) ;
2000-01-16 13:30:57 +00:00
} else {
2008-04-18 00:05:27 +00:00
/* We only remove the hash entry. The resource and the list entry with its pointer
* to the resource are still intact
*/
2005-12-01 13:39:48 +00:00
zend_hash_del ( & EG ( regular_list ) , hashed_details . c , hashed_details . len + 1 ) ;
2000-01-16 13:30:57 +00:00
}
2008-03-22 01:27:50 +00:00
connection = NULL ;
2008-02-16 01:20:22 +00:00
} else if ( found ) {
2005-12-01 13:39:48 +00:00
/* found something, but it's not a connection, delete it */
if ( persistent ) {
zend_hash_del ( & EG ( persistent_list ) , hashed_details . c , hashed_details . len + 1 ) ;
2006-08-15 13:08:34 +00:00
} else {
2005-12-01 13:39:48 +00:00
zend_hash_del ( & EG ( regular_list ) , hashed_details . c , hashed_details . len + 1 ) ;
}
}
}
2008-01-31 01:33:30 +00:00
2008-04-18 00:05:27 +00:00
/* Check if we have reached max_persistent. If so, try to remove a few timed-out connections. As
* a last resort , return a non - persistent connection .
2008-01-31 01:33:30 +00:00
*/
2008-02-16 01:20:22 +00:00
if ( persistent ) {
zend_bool alloc_non_persistent = 0 ;
2008-03-12 01:26:44 +00:00
2008-02-16 01:20:22 +00:00
if ( OCI_G ( max_persistent ) ! = - 1 & & OCI_G ( num_persistent ) > = OCI_G ( max_persistent ) ) {
/* try to find an idle connection and kill it */
zend_hash_apply ( & EG ( persistent_list ) , ( apply_func_t ) php_oci_persistent_helper TSRMLS_CC ) ;
2008-03-12 01:26:44 +00:00
2008-02-16 01:20:22 +00:00
if ( OCI_G ( max_persistent ) ! = - 1 & & OCI_G ( num_persistent ) > = OCI_G ( max_persistent ) ) {
/* all persistent connactions are in use, fallback to non-persistent connection creation */
php_error_docref ( NULL TSRMLS_CC , E_NOTICE , " Too many open persistent connections (%ld) " , OCI_G ( num_persistent ) ) ;
alloc_non_persistent = 1 ;
2008-01-31 01:33:30 +00:00
}
2008-02-16 01:20:22 +00:00
}
2008-03-12 01:26:44 +00:00
2008-02-16 01:20:22 +00:00
if ( alloc_non_persistent ) {
2005-12-01 13:39:48 +00:00
connection = ( php_oci_connection * ) ecalloc ( 1 , sizeof ( php_oci_connection ) ) ;
2006-08-22 11:09:12 +00:00
connection - > hash_key = estrndup ( hashed_details . c , hashed_details . len ) ;
2005-12-01 13:39:48 +00:00
connection - > is_persistent = 0 ;
2008-02-16 01:20:22 +00:00
} else {
connection = ( php_oci_connection * ) calloc ( 1 , sizeof ( php_oci_connection ) ) ;
connection - > hash_key = zend_strndup ( hashed_details . c , hashed_details . len ) ;
connection - > is_persistent = 1 ;
2005-12-01 13:39:48 +00:00
}
2008-02-16 01:20:22 +00:00
} else {
connection = ( php_oci_connection * ) ecalloc ( 1 , sizeof ( php_oci_connection ) ) ;
connection - > hash_key = estrndup ( hashed_details . c , hashed_details . len ) ;
connection - > is_persistent = 0 ;
2001-02-12 14:36:28 +00:00
}
2001-08-15 16:00:56 +00:00
2008-04-18 00:05:27 +00:00
/* {{{ Get the session pool that suits this connection request from the persistent list. This
* step is only for non - persistent connections as persistent connections have private session
* pools . Non - persistent conns use shared session pool to allow for optimizations such as
* caching the physical connection ( for DRCP ) even when the non - persistent php connection is
* destroyed .
*
* TODO : Unconditionally do this once OCI provides extended OCISessionGet capability
*/
2008-01-31 01:33:30 +00:00
if ( use_spool & & ! connection - > is_persistent ) {
if ( ( session_pool = php_oci_get_spool ( username , username_len , password , password_len , dbname , dbname_len , charsetid ? charsetid : charsetid_nls_lang TSRMLS_CC ) ) = = NULL )
{
2008-02-16 01:20:22 +00:00
php_oci_connection_close ( connection TSRMLS_CC ) ;
2008-01-31 01:33:30 +00:00
smart_str_free_ex ( & hashed_details , 0 ) ;
return NULL ;
2008-02-16 01:20:22 +00:00
}
2008-01-31 01:33:30 +00:00
} /* }}} */
2005-12-01 13:39:48 +00:00
connection - > idle_expiry = ( OCI_G ( persistent_timeout ) > 0 ) ? ( timestamp + OCI_G ( persistent_timeout ) ) : 0 ;
2007-08-06 20:32:55 +00:00
2008-04-18 00:05:27 +00:00
/* Mark password as unchanged by PHP during the duration of the database session */
2007-08-06 20:32:55 +00:00
connection - > passwd_changed = 0 ;
2008-03-12 01:26:44 +00:00
2005-12-01 13:39:48 +00:00
smart_str_free_ex ( & hashed_details , 0 ) ;
1999-04-21 22:49:16 +00:00
2006-08-10 12:15:58 +00:00
if ( charsetid ) {
2005-12-01 13:39:48 +00:00
connection - > charset = charsetid ;
2006-08-10 12:15:58 +00:00
} else {
connection - > charset = charsetid_nls_lang ;
1999-05-12 14:28:01 +00:00
}
2008-04-18 00:05:27 +00:00
/* Old session creation semantics when session pool cannot be used Eg: privileged
* connect / password change
*/
if ( ! use_spool ) {
2008-01-31 01:33:30 +00:00
if ( php_oci_old_create_session ( connection , dbname , dbname_len , username , username_len , password , password_len , new_password , new_password_len , session_mode TSRMLS_CC ) ) {
2008-02-16 01:20:22 +00:00
php_oci_connection_close ( connection TSRMLS_CC ) ;
2005-12-01 13:39:48 +00:00
return NULL ;
}
2008-03-12 01:26:44 +00:00
} else {
2008-01-31 01:33:30 +00:00
/* create using the client-side session pool */
if ( php_oci_create_session ( connection , session_pool , dbname , dbname_len , username , username_len , password , password_len , new_password , new_password_len , session_mode TSRMLS_CC ) ) {
2008-02-16 01:20:22 +00:00
php_oci_connection_close ( connection TSRMLS_CC ) ;
2005-12-01 13:39:48 +00:00
return NULL ;
2008-01-31 01:33:30 +00:00
}
1999-04-21 22:49:16 +00:00
}
2008-03-12 01:26:44 +00:00
2008-04-18 00:05:27 +00:00
/* Mark it as open */
2005-12-01 13:39:48 +00:00
connection - > is_open = 1 ;
2008-01-31 01:33:30 +00:00
2008-02-16 01:20:22 +00:00
/* add to the appropriate hash */
2005-12-01 13:39:48 +00:00
if ( connection - > is_persistent ) {
2008-02-16 01:20:22 +00:00
new_le . ptr = connection ;
new_le . type = le_pconnection ;
2005-12-01 13:39:48 +00:00
connection - > used_this_request = 1 ;
2008-02-16 01:20:22 +00:00
connection - > rsrc_id = zend_list_insert ( connection , le_pconnection ) ;
2008-04-18 00:05:27 +00:00
/* Persistent connections: For old close semantics we artificially bump up the refcount to
* prevent the non - persistent destructor from getting called until request shutdown . The
* refcount is decremented in the persistent helper
*/
if ( OCI_G ( old_oci_close_semantics ) ) {
zend_list_addref ( connection - > rsrc_id ) ;
}
2008-02-16 01:20:22 +00:00
zend_hash_update ( & EG ( persistent_list ) , connection - > hash_key , strlen ( connection - > hash_key ) + 1 , ( void * ) & new_le , sizeof ( zend_rsrc_list_entry ) , NULL ) ;
OCI_G ( num_persistent ) + + ;
} else if ( ! exclusive ) {
connection - > rsrc_id = zend_list_insert ( connection , le_connection ) ;
new_le . ptr = ( void * ) connection - > rsrc_id ;
new_le . type = le_index_ptr ;
zend_hash_update ( & EG ( regular_list ) , connection - > hash_key , strlen ( connection - > hash_key ) + 1 , ( void * ) & new_le , sizeof ( zend_rsrc_list_entry ) , NULL ) ;
OCI_G ( num_links ) + + ;
} else {
2008-03-12 01:26:44 +00:00
connection - > rsrc_id = zend_list_insert ( connection , le_connection ) ;
2008-02-16 01:20:22 +00:00
OCI_G ( num_links ) + + ;
2008-01-31 01:33:30 +00:00
}
2008-02-16 01:20:22 +00:00
/* Debug statements {{{ */
if ( OCI_G ( debug_mode ) ) {
if ( connection - > is_persistent ) {
php_printf ( " OCI8 DEBUG L1: New Persistent Connection address: (%p) at (%s:%d) \n " , connection , __FILE__ , __LINE__ ) ;
2008-03-12 01:26:44 +00:00
} else {
2008-02-16 01:20:22 +00:00
php_printf ( " OCI8 DEBUG L1: New Non-Persistent Connection address: (%p) at (%s:%d) \n " , connection , __FILE__ , __LINE__ ) ;
2008-01-31 01:33:30 +00:00
}
2008-02-16 01:20:22 +00:00
php_printf ( " OCI8 DEBUG L1: num_persistent=(%ld), num_links=(%ld) at (%s:%d) \n " , OCI_G ( num_persistent ) , OCI_G ( num_links ) , __FILE__ , __LINE__ ) ;
2008-01-31 01:33:30 +00:00
} /* }}} */
2008-02-16 01:20:22 +00:00
2005-12-01 13:39:48 +00:00
return connection ;
1999-04-21 22:49:16 +00:00
}
/* }}} */
2005-12-01 13:39:48 +00:00
/* {{{ php_oci_connection_ping()
2008-04-18 00:05:27 +00:00
*
* Ping connection . Uses OCIPing ( ) or OCIServerVersion ( ) depending on the Oracle Client version
*/
2005-12-01 13:39:48 +00:00
static int php_oci_connection_ping ( php_oci_connection * connection TSRMLS_DC )
2001-04-13 14:43:39 +00:00
{
2008-04-18 00:05:27 +00:00
/* Use OCIPing instead of OCIServerVersion. If OCIPing returns ORA-1010 (invalid OCI operation)
* such as from Pre - 10.1 servers , the error is still from the server and we would have
* successfully performed a roundtrip and validated the connection . Use OCIServerVersion for
* Pre - 10.2 clients
2008-02-16 01:20:22 +00:00
*/
2008-04-18 00:05:27 +00:00
# if ((OCI_MAJOR_VERSION > 10) || ((OCI_MAJOR_VERSION == 10) && (OCI_MINOR_VERSION >= 2))) /* OCIPing available 10.2 onwards */
2006-08-21 16:41:13 +00:00
PHP_OCI_CALL_RETURN ( OCI_G ( errcode ) , OCIPing , ( connection - > svc , OCI_G ( err ) , OCI_DEFAULT ) ) ;
2005-12-01 13:39:48 +00:00
# else
char version [ 256 ] ;
2008-02-16 01:20:22 +00:00
/* use good old OCIServerVersion() */
2008-03-12 01:26:44 +00:00
PHP_OCI_CALL_RETURN ( OCI_G ( errcode ) , OCIServerVersion , ( connection - > svc , OCI_G ( err ) , ( text * ) version , sizeof ( version ) , OCI_HTYPE_SVCCTX ) ) ;
2005-12-01 13:39:48 +00:00
# endif
2008-03-12 01:26:44 +00:00
2005-12-01 13:39:48 +00:00
if ( OCI_G ( errcode ) = = OCI_SUCCESS ) {
return 1 ;
2008-03-12 01:26:44 +00:00
} else {
2008-02-16 01:20:22 +00:00
sb4 error_code = 0 ;
text tmp_buf [ PHP_OCI_ERRBUF_LEN ] ;
2005-12-01 13:39:48 +00:00
2008-02-16 01:20:22 +00:00
/* Treat ORA-1010 as a successful Ping */
OCIErrorGet ( OCI_G ( err ) , ( ub4 ) 1 , NULL , & error_code , tmp_buf , ( ub4 ) PHP_OCI_ERRBUF_LEN , ( ub4 ) OCI_HTYPE_ERROR ) ;
if ( error_code = = 1010 ) {
return 1 ;
}
}
/* ignore errors here, just return failure
2005-12-01 13:39:48 +00:00
* php_oci_error ( OCI_G ( err ) , OCI_G ( errcode ) TSRMLS_CC ) ; */
return 0 ;
2001-04-13 14:43:39 +00:00
}
2001-06-06 13:06:12 +00:00
/* }}} */
2001-04-13 14:43:39 +00:00
2005-12-01 13:39:48 +00:00
/* {{{ php_oci_connection_status()
2008-04-18 00:05:27 +00:00
*
* Check connection status ( pre - ping check )
*/
2005-12-01 13:39:48 +00:00
static int php_oci_connection_status ( php_oci_connection * connection TSRMLS_DC )
2001-04-13 14:43:39 +00:00
{
2005-12-01 13:39:48 +00:00
ub4 ss = 0 ;
2001-05-22 23:16:03 +00:00
2005-12-01 13:39:48 +00:00
/* get OCI_ATTR_SERVER_STATUS */
2006-08-21 16:41:13 +00:00
PHP_OCI_CALL_RETURN ( OCI_G ( errcode ) , OCIAttrGet , ( ( dvoid * ) connection - > server , OCI_HTYPE_SERVER , ( dvoid * ) & ss , ( ub4 * ) 0 , OCI_ATTR_SERVER_STATUS , OCI_G ( err ) ) ) ;
2008-03-12 01:26:44 +00:00
2005-12-01 13:39:48 +00:00
if ( OCI_G ( errcode ) = = OCI_SUCCESS & & ss = = OCI_SERVER_NORMAL ) {
return 1 ;
2002-11-15 17:59:19 +00:00
}
2001-04-13 14:43:39 +00:00
2008-02-16 01:20:22 +00:00
/* ignore errors here, just return failure
2005-12-01 13:39:48 +00:00
* php_oci_error ( OCI_G ( err ) , OCI_G ( errcode ) TSRMLS_CC ) ; */
return 0 ;
2001-04-13 14:43:39 +00:00
}
/* }}} */
2005-12-01 13:39:48 +00:00
/* {{{ php_oci_connection_rollback()
2008-04-18 00:05:27 +00:00
*
* Rollback connection
*/
2005-12-01 13:39:48 +00:00
int php_oci_connection_rollback ( php_oci_connection * connection TSRMLS_DC )
2001-04-13 14:43:39 +00:00
{
2006-08-21 16:41:13 +00:00
PHP_OCI_CALL_RETURN ( connection - > errcode , OCITransRollback , ( connection - > svc , connection - > err , ( ub4 ) 0 ) ) ;
2005-12-01 13:39:48 +00:00
connection - > needs_commit = 0 ;
2001-04-13 14:43:39 +00:00
2005-12-01 13:39:48 +00:00
if ( connection - > errcode ! = OCI_SUCCESS ) {
2008-03-22 01:27:50 +00:00
connection - > errcode = php_oci_error ( connection - > err , connection - > errcode TSRMLS_CC ) ;
2005-12-01 13:39:48 +00:00
PHP_OCI_HANDLE_ERROR ( connection , connection - > errcode ) ;
return 1 ;
}
return 0 ;
} /* }}} */
2001-04-13 14:43:39 +00:00
2005-12-01 13:39:48 +00:00
/* {{{ php_oci_connection_commit()
2008-04-18 00:05:27 +00:00
*
* Commit connection
*/
2005-12-01 13:39:48 +00:00
int php_oci_connection_commit ( php_oci_connection * connection TSRMLS_DC )
{
2006-08-21 16:41:13 +00:00
PHP_OCI_CALL_RETURN ( connection - > errcode , OCITransCommit , ( connection - > svc , connection - > err , ( ub4 ) 0 ) ) ;
2005-12-01 13:39:48 +00:00
connection - > needs_commit = 0 ;
2001-09-11 21:03:58 +00:00
2005-12-01 13:39:48 +00:00
if ( connection - > errcode ! = OCI_SUCCESS ) {
2008-03-22 01:27:50 +00:00
connection - > errcode = php_oci_error ( connection - > err , connection - > errcode TSRMLS_CC ) ;
2005-12-01 13:39:48 +00:00
PHP_OCI_HANDLE_ERROR ( connection , connection - > errcode ) ;
return 1 ;
}
return 0 ;
} /* }}} */
2002-11-15 17:59:19 +00:00
2008-02-16 01:20:22 +00:00
/* {{{ php_oci_connection_close()
2008-04-18 00:05:27 +00:00
*
* Close the connection and free all its resources
*/
2005-12-01 13:39:48 +00:00
static int php_oci_connection_close ( php_oci_connection * connection TSRMLS_DC )
{
int result = 0 ;
2006-08-21 16:41:13 +00:00
zend_bool in_call_save = OCI_G ( in_call ) ;
2002-11-15 17:59:19 +00:00
2008-04-18 00:05:27 +00:00
if ( ! connection - > is_stub ) {
/* Release resources associated with connection */
php_oci_connection_release ( connection TSRMLS_CC ) ;
2001-04-13 14:43:39 +00:00
}
2008-04-18 00:05:27 +00:00
if ( ! connection - > using_spool & & connection - > svc ) {
2008-01-31 01:33:30 +00:00
PHP_OCI_CALL ( OCISessionEnd , ( connection - > svc , connection - > err , connection - > session , ( ub4 ) 0 ) ) ;
2005-12-01 13:39:48 +00:00
}
2008-01-31 01:33:30 +00:00
2005-12-01 13:39:48 +00:00
if ( connection - > err ) {
PHP_OCI_CALL ( OCIHandleFree , ( ( dvoid * ) connection - > err , ( ub4 ) OCI_HTYPE_ERROR ) ) ;
}
2008-01-31 01:33:30 +00:00
if ( connection - > authinfo ) {
PHP_OCI_CALL ( OCIHandleFree , ( ( dvoid * ) connection - > authinfo , ( ub4 ) OCI_HTYPE_AUTHINFO ) ) ;
2005-12-01 13:39:48 +00:00
}
2008-03-12 01:26:44 +00:00
/* No Handlefrees for session pool connections */
if ( ! connection - > using_spool ) {
2008-01-31 01:33:30 +00:00
if ( connection - > session ) {
PHP_OCI_CALL ( OCIHandleFree , ( ( dvoid * ) connection - > session , OCI_HTYPE_SESSION ) ) ;
}
2008-03-12 01:26:44 +00:00
2008-01-31 01:33:30 +00:00
if ( connection - > is_attached ) {
PHP_OCI_CALL ( OCIServerDetach , ( connection - > server , OCI_G ( err ) , OCI_DEFAULT ) ) ;
}
2008-03-12 01:26:44 +00:00
2008-01-31 01:33:30 +00:00
if ( connection - > svc ) {
PHP_OCI_CALL ( OCIHandleFree , ( ( dvoid * ) connection - > svc , ( ub4 ) OCI_HTYPE_SVCCTX ) ) ;
}
2008-03-12 01:26:44 +00:00
2008-01-31 01:33:30 +00:00
if ( connection - > server ) {
PHP_OCI_CALL ( OCIHandleFree , ( ( dvoid * ) connection - > server , ( ub4 ) OCI_HTYPE_SERVER ) ) ;
}
2008-03-12 01:26:44 +00:00
2008-01-31 01:33:30 +00:00
if ( connection - > env ) {
PHP_OCI_CALL ( OCIHandleFree , ( ( dvoid * ) connection - > env , OCI_HTYPE_ENV ) ) ;
}
2008-03-12 01:26:44 +00:00
} else if ( connection - > private_spool ) {
2008-02-16 01:20:22 +00:00
/* Keep this as the last member to be freed, as there are dependencies
2008-01-31 01:33:30 +00:00
* ( like env ) on the session pool
*/
php_oci_spool_close ( connection - > private_spool TSRMLS_CC ) ;
2005-12-01 13:39:48 +00:00
}
2001-04-13 14:43:39 +00:00
2005-12-01 13:39:48 +00:00
if ( connection - > is_persistent ) {
if ( connection - > hash_key ) {
free ( connection - > hash_key ) ;
2001-09-11 23:15:18 +00:00
}
2005-12-01 13:39:48 +00:00
free ( connection ) ;
2006-08-15 13:08:34 +00:00
} else {
2005-12-01 13:39:48 +00:00
if ( connection - > hash_key ) {
efree ( connection - > hash_key ) ;
2001-04-13 14:43:39 +00:00
}
2005-12-01 13:39:48 +00:00
efree ( connection ) ;
2001-04-13 14:43:39 +00:00
}
2005-12-01 13:39:48 +00:00
connection = NULL ;
2006-08-21 16:41:13 +00:00
OCI_G ( in_call ) = in_call_save ;
2005-12-01 13:39:48 +00:00
return result ;
} /* }}} */
2001-04-13 14:43:39 +00:00
2008-02-16 01:20:22 +00:00
/* {{{ php_oci_connection_release()
2008-04-18 00:05:27 +00:00
*
* Release the connection ' s resources . This involves freeing descriptors and rolling back
* transactions , setting timeout - related parameters etc . For session - pool using connections , the
* underlying connection is released to its session pool .
*/
2008-01-31 01:33:30 +00:00
int php_oci_connection_release ( php_oci_connection * connection TSRMLS_DC )
{
int result = 0 ;
zend_bool in_call_save = OCI_G ( in_call ) ;
2008-04-18 00:05:27 +00:00
time_t timestamp = time ( NULL ) ;
2008-01-31 01:33:30 +00:00
2008-04-18 00:05:27 +00:00
if ( connection - > is_stub ) {
return 0 ;
2008-01-31 01:33:30 +00:00
}
if ( connection - > descriptors ) {
zend_hash_destroy ( connection - > descriptors ) ;
efree ( connection - > descriptors ) ;
connection - > descriptors = NULL ;
}
2008-03-12 01:26:44 +00:00
if ( connection - > svc ) {
2008-01-31 01:33:30 +00:00
/* rollback outstanding transactions */
if ( connection - > needs_commit ) {
if ( php_oci_connection_rollback ( connection TSRMLS_CC ) ) {
/* rollback failed */
result = 1 ;
}
}
}
2008-04-18 00:05:27 +00:00
if ( OCI_G ( persistent_timeout ) > 0 ) {
connection - > idle_expiry = timestamp + OCI_G ( persistent_timeout ) ;
}
/* We may have half-cooked connections to clean up */
if ( connection - > next_pingp ) {
2008-03-12 01:26:44 +00:00
if ( OCI_G ( ping_interval ) > = 0 ) {
2008-04-18 00:05:27 +00:00
* ( connection - > next_pingp ) = timestamp + OCI_G ( ping_interval ) ;
2008-03-12 01:26:44 +00:00
} else {
/* ping_interval is -1 */
* ( connection - > next_pingp ) = 0 ;
}
2008-01-31 01:33:30 +00:00
}
2008-04-18 00:05:27 +00:00
/* Release the session (stubs are filtered out at the beginning)*/
if ( connection - > using_spool ) {
ub4 rlsMode = OCI_DEFAULT ;
2008-01-31 01:33:30 +00:00
2008-04-18 00:05:27 +00:00
if ( result ) {
rlsMode | = OCI_SESSRLS_DROPSESS ;
}
2008-01-31 01:33:30 +00:00
2008-04-18 00:05:27 +00:00
/* Sessions for non-persistent connections should be dropped. For 11 and above, the session
* pool has its own mechanism for doing so for purity NEW connections . We need to do so
* explicitly for 10.2 and earlier .
*/
# if (!(OCI_MAJOR_VERSION >= 11))
if ( ! connection - > is_persistent ) {
rlsMode | = OCI_SESSRLS_DROPSESS ;
}
# endif
if ( connection - > svc ) {
PHP_OCI_CALL ( OCISessionRelease , ( connection - > svc , connection - > err , NULL ,
0 , rlsMode ) ) ;
}
/* It no longer has relation with the database session. However authinfo and env are
* cached
*/
connection - > svc = NULL ;
connection - > server = NULL ;
connection - > session = NULL ;
2008-03-12 01:26:44 +00:00
2008-04-18 00:05:27 +00:00
connection - > is_attached = connection - > is_open = connection - > needs_commit = connection - > used_this_request = 0 ;
connection - > is_stub = 1 ;
/* Cut the link between the connection structure and the time_t structure allocated within
* the OCI session
*/
connection - > next_pingp = NULL ;
2008-01-31 01:33:30 +00:00
}
OCI_G ( in_call ) = in_call_save ;
return result ;
} /* }}} */
2005-12-01 13:39:48 +00:00
/* {{{ php_oci_password_change()
2008-04-18 00:05:27 +00:00
*
* Change password for the user with the username given
*/
2005-12-01 13:39:48 +00:00
int php_oci_password_change ( php_oci_connection * connection , char * user , int user_len , char * pass_old , int pass_old_len , char * pass_new , int pass_new_len TSRMLS_DC )
2001-04-13 14:43:39 +00:00
{
2006-08-21 16:41:13 +00:00
PHP_OCI_CALL_RETURN ( connection - > errcode , OCIPasswordChange , ( connection - > svc , connection - > err , ( text * ) user , user_len , ( text * ) pass_old , pass_old_len , ( text * ) pass_new , pass_new_len , OCI_DEFAULT ) ) ;
2001-04-13 14:43:39 +00:00
2005-12-01 13:39:48 +00:00
if ( connection - > errcode ! = OCI_SUCCESS ) {
2008-03-22 01:27:50 +00:00
connection - > errcode = php_oci_error ( connection - > err , connection - > errcode TSRMLS_CC ) ;
2005-12-01 13:39:48 +00:00
PHP_OCI_HANDLE_ERROR ( connection , connection - > errcode ) ;
return 1 ;
}
2007-08-06 20:32:55 +00:00
connection - > passwd_changed = 1 ;
2005-12-01 13:39:48 +00:00
return 0 ;
} /* }}} */
2001-04-13 14:43:39 +00:00
2008-02-16 01:20:22 +00:00
/* {{{ php_oci_server_get_version()
2008-04-18 00:05:27 +00:00
*
* Get Oracle server version
*/
2008-02-16 01:20:22 +00:00
int php_oci_server_get_version ( php_oci_connection * connection , char * * version TSRMLS_DC )
2005-12-01 13:39:48 +00:00
{
char version_buff [ 256 ] ;
2001-04-13 14:43:39 +00:00
2008-03-12 01:26:44 +00:00
PHP_OCI_CALL_RETURN ( connection - > errcode , OCIServerVersion , ( connection - > svc , connection - > err , ( text * ) version_buff , sizeof ( version_buff ) , OCI_HTYPE_SVCCTX ) ) ;
2005-12-01 13:39:48 +00:00
if ( connection - > errcode ! = OCI_SUCCESS ) {
2008-03-22 01:27:50 +00:00
connection - > errcode = php_oci_error ( connection - > err , connection - > errcode TSRMLS_CC ) ;
2005-12-01 13:39:48 +00:00
PHP_OCI_HANDLE_ERROR ( connection , connection - > errcode ) ;
return 1 ;
2001-04-13 14:43:39 +00:00
}
2008-03-12 01:26:44 +00:00
2005-12-01 13:39:48 +00:00
* version = estrdup ( version_buff ) ;
return 0 ;
} /* }}} */
2001-04-13 14:43:39 +00:00
2008-02-16 01:20:22 +00:00
/* {{{ php_oci_column_to_zval()
2008-04-18 00:05:27 +00:00
*
* Convert php_oci_out_column struct into zval
*/
2005-12-01 13:39:48 +00:00
int php_oci_column_to_zval ( php_oci_out_column * column , zval * value , int mode TSRMLS_DC )
2001-04-13 14:43:39 +00:00
{
2005-12-01 13:39:48 +00:00
php_oci_descriptor * descriptor ;
ub4 lob_length ;
int column_size ;
char * lob_buffer ;
2008-01-15 20:44:31 +00:00
int lob_fetch_status ;
2008-01-31 01:33:30 +00:00
2008-02-16 01:20:22 +00:00
if ( column - > indicator = = - 1 ) { /* column is NULL */
ZVAL_NULL ( value ) ;
2005-12-01 13:39:48 +00:00
return 0 ;
}
2008-03-12 01:26:44 +00:00
2005-12-01 13:39:48 +00:00
if ( column - > is_cursor ) { /* REFCURSOR -> simply return the statement id */
ZVAL_RESOURCE ( value , column - > stmtid ) ;
zend_list_addref ( column - > stmtid ) ;
2006-08-15 13:08:34 +00:00
} else if ( column - > is_descr ) {
2008-03-12 01:26:44 +00:00
2005-12-01 13:39:48 +00:00
if ( column - > data_type ! = SQLT_RDD ) {
int rsrc_type ;
2008-03-12 01:26:44 +00:00
2005-12-01 13:39:48 +00:00
/* reset descriptor's length */
descriptor = ( php_oci_descriptor * ) zend_list_find ( column - > descid , & rsrc_type ) ;
2001-09-11 21:03:58 +00:00
2005-12-01 13:39:48 +00:00
if ( ! descriptor | | rsrc_type ! = le_descriptor ) {
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Unable to find LOB descriptor #%d " , column - > descid ) ;
return 1 ;
2001-09-11 21:03:58 +00:00
}
2008-03-12 01:26:44 +00:00
2005-12-01 13:39:48 +00:00
descriptor - > lob_size = - 1 ;
descriptor - > lob_current_position = 0 ;
descriptor - > buffering = 0 ;
2001-09-11 21:03:58 +00:00
}
2005-12-01 13:39:48 +00:00
if ( column - > data_type ! = SQLT_RDD & & ( mode & PHP_OCI_RETURN_LOBS ) ) {
/* PHP_OCI_RETURN_LOBS means that we want the content of the LOB back instead of the locator */
2008-03-12 01:26:44 +00:00
2008-01-15 20:44:31 +00:00
lob_fetch_status = php_oci_lob_read ( descriptor , - 1 , 0 , & lob_buffer , & lob_length TSRMLS_CC ) ;
2008-01-24 14:09:36 +00:00
php_oci_temp_lob_close ( descriptor TSRMLS_CC ) ;
2008-01-15 20:44:31 +00:00
if ( lob_fetch_status ) {
2005-12-01 13:39:48 +00:00
ZVAL_FALSE ( value ) ;
return 1 ;
} else {
if ( lob_length > 0 ) {
ZVAL_STRINGL ( value , lob_buffer , lob_length , 0 ) ;
2006-08-15 13:08:34 +00:00
} else {
2005-12-01 13:39:48 +00:00
ZVAL_EMPTY_STRING ( value ) ;
2002-11-15 17:59:19 +00:00
}
2005-12-01 13:39:48 +00:00
return 0 ;
}
2008-02-16 01:20:22 +00:00
} else {
2005-12-01 13:39:48 +00:00
/* return the locator */
object_init_ex ( value , oci_lob_class_entry_ptr ) ;
add_property_resource ( value , " descriptor " , column - > descid ) ;
zend_list_addref ( column - > descid ) ;
}
2006-08-15 13:08:34 +00:00
} else {
2005-12-01 13:39:48 +00:00
switch ( column - > retcode ) {
2008-02-16 01:20:22 +00:00
case 0 :
2005-12-01 13:39:48 +00:00
/* intact value */
if ( column - > piecewise ) {
column_size = column - > retlen4 ;
} else {
column_size = column - > retlen ;
2002-11-15 17:59:19 +00:00
}
break ;
2008-03-12 01:26:44 +00:00
default :
2008-02-16 01:20:22 +00:00
ZVAL_FALSE ( value ) ;
2005-12-01 13:39:48 +00:00
return 0 ;
2001-04-13 14:43:39 +00:00
}
2008-03-12 01:26:44 +00:00
2005-12-01 13:39:48 +00:00
ZVAL_STRINGL ( value , column - > data , column_size , 1 ) ;
2001-04-13 14:43:39 +00:00
}
2005-12-01 13:39:48 +00:00
return 0 ;
2001-04-13 14:43:39 +00:00
}
/* }}} */
2008-02-16 01:20:22 +00:00
/* {{{ php_oci_fetch_row()
2008-04-18 00:05:27 +00:00
*
* Fetch the next row from the given statement
*/
2005-12-01 13:39:48 +00:00
void php_oci_fetch_row ( INTERNAL_FUNCTION_PARAMETERS , int mode , int expected_args )
2001-04-13 14:43:39 +00:00
{
2005-12-01 13:39:48 +00:00
zval * z_statement , * array ;
php_oci_statement * statement ;
php_oci_out_column * column ;
ub4 nrows = 1 ;
int i ;
long fetch_mode = 0 ;
2004-01-21 16:18:58 +00:00
2005-12-01 13:39:48 +00:00
if ( expected_args > 2 ) {
/* only for ocifetchinto BC */
2001-04-25 17:48:30 +00:00
2005-12-01 13:39:48 +00:00
if ( zend_parse_parameters ( ZEND_NUM_ARGS ( ) TSRMLS_CC , " rz|l " , & z_statement , & array , & fetch_mode ) = = FAILURE ) {
return ;
}
2008-03-12 01:26:44 +00:00
2005-12-01 13:39:48 +00:00
if ( ZEND_NUM_ARGS ( ) = = 2 ) {
fetch_mode = mode ;
2001-04-25 17:48:30 +00:00
}
2006-08-15 13:08:34 +00:00
} else if ( expected_args = = 2 ) {
2005-12-01 13:39:48 +00:00
/* only for oci_fetch_array() */
2004-01-21 16:18:58 +00:00
2005-12-01 13:39:48 +00:00
if ( zend_parse_parameters ( ZEND_NUM_ARGS ( ) TSRMLS_CC , " r|l " , & z_statement , & fetch_mode ) = = FAILURE ) {
return ;
2001-04-25 17:48:30 +00:00
}
2008-03-12 01:26:44 +00:00
2005-12-01 13:39:48 +00:00
if ( ZEND_NUM_ARGS ( ) = = 1 ) {
fetch_mode = mode ;
2001-04-25 17:48:30 +00:00
}
2006-08-15 13:08:34 +00:00
} else {
2005-12-01 13:39:48 +00:00
/* for all oci_fetch_*() */
2008-03-12 01:26:44 +00:00
2005-12-01 13:39:48 +00:00
if ( zend_parse_parameters ( ZEND_NUM_ARGS ( ) TSRMLS_CC , " r " , & z_statement ) = = FAILURE ) {
return ;
2001-04-13 14:43:39 +00:00
}
2008-03-12 01:26:44 +00:00
2005-12-01 13:39:48 +00:00
fetch_mode = mode ;
2001-04-13 14:43:39 +00:00
}
2004-01-21 16:18:58 +00:00
2006-05-18 13:21:08 +00:00
if ( ! ( fetch_mode & PHP_OCI_NUM ) & & ! ( fetch_mode & PHP_OCI_ASSOC ) ) {
/* none of the modes present, use the default one */
if ( mode & PHP_OCI_ASSOC ) {
fetch_mode | = PHP_OCI_ASSOC ;
2008-02-16 01:20:22 +00:00
}
2006-05-18 13:21:08 +00:00
if ( mode & PHP_OCI_NUM ) {
fetch_mode | = PHP_OCI_NUM ;
}
}
2005-12-01 13:39:48 +00:00
PHP_OCI_ZVAL_TO_STATEMENT ( z_statement , statement ) ;
2001-04-13 14:43:39 +00:00
2005-12-01 13:39:48 +00:00
if ( php_oci_statement_fetch ( statement , nrows TSRMLS_CC ) ) {
RETURN_FALSE ;
2002-11-15 17:59:19 +00:00
}
2001-04-13 14:43:39 +00:00
2005-12-01 13:39:48 +00:00
array_init ( return_value ) ;
2001-05-22 23:16:03 +00:00
2005-12-01 13:39:48 +00:00
for ( i = 0 ; i < statement - > ncolumns ; i + + ) {
2008-03-12 01:26:44 +00:00
2005-12-01 13:39:48 +00:00
column = php_oci_statement_get_column ( statement , i + 1 , NULL , 0 TSRMLS_CC ) ;
2008-03-12 01:26:44 +00:00
2005-12-01 13:39:48 +00:00
if ( column = = NULL ) {
continue ;
}
if ( ( column - > indicator = = - 1 ) & & ( ( fetch_mode & PHP_OCI_RETURN_NULLS ) = = 0 ) ) {
continue ;
}
2001-04-13 14:43:39 +00:00
2005-12-01 13:39:48 +00:00
if ( ! ( column - > indicator = = - 1 ) ) {
zval * element ;
2008-03-12 01:26:44 +00:00
2005-12-01 13:39:48 +00:00
MAKE_STD_ZVAL ( element ) ;
php_oci_column_to_zval ( column , element , fetch_mode TSRMLS_CC ) ;
2001-08-15 16:00:56 +00:00
2005-12-01 13:39:48 +00:00
if ( fetch_mode & PHP_OCI_NUM | | ! ( fetch_mode & PHP_OCI_ASSOC ) ) {
add_index_zval ( return_value , i , element ) ;
}
if ( fetch_mode & PHP_OCI_ASSOC ) {
if ( fetch_mode & PHP_OCI_NUM ) {
2007-10-07 05:22:07 +00:00
Z_ADDREF_P ( element ) ;
2005-12-01 13:39:48 +00:00
}
add_assoc_zval ( return_value , column - > name , element ) ;
}
2008-03-12 01:26:44 +00:00
2005-12-01 13:39:48 +00:00
} else {
if ( fetch_mode & PHP_OCI_NUM | | ! ( fetch_mode & PHP_OCI_ASSOC ) ) {
add_index_null ( return_value , i ) ;
}
if ( fetch_mode & PHP_OCI_ASSOC ) {
add_assoc_null ( return_value , column - > name ) ;
}
}
2002-11-15 17:59:19 +00:00
}
2001-04-13 14:43:39 +00:00
2005-12-01 13:39:48 +00:00
if ( expected_args > 2 ) {
2008-04-18 00:05:27 +00:00
/* Only for ocifetchinto BC. In all other cases we return array, not long */
2005-12-01 13:39:48 +00:00
REPLACE_ZVAL_VALUE ( & array , return_value , 1 ) ; /* copy return_value to given reference */
zval_dtor ( return_value ) ;
RETURN_LONG ( statement - > ncolumns ) ;
2002-11-15 17:59:19 +00:00
}
2005-12-01 13:39:48 +00:00
}
/* }}} */
2001-04-13 14:43:39 +00:00
2008-02-16 01:20:22 +00:00
/* {{{ php_oci_persistent_helper()
2008-04-18 00:05:27 +00:00
*
* Helper function to close / rollback persistent connections at the end of request . A return value of
* 1 indicates that the connection is to be destroyed
*/
2005-12-05 23:38:04 +00:00
static int php_oci_persistent_helper ( zend_rsrc_list_entry * le TSRMLS_DC )
2005-12-01 13:39:48 +00:00
{
time_t timestamp ;
php_oci_connection * connection ;
2001-04-13 14:43:39 +00:00
2005-12-01 13:39:48 +00:00
timestamp = time ( NULL ) ;
2008-03-12 01:26:44 +00:00
2008-04-18 00:05:27 +00:00
/* Persistent connection stubs are also counted as they have private session pools */
2005-12-01 13:39:48 +00:00
if ( le - > type = = le_pconnection ) {
connection = ( php_oci_connection * ) le - > ptr ;
2002-11-15 17:59:19 +00:00
2008-04-18 00:05:27 +00:00
if ( ! connection - > used_this_request & & OCI_G ( persistent_timeout ) ! = - 1 ) {
2008-03-22 01:27:50 +00:00
if ( OCI_G ( debug_mode ) ) {
2008-04-18 00:05:27 +00:00
php_printf ( " OCI8 DEBUG L1: persistent_helper processing for timeout: (%p stub=%d) at (%s:%d) \n " , connection , connection - > is_stub , __FILE__ , __LINE__ ) ;
2008-03-22 01:27:50 +00:00
}
2005-12-01 13:39:48 +00:00
if ( connection - > idle_expiry < timestamp ) {
/* connection has timed out */
2007-08-06 20:32:55 +00:00
return ZEND_HASH_APPLY_REMOVE ;
2002-11-15 17:59:19 +00:00
}
2005-12-01 13:39:48 +00:00
}
2001-04-25 17:48:30 +00:00
}
2007-08-06 20:32:55 +00:00
return ZEND_HASH_APPLY_KEEP ;
2005-12-01 13:39:48 +00:00
} /* }}} */
2001-04-13 14:43:39 +00:00
2008-01-31 01:33:30 +00:00
/* {{{ php_oci_create_spool()
2008-04-18 00:05:27 +00:00
*
* Create ( alloc + Init ) Session pool for the given dbname and charsetid
*/
2008-01-31 01:33:30 +00:00
static php_oci_spool * php_oci_create_spool ( char * username , int username_len , char * password , int password_len , char * dbname , int dbname_len , char * hash_key , int hash_key_len , int charsetid TSRMLS_DC )
{
php_oci_spool * session_pool = NULL ;
zend_bool iserror = 0 ;
2008-03-12 01:26:44 +00:00
ub4 poolmode = OCI_DEFAULT ; /* Mode to be passed to OCISessionPoolCreate */
2008-01-31 01:33:30 +00:00
/*Allocate sessionpool out of persistent memory */
session_pool = ( php_oci_spool * ) calloc ( 1 , sizeof ( php_oci_spool ) ) ;
2008-03-12 01:26:44 +00:00
/* Populate key if passed */
2008-04-18 00:05:27 +00:00
if ( hash_key_len ) {
2008-01-31 01:33:30 +00:00
session_pool - > spool_hash_key = zend_strndup ( hash_key , hash_key_len ) ;
2008-04-18 00:05:27 +00:00
}
2008-03-12 01:26:44 +00:00
2008-01-31 01:33:30 +00:00
/* Create the session pool's env */
if ( ! ( session_pool - > env = php_oci_create_env ( charsetid TSRMLS_CC ) ) ) {
iserror = 1 ;
goto exit_create_spool ;
}
/* Allocate the pool handle */
PHP_OCI_CALL_RETURN ( OCI_G ( errcode ) , OCIHandleAlloc , ( session_pool - > env , ( dvoid * * ) & session_pool - > poolh , OCI_HTYPE_SPOOL , ( size_t ) 0 , ( dvoid * * ) 0 ) ) ;
2008-02-16 01:20:22 +00:00
if ( OCI_G ( errcode ) ! = OCI_SUCCESS ) {
2008-01-31 01:33:30 +00:00
php_oci_error ( OCI_G ( err ) , OCI_G ( errcode ) TSRMLS_CC ) ;
iserror = 1 ;
goto exit_create_spool ;
}
2008-04-18 00:05:27 +00:00
/* Allocate the session pool error handle - This only for use in the destructor, as there is a
* generic bug which can free up the OCI_G ( err ) variable before destroying connections . We
* cannot use this for other roundtrip calls as there is no way the user can access this error
2008-02-16 01:20:22 +00:00
*/
2008-01-31 01:33:30 +00:00
PHP_OCI_CALL_RETURN ( OCI_G ( errcode ) , OCIHandleAlloc , ( ( dvoid * ) session_pool - > env , ( dvoid * * ) & ( session_pool - > err ) , ( ub4 ) OCI_HTYPE_ERROR , ( size_t ) 0 , ( dvoid * * ) 0 ) ) ;
2008-02-16 01:20:22 +00:00
if ( OCI_G ( errcode ) ! = OCI_SUCCESS ) {
2008-01-31 01:33:30 +00:00
php_oci_error ( OCI_G ( err ) , OCI_G ( errcode ) TSRMLS_CC ) ;
iserror = 1 ;
goto exit_create_spool ;
2008-02-16 01:20:22 +00:00
}
2008-01-31 01:33:30 +00:00
2008-04-18 00:05:27 +00:00
/* Disable RLB as we mostly have single-connection pools */
# if (OCI_MAJOR_VERSION > 10)
2008-03-12 01:26:44 +00:00
poolmode = OCI_SPC_NO_RLB | OCI_SPC_HOMOGENEOUS ;
# else
poolmode = OCI_SPC_HOMOGENEOUS ;
# endif
2008-04-18 00:05:27 +00:00
/* Create the homogeneous session pool - We have different session pools for every different
* username , password , charset and dbname .
2008-02-16 01:20:22 +00:00
*/
2008-03-12 01:26:44 +00:00
PHP_OCI_CALL_RETURN ( OCI_G ( errcode ) , OCISessionPoolCreate , ( session_pool - > env , OCI_G ( err ) , session_pool - > poolh , ( OraText * * ) & session_pool - > poolname , & session_pool - > poolname_len , ( OraText * ) dbname , ( ub4 ) dbname_len , 0 , UB4MAXVAL , 1 , ( OraText * ) username , ( ub4 ) username_len , ( OraText * ) password , ( ub4 ) password_len , poolmode ) ) ;
2008-02-16 01:20:22 +00:00
if ( OCI_G ( errcode ) ! = OCI_SUCCESS ) {
php_oci_error ( OCI_G ( err ) , OCI_G ( errcode ) TSRMLS_CC ) ;
2008-01-31 01:33:30 +00:00
iserror = 1 ;
goto exit_create_spool ;
}
/* Set the session pool's timeout to the oci8.persistent_timeout param */
2008-02-16 01:20:22 +00:00
if ( OCI_G ( persistent_timeout ) ) {
2008-01-31 01:33:30 +00:00
ub4 timeout = OCI_G ( persistent_timeout ) ;
PHP_OCI_CALL_RETURN ( OCI_G ( errcode ) , OCIAttrSet , ( ( dvoid * ) session_pool - > poolh , ( ub4 ) OCI_HTYPE_SPOOL , ( void * ) & timeout , ( ub4 ) sizeof ( timeout ) , ( ub4 ) OCI_ATTR_SPOOL_TIMEOUT , OCI_G ( err ) ) ) ;
2008-03-12 01:26:44 +00:00
2008-01-31 01:33:30 +00:00
if ( OCI_G ( errcode ) ! = OCI_SUCCESS ) {
php_oci_error ( OCI_G ( err ) , OCI_G ( errcode ) TSRMLS_CC ) ;
iserror = 1 ;
goto exit_create_spool ;
}
}
2008-03-12 01:26:44 +00:00
2008-01-31 01:33:30 +00:00
exit_create_spool :
if ( iserror & & session_pool ) {
php_oci_spool_close ( session_pool TSRMLS_CC ) ;
session_pool = NULL ;
}
2008-02-16 01:20:22 +00:00
if ( OCI_G ( debug_mode ) ) {
php_printf ( " OCI8 DEBUG L1: create_spool: (%p) at (%s:%d) \n " , session_pool , __FILE__ , __LINE__ ) ;
}
2008-01-31 01:33:30 +00:00
return session_pool ;
} /* }}} */
/* {{{ php_oci_get_spool()
2008-04-18 00:05:27 +00:00
*
* Get Session pool for the given dbname and charsetid from the persistent list . Function called for
* non - persistent connections .
*/
2008-01-31 01:33:30 +00:00
static php_oci_spool * php_oci_get_spool ( char * username , int username_len , char * password , int password_len , char * dbname , int dbname_len , int charsetid TSRMLS_DC )
{
smart_str spool_hashed_details = { 0 } ;
php_oci_spool * session_pool = NULL ;
zend_rsrc_list_entry spool_le = { 0 } ;
zend_rsrc_list_entry * spool_out_le = NULL ;
zend_bool iserror = 0 ;
2008-03-12 01:26:44 +00:00
2008-01-31 01:33:30 +00:00
/* Create the spool hash key {{{ */
2008-03-12 01:26:44 +00:00
smart_str_appendl_ex ( & spool_hashed_details , " oci8spool*** " , sizeof ( " oci8spool*** " ) - 1 , 0 ) ;
2008-01-31 01:33:30 +00:00
smart_str_appendl_ex ( & spool_hashed_details , username , username_len , 0 ) ;
2008-03-12 01:26:44 +00:00
smart_str_appendl_ex ( & spool_hashed_details , " ** " , sizeof ( " ** " ) - 1 , 0 ) ;
2008-01-31 01:33:30 +00:00
if ( password_len ) {
ulong password_hash ;
password_hash = zend_inline_hash_func ( password , password_len ) ;
smart_str_append_unsigned_ex ( & spool_hashed_details , password_hash , 0 ) ;
}
2008-03-12 01:26:44 +00:00
smart_str_appendl_ex ( & spool_hashed_details , " ** " , sizeof ( " ** " ) - 1 , 0 ) ;
2008-01-31 01:33:30 +00:00
2008-04-18 00:05:27 +00:00
if ( dbname_len ) {
smart_str_appendl_ex ( & spool_hashed_details , dbname , dbname_len , 0 ) ;
}
2008-03-12 01:26:44 +00:00
smart_str_appendl_ex ( & spool_hashed_details , " ** " , sizeof ( " ** " ) - 1 , 0 ) ;
2008-01-31 01:33:30 +00:00
smart_str_append_unsigned_ex ( & spool_hashed_details , charsetid , 0 ) ;
2008-03-12 01:26:44 +00:00
/* Session Pool Hash Key : oci8spool***username**hashedpassword**dbname**charset */
2008-01-31 01:33:30 +00:00
smart_str_0 ( & spool_hashed_details ) ;
php_strtolower ( spool_hashed_details . c , spool_hashed_details . len ) ;
/* }}} */
2008-04-18 00:05:27 +00:00
if ( zend_hash_find ( & EG ( persistent_list ) , spool_hashed_details . c , spool_hashed_details . len + 1 , ( void * * ) & spool_out_le ) = = FAILURE ) {
2008-01-31 01:33:30 +00:00
session_pool = php_oci_create_spool ( username , username_len , password , password_len , dbname , dbname_len , spool_hashed_details . c , spool_hashed_details . len , charsetid TSRMLS_CC ) ;
2008-03-12 01:26:44 +00:00
if ( session_pool = = NULL ) {
2008-01-31 01:33:30 +00:00
iserror = 1 ;
2008-03-12 01:26:44 +00:00
goto exit_get_spool ;
}
2008-01-31 01:33:30 +00:00
spool_le . ptr = session_pool ;
spool_le . type = le_psessionpool ;
zend_list_insert ( session_pool , le_psessionpool ) ;
zend_hash_update ( & EG ( persistent_list ) , session_pool - > spool_hash_key , strlen ( session_pool - > spool_hash_key ) + 1 , ( void * ) & spool_le , sizeof ( zend_rsrc_list_entry ) , NULL ) ;
2008-03-12 01:26:44 +00:00
} else if ( spool_out_le - > type = = le_psessionpool & &
2008-01-31 01:33:30 +00:00
strlen ( ( ( php_oci_spool * ) ( spool_out_le - > ptr ) ) - > spool_hash_key ) = = spool_hashed_details . len & &
2008-04-18 00:05:27 +00:00
memcmp ( ( ( php_oci_spool * ) ( spool_out_le - > ptr ) ) - > spool_hash_key , spool_hashed_details . c , spool_hashed_details . len ) = = 0 ) {
2008-01-31 01:33:30 +00:00
/* retrieve the cached session pool */
session_pool = ( php_oci_spool * ) ( spool_out_le - > ptr ) ;
}
exit_get_spool :
smart_str_free_ex ( & spool_hashed_details , 0 ) ;
if ( iserror & & session_pool ) {
php_oci_spool_close ( session_pool TSRMLS_CC ) ;
session_pool = NULL ;
}
return session_pool ;
} /* }}} */
/* {{{ php_oci_create_env()
2008-04-18 00:05:27 +00:00
*
* Create the OCI environment choosing the correct function for the OCI version
*/
2008-03-12 01:26:44 +00:00
static OCIEnv * php_oci_create_env ( ub2 charsetid TSRMLS_DC )
2008-01-31 01:33:30 +00:00
{
OCIEnv * retenv = NULL ;
2008-06-05 23:43:10 +00:00
/* create an environment using the character set id */
2008-01-31 01:33:30 +00:00
PHP_OCI_CALL_RETURN ( OCI_G ( errcode ) , OCIEnvNlsCreate , ( & retenv , OCI_G ( events ) ? PHP_OCI_INIT_MODE | OCI_EVENTS : PHP_OCI_INIT_MODE , 0 , NULL , NULL , NULL , 0 , NULL , charsetid , charsetid ) ) ;
if ( OCI_G ( errcode ) ! = OCI_SUCCESS ) {
# ifdef HAVE_OCI_INSTANT_CLIENT
# ifdef PHP_WIN32
2008-06-05 23:43:10 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " OCIEnvNlsCreate() failed. There is something wrong with your system - please check that PATH includes the directory with Oracle Instant Client libraries " ) ;
2008-01-31 01:33:30 +00:00
# else
2008-06-05 23:43:10 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " OCIEnvNlsCreate() failed. There is something wrong with your system - please check that LD_LIBRARY_PATH includes the directory with Oracle Instant Client libraries " ) ;
2008-01-31 01:33:30 +00:00
# endif
# else
2008-06-05 23:43:10 +00:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " OCIEnvNlsCreate() failed. There is something wrong with your system - please check that ORACLE_HOME is set and points to the right directory " ) ;
2008-01-31 01:33:30 +00:00
# endif
return NULL ;
}
return retenv ;
} /* }}} */
/* {{{ php_oci_old_create_session()
2008-04-18 00:05:27 +00:00
*
* This function is to be deprecated in future in favour of OCISessionGet which is used in
* php_oci_do_connect_ex
*/
2008-01-31 01:33:30 +00:00
static int php_oci_old_create_session ( php_oci_connection * connection , char * dbname , int dbname_len , char * username , int username_len , char * password , int password_len , char * new_password , int new_password_len , int session_mode TSRMLS_DC )
{
2008-06-05 23:43:10 +00:00
ub4 statement_cache_size = ( OCI_G ( statement_cache_size ) > 0 ) ? OCI_G ( statement_cache_size ) : 0 ;
2008-02-16 01:20:22 +00:00
if ( OCI_G ( debug_mode ) ) {
php_printf ( " OCI8 DEBUG: Bypassing client-side session pool for session create at (%s:%d) \n " , __FILE__ , __LINE__ ) ;
2008-01-31 01:33:30 +00:00
}
/* Create the OCI environment separate for each connection */
2008-02-16 01:20:22 +00:00
if ( ! ( connection - > env = php_oci_create_env ( connection - > charset TSRMLS_CC ) ) ) {
2008-03-12 01:26:44 +00:00
return 1 ;
2008-01-31 01:33:30 +00:00
}
2008-03-12 01:26:44 +00:00
/* Allocate our server handle {{{ */
2008-01-31 01:33:30 +00:00
PHP_OCI_CALL_RETURN ( OCI_G ( errcode ) , OCIHandleAlloc , ( connection - > env , ( dvoid * * ) & ( connection - > server ) , OCI_HTYPE_SERVER , 0 , NULL ) ) ;
2008-03-12 01:26:44 +00:00
2008-01-31 01:33:30 +00:00
if ( OCI_G ( errcode ) ! = OCI_SUCCESS ) {
php_oci_error ( OCI_G ( err ) , OCI_G ( errcode ) TSRMLS_CC ) ;
return 1 ;
} /* }}} */
/* Attach to the server {{{ */
2008-03-12 01:26:44 +00:00
PHP_OCI_CALL_RETURN ( OCI_G ( errcode ) , OCIServerAttach , ( connection - > server , OCI_G ( err ) , ( text * ) dbname , dbname_len , ( ub4 ) OCI_DEFAULT ) ) ;
2008-01-31 01:33:30 +00:00
if ( OCI_G ( errcode ) ! = OCI_SUCCESS ) {
php_oci_error ( OCI_G ( err ) , OCI_G ( errcode ) TSRMLS_CC ) ;
return 1 ;
} /* }}} */
connection - > is_attached = 1 ;
/* Allocate our session handle {{{ */
PHP_OCI_CALL_RETURN ( OCI_G ( errcode ) , OCIHandleAlloc , ( connection - > env , ( dvoid * * ) & ( connection - > session ) , OCI_HTYPE_SESSION , 0 , NULL ) ) ;
2008-03-12 01:26:44 +00:00
2008-01-31 01:33:30 +00:00
if ( OCI_G ( errcode ) ! = OCI_SUCCESS ) {
php_oci_error ( OCI_G ( err ) , OCI_G ( errcode ) TSRMLS_CC ) ;
return 1 ;
} /* }}} */
/* Allocate our private error-handle {{{ */
PHP_OCI_CALL_RETURN ( OCI_G ( errcode ) , OCIHandleAlloc , ( connection - > env , ( dvoid * * ) & ( connection - > err ) , OCI_HTYPE_ERROR , 0 , NULL ) ) ;
if ( OCI_G ( errcode ) ! = OCI_SUCCESS ) {
php_oci_error ( OCI_G ( err ) , OCI_G ( errcode ) TSRMLS_CC ) ;
return 1 ;
} /* }}} */
/* Allocate our service-context {{{ */
PHP_OCI_CALL_RETURN ( OCI_G ( errcode ) , OCIHandleAlloc , ( connection - > env , ( dvoid * * ) & ( connection - > svc ) , OCI_HTYPE_SVCCTX , 0 , NULL ) ) ;
if ( OCI_G ( errcode ) ! = OCI_SUCCESS ) {
php_oci_error ( OCI_G ( err ) , OCI_G ( errcode ) TSRMLS_CC ) ;
return 1 ;
} /* }}} */
/* Set the username {{{ */
if ( username ) {
PHP_OCI_CALL_RETURN ( OCI_G ( errcode ) , OCIAttrSet , ( ( dvoid * ) connection - > session , ( ub4 ) OCI_HTYPE_SESSION , ( dvoid * ) username , ( ub4 ) username_len , ( ub4 ) OCI_ATTR_USERNAME , OCI_G ( err ) ) ) ;
2008-03-12 01:26:44 +00:00
2008-01-31 01:33:30 +00:00
if ( OCI_G ( errcode ) ! = OCI_SUCCESS ) {
php_oci_error ( OCI_G ( err ) , OCI_G ( errcode ) TSRMLS_CC ) ;
return 1 ;
2008-02-16 01:20:22 +00:00
}
2008-01-31 01:33:30 +00:00
} /* }}} */
/* Set the password {{{ */
if ( password ) {
PHP_OCI_CALL_RETURN ( OCI_G ( errcode ) , OCIAttrSet , ( ( dvoid * ) connection - > session , ( ub4 ) OCI_HTYPE_SESSION , ( dvoid * ) password , ( ub4 ) password_len , ( ub4 ) OCI_ATTR_PASSWORD , OCI_G ( err ) ) ) ;
2008-03-12 01:26:44 +00:00
2008-01-31 01:33:30 +00:00
if ( OCI_G ( errcode ) ! = OCI_SUCCESS ) {
php_oci_error ( OCI_G ( err ) , OCI_G ( errcode ) TSRMLS_CC ) ;
return 1 ;
2008-02-16 01:20:22 +00:00
}
2008-01-31 01:33:30 +00:00
} /* }}} */
2008-02-16 01:20:22 +00:00
/* Set the server handle in the service handle {{{ */
2008-01-31 01:33:30 +00:00
PHP_OCI_CALL_RETURN ( OCI_G ( errcode ) , OCIAttrSet , ( connection - > svc , OCI_HTYPE_SVCCTX , connection - > server , 0 , OCI_ATTR_SERVER , OCI_G ( err ) ) ) ;
if ( OCI_G ( errcode ) ! = OCI_SUCCESS ) {
php_oci_error ( OCI_G ( err ) , OCI_G ( errcode ) TSRMLS_CC ) ;
return 1 ;
} /* }}} */
/* Set the authentication handle in the service handle {{{ */
PHP_OCI_CALL_RETURN ( OCI_G ( errcode ) , OCIAttrSet , ( connection - > svc , OCI_HTYPE_SVCCTX , connection - > session , 0 , OCI_ATTR_SESSION , OCI_G ( err ) ) ) ;
if ( OCI_G ( errcode ) ! = OCI_SUCCESS ) {
php_oci_error ( OCI_G ( err ) , OCI_G ( errcode ) TSRMLS_CC ) ;
return 1 ;
} /* }}} */
if ( new_password ) {
/* Try to change password if new one was provided {{{ */
PHP_OCI_CALL_RETURN ( OCI_G ( errcode ) , OCIPasswordChange , ( connection - > svc , OCI_G ( err ) , ( text * ) username , username_len , ( text * ) password , password_len , ( text * ) new_password , new_password_len , OCI_AUTH ) ) ;
if ( OCI_G ( errcode ) ! = OCI_SUCCESS ) {
php_oci_error ( OCI_G ( err ) , OCI_G ( errcode ) TSRMLS_CC ) ;
return 1 ;
}
PHP_OCI_CALL_RETURN ( OCI_G ( errcode ) , OCIAttrGet , ( ( dvoid * ) connection - > svc , OCI_HTYPE_SVCCTX , ( dvoid * ) & ( connection - > session ) , ( ub4 * ) 0 , OCI_ATTR_SESSION , OCI_G ( err ) ) ) ;
if ( OCI_G ( errcode ) ! = OCI_SUCCESS ) {
php_oci_error ( OCI_G ( err ) , OCI_G ( errcode ) TSRMLS_CC ) ;
return 1 ;
} /* }}} */
} else {
/* start the session {{{ */
switch ( session_mode ) {
case OCI_DEFAULT :
PHP_OCI_CALL_RETURN ( OCI_G ( errcode ) , OCISessionBegin , ( connection - > svc , OCI_G ( err ) , connection - > session , ( ub4 ) OCI_CRED_RDBMS , ( ub4 ) OCI_STMT_CACHE ) ) ;
break ;
case OCI_SYSDBA :
case OCI_SYSOPER :
default :
if ( username_len = = 1 & & username [ 0 ] = = ' / ' & & password_len = = 0 ) {
PHP_OCI_CALL_RETURN ( OCI_G ( errcode ) , OCISessionBegin , ( connection - > svc , OCI_G ( err ) , connection - > session , ( ub4 ) OCI_CRED_EXT , ( ub4 ) session_mode ) ) ;
} else {
PHP_OCI_CALL_RETURN ( OCI_G ( errcode ) , OCISessionBegin , ( connection - > svc , OCI_G ( err ) , connection - > session , ( ub4 ) OCI_CRED_RDBMS , ( ub4 ) session_mode ) ) ;
}
break ;
}
if ( OCI_G ( errcode ) ! = OCI_SUCCESS ) {
php_oci_error ( OCI_G ( err ) , OCI_G ( errcode ) TSRMLS_CC ) ;
/* OCISessionBegin returns OCI_SUCCESS_WITH_INFO when
* user ' s password has expired , but is still usable .
2008-03-12 01:26:44 +00:00
*/
2008-01-31 01:33:30 +00:00
if ( OCI_G ( errcode ) ! = OCI_SUCCESS_WITH_INFO ) {
return 1 ;
}
} /* }}} */
}
2008-03-12 01:26:44 +00:00
/* Brand new connection: Init and update the next_ping in the connection */
if ( php_oci_ping_init ( connection , OCI_G ( err ) TSRMLS_CC ) ! = OCI_SUCCESS ) {
php_oci_error ( OCI_G ( err ) , OCI_G ( errcode ) TSRMLS_CC ) ;
return 1 ;
}
2008-06-05 23:43:10 +00:00
PHP_OCI_CALL_RETURN ( OCI_G ( errcode ) , OCIAttrSet , ( ( dvoid * ) connection - > svc , ( ub4 ) OCI_HTYPE_SVCCTX , ( ub4 * ) & statement_cache_size , 0 , ( ub4 ) OCI_ATTR_STMTCACHESIZE , OCI_G ( err ) ) ) ;
2008-03-12 01:26:44 +00:00
2008-06-05 23:43:10 +00:00
if ( OCI_G ( errcode ) ! = OCI_SUCCESS ) {
php_oci_error ( OCI_G ( err ) , OCI_G ( errcode ) TSRMLS_CC ) ;
return 1 ;
2008-01-31 01:33:30 +00:00
}
2008-03-12 01:26:44 +00:00
/* Successfully created session */
2008-01-31 01:33:30 +00:00
return 0 ;
} /* }}} */
/* {{{ php_oci_create_session()
2008-04-18 00:05:27 +00:00
*
* Create session using client - side session pool - new norm
*/
2008-01-31 01:33:30 +00:00
static int php_oci_create_session ( php_oci_connection * connection , php_oci_spool * session_pool , char * dbname , int dbname_len , char * username , int username_len , char * password , int password_len , char * new_password , int new_password_len , int session_mode TSRMLS_DC )
{
php_oci_spool * actual_spool = NULL ;
2008-04-18 00:05:27 +00:00
# if (OCI_MAJOR_VERSION > 10)
2008-01-31 01:33:30 +00:00
ub4 purity = - 2 ; /* Illegal value to initialize */
# endif
2008-03-12 01:26:44 +00:00
time_t timestamp = time ( NULL ) ;
2008-06-05 23:43:10 +00:00
ub4 statement_cache_size = ( OCI_G ( statement_cache_size ) > 0 ) ? OCI_G ( statement_cache_size ) : 0 ;
2008-01-31 01:33:30 +00:00
/* Persistent connections have private session pools */
if ( connection - > is_persistent & & ! connection - > private_spool & &
2008-02-16 01:20:22 +00:00
! ( connection - > private_spool = php_oci_create_spool ( username , username_len , password , password_len , dbname , dbname_len , NULL , 0 , connection - > charset TSRMLS_CC ) ) ) {
2008-01-31 01:33:30 +00:00
return 1 ;
}
actual_spool = ( connection - > is_persistent ) ? ( connection - > private_spool ) : ( session_pool ) ;
connection - > env = actual_spool - > env ;
2008-04-18 00:05:27 +00:00
/* Do this upfront so that connection close on an error would know that this is a session pool
* connection . Failure to do this would result in crashes in error scenarios
*/
2008-02-16 01:20:22 +00:00
if ( ! connection - > using_spool ) {
2008-01-31 01:33:30 +00:00
connection - > using_spool = 1 ;
}
2008-02-16 01:20:22 +00:00
if ( OCI_G ( debug_mode ) ) {
if ( session_pool ) {
php_printf ( " OCI8 DEBUG L1: using shared pool: (%p) at (%s:%d) \n " , session_pool , __FILE__ , __LINE__ ) ;
2008-03-12 01:26:44 +00:00
} else {
2008-02-16 01:20:22 +00:00
php_printf ( " OCI8 DEBUG L1: using private pool: (%p) at (%s:%d) \n " , connection - > private_spool , __FILE__ , __LINE__ ) ;
}
}
2008-04-18 00:05:27 +00:00
/* The passed in "connection" can be a cached stub from plist or freshly created. In the former
* case , we do not have to allocate any handles
*/
2008-01-31 01:33:30 +00:00
2008-02-16 01:20:22 +00:00
if ( ! connection - > err ) {
PHP_OCI_CALL_RETURN ( OCI_G ( errcode ) , OCIHandleAlloc , ( connection - > env , ( dvoid * * ) & ( connection - > err ) , OCI_HTYPE_ERROR , 0 , NULL ) ) ;
2008-03-12 01:26:44 +00:00
2008-01-31 01:33:30 +00:00
if ( OCI_G ( errcode ) ! = OCI_SUCCESS ) {
php_oci_error ( OCI_G ( err ) , OCI_G ( errcode ) TSRMLS_CC ) ;
return 1 ;
}
}
/* {{{ Allocate and initialize the connection-private authinfo handle if not allocated yet */
2008-02-16 01:20:22 +00:00
if ( ! connection - > authinfo ) {
PHP_OCI_CALL_RETURN ( OCI_G ( errcode ) , OCIHandleAlloc , ( connection - > env , ( dvoid * * ) & ( connection - > authinfo ) , OCI_HTYPE_AUTHINFO , 0 , NULL ) ) ;
2008-01-31 01:33:30 +00:00
if ( OCI_G ( errcode ) ! = OCI_SUCCESS ) {
php_oci_error ( OCI_G ( err ) , OCI_G ( errcode ) TSRMLS_CC ) ;
return 1 ;
}
2008-03-12 01:26:44 +00:00
/* Set the Connection class and purity if OCI client version >= 11g */
2008-04-18 00:05:27 +00:00
# if (OCI_MAJOR_VERSION > 10)
2008-01-31 01:33:30 +00:00
PHP_OCI_CALL_RETURN ( OCI_G ( errcode ) , OCIAttrSet , ( ( dvoid * ) connection - > authinfo , ( ub4 ) OCI_HTYPE_SESSION , ( dvoid * ) OCI_G ( connection_class ) , ( ub4 ) ( strlen ( OCI_G ( connection_class ) ) ) , ( ub4 ) OCI_ATTR_CONNECTION_CLASS , OCI_G ( err ) ) ) ;
if ( OCI_G ( errcode ) ! = OCI_SUCCESS ) {
php_oci_error ( OCI_G ( err ) , OCI_G ( errcode ) TSRMLS_CC ) ;
return 1 ;
}
if ( connection - > is_persistent )
purity = OCI_ATTR_PURITY_SELF ;
else
purity = OCI_ATTR_PURITY_NEW ;
PHP_OCI_CALL_RETURN ( OCI_G ( errcode ) , OCIAttrSet , ( ( dvoid * ) connection - > authinfo , ( ub4 ) OCI_HTYPE_AUTHINFO , ( dvoid * ) & purity , ( ub4 ) 0 , ( ub4 ) OCI_ATTR_PURITY , OCI_G ( err ) ) ) ;
if ( OCI_G ( errcode ) ! = OCI_SUCCESS ) {
php_oci_error ( OCI_G ( err ) , OCI_G ( errcode ) TSRMLS_CC ) ;
return 1 ;
}
# endif
} /* }}} */
2008-03-12 01:26:44 +00:00
/* Debug statements {{{ */
if ( OCI_G ( debug_mode ) ) {
ub4 numfree = 0 , numbusy = 0 , numopen = 0 ;
PHP_OCI_CALL_RETURN ( OCI_G ( errcode ) , OCIAttrGet , ( ( dvoid * ) actual_spool - > poolh , OCI_HTYPE_SPOOL , ( dvoid * ) & numopen , ( ub4 * ) 0 , OCI_ATTR_SPOOL_OPEN_COUNT , OCI_G ( err ) ) ) ;
PHP_OCI_CALL_RETURN ( OCI_G ( errcode ) , OCIAttrGet , ( ( dvoid * ) actual_spool - > poolh , OCI_HTYPE_SPOOL , ( dvoid * ) & numbusy , ( ub4 * ) 0 , OCI_ATTR_SPOOL_BUSY_COUNT , OCI_G ( err ) ) ) ;
numfree = numopen - numbusy ; /* number of free connections in the pool */
php_printf ( " OCI8 DEBUG L1: (numopen=%d)(numbusy=%d) at (%s:%d) \n " , numopen , numbusy , __FILE__ , __LINE__ ) ;
} /* }}} */
2008-01-31 01:33:30 +00:00
2008-04-18 00:05:27 +00:00
/* Ping loop: Ping and loop till we get a good connection. When a database instance goes
* down , it can leave several bad connections that need to be flushed out before getting a
* good one . In non - RAC , we always get a brand new connection at the end of the loop and in
* RAC , we can get a good connection from a different instance before flushing out all bad
* ones . We do not need to ping brand new connections .
2008-03-12 01:26:44 +00:00
*/
do {
/* Continue to use the global error handle as the connection is closed when an error occurs */
PHP_OCI_CALL_RETURN ( OCI_G ( errcode ) , OCISessionGet , ( connection - > env , OCI_G ( err ) , & ( connection - > svc ) , ( OCIAuthInfo * ) connection - > authinfo , ( OraText * ) actual_spool - > poolname , ( ub4 ) actual_spool - > poolname_len , NULL , 0 , NULL , NULL , NULL , OCI_SESSGET_SPOOL ) ) ;
if ( OCI_G ( errcode ) ! = OCI_SUCCESS ) {
php_oci_error ( OCI_G ( err ) , OCI_G ( errcode ) TSRMLS_CC ) ;
2008-04-18 00:05:27 +00:00
/* Session creation returns OCI_SUCCESS_WITH_INFO when user's password has expired, but
* is still usable .
2008-03-12 01:26:44 +00:00
*/
2008-01-31 01:33:30 +00:00
2008-03-12 01:26:44 +00:00
if ( OCI_G ( errcode ) ! = OCI_SUCCESS_WITH_INFO ) {
return 1 ;
}
}
/* {{{ Populate the session and server fields of the connection */
PHP_OCI_CALL_RETURN ( OCI_G ( errcode ) , OCIAttrGet , ( ( dvoid * ) connection - > svc , OCI_HTYPE_SVCCTX , ( dvoid * ) & ( connection - > server ) , ( ub4 * ) 0 , OCI_ATTR_SERVER , OCI_G ( err ) ) ) ;
PHP_OCI_CALL_RETURN ( OCI_G ( errcode ) , OCIAttrGet , ( ( dvoid * ) connection - > svc , OCI_HTYPE_SVCCTX , ( dvoid * ) & ( connection - > session ) , ( ub4 * ) 0 , OCI_ATTR_SESSION , OCI_G ( err ) ) ) ; /* }}} */
PHP_OCI_CALL_RETURN ( OCI_G ( errcode ) , OCIContextGetValue , ( connection - > session , OCI_G ( err ) , ( ub1 * ) " NEXT_PING " , ( ub1 ) sizeof ( " NEXT_PING " ) , ( void * * ) & ( connection - > next_pingp ) ) ) ;
if ( OCI_G ( errcode ) ! = OCI_SUCCESS ) {
php_oci_error ( OCI_G ( err ) , OCI_G ( errcode ) TSRMLS_CC ) ;
2008-01-31 01:33:30 +00:00
return 1 ;
}
2008-03-12 01:26:44 +00:00
if ( ! ( connection - > next_pingp ) ) {
/* This is a brand new connection, we need not ping, but have to initialize ping */
if ( php_oci_ping_init ( connection , OCI_G ( err ) TSRMLS_CC ) ! = OCI_SUCCESS ) {
php_oci_error ( OCI_G ( err ) , OCI_G ( errcode ) TSRMLS_CC ) ;
return 1 ;
}
} else if ( ( * ( connection - > next_pingp ) > 0 ) & & ( timestamp > = * ( connection - > next_pingp ) ) ) {
if ( php_oci_connection_ping ( connection TSRMLS_CC ) ) {
/* Got a good connection - update next_ping and get out of ping loop */
* ( connection - > next_pingp ) = timestamp + OCI_G ( ping_interval ) ;
} else {
/* Bad connection - remove from pool */
PHP_OCI_CALL ( OCISessionRelease , ( connection - > svc , connection - > err , NULL , 0 , ( ub4 ) OCI_SESSRLS_DROPSESS ) ) ;
connection - > svc = NULL ;
connection - > server = NULL ;
connection - > session = NULL ;
}
} /* If ping applicable */
} while ( ! ( connection - > svc ) ) ;
2008-06-05 23:43:10 +00:00
PHP_OCI_CALL_RETURN ( OCI_G ( errcode ) , OCIAttrSet , ( ( dvoid * ) connection - > svc , ( ub4 ) OCI_HTYPE_SVCCTX , ( ub4 * ) & statement_cache_size , 0 , ( ub4 ) OCI_ATTR_STMTCACHESIZE , OCI_G ( err ) ) ) ;
if ( OCI_G ( errcode ) ! = OCI_SUCCESS ) {
php_oci_error ( OCI_G ( err ) , OCI_G ( errcode ) TSRMLS_CC ) ;
return 1 ;
2008-01-31 01:33:30 +00:00
}
2008-02-16 01:20:22 +00:00
/* Session is now taken from the session pool and attached and open */
2008-01-31 01:33:30 +00:00
connection - > is_stub = 0 ;
2008-02-16 01:20:22 +00:00
connection - > is_attached = connection - > is_open = 1 ;
2008-01-31 01:33:30 +00:00
return 0 ;
} /* }}} */
/* {{{ php_oci_spool_list_dtor()
2008-04-18 00:05:27 +00:00
*
* Session pool destructor function
*/
2008-01-31 01:33:30 +00:00
static void php_oci_spool_list_dtor ( zend_rsrc_list_entry * entry TSRMLS_DC )
{
php_oci_spool * session_pool = ( php_oci_spool * ) entry - > ptr ;
if ( session_pool ) {
php_oci_spool_close ( session_pool TSRMLS_CC ) ;
}
return ;
2008-02-16 01:20:22 +00:00
} /* }}} */
2008-01-31 01:33:30 +00:00
2008-03-12 01:26:44 +00:00
/* {{{ php_oci_spool_close()
2008-04-18 00:05:27 +00:00
*
* Destroys the OCI Session Pool
*/
2008-01-31 01:33:30 +00:00
static void php_oci_spool_close ( php_oci_spool * session_pool TSRMLS_DC )
{
2008-02-16 01:20:22 +00:00
if ( session_pool - > poolname_len ) {
PHP_OCI_CALL ( OCISessionPoolDestroy , ( ( dvoid * ) session_pool - > poolh ,
( dvoid * ) session_pool - > err , OCI_SPD_FORCE ) ) ;
2008-01-31 01:33:30 +00:00
}
2008-02-16 01:20:22 +00:00
if ( session_pool - > poolh ) {
2008-01-31 01:33:30 +00:00
PHP_OCI_CALL ( OCIHandleFree , ( ( dvoid * ) session_pool - > poolh , OCI_HTYPE_SPOOL ) ) ;
}
2008-02-16 01:20:22 +00:00
if ( session_pool - > err ) {
2008-01-31 01:33:30 +00:00
PHP_OCI_CALL ( OCIHandleFree , ( ( dvoid * ) session_pool - > err , OCI_HTYPE_ERROR ) ) ;
}
2008-02-16 01:20:22 +00:00
if ( session_pool - > env ) {
2008-01-31 01:33:30 +00:00
PHP_OCI_CALL ( OCIHandleFree , ( ( dvoid * ) session_pool - > env , OCI_HTYPE_ENV ) ) ;
}
2008-02-16 01:20:22 +00:00
if ( session_pool - > spool_hash_key ) {
free ( session_pool - > spool_hash_key ) ;
2008-01-31 01:33:30 +00:00
}
free ( session_pool ) ;
} /* }}} */
2008-03-12 01:26:44 +00:00
/* {{{ php_oci_ping_init()
2008-04-18 00:05:27 +00:00
*
* Initializes the next_ping time as a context value in the connection . We now use
* OCIContext { Get , Set } Value to store the next_ping because we need to support ping for
* non - persistent DRCP connections
*/
2008-03-12 01:26:44 +00:00
static sword php_oci_ping_init ( php_oci_connection * connection , OCIError * errh TSRMLS_DC )
{
time_t * next_pingp = NULL ;
PHP_OCI_CALL_RETURN ( OCI_G ( errcode ) , OCIContextGetValue , ( connection - > session , errh , ( ub1 * ) " NEXT_PING " , ( ub1 ) sizeof ( " NEXT_PING " ) , ( void * * ) & next_pingp ) ) ;
if ( OCI_G ( errcode ) ! = OCI_SUCCESS ) {
return OCI_G ( errcode ) ;
}
/* This must be a brand-new connection. Allocate memory for the ping */
if ( ! next_pingp ) {
PHP_OCI_CALL_RETURN ( OCI_G ( errcode ) , OCIMemoryAlloc , ( connection - > session , errh , ( void * * ) & next_pingp , OCI_DURATION_SESSION , sizeof ( time_t ) , OCI_MEMORY_CLEARED ) ) ;
if ( OCI_G ( errcode ) ! = OCI_SUCCESS ) {
return OCI_G ( errcode ) ;
}
}
if ( OCI_G ( ping_interval ) > = 0 ) {
time_t timestamp = time ( NULL ) ;
* next_pingp = timestamp + OCI_G ( ping_interval ) ;
} else {
* next_pingp = 0 ;
}
/* Set the new ping value into the connection */
PHP_OCI_CALL_RETURN ( OCI_G ( errcode ) , OCIContextSetValue , ( connection - > session , errh , OCI_DURATION_SESSION , ( ub1 * ) " NEXT_PING " , ( ub1 ) sizeof ( " NEXT_PING " ) , next_pingp ) ) ;
if ( OCI_G ( errcode ) ! = OCI_SUCCESS ) {
OCIMemoryFree ( connection - > session , errh , next_pingp ) ;
return OCI_G ( errcode ) ;
}
/* Cache the pointer so we do not have to do OCIContextGetValue repeatedly */
connection - > next_pingp = next_pingp ;
return OCI_SUCCESS ;
} /* }}} */
2006-01-10 08:34:28 +00:00
# ifdef ZTS
2008-02-16 01:20:22 +00:00
/* {{{ php_oci_list_helper()
2008-04-18 00:05:27 +00:00
*
* Helper function to destroy data on thread shutdown in ZTS mode
*/
2006-01-18 10:12:34 +00:00
static int php_oci_list_helper ( zend_rsrc_list_entry * le , void * le_type TSRMLS_DC )
2006-01-10 08:34:28 +00:00
{
2006-01-18 10:12:34 +00:00
int type = ( int ) le_type ;
2006-11-10 16:33:41 +00:00
2006-01-18 10:12:34 +00:00
if ( le - > type = = type ) {
2006-11-10 16:33:41 +00:00
if ( le - > ptr ! = NULL & & - - le - > refcount < = 0 ) {
return ZEND_HASH_APPLY_REMOVE ;
2006-01-17 23:44:51 +00:00
}
}
2006-11-10 16:33:41 +00:00
return ZEND_HASH_APPLY_KEEP ;
2006-01-17 23:44:51 +00:00
} /* }}} */
2006-01-10 08:34:28 +00:00
# endif
1999-04-21 22:49:16 +00:00
# endif /* HAVE_OCI8 */
2007-07-31 19:21:08 +00:00
/*
* 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
*/