2003-02-12 08:45:53 +08:00
/*
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
2003-02-22 15:31:01 +08:00
| PHP Version 5 |
2003-02-12 08:45:53 +08:00
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
2007-12-31 15:17:19 +08:00
| Copyright ( c ) 1997 - 2008 The PHP Group |
2003-02-12 08:45:53 +08:00
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
2006-01-01 20:51:34 +08:00
| This source file is subject to version 3.01 of the PHP license , |
2003-02-12 08:45:53 +08:00
| that is bundled with this package in the file LICENSE , and is |
2003-06-11 04:04:29 +08:00
| available through the world - wide - web at the following url : |
2006-01-01 20:51:34 +08:00
| http : //www.php.net/license/3_01.txt |
2003-02-12 08:45:53 +08: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 . |
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
2008-03-19 00:57:31 +08:00
| Authors : Georg Richter < georg @ php . net > |
| Andrey Hristov < andrey @ php . net > |
| Ulf Wendel < uw @ php . net > |
2003-02-12 08:45:53 +08:00
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
$ Id $
*/
# ifdef HAVE_CONFIG_H
# include "config.h"
# endif
# include <signal.h>
# include "php.h"
# include "php_ini.h"
# include "ext/standard/info.h"
2003-02-15 00:49:09 +08:00
# include "ext/standard/php_string.h"
2007-10-06 05:23:56 +08:00
# include "php_mysqli_structs.h"
2004-02-12 18:43:27 +08:00
# include "zend_exceptions.h"
2003-02-12 08:45:53 +08:00
ZEND_DECLARE_MODULE_GLOBALS ( mysqli )
2006-06-16 02:33:09 +08:00
static PHP_GINIT_FUNCTION ( mysqli ) ;
2008-03-19 00:57:31 +08:00
# define MYSQLI_ADD_PROPERTIES(a,b) \
{ \
int i = 0 ; \
while ( b [ i ] . pname ! = NULL ) { \
mysqli_add_property ( ( a ) , ( b ) [ i ] . pname , ( b ) [ i ] . pname_length , \
( mysqli_read_t ) ( b ) [ i ] . r_func , ( mysqli_write_t ) ( b ) [ i ] . w_func TSRMLS_CC ) ; \
i + + ; \
} \
}
# define MYSQLI_ADD_PROPERTIES_INFO(a,b) \
{ \
int i = 0 ; \
while ( b [ i ] . name ! = NULL ) { \
zend_declare_property_null ( ( a ) , ( b ) [ i ] . name , ( b ) [ i ] . name_length , ZEND_ACC_PUBLIC TSRMLS_CC ) ; \
i + + ; \
} \
}
2003-02-12 08:45:53 +08:00
static zend_object_handlers mysqli_object_handlers ;
- Added multiquery support:
mysqli_multi_query
mysqli_more_results
mysqli_next_results
- added read-only properties (and removed methods)
object mysql
affected_rows
client_flags
client_version
errno, error,
host, host_info, info
server_capabilities, server_version
sqlstate, port, protocol_version,
server_language
thread_id, user, warning_count
object result
current_field, field_count,
lengths, num_rows, type
object stmt
query, param_count, field_count,
id, errno, error, sqlstate
- added constructor
- minor fixes, prototypes
2003-11-23 05:20:07 +08:00
static HashTable classes ;
2005-01-07 22:59:59 +08:00
static HashTable mysqli_driver_properties ;
- Added multiquery support:
mysqli_multi_query
mysqli_more_results
mysqli_next_results
- added read-only properties (and removed methods)
object mysql
affected_rows
client_flags
client_version
errno, error,
host, host_info, info
server_capabilities, server_version
sqlstate, port, protocol_version,
server_language
thread_id, user, warning_count
object result
current_field, field_count,
lengths, num_rows, type
object stmt
query, param_count, field_count,
id, errno, error, sqlstate
- added constructor
- minor fixes, prototypes
2003-11-23 05:20:07 +08:00
static HashTable mysqli_link_properties ;
static HashTable mysqli_result_properties ;
static HashTable mysqli_stmt_properties ;
2005-01-07 22:59:59 +08:00
static HashTable mysqli_warning_properties ;
2006-05-09 00:19:43 +08:00
zend_class_entry * mysqli_link_class_entry ;
zend_class_entry * mysqli_stmt_class_entry ;
zend_class_entry * mysqli_result_class_entry ;
zend_class_entry * mysqli_driver_class_entry ;
zend_class_entry * mysqli_warning_class_entry ;
zend_class_entry * mysqli_exception_class_entry ;
2008-03-11 04:15:38 +08:00
# ifdef MYSQLI_USE_MYSQLND
2007-10-06 05:23:56 +08:00
MYSQLND_ZVAL_PCACHE * mysqli_mysqlnd_zval_cache ;
MYSQLND_QCACHE * mysqli_mysqlnd_qcache ;
# endif
2008-03-19 00:57:31 +08:00
- Added multiquery support:
mysqli_multi_query
mysqli_more_results
mysqli_next_results
- added read-only properties (and removed methods)
object mysql
affected_rows
client_flags
client_version
errno, error,
host, host_info, info
server_capabilities, server_version
sqlstate, port, protocol_version,
server_language
thread_id, user, warning_count
object result
current_field, field_count,
lengths, num_rows, type
object stmt
query, param_count, field_count,
id, errno, error, sqlstate
- added constructor
- minor fixes, prototypes
2003-11-23 05:20:07 +08:00
typedef int ( * mysqli_read_t ) ( mysqli_object * obj , zval * * retval TSRMLS_DC ) ;
2003-11-24 19:31:26 +08:00
typedef int ( * mysqli_write_t ) ( mysqli_object * obj , zval * newval TSRMLS_DC ) ;
- Added multiquery support:
mysqli_multi_query
mysqli_more_results
mysqli_next_results
- added read-only properties (and removed methods)
object mysql
affected_rows
client_flags
client_version
errno, error,
host, host_info, info
server_capabilities, server_version
sqlstate, port, protocol_version,
server_language
thread_id, user, warning_count
object result
current_field, field_count,
lengths, num_rows, type
object stmt
query, param_count, field_count,
id, errno, error, sqlstate
- added constructor
- minor fixes, prototypes
2003-11-23 05:20:07 +08:00
typedef struct _mysqli_prop_handler {
2008-03-19 00:57:31 +08:00
char * name ;
size_t name_len ;
- Added multiquery support:
mysqli_multi_query
mysqli_more_results
mysqli_next_results
- added read-only properties (and removed methods)
object mysql
affected_rows
client_flags
client_version
errno, error,
host, host_info, info
server_capabilities, server_version
sqlstate, port, protocol_version,
server_language
thread_id, user, warning_count
object result
current_field, field_count,
lengths, num_rows, type
object stmt
query, param_count, field_count,
id, errno, error, sqlstate
- added constructor
- minor fixes, prototypes
2003-11-23 05:20:07 +08:00
mysqli_read_t read_func ;
mysqli_write_t write_func ;
} mysqli_prop_handler ;
2003-02-12 08:45:53 +08:00
2007-10-06 05:23:56 +08:00
static int le_pmysqli ;
/* Destructor for mysqli entries in free_links/used_links */
void php_mysqli_dtor_p_elements ( void * data )
{
2008-06-25 06:22:48 +08:00
MYSQL * mysql = ( MYSQL * ) data ;
2008-10-04 00:19:49 +08:00
TSRMLS_FETCH ( ) ;
2007-11-09 18:56:28 +08:00
mysqli_close ( mysql , MYSQLI_CLOSE_IMPLICIT ) ;
2007-10-06 05:23:56 +08:00
}
2008-03-19 00:57:31 +08:00
2007-10-06 05:23:56 +08:00
ZEND_RSRC_DTOR_FUNC ( php_mysqli_dtor )
{
if ( rsrc - > ptr ) {
mysqli_plist_entry * plist = ( mysqli_plist_entry * ) rsrc - > ptr ;
2007-11-09 18:56:28 +08:00
zend_ptr_stack_clean ( & plist - > free_links , php_mysqli_dtor_p_elements , 0 ) ;
zend_ptr_stack_destroy ( & plist - > free_links ) ;
2007-10-06 05:23:56 +08:00
free ( plist ) ;
}
}
int php_le_pmysqli ( void )
{
return le_pmysqli ;
}
2008-03-11 04:15:38 +08:00
# ifndef MYSQLI_USE_MYSQLND
2003-07-15 18:37:19 +08:00
/* {{{ php_free_stmt_bind_buffer */
void php_free_stmt_bind_buffer ( BIND_BUFFER bbuf , int type )
2003-02-15 00:49:09 +08:00
{
unsigned int i ;
2003-02-12 08:45:53 +08:00
2003-07-15 18:37:19 +08:00
if ( ! bbuf . var_cnt ) {
return ;
2003-02-22 15:31:01 +08:00
}
2003-02-12 08:45:53 +08:00
2003-07-15 18:37:19 +08:00
for ( i = 0 ; i < bbuf . var_cnt ; i + + ) {
2004-03-17 05:43:25 +08:00
/* free temporary bind buffer */
2005-05-05 21:02:32 +08:00
if ( type = = FETCH_RESULT & & bbuf . buf [ i ] . val ) {
2004-03-18 21:03:17 +08:00
efree ( bbuf . buf [ i ] . val ) ;
2003-02-12 08:45:53 +08:00
}
2004-03-17 05:43:25 +08:00
2003-07-15 18:37:19 +08:00
if ( bbuf . vars [ i ] ) {
2004-02-15 20:58:19 +08:00
zval_ptr_dtor ( & bbuf . vars [ i ] ) ;
2007-10-06 05:23:56 +08:00
}
2003-07-15 18:37:19 +08:00
}
if ( bbuf . vars ) {
efree ( bbuf . vars ) ;
}
2006-05-10 19:53:13 +08:00
/*
Don ' t free bbuf . is_null for FETCH_RESULT since we have allocated
is_null and buf in one block so we free only buf , which is the beginning
of the block . When FETCH_SIMPLE then buf wasn ' t allocated together with
buf and we have to free it .
*/
2003-07-15 18:37:19 +08:00
if ( type = = FETCH_RESULT ) {
efree ( bbuf . buf ) ;
2006-05-10 19:53:13 +08:00
} else if ( type = = FETCH_SIMPLE ) {
efree ( bbuf . is_null ) ;
2003-02-12 08:45:53 +08:00
}
2006-05-10 19:53:13 +08:00
2003-07-15 18:37:19 +08:00
bbuf . var_cnt = 0 ;
}
/* }}} */
2007-10-06 05:23:56 +08:00
# endif
2003-07-15 18:37:19 +08:00
/* {{{ php_clear_stmt_bind */
2007-10-06 05:23:56 +08:00
void php_clear_stmt_bind ( MY_STMT * stmt TSRMLS_DC )
2003-07-15 18:37:19 +08:00
{
if ( stmt - > stmt ) {
2007-10-06 05:23:56 +08:00
if ( mysqli_stmt_close ( stmt - > stmt , TRUE ) ) {
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Error occured while closing statement " ) ;
return ;
}
2003-07-15 18:37:19 +08:00
}
2007-10-06 05:23:56 +08:00
/*
mysqlnd keeps track of the binding and has freed its
structures in stmt_close ( ) above
*/
2008-03-11 04:15:38 +08:00
# ifndef MYSQLI_USE_MYSQLND
2007-10-06 05:23:56 +08:00
/* Clean param bind */
2003-07-15 18:37:19 +08:00
php_free_stmt_bind_buffer ( stmt - > param , FETCH_SIMPLE ) ;
2007-10-06 05:23:56 +08:00
/* Clean output bind */
2003-07-15 18:37:19 +08:00
php_free_stmt_bind_buffer ( stmt - > result , FETCH_RESULT ) ;
2007-10-06 05:23:56 +08:00
# endif
2003-07-15 18:37:19 +08:00
2004-03-17 05:43:25 +08:00
if ( stmt - > query ) {
efree ( stmt - > query ) ;
}
2003-02-12 08:45:53 +08:00
efree ( stmt ) ;
}
/* }}} */
2004-06-06 02:31:56 +08:00
/* {{{ php_clear_mysql */
void php_clear_mysql ( MY_MYSQL * mysql ) {
2007-10-06 05:23:56 +08:00
if ( mysql - > hash_key ) {
efree ( mysql - > hash_key ) ;
mysql - > hash_key = NULL ;
}
2004-08-25 21:57:35 +08:00
if ( mysql - > li_read ) {
2007-10-17 16:18:09 +08:00
zval_ptr_dtor ( & ( mysql - > li_read ) ) ;
2004-08-25 21:57:35 +08:00
mysql - > li_read = NULL ;
2004-06-06 02:31:56 +08:00
}
}
/* }}} */
2006-07-10 20:46:28 +08:00
/* {{{ mysqli_objects_free_storage
2003-02-12 08:45:53 +08:00
*/
2006-07-10 21:02:43 +08:00
static void mysqli_objects_free_storage ( void * object TSRMLS_DC )
2005-06-28 01:40:37 +08:00
{
2006-07-10 21:02:43 +08:00
zend_object * zo = ( zend_object * ) object ;
mysqli_object * intern = ( mysqli_object * ) zo ;
2006-05-30 00:53:56 +08:00
MYSQLI_RESOURCE * my_res = ( MYSQLI_RESOURCE * ) intern - > ptr ;
- Added multiquery support:
mysqli_multi_query
mysqli_more_results
mysqli_next_results
- added read-only properties (and removed methods)
object mysql
affected_rows
client_flags
client_version
errno, error,
host, host_info, info
server_capabilities, server_version
sqlstate, port, protocol_version,
server_language
thread_id, user, warning_count
object result
current_field, field_count,
lengths, num_rows, type
object stmt
query, param_count, field_count,
id, errno, error, sqlstate
- added constructor
- minor fixes, prototypes
2003-11-23 05:20:07 +08:00
2007-10-06 05:23:56 +08:00
my_efree ( my_res ) ;
2006-07-10 20:46:28 +08:00
zend_object_std_dtor ( & intern - > zo TSRMLS_CC ) ;
efree ( intern ) ;
}
/* }}} */
2006-07-10 18:05:20 +08:00
2007-11-09 18:56:28 +08:00
/* mysqli_link_free_storage partly doubles the work of PHP_FUNCTION(mysqli_close) */
2006-07-10 20:46:28 +08:00
/* {{{ mysqli_link_free_storage
*/
2006-07-10 21:02:43 +08:00
static void mysqli_link_free_storage ( void * object TSRMLS_DC )
2006-07-10 20:46:28 +08:00
{
2006-07-10 21:02:43 +08:00
zend_object * zo = ( zend_object * ) object ;
mysqli_object * intern = ( mysqli_object * ) zo ;
2006-07-10 20:46:28 +08:00
MYSQLI_RESOURCE * my_res = ( MYSQLI_RESOURCE * ) intern - > ptr ;
if ( my_res & & my_res - > ptr ) {
MY_MYSQL * mysql = ( MY_MYSQL * ) my_res - > ptr ;
if ( mysql - > mysql ) {
2007-10-06 05:23:56 +08:00
if ( ! mysql - > persistent ) {
mysqli_close ( mysql - > mysql , MYSQLI_CLOSE_IMPLICIT ) ;
2007-11-09 18:56:28 +08:00
} else {
zend_rsrc_list_entry * le ;
if ( zend_hash_find ( & EG ( persistent_list ) , mysql - > hash_key , strlen ( mysql - > hash_key ) + 1 , ( void * * ) & le ) = = SUCCESS ) {
if ( Z_TYPE_P ( le ) = = php_le_pmysqli ( ) ) {
mysqli_plist_entry * plist = ( mysqli_plist_entry * ) le - > ptr ;
zend_ptr_stack_push ( & plist - > free_links , mysql - > mysql ) ;
MyG ( num_links ) - - ;
MyG ( num_active_persistent ) - - ;
MyG ( num_inactive_persistent ) + + ;
}
}
2007-10-06 05:23:56 +08:00
}
2005-01-07 22:59:59 +08:00
}
2006-07-10 20:46:28 +08:00
php_clear_mysql ( mysql ) ;
efree ( mysql ) ;
2003-02-12 08:45:53 +08:00
}
2006-07-10 20:46:28 +08:00
mysqli_objects_free_storage ( object TSRMLS_CC ) ;
2006-07-10 18:05:20 +08:00
}
/* }}} */
2007-10-06 05:23:56 +08:00
/* {{{ mysql_driver_free_storage */
static void mysqli_driver_free_storage ( void * object TSRMLS_DC )
{
mysqli_objects_free_storage ( object TSRMLS_CC ) ;
}
/* }}} */
2006-07-10 20:46:28 +08:00
/* {{{ mysqli_stmt_free_storage
2006-07-10 18:05:20 +08:00
*/
2006-07-10 21:02:43 +08:00
static void mysqli_stmt_free_storage ( void * object TSRMLS_DC )
2006-07-10 18:05:20 +08:00
{
2006-07-10 21:02:43 +08:00
zend_object * zo = ( zend_object * ) object ;
mysqli_object * intern = ( mysqli_object * ) zo ;
2006-07-10 18:05:20 +08:00
MYSQLI_RESOURCE * my_res = ( MYSQLI_RESOURCE * ) intern - > ptr ;
2006-07-10 20:46:28 +08:00
if ( my_res & & my_res - > ptr ) {
MY_STMT * stmt = ( MY_STMT * ) my_res - > ptr ;
2007-10-06 05:23:56 +08:00
php_clear_stmt_bind ( stmt TSRMLS_CC ) ;
2006-07-10 20:46:28 +08:00
}
mysqli_objects_free_storage ( object TSRMLS_CC ) ;
}
/* }}} */
/* {{{ mysqli_result_free_storage
*/
2006-07-10 21:02:43 +08:00
static void mysqli_result_free_storage ( void * object TSRMLS_DC )
2006-07-10 20:46:28 +08:00
{
2006-07-10 21:02:43 +08:00
zend_object * zo = ( zend_object * ) object ;
mysqli_object * intern = ( mysqli_object * ) zo ;
2006-07-10 20:46:28 +08:00
MYSQLI_RESOURCE * my_res = ( MYSQLI_RESOURCE * ) intern - > ptr ;
if ( my_res & & my_res - > ptr ) {
mysql_free_result ( my_res - > ptr ) ;
}
mysqli_objects_free_storage ( object TSRMLS_CC ) ;
}
/* }}} */
/* {{{ mysqli_warning_free_storage
*/
2006-07-10 21:02:43 +08:00
static void mysqli_warning_free_storage ( void * object TSRMLS_DC )
2006-07-10 20:46:28 +08:00
{
2006-07-10 21:02:43 +08:00
zend_object * zo = ( zend_object * ) object ;
mysqli_object * intern = ( mysqli_object * ) zo ;
2006-07-10 20:46:28 +08:00
MYSQLI_RESOURCE * my_res = ( MYSQLI_RESOURCE * ) intern - > ptr ;
if ( my_res & & my_res - > ptr ) {
php_clear_warnings ( ( MYSQLI_WARNING * ) my_res - > info ) ;
my_res - > ptr = NULL ;
}
mysqli_objects_free_storage ( object TSRMLS_CC ) ;
2003-02-12 08:45:53 +08:00
}
/* }}} */
- Added multiquery support:
mysqli_multi_query
mysqli_more_results
mysqli_next_results
- added read-only properties (and removed methods)
object mysql
affected_rows
client_flags
client_version
errno, error,
host, host_info, info
server_capabilities, server_version
sqlstate, port, protocol_version,
server_language
thread_id, user, warning_count
object result
current_field, field_count,
lengths, num_rows, type
object stmt
query, param_count, field_count,
id, errno, error, sqlstate
- added constructor
- minor fixes, prototypes
2003-11-23 05:20:07 +08:00
/* {{{ mysqli_read_na */
static int mysqli_read_na ( mysqli_object * obj , zval * * retval TSRMLS_DC )
{
* retval = NULL ;
php_error_docref ( NULL TSRMLS_CC , E_ERROR , " Cannot read property " ) ;
return FAILURE ;
}
/* }}} */
/* {{{ mysqli_write_na */
2003-11-24 19:31:26 +08:00
static int mysqli_write_na ( mysqli_object * obj , zval * newval TSRMLS_DC )
- Added multiquery support:
mysqli_multi_query
mysqli_more_results
mysqli_next_results
- added read-only properties (and removed methods)
object mysql
affected_rows
client_flags
client_version
errno, error,
host, host_info, info
server_capabilities, server_version
sqlstate, port, protocol_version,
server_language
thread_id, user, warning_count
object result
current_field, field_count,
lengths, num_rows, type
object stmt
query, param_count, field_count,
id, errno, error, sqlstate
- added constructor
- minor fixes, prototypes
2003-11-23 05:20:07 +08:00
{
php_error_docref ( NULL TSRMLS_CC , E_ERROR , " Cannot write property " ) ;
return FAILURE ;
}
/* }}} */
2007-10-17 04:56:22 +08:00
# ifndef Z_ADDREF_P
/* PHP 5.2, old GC */
# define Z_ADDREF_P(pz) (++(pz)->refcount)
# define Z_REFCOUNT_P(pz) ((pz)->refcount)
# define Z_SET_REFCOUNT_P(pz, rc) ((pz)->refcount = rc)
# endif
- Added multiquery support:
mysqli_multi_query
mysqli_more_results
mysqli_next_results
- added read-only properties (and removed methods)
object mysql
affected_rows
client_flags
client_version
errno, error,
host, host_info, info
server_capabilities, server_version
sqlstate, port, protocol_version,
server_language
thread_id, user, warning_count
object result
current_field, field_count,
lengths, num_rows, type
object stmt
query, param_count, field_count,
id, errno, error, sqlstate
- added constructor
- minor fixes, prototypes
2003-11-23 05:20:07 +08:00
/* {{{ mysqli_read_property */
2004-03-22 02:28:38 +08:00
zval * mysqli_read_property ( zval * object , zval * member , int type TSRMLS_DC )
- Added multiquery support:
mysqli_multi_query
mysqli_more_results
mysqli_next_results
- added read-only properties (and removed methods)
object mysql
affected_rows
client_flags
client_version
errno, error,
host, host_info, info
server_capabilities, server_version
sqlstate, port, protocol_version,
server_language
thread_id, user, warning_count
object result
current_field, field_count,
lengths, num_rows, type
object stmt
query, param_count, field_count,
id, errno, error, sqlstate
- added constructor
- minor fixes, prototypes
2003-11-23 05:20:07 +08:00
{
zval tmp_member ;
zval * retval ;
mysqli_object * obj ;
mysqli_prop_handler * hnd ;
zend_object_handlers * std_hnd ;
int ret ;
2003-12-31 16:34:02 +08:00
ret = FAILURE ;
obj = ( mysqli_object * ) zend_objects_get_address ( object TSRMLS_CC ) ;
2007-10-06 05:23:56 +08:00
if ( member - > type ! = IS_STRING ) {
- Added multiquery support:
mysqli_multi_query
mysqli_more_results
mysqli_next_results
- added read-only properties (and removed methods)
object mysql
affected_rows
client_flags
client_version
errno, error,
host, host_info, info
server_capabilities, server_version
sqlstate, port, protocol_version,
server_language
thread_id, user, warning_count
object result
current_field, field_count,
lengths, num_rows, type
object stmt
query, param_count, field_count,
id, errno, error, sqlstate
- added constructor
- minor fixes, prototypes
2003-11-23 05:20:07 +08:00
tmp_member = * member ;
zval_copy_ctor ( & tmp_member ) ;
convert_to_string ( & tmp_member ) ;
member = & tmp_member ;
}
if ( obj - > prop_handler ! = NULL ) {
ret = zend_hash_find ( obj - > prop_handler , Z_STRVAL_P ( member ) , Z_STRLEN_P ( member ) + 1 , ( void * * ) & hnd ) ;
}
2004-12-04 16:16:04 +08:00
- Added multiquery support:
mysqli_multi_query
mysqli_more_results
mysqli_next_results
- added read-only properties (and removed methods)
object mysql
affected_rows
client_flags
client_version
errno, error,
host, host_info, info
server_capabilities, server_version
sqlstate, port, protocol_version,
server_language
thread_id, user, warning_count
object result
current_field, field_count,
lengths, num_rows, type
object stmt
query, param_count, field_count,
id, errno, error, sqlstate
- added constructor
- minor fixes, prototypes
2003-11-23 05:20:07 +08:00
if ( ret = = SUCCESS ) {
2006-03-24 17:32:24 +08:00
if ( strcmp ( obj - > zo . ce - > name , " mysqli_driver " ) & &
2007-10-06 05:23:56 +08:00
( ! obj - > ptr | | ( ( MYSQLI_RESOURCE * ) ( obj - > ptr ) ) - > status < MYSQLI_STATUS_INITIALIZED ) )
{
2006-03-24 17:32:24 +08:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Couldn't fetch %s " , obj - > zo . ce - > name ) ;
retval = EG ( uninitialized_zval_ptr ) ;
return ( retval ) ;
2004-08-04 20:28:09 +08:00
}
- Added multiquery support:
mysqli_multi_query
mysqli_more_results
mysqli_next_results
- added read-only properties (and removed methods)
object mysql
affected_rows
client_flags
client_version
errno, error,
host, host_info, info
server_capabilities, server_version
sqlstate, port, protocol_version,
server_language
thread_id, user, warning_count
object result
current_field, field_count,
lengths, num_rows, type
object stmt
query, param_count, field_count,
id, errno, error, sqlstate
- added constructor
- minor fixes, prototypes
2003-11-23 05:20:07 +08:00
ret = hnd - > read_func ( obj , & retval TSRMLS_CC ) ;
if ( ret = = SUCCESS ) {
/* ensure we're creating a temporary variable */
2007-10-07 13:22:07 +08:00
Z_SET_REFCOUNT_P ( retval , 0 ) ;
- Added multiquery support:
mysqli_multi_query
mysqli_more_results
mysqli_next_results
- added read-only properties (and removed methods)
object mysql
affected_rows
client_flags
client_version
errno, error,
host, host_info, info
server_capabilities, server_version
sqlstate, port, protocol_version,
server_language
thread_id, user, warning_count
object result
current_field, field_count,
lengths, num_rows, type
object stmt
query, param_count, field_count,
id, errno, error, sqlstate
- added constructor
- minor fixes, prototypes
2003-11-23 05:20:07 +08:00
} else {
retval = EG ( uninitialized_zval_ptr ) ;
}
} else {
std_hnd = zend_get_std_object_handlers ( ) ;
2004-03-22 02:28:38 +08:00
retval = std_hnd - > read_property ( object , member , type TSRMLS_CC ) ;
- Added multiquery support:
mysqli_multi_query
mysqli_more_results
mysqli_next_results
- added read-only properties (and removed methods)
object mysql
affected_rows
client_flags
client_version
errno, error,
host, host_info, info
server_capabilities, server_version
sqlstate, port, protocol_version,
server_language
thread_id, user, warning_count
object result
current_field, field_count,
lengths, num_rows, type
object stmt
query, param_count, field_count,
id, errno, error, sqlstate
- added constructor
- minor fixes, prototypes
2003-11-23 05:20:07 +08:00
}
if ( member = = & tmp_member ) {
zval_dtor ( member ) ;
}
return ( retval ) ;
}
/* }}} */
2003-12-31 16:34:02 +08:00
/* {{{ mysqli_write_property */
- Added multiquery support:
mysqli_multi_query
mysqli_more_results
mysqli_next_results
- added read-only properties (and removed methods)
object mysql
affected_rows
client_flags
client_version
errno, error,
host, host_info, info
server_capabilities, server_version
sqlstate, port, protocol_version,
server_language
thread_id, user, warning_count
object result
current_field, field_count,
lengths, num_rows, type
object stmt
query, param_count, field_count,
id, errno, error, sqlstate
- added constructor
- minor fixes, prototypes
2003-11-23 05:20:07 +08:00
void mysqli_write_property ( zval * object , zval * member , zval * value TSRMLS_DC )
{
2003-11-24 19:31:26 +08:00
zval tmp_member ;
mysqli_object * obj ;
mysqli_prop_handler * hnd ;
zend_object_handlers * std_hnd ;
int ret ;
2007-10-06 05:23:56 +08:00
if ( member - > type ! = IS_STRING ) {
2003-11-24 19:31:26 +08:00
tmp_member = * member ;
zval_copy_ctor ( & tmp_member ) ;
convert_to_string ( & tmp_member ) ;
member = & tmp_member ;
}
ret = FAILURE ;
obj = ( mysqli_object * ) zend_objects_get_address ( object TSRMLS_CC ) ;
if ( obj - > prop_handler ! = NULL ) {
ret = zend_hash_find ( ( HashTable * ) obj - > prop_handler , Z_STRVAL_P ( member ) , Z_STRLEN_P ( member ) + 1 , ( void * * ) & hnd ) ;
}
if ( ret = = SUCCESS ) {
hnd - > write_func ( obj , value TSRMLS_CC ) ;
2007-10-07 13:22:07 +08:00
if ( ! PZVAL_IS_REF ( value ) & & Z_REFCOUNT_P ( value ) = = 0 ) {
Z_ADDREF_P ( value ) ;
2003-11-24 19:31:26 +08:00
zval_ptr_dtor ( & value ) ;
}
} else {
std_hnd = zend_get_std_object_handlers ( ) ;
std_hnd - > write_property ( object , member , value TSRMLS_CC ) ;
}
if ( member = = & tmp_member ) {
zval_dtor ( member ) ;
}
- Added multiquery support:
mysqli_multi_query
mysqli_more_results
mysqli_next_results
- added read-only properties (and removed methods)
object mysql
affected_rows
client_flags
client_version
errno, error,
host, host_info, info
server_capabilities, server_version
sqlstate, port, protocol_version,
server_language
thread_id, user, warning_count
object result
current_field, field_count,
lengths, num_rows, type
object stmt
query, param_count, field_count,
id, errno, error, sqlstate
- added constructor
- minor fixes, prototypes
2003-11-23 05:20:07 +08:00
}
/* }}} */
2003-12-13 08:28:21 +08:00
/* {{{ void mysqli_add_property(HashTable *h, char *pname, mysqli_read_t r_func, mysqli_write_t w_func TSRMLS_DC) */
2008-03-19 00:57:31 +08:00
void mysqli_add_property ( HashTable * h , const char * pname , size_t pname_len , mysqli_read_t r_func , mysqli_write_t w_func TSRMLS_DC ) {
- Added multiquery support:
mysqli_multi_query
mysqli_more_results
mysqli_next_results
- added read-only properties (and removed methods)
object mysql
affected_rows
client_flags
client_version
errno, error,
host, host_info, info
server_capabilities, server_version
sqlstate, port, protocol_version,
server_language
thread_id, user, warning_count
object result
current_field, field_count,
lengths, num_rows, type
object stmt
query, param_count, field_count,
id, errno, error, sqlstate
- added constructor
- minor fixes, prototypes
2003-11-23 05:20:07 +08:00
mysqli_prop_handler p ;
2008-03-19 00:57:31 +08:00
p . name = ( char * ) pname ;
p . name_len = pname_len ;
- Added multiquery support:
mysqli_multi_query
mysqli_more_results
mysqli_next_results
- added read-only properties (and removed methods)
object mysql
affected_rows
client_flags
client_version
errno, error,
host, host_info, info
server_capabilities, server_version
sqlstate, port, protocol_version,
server_language
thread_id, user, warning_count
object result
current_field, field_count,
lengths, num_rows, type
object stmt
query, param_count, field_count,
id, errno, error, sqlstate
- added constructor
- minor fixes, prototypes
2003-11-23 05:20:07 +08:00
p . read_func = ( r_func ) ? r_func : mysqli_read_na ;
p . write_func = ( w_func ) ? w_func : mysqli_write_na ;
2008-03-19 00:57:31 +08:00
zend_hash_add ( h , pname , pname_len + 1 , & p , sizeof ( mysqli_prop_handler ) , NULL ) ;
- Added multiquery support:
mysqli_multi_query
mysqli_more_results
mysqli_next_results
- added read-only properties (and removed methods)
object mysql
affected_rows
client_flags
client_version
errno, error,
host, host_info, info
server_capabilities, server_version
sqlstate, port, protocol_version,
server_language
thread_id, user, warning_count
object result
current_field, field_count,
lengths, num_rows, type
object stmt
query, param_count, field_count,
id, errno, error, sqlstate
- added constructor
- minor fixes, prototypes
2003-11-23 05:20:07 +08:00
}
2003-12-13 08:28:21 +08:00
/* }}} */
- Added multiquery support:
mysqli_multi_query
mysqli_more_results
mysqli_next_results
- added read-only properties (and removed methods)
object mysql
affected_rows
client_flags
client_version
errno, error,
host, host_info, info
server_capabilities, server_version
sqlstate, port, protocol_version,
server_language
thread_id, user, warning_count
object result
current_field, field_count,
lengths, num_rows, type
object stmt
query, param_count, field_count,
id, errno, error, sqlstate
- added constructor
- minor fixes, prototypes
2003-11-23 05:20:07 +08:00
2004-06-24 00:47:25 +08:00
static union _zend_function * php_mysqli_constructor_get ( zval * object TSRMLS_DC )
{
2006-07-05 19:48:30 +08:00
zend_class_entry * ce = Z_OBJCE_P ( object ) ;
2004-06-24 00:47:25 +08:00
2006-07-05 19:48:30 +08:00
if ( ce ! = mysqli_link_class_entry & & ce ! = mysqli_stmt_class_entry & &
ce ! = mysqli_result_class_entry & & ce ! = mysqli_driver_class_entry & &
ce ! = mysqli_warning_class_entry ) {
return zend_std_get_constructor ( object TSRMLS_CC ) ;
2004-06-24 00:47:25 +08:00
} else {
static zend_internal_function f ;
2007-10-06 05:23:56 +08:00
mysqli_object * obj = ( mysqli_object * ) zend_objects_get_address ( object TSRMLS_CC ) ;
2004-06-24 00:47:25 +08:00
2004-12-26 21:16:40 +08:00
f . function_name = obj - > zo . ce - > name ;
f . scope = obj - > zo . ce ;
2004-06-24 00:47:25 +08:00
f . arg_info = NULL ;
f . num_args = 0 ;
f . fn_flags = 0 ;
f . type = ZEND_INTERNAL_FUNCTION ;
2004-12-26 21:16:40 +08:00
if ( obj - > zo . ce = = mysqli_link_class_entry ) {
2008-03-08 22:55:52 +08:00
f . handler = ZEND_FN ( mysqli_link_construct ) ;
2004-12-26 21:16:40 +08:00
} else if ( obj - > zo . ce = = mysqli_stmt_class_entry ) {
f . handler = ZEND_FN ( mysqli_stmt_construct ) ;
} else if ( obj - > zo . ce = = mysqli_result_class_entry ) {
f . handler = ZEND_FN ( mysqli_result_construct ) ;
2005-01-07 22:59:59 +08:00
} else if ( obj - > zo . ce = = mysqli_driver_class_entry ) {
f . handler = ZEND_FN ( mysqli_driver_construct ) ;
} else if ( obj - > zo . ce = = mysqli_warning_class_entry ) {
2006-05-10 08:00:13 +08:00
f . handler = ZEND_MN ( mysqli_warning___construct ) ;
2004-12-26 21:16:40 +08:00
}
2007-10-06 05:23:56 +08:00
2004-06-24 00:47:25 +08:00
return ( union _zend_function * ) & f ;
}
}
2004-12-26 21:16:40 +08:00
2008-03-19 00:57:31 +08:00
static int mysqli_object_has_property ( zval * object , zval * member , int has_set_exists TSRMLS_DC ) /* { { { */
{
mysqli_object * obj = ( mysqli_object * ) zend_objects_get_address ( object TSRMLS_CC ) ;
mysqli_prop_handler p ;
int ret = 0 ;
if ( zend_hash_find ( obj - > prop_handler , Z_STRVAL_P ( member ) , Z_STRLEN_P ( member ) + 1 , ( void * * ) & p ) = = SUCCESS ) {
switch ( has_set_exists ) {
case 2 :
ret = 1 ;
break ;
case 1 : {
zval * value = mysqli_read_property ( object , member , BP_VAR_IS TSRMLS_CC ) ;
if ( value ! = EG ( uninitialized_zval_ptr ) ) {
convert_to_boolean ( value ) ;
ret = Z_BVAL_P ( value ) ? 1 : 0 ;
/* refcount is 0 */
Z_ADDREF_P ( value ) ;
zval_ptr_dtor ( & value ) ;
}
break ;
}
case 0 : {
zval * value = mysqli_read_property ( object , member , BP_VAR_IS TSRMLS_CC ) ;
if ( value ! = EG ( uninitialized_zval_ptr ) ) {
ret = Z_TYPE_P ( value ) ! = IS_NULL ? 1 : 0 ;
/* refcount is 0 */
Z_ADDREF_P ( value ) ;
zval_ptr_dtor ( & value ) ;
}
break ;
}
default :
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Invalid value for has_set_exists " ) ;
}
}
return ret ;
} /* }}} */
2008-05-07 01:05:14 +08:00
# if PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION >= 3
2008-03-19 00:57:31 +08:00
HashTable * mysqli_object_get_debug_info ( zval * object , int * is_temp TSRMLS_DC )
{
mysqli_object * obj = ( mysqli_object * ) zend_objects_get_address ( object TSRMLS_CC ) ;
HashTable * retval , * props = obj - > prop_handler ;
HashPosition pos ;
mysqli_prop_handler * entry ;
ALLOC_HASHTABLE ( retval ) ;
ZEND_INIT_SYMTABLE_EX ( retval , zend_hash_num_elements ( props ) + 1 , 0 ) ;
zend_hash_internal_pointer_reset_ex ( props , & pos ) ;
while ( zend_hash_get_current_data_ex ( props , ( void * * ) & entry , & pos ) = = SUCCESS ) {
zval member ;
zval * value ;
INIT_ZVAL ( member ) ;
ZVAL_STRINGL ( & member , entry - > name , entry - > name_len , 0 ) ;
value = mysqli_read_property ( object , & member , BP_VAR_IS TSRMLS_CC ) ;
if ( value ! = EG ( uninitialized_zval_ptr ) ) {
Z_ADDREF_P ( value ) ;
zend_hash_add ( retval , entry - > name , entry - > name_len + 1 , & value , sizeof ( zval * ) , NULL ) ;
}
zend_hash_move_forward_ex ( props , & pos ) ;
}
* is_temp = 1 ;
return retval ;
}
2008-05-07 01:05:14 +08:00
# endif
2008-03-19 00:57:31 +08:00
2003-02-12 08:45:53 +08:00
/* {{{ mysqli_objects_new
*/
PHP_MYSQLI_EXPORT ( zend_object_value ) mysqli_objects_new ( zend_class_entry * class_type TSRMLS_DC )
{
zend_object_value retval ;
mysqli_object * intern ;
zval * tmp ;
2004-12-03 15:56:19 +08:00
zend_class_entry * mysqli_base_class ;
2006-07-10 20:46:28 +08:00
zend_objects_free_object_storage_t free_storage ;
2003-02-12 08:45:53 +08:00
intern = emalloc ( sizeof ( mysqli_object ) ) ;
2004-06-06 02:31:56 +08:00
memset ( intern , 0 , sizeof ( mysqli_object ) ) ;
2003-03-22 02:08:59 +08:00
intern - > ptr = NULL ;
- Added multiquery support:
mysqli_multi_query
mysqli_more_results
mysqli_next_results
- added read-only properties (and removed methods)
object mysql
affected_rows
client_flags
client_version
errno, error,
host, host_info, info
server_capabilities, server_version
sqlstate, port, protocol_version,
server_language
thread_id, user, warning_count
object result
current_field, field_count,
lengths, num_rows, type
object stmt
query, param_count, field_count,
id, errno, error, sqlstate
- added constructor
- minor fixes, prototypes
2003-11-23 05:20:07 +08:00
intern - > prop_handler = NULL ;
2004-12-03 15:56:19 +08:00
mysqli_base_class = class_type ;
2008-03-19 00:57:31 +08:00
while ( mysqli_base_class - > type ! = ZEND_INTERNAL_CLASS & &
mysqli_base_class - > parent ! = NULL ) {
2004-12-03 15:56:19 +08:00
mysqli_base_class = mysqli_base_class - > parent ;
2004-06-06 02:31:56 +08:00
}
2004-12-03 15:56:19 +08:00
zend_hash_find ( & classes , mysqli_base_class - > name , mysqli_base_class - > name_length + 1 ,
( void * * ) & intern - > prop_handler ) ;
2003-02-12 08:45:53 +08:00
2006-03-30 00:29:53 +08:00
zend_object_std_init ( & intern - > zo , class_type TSRMLS_CC ) ;
2003-12-13 08:28:21 +08:00
zend_hash_copy ( intern - > zo . properties , & class_type - > default_properties , ( copy_ctor_func_t ) zval_add_ref ,
( void * ) & tmp , sizeof ( zval * ) ) ;
2003-02-12 08:45:53 +08:00
2006-07-10 20:46:28 +08:00
/* link object */
if ( instanceof_function ( class_type , mysqli_link_class_entry TSRMLS_CC ) ) {
free_storage = mysqli_link_free_storage ;
2007-10-06 05:23:56 +08:00
} else if ( instanceof_function ( class_type , mysqli_driver_class_entry TSRMLS_CC ) ) { /* driver object */
free_storage = mysqli_driver_free_storage ;
2006-07-10 20:46:28 +08:00
} else if ( instanceof_function ( class_type , mysqli_stmt_class_entry TSRMLS_CC ) ) { /* stmt object */
free_storage = mysqli_stmt_free_storage ;
} else if ( instanceof_function ( class_type , mysqli_result_class_entry TSRMLS_CC ) ) { /* result object */
free_storage = mysqli_result_free_storage ;
} else if ( instanceof_function ( class_type , mysqli_warning_class_entry TSRMLS_CC ) ) { /* warning object */
free_storage = mysqli_warning_free_storage ;
} else {
free_storage = mysqli_objects_free_storage ;
}
retval . handle = zend_objects_store_put ( intern , ( zend_objects_store_dtor_t ) zend_objects_destroy_object , free_storage , NULL TSRMLS_CC ) ;
2003-02-12 08:45:53 +08:00
retval . handlers = & mysqli_object_handlers ;
return retval ;
}
/* }}} */
2007-10-06 05:23:56 +08:00
2007-03-21 04:00:27 +08:00
/* Dependancies */
2008-03-19 00:57:31 +08:00
static const zend_module_dep mysqli_deps [ ] = {
2007-03-21 04:00:27 +08:00
# if defined(HAVE_SPL) && ((PHP_MAJOR_VERSION > 5) || (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION >= 1))
ZEND_MOD_REQUIRED ( " spl " )
2007-10-06 05:23:56 +08:00
# endif
2008-03-11 04:15:38 +08:00
# if defined(MYSQLI_USE_MYSQLND)
2007-10-06 05:23:56 +08:00
ZEND_MOD_REQUIRED ( " mysqlnd " )
2007-03-21 04:00:27 +08:00
# endif
{ NULL , NULL , NULL }
} ;
2007-10-06 05:23:56 +08:00
/* {{{ mysqli_module_entry
*/
2003-02-12 08:45:53 +08:00
zend_module_entry mysqli_module_entry = {
2007-03-21 04:00:27 +08:00
# if ZEND_MODULE_API_NO >= 20050922
STANDARD_MODULE_HEADER_EX , NULL ,
mysqli_deps ,
# elif ZEND_MODULE_API_NO >= 20010901
2003-02-12 08:45:53 +08:00
STANDARD_MODULE_HEADER ,
2007-03-21 04:00:27 +08:00
# endif
2003-02-12 08:45:53 +08:00
" mysqli " ,
mysqli_functions ,
PHP_MINIT ( mysqli ) ,
PHP_MSHUTDOWN ( mysqli ) ,
2005-05-10 06:29:21 +08:00
PHP_RINIT ( mysqli ) ,
PHP_RSHUTDOWN ( mysqli ) ,
2003-02-12 08:45:53 +08:00
PHP_MINFO ( mysqli ) ,
" 0.1 " , /* Replace with version number for your extension */
2006-06-16 02:33:09 +08:00
PHP_MODULE_GLOBALS ( mysqli ) ,
PHP_GINIT ( mysqli ) ,
NULL ,
NULL ,
STANDARD_MODULE_PROPERTIES_EX
2003-02-12 08:45:53 +08:00
} ;
/* }}} */
# ifdef COMPILE_DL_MYSQLI
ZEND_GET_MODULE ( mysqli )
# endif
/* {{{ PHP_INI_BEGIN
*/
PHP_INI_BEGIN ( )
2003-03-07 13:15:28 +08:00
STD_PHP_INI_ENTRY_EX ( " mysqli.max_links " , " -1 " , PHP_INI_SYSTEM , OnUpdateLong , max_links , zend_mysqli_globals , mysqli_globals , display_link_numbers )
2007-10-06 05:23:56 +08:00
STD_PHP_INI_ENTRY_EX ( " mysqli.max_persistent " , " -1 " , PHP_INI_SYSTEM , OnUpdateLong , max_persistent , zend_mysqli_globals , mysqli_globals , display_link_numbers )
STD_PHP_INI_BOOLEAN ( " mysqli.allow_persistent " , " 1 " , PHP_INI_SYSTEM , OnUpdateLong , allow_persistent , zend_mysqli_globals , mysqli_globals )
2003-02-12 08:45:53 +08:00
STD_PHP_INI_ENTRY ( " mysqli.default_host " , NULL , PHP_INI_ALL , OnUpdateString , default_host , zend_mysqli_globals , mysqli_globals )
STD_PHP_INI_ENTRY ( " mysqli.default_user " , NULL , PHP_INI_ALL , OnUpdateString , default_user , zend_mysqli_globals , mysqli_globals )
STD_PHP_INI_ENTRY ( " mysqli.default_pw " , NULL , PHP_INI_ALL , OnUpdateString , default_pw , zend_mysqli_globals , mysqli_globals )
2003-03-07 13:15:28 +08:00
STD_PHP_INI_ENTRY ( " mysqli.default_port " , " 3306 " , PHP_INI_ALL , OnUpdateLong , default_port , zend_mysqli_globals , mysqli_globals )
2008-07-21 20:58:51 +08:00
# ifdef PHP_MYSQL_UNIX_SOCK_ADDR
STD_PHP_INI_ENTRY ( " mysqli.default_socket " , MYSQL_UNIX_ADDR , PHP_INI_ALL , OnUpdateStringUnempty , default_socket , zend_mysqli_globals , mysqli_globals )
# else
2003-02-12 08:45:53 +08:00
STD_PHP_INI_ENTRY ( " mysqli.default_socket " , NULL , PHP_INI_ALL , OnUpdateStringUnempty , default_socket , zend_mysqli_globals , mysqli_globals )
2008-07-21 20:58:51 +08:00
# endif
2004-02-26 19:40:35 +08:00
STD_PHP_INI_BOOLEAN ( " mysqli.reconnect " , " 0 " , PHP_INI_SYSTEM , OnUpdateLong , reconnect , zend_mysqli_globals , mysqli_globals )
2007-10-06 05:23:56 +08:00
STD_PHP_INI_BOOLEAN ( " mysqli.allow_local_infile " , " 1 " , PHP_INI_SYSTEM , OnUpdateLong , allow_local_infile , zend_mysqli_globals , mysqli_globals )
2008-03-11 04:15:38 +08:00
# ifdef MYSQLI_USE_MYSQLND
2007-10-06 05:23:56 +08:00
STD_PHP_INI_ENTRY ( " mysqli.cache_size " , " 2000 " , PHP_INI_SYSTEM , OnUpdateLong , cache_size , zend_mysqli_globals , mysqli_globals )
# endif
2003-02-12 08:45:53 +08:00
PHP_INI_END ( )
/* }}} */
2007-10-06 05:23:56 +08:00
2006-06-16 02:33:09 +08:00
/* {{{ PHP_GINIT_FUNCTION
2003-02-12 08:45:53 +08:00
*/
2006-06-16 02:33:09 +08:00
static PHP_GINIT_FUNCTION ( mysqli )
2003-02-12 08:45:53 +08:00
{
mysqli_globals - > num_links = 0 ;
2007-10-06 05:23:56 +08:00
mysqli_globals - > num_active_persistent = 0 ;
mysqli_globals - > num_inactive_persistent = 0 ;
mysqli_globals - > max_links = - 1 ;
mysqli_globals - > max_persistent = - 1 ;
mysqli_globals - > allow_persistent = 1 ;
2003-02-12 08:45:53 +08:00
mysqli_globals - > default_port = 0 ;
mysqli_globals - > default_host = NULL ;
mysqli_globals - > default_user = NULL ;
mysqli_globals - > default_pw = NULL ;
mysqli_globals - > default_socket = NULL ;
2004-02-26 19:40:35 +08:00
mysqli_globals - > reconnect = 0 ;
2003-12-13 08:28:21 +08:00
mysqli_globals - > report_mode = 0 ;
mysqli_globals - > report_ht = 0 ;
2007-10-06 05:23:56 +08:00
mysqli_globals - > allow_local_infile = 1 ;
2005-01-07 22:59:59 +08:00
# ifdef HAVE_EMBEDDED_MYSQLI
mysqli_globals - > embedded = 1 ;
# else
mysqli_globals - > embedded = 0 ;
# endif
2008-03-11 04:15:38 +08:00
# ifdef MYSQLI_USE_MYSQLND
2007-10-06 05:23:56 +08:00
mysqli_globals - > cache_size = 0 ;
mysqli_globals - > mysqlnd_thd_zval_cache = NULL ;
# endif
2003-02-12 08:45:53 +08:00
}
/* }}} */
/* {{{ PHP_MINIT_FUNCTION
*/
PHP_MINIT_FUNCTION ( mysqli )
{
2005-01-07 22:59:59 +08:00
zend_class_entry * ce , cex ;
2004-12-26 00:42:53 +08:00
zend_object_handlers * std_hnd = zend_get_std_object_handlers ( ) ;
2003-02-12 08:45:53 +08:00
REGISTER_INI_ENTRIES ( ) ;
2008-03-11 04:15:38 +08:00
# ifndef MYSQLI_USE_MYSQLND
2007-10-06 05:23:56 +08:00
# if MYSQL_VERSION_ID >= 40000
if ( mysql_server_init ( 0 , NULL , NULL ) ) {
return FAILURE ;
}
# endif
# else
mysqli_mysqlnd_zval_cache = mysqlnd_palloc_init_cache ( MyG ( cache_size ) ) ;
mysqli_mysqlnd_qcache = mysqlnd_qcache_init_cache ( ) ;
# endif
2003-02-12 08:45:53 +08:00
memcpy ( & mysqli_object_handlers , zend_get_std_object_handlers ( ) , sizeof ( zend_object_handlers ) ) ;
2004-06-06 02:31:56 +08:00
mysqli_object_handlers . clone_obj = NULL ;
- Added multiquery support:
mysqli_multi_query
mysqli_more_results
mysqli_next_results
- added read-only properties (and removed methods)
object mysql
affected_rows
client_flags
client_version
errno, error,
host, host_info, info
server_capabilities, server_version
sqlstate, port, protocol_version,
server_language
thread_id, user, warning_count
object result
current_field, field_count,
lengths, num_rows, type
object stmt
query, param_count, field_count,
id, errno, error, sqlstate
- added constructor
- minor fixes, prototypes
2003-11-23 05:20:07 +08:00
mysqli_object_handlers . read_property = mysqli_read_property ;
mysqli_object_handlers . write_property = mysqli_write_property ;
2004-12-26 00:42:53 +08:00
mysqli_object_handlers . get_property_ptr_ptr = std_hnd - > get_property_ptr_ptr ;
2004-06-24 00:47:25 +08:00
mysqli_object_handlers . get_constructor = php_mysqli_constructor_get ;
2008-03-19 00:57:31 +08:00
mysqli_object_handlers . has_property = mysqli_object_has_property ;
2008-05-07 01:05:14 +08:00
# if PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION >= 3
2008-03-19 00:57:31 +08:00
mysqli_object_handlers . get_debug_info = mysqli_object_get_debug_info ;
2008-05-07 01:05:14 +08:00
# endif
- Added multiquery support:
mysqli_multi_query
mysqli_more_results
mysqli_next_results
- added read-only properties (and removed methods)
object mysql
affected_rows
client_flags
client_version
errno, error,
host, host_info, info
server_capabilities, server_version
sqlstate, port, protocol_version,
server_language
thread_id, user, warning_count
object result
current_field, field_count,
lengths, num_rows, type
object stmt
query, param_count, field_count,
id, errno, error, sqlstate
- added constructor
- minor fixes, prototypes
2003-11-23 05:20:07 +08:00
zend_hash_init ( & classes , 0 , NULL , NULL , 1 ) ;
2003-02-12 08:45:53 +08:00
2007-10-06 05:23:56 +08:00
/* persistent connections */
le_pmysqli = zend_register_list_destructors_ex ( NULL , php_mysqli_dtor ,
" MySqli persistent connection " , module_number ) ;
2005-01-07 22:59:59 +08:00
INIT_CLASS_ENTRY ( cex , " mysqli_sql_exception " , mysqli_exception_methods ) ;
# ifdef HAVE_SPL
mysqli_exception_class_entry = zend_register_internal_class_ex ( & cex , spl_ce_RuntimeException , NULL TSRMLS_CC ) ;
# else
2006-07-12 17:33:37 +08:00
mysqli_exception_class_entry = zend_register_internal_class_ex ( & cex , zend_exception_get_default ( TSRMLS_C ) , NULL TSRMLS_CC ) ;
2005-01-07 22:59:59 +08:00
# endif
mysqli_exception_class_entry - > ce_flags | = ZEND_ACC_FINAL ;
zend_declare_property_long ( mysqli_exception_class_entry , " code " , sizeof ( " code " ) - 1 , 0 , ZEND_ACC_PROTECTED TSRMLS_CC ) ;
zend_declare_property_string ( mysqli_exception_class_entry , " sqlstate " , sizeof ( " sqlstate " ) - 1 , " 00000 " , ZEND_ACC_PROTECTED TSRMLS_CC ) ;
- Added multiquery support:
mysqli_multi_query
mysqli_more_results
mysqli_next_results
- added read-only properties (and removed methods)
object mysql
affected_rows
client_flags
client_version
errno, error,
host, host_info, info
server_capabilities, server_version
sqlstate, port, protocol_version,
server_language
thread_id, user, warning_count
object result
current_field, field_count,
lengths, num_rows, type
object stmt
query, param_count, field_count,
id, errno, error, sqlstate
- added constructor
- minor fixes, prototypes
2003-11-23 05:20:07 +08:00
2005-01-07 22:59:59 +08:00
REGISTER_MYSQLI_CLASS_ENTRY ( " mysqli_driver " , mysqli_driver_class_entry , mysqli_driver_methods ) ;
ce = mysqli_driver_class_entry ;
zend_hash_init ( & mysqli_driver_properties , 0 , NULL , NULL , 1 ) ;
MYSQLI_ADD_PROPERTIES ( & mysqli_driver_properties , mysqli_driver_property_entries ) ;
2008-03-19 00:57:31 +08:00
MYSQLI_ADD_PROPERTIES_INFO ( ce , mysqli_driver_property_info_entries ) ;
2005-01-07 22:59:59 +08:00
zend_hash_add ( & classes , ce - > name , ce - > name_length + 1 , & mysqli_driver_properties , sizeof ( mysqli_driver_properties ) , NULL ) ;
2005-12-23 02:11:39 +08:00
ce - > ce_flags | = ZEND_ACC_FINAL_CLASS ;
2005-01-07 22:59:59 +08:00
REGISTER_MYSQLI_CLASS_ENTRY ( " mysqli " , mysqli_link_class_entry , mysqli_link_methods ) ;
- Added multiquery support:
mysqli_multi_query
mysqli_more_results
mysqli_next_results
- added read-only properties (and removed methods)
object mysql
affected_rows
client_flags
client_version
errno, error,
host, host_info, info
server_capabilities, server_version
sqlstate, port, protocol_version,
server_language
thread_id, user, warning_count
object result
current_field, field_count,
lengths, num_rows, type
object stmt
query, param_count, field_count,
id, errno, error, sqlstate
- added constructor
- minor fixes, prototypes
2003-11-23 05:20:07 +08:00
ce = mysqli_link_class_entry ;
zend_hash_init ( & mysqli_link_properties , 0 , NULL , NULL , 1 ) ;
MYSQLI_ADD_PROPERTIES ( & mysqli_link_properties , mysqli_link_property_entries ) ;
2008-03-19 00:57:31 +08:00
MYSQLI_ADD_PROPERTIES_INFO ( ce , mysqli_link_property_info_entries ) ;
- Added multiquery support:
mysqli_multi_query
mysqli_more_results
mysqli_next_results
- added read-only properties (and removed methods)
object mysql
affected_rows
client_flags
client_version
errno, error,
host, host_info, info
server_capabilities, server_version
sqlstate, port, protocol_version,
server_language
thread_id, user, warning_count
object result
current_field, field_count,
lengths, num_rows, type
object stmt
query, param_count, field_count,
id, errno, error, sqlstate
- added constructor
- minor fixes, prototypes
2003-11-23 05:20:07 +08:00
zend_hash_add ( & classes , ce - > name , ce - > name_length + 1 , & mysqli_link_properties , sizeof ( mysqli_link_properties ) , NULL ) ;
2005-01-07 22:59:59 +08:00
REGISTER_MYSQLI_CLASS_ENTRY ( " mysqli_warning " , mysqli_warning_class_entry , mysqli_warning_methods ) ;
ce = mysqli_warning_class_entry ;
2005-12-23 02:11:39 +08:00
ce - > ce_flags | = ZEND_ACC_FINAL_CLASS | ZEND_ACC_PROTECTED ;
2005-01-07 22:59:59 +08:00
zend_hash_init ( & mysqli_warning_properties , 0 , NULL , NULL , 1 ) ;
MYSQLI_ADD_PROPERTIES ( & mysqli_warning_properties , mysqli_warning_property_entries ) ;
2008-03-19 00:57:31 +08:00
MYSQLI_ADD_PROPERTIES_INFO ( ce , mysqli_warning_property_info_entries ) ;
2005-01-07 22:59:59 +08:00
zend_hash_add ( & classes , ce - > name , ce - > name_length + 1 , & mysqli_warning_properties , sizeof ( mysqli_warning_properties ) , NULL ) ;
2003-02-12 08:45:53 +08:00
REGISTER_MYSQLI_CLASS_ENTRY ( " mysqli_result " , mysqli_result_class_entry , mysqli_result_methods ) ;
- Added multiquery support:
mysqli_multi_query
mysqli_more_results
mysqli_next_results
- added read-only properties (and removed methods)
object mysql
affected_rows
client_flags
client_version
errno, error,
host, host_info, info
server_capabilities, server_version
sqlstate, port, protocol_version,
server_language
thread_id, user, warning_count
object result
current_field, field_count,
lengths, num_rows, type
object stmt
query, param_count, field_count,
id, errno, error, sqlstate
- added constructor
- minor fixes, prototypes
2003-11-23 05:20:07 +08:00
ce = mysqli_result_class_entry ;
zend_hash_init ( & mysqli_result_properties , 0 , NULL , NULL , 1 ) ;
MYSQLI_ADD_PROPERTIES ( & mysqli_result_properties , mysqli_result_property_entries ) ;
2008-03-19 00:57:31 +08:00
MYSQLI_ADD_PROPERTIES_INFO ( ce , mysqli_result_property_info_entries ) ;
- Added multiquery support:
mysqli_multi_query
mysqli_more_results
mysqli_next_results
- added read-only properties (and removed methods)
object mysql
affected_rows
client_flags
client_version
errno, error,
host, host_info, info
server_capabilities, server_version
sqlstate, port, protocol_version,
server_language
thread_id, user, warning_count
object result
current_field, field_count,
lengths, num_rows, type
object stmt
query, param_count, field_count,
id, errno, error, sqlstate
- added constructor
- minor fixes, prototypes
2003-11-23 05:20:07 +08:00
zend_hash_add ( & classes , ce - > name , ce - > name_length + 1 , & mysqli_result_properties , sizeof ( mysqli_result_properties ) , NULL ) ;
2003-02-12 08:45:53 +08:00
REGISTER_MYSQLI_CLASS_ENTRY ( " mysqli_stmt " , mysqli_stmt_class_entry , mysqli_stmt_methods ) ;
- Added multiquery support:
mysqli_multi_query
mysqli_more_results
mysqli_next_results
- added read-only properties (and removed methods)
object mysql
affected_rows
client_flags
client_version
errno, error,
host, host_info, info
server_capabilities, server_version
sqlstate, port, protocol_version,
server_language
thread_id, user, warning_count
object result
current_field, field_count,
lengths, num_rows, type
object stmt
query, param_count, field_count,
id, errno, error, sqlstate
- added constructor
- minor fixes, prototypes
2003-11-23 05:20:07 +08:00
ce = mysqli_stmt_class_entry ;
zend_hash_init ( & mysqli_stmt_properties , 0 , NULL , NULL , 1 ) ;
MYSQLI_ADD_PROPERTIES ( & mysqli_stmt_properties , mysqli_stmt_property_entries ) ;
2008-03-19 00:57:31 +08:00
MYSQLI_ADD_PROPERTIES_INFO ( ce , mysqli_stmt_property_info_entries ) ;
- Added multiquery support:
mysqli_multi_query
mysqli_more_results
mysqli_next_results
- added read-only properties (and removed methods)
object mysql
affected_rows
client_flags
client_version
errno, error,
host, host_info, info
server_capabilities, server_version
sqlstate, port, protocol_version,
server_language
thread_id, user, warning_count
object result
current_field, field_count,
lengths, num_rows, type
object stmt
query, param_count, field_count,
id, errno, error, sqlstate
- added constructor
- minor fixes, prototypes
2003-11-23 05:20:07 +08:00
zend_hash_add ( & classes , ce - > name , ce - > name_length + 1 , & mysqli_stmt_properties , sizeof ( mysqli_stmt_properties ) , NULL ) ;
2003-02-12 08:45:53 +08:00
/* mysqli_options */
REGISTER_LONG_CONSTANT ( " MYSQLI_READ_DEFAULT_GROUP " , MYSQL_READ_DEFAULT_GROUP , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " MYSQLI_READ_DEFAULT_FILE " , MYSQL_READ_DEFAULT_FILE , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " MYSQLI_OPT_CONNECT_TIMEOUT " , MYSQL_OPT_CONNECT_TIMEOUT , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " MYSQLI_OPT_LOCAL_INFILE " , MYSQL_OPT_LOCAL_INFILE , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " MYSQLI_INIT_COMMAND " , MYSQL_INIT_COMMAND , CONST_CS | CONST_PERSISTENT ) ;
2008-03-11 04:15:38 +08:00
# if defined(MYSQLI_USE_MYSQLND)
2007-10-06 05:23:56 +08:00
REGISTER_LONG_CONSTANT ( " MYSQLI_OPT_NET_CMD_BUFFER_SIZE " , MYSQLND_OPT_NET_CMD_BUFFER_SIZE , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " MYSQLI_OPT_NET_READ_BUFFER_SIZE " , MYSQLND_OPT_NET_READ_BUFFER_SIZE , CONST_CS | CONST_PERSISTENT ) ;
# endif
# ifdef MYSQLND_STRING_TO_INT_CONVERSION
2008-09-16 02:09:20 +08:00
REGISTER_LONG_CONSTANT ( " MYSQLI_OPT_INT_AND_FLOAT_NATIVE " , MYSQLND_OPT_INT_AND_FLOAT_NATIVE , CONST_CS | CONST_PERSISTENT ) ;
2007-10-06 05:23:56 +08:00
# endif
2003-02-12 08:45:53 +08:00
/* mysqli_real_connect flags */
REGISTER_LONG_CONSTANT ( " MYSQLI_CLIENT_SSL " , CLIENT_SSL , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " MYSQLI_CLIENT_COMPRESS " , CLIENT_COMPRESS , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " MYSQLI_CLIENT_INTERACTIVE " , CLIENT_INTERACTIVE , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " MYSQLI_CLIENT_IGNORE_SPACE " , CLIENT_IGNORE_SPACE , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " MYSQLI_CLIENT_NO_SCHEMA " , CLIENT_NO_SCHEMA , CONST_CS | CONST_PERSISTENT ) ;
2004-08-09 12:34:01 +08:00
REGISTER_LONG_CONSTANT ( " MYSQLI_CLIENT_FOUND_ROWS " , CLIENT_FOUND_ROWS , CONST_CS | CONST_PERSISTENT ) ;
2003-02-12 08:45:53 +08:00
/* for mysqli_query */
2008-01-29 02:25:50 +08:00
REGISTER_LONG_CONSTANT ( " MYSQLI_STORE_RESULT " , MYSQLI_STORE_RESULT , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " MYSQLI_USE_RESULT " , MYSQLI_USE_RESULT , CONST_CS | CONST_PERSISTENT ) ;
2008-03-11 04:15:38 +08:00
# if defined(MYSQLI_USE_MYSQLND) && defined(MYSQLND_THREADED)
2008-01-29 02:25:50 +08:00
REGISTER_LONG_CONSTANT ( " MYSQLI_BG_STORE_RESULT " , MYSQLI_BG_STORE_RESULT , CONST_CS | CONST_PERSISTENT ) ;
# endif
2003-02-12 08:45:53 +08:00
/* for mysqli_fetch_assoc */
REGISTER_LONG_CONSTANT ( " MYSQLI_ASSOC " , MYSQLI_ASSOC , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " MYSQLI_NUM " , MYSQLI_NUM , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " MYSQLI_BOTH " , MYSQLI_BOTH , CONST_CS | CONST_PERSISTENT ) ;
2004-07-07 16:02:27 +08:00
/* for mysqli_stmt_set_attr */
REGISTER_LONG_CONSTANT ( " MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH " , STMT_ATTR_UPDATE_MAX_LENGTH , CONST_CS | CONST_PERSISTENT ) ;
2004-07-23 20:47:36 +08:00
2008-03-11 04:15:38 +08:00
# if MYSQL_VERSION_ID > 50003 || defined(MYSQLI_USE_MYSQLND)
2004-07-23 20:47:36 +08:00
REGISTER_LONG_CONSTANT ( " MYSQLI_STMT_ATTR_CURSOR_TYPE " , STMT_ATTR_CURSOR_TYPE , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " MYSQLI_CURSOR_TYPE_NO_CURSOR " , CURSOR_TYPE_NO_CURSOR , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " MYSQLI_CURSOR_TYPE_READ_ONLY " , CURSOR_TYPE_READ_ONLY , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " MYSQLI_CURSOR_TYPE_FOR_UPDATE " , CURSOR_TYPE_FOR_UPDATE , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " MYSQLI_CURSOR_TYPE_SCROLLABLE " , CURSOR_TYPE_SCROLLABLE , CONST_CS | CONST_PERSISTENT ) ;
# endif
2005-06-22 17:12:43 +08:00
2008-03-11 04:15:38 +08:00
# if MYSQL_VERSION_ID > 50007 || defined(MYSQLI_USE_MYSQLND)
2005-06-22 17:12:43 +08:00
REGISTER_LONG_CONSTANT ( " MYSQLI_STMT_ATTR_PREFETCH_ROWS " , STMT_ATTR_PREFETCH_ROWS , CONST_CS | CONST_PERSISTENT ) ;
# endif
2003-02-12 08:45:53 +08:00
/* column information */
REGISTER_LONG_CONSTANT ( " MYSQLI_NOT_NULL_FLAG " , NOT_NULL_FLAG , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " MYSQLI_PRI_KEY_FLAG " , PRI_KEY_FLAG , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " MYSQLI_UNIQUE_KEY_FLAG " , UNIQUE_KEY_FLAG , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " MYSQLI_MULTIPLE_KEY_FLAG " , MULTIPLE_KEY_FLAG , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " MYSQLI_BLOB_FLAG " , BLOB_FLAG , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " MYSQLI_UNSIGNED_FLAG " , UNSIGNED_FLAG , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " MYSQLI_ZEROFILL_FLAG " , ZEROFILL_FLAG , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " MYSQLI_AUTO_INCREMENT_FLAG " , AUTO_INCREMENT_FLAG , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " MYSQLI_TIMESTAMP_FLAG " , TIMESTAMP_FLAG , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " MYSQLI_SET_FLAG " , SET_FLAG , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " MYSQLI_NUM_FLAG " , NUM_FLAG , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " MYSQLI_PART_KEY_FLAG " , PART_KEY_FLAG , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " MYSQLI_GROUP_FLAG " , GROUP_FLAG , CONST_CS | CONST_PERSISTENT ) ;
2008-02-12 00:44:48 +08:00
REGISTER_LONG_CONSTANT ( " MYSQLI_ENUM_FLAG " , ENUM_FLAG , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " MYSQLI_BINARY_FLAG " , BINARY_FLAG , CONST_CS | CONST_PERSISTENT ) ;
2008-03-11 04:15:38 +08:00
# if MYSQL_VERSION_ID > 50001 || defined(MYSQLI_USE_MYSQLND)
2008-02-12 00:44:48 +08:00
REGISTER_LONG_CONSTANT ( " MYSQLI_NO_DEFAULT_VALUE_FLAG " , NO_DEFAULT_VALUE_FLAG , CONST_CS | CONST_PERSISTENT ) ;
2008-03-10 21:39:53 +08:00
# endif
2008-02-12 00:44:48 +08:00
2008-03-11 04:15:38 +08:00
# if (MYSQL_VERSION_ID > 51122 && MYSQL_VERSION_ID < 60000) || (MYSQL_VERSION_ID > 60003) || defined(MYSQLI_USE_MYSQLND)
2008-02-12 00:44:48 +08:00
REGISTER_LONG_CONSTANT ( " MYSQLI_ON_UPDATE_NOW_FLAG " , ON_UPDATE_NOW_FLAG , CONST_CS | CONST_PERSISTENT ) ;
# endif
2003-02-12 08:45:53 +08:00
REGISTER_LONG_CONSTANT ( " MYSQLI_TYPE_DECIMAL " , FIELD_TYPE_DECIMAL , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " MYSQLI_TYPE_TINY " , FIELD_TYPE_TINY , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " MYSQLI_TYPE_SHORT " , FIELD_TYPE_SHORT , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " MYSQLI_TYPE_LONG " , FIELD_TYPE_LONG , CONST_CS | CONST_PERSISTENT ) ;
2004-01-29 06:51:54 +08:00
REGISTER_LONG_CONSTANT ( " MYSQLI_TYPE_FLOAT " , FIELD_TYPE_FLOAT , CONST_CS | CONST_PERSISTENT ) ;
2003-02-12 08:45:53 +08:00
REGISTER_LONG_CONSTANT ( " MYSQLI_TYPE_DOUBLE " , FIELD_TYPE_DOUBLE , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " MYSQLI_TYPE_NULL " , FIELD_TYPE_NULL , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " MYSQLI_TYPE_TIMESTAMP " , FIELD_TYPE_TIMESTAMP , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " MYSQLI_TYPE_LONGLONG " , FIELD_TYPE_LONGLONG , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " MYSQLI_TYPE_INT24 " , FIELD_TYPE_INT24 , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " MYSQLI_TYPE_DATE " , FIELD_TYPE_DATE , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " MYSQLI_TYPE_TIME " , FIELD_TYPE_TIME , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " MYSQLI_TYPE_DATETIME " , FIELD_TYPE_DATETIME , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " MYSQLI_TYPE_YEAR " , FIELD_TYPE_YEAR , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " MYSQLI_TYPE_NEWDATE " , FIELD_TYPE_NEWDATE , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " MYSQLI_TYPE_ENUM " , FIELD_TYPE_ENUM , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " MYSQLI_TYPE_SET " , FIELD_TYPE_SET , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " MYSQLI_TYPE_TINY_BLOB " , FIELD_TYPE_TINY_BLOB , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " MYSQLI_TYPE_MEDIUM_BLOB " , FIELD_TYPE_MEDIUM_BLOB , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " MYSQLI_TYPE_LONG_BLOB " , FIELD_TYPE_LONG_BLOB , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " MYSQLI_TYPE_BLOB " , FIELD_TYPE_BLOB , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " MYSQLI_TYPE_VAR_STRING " , FIELD_TYPE_VAR_STRING , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " MYSQLI_TYPE_STRING " , FIELD_TYPE_STRING , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " MYSQLI_TYPE_CHAR " , FIELD_TYPE_CHAR , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " MYSQLI_TYPE_INTERVAL " , FIELD_TYPE_INTERVAL , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " MYSQLI_TYPE_GEOMETRY " , FIELD_TYPE_GEOMETRY , CONST_CS | CONST_PERSISTENT ) ;
2008-03-11 04:15:38 +08:00
# if MYSQL_VERSION_ID > 50002 || defined(MYSQLI_USE_MYSQLND)
2006-01-14 22:15:41 +08:00
REGISTER_LONG_CONSTANT ( " MYSQLI_TYPE_NEWDECIMAL " , FIELD_TYPE_NEWDECIMAL , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " MYSQLI_TYPE_BIT " , FIELD_TYPE_BIT , CONST_CS | CONST_PERSISTENT ) ;
# endif
2007-10-06 05:23:56 +08:00
REGISTER_LONG_CONSTANT ( " MYSQLI_SET_CHARSET_NAME " , MYSQL_SET_CHARSET_NAME , CONST_CS | CONST_PERSISTENT ) ;
2006-01-14 22:15:41 +08:00
2005-04-20 20:50:13 +08:00
/* bind support */
2003-02-12 08:45:53 +08:00
REGISTER_LONG_CONSTANT ( " MYSQLI_NO_DATA " , MYSQL_NO_DATA , CONST_CS | CONST_PERSISTENT ) ;
2005-04-20 21:03:01 +08:00
# ifdef MYSQL_DATA_TRUNCATED
REGISTER_LONG_CONSTANT ( " MYSQLI_DATA_TRUNCATED " , MYSQL_DATA_TRUNCATED , CONST_CS | CONST_PERSISTENT ) ;
2005-04-20 20:50:13 +08:00
# endif
2003-03-11 09:19:21 +08:00
2003-12-13 08:28:21 +08:00
/* reporting */
REGISTER_LONG_CONSTANT ( " MYSQLI_REPORT_INDEX " , MYSQLI_REPORT_INDEX , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " MYSQLI_REPORT_ERROR " , MYSQLI_REPORT_ERROR , CONST_CS | CONST_PERSISTENT ) ;
2006-03-30 19:21:51 +08:00
REGISTER_LONG_CONSTANT ( " MYSQLI_REPORT_STRICT " , MYSQLI_REPORT_STRICT , CONST_CS | CONST_PERSISTENT ) ;
2003-12-13 08:28:21 +08:00
REGISTER_LONG_CONSTANT ( " MYSQLI_REPORT_ALL " , MYSQLI_REPORT_ALL , CONST_CS | CONST_PERSISTENT ) ;
2004-01-29 06:51:54 +08:00
REGISTER_LONG_CONSTANT ( " MYSQLI_REPORT_OFF " , 0 , CONST_CS | CONST_PERSISTENT ) ;
2003-03-11 09:19:21 +08:00
2008-02-13 06:05:34 +08:00
/* We use non-nested macros with expansion, as VC has problems */
2008-03-11 04:15:38 +08:00
# ifdef MYSQLI_USE_MYSQLND
2008-02-13 06:05:34 +08:00
REGISTER_LONG_CONSTANT ( " MYSQLI_DEBUG_TRACE_ENABLED " , MYSQLND_DBG_ENABLED , CONST_CS | CONST_PERSISTENT ) ;
2008-02-12 00:44:48 +08:00
# else
# ifndef DBUG_OFF
2008-02-13 06:05:34 +08:00
REGISTER_LONG_CONSTANT ( " MYSQLI_DEBUG_TRACE_ENABLED " , 0 , CONST_CS | CONST_PERSISTENT ) ;
2008-02-12 00:44:48 +08:00
# else
2008-02-13 06:05:34 +08:00
REGISTER_LONG_CONSTANT ( " MYSQLI_DEBUG_TRACE_ENABLED " , 1 , CONST_CS | CONST_PERSISTENT ) ;
2008-02-12 00:44:48 +08:00
# endif
# endif
2008-07-15 21:11:09 +08:00
REGISTER_LONG_CONSTANT ( " MYSQLI_SERVER_QUERY_NO_GOOD_INDEX_USED " , SERVER_QUERY_NO_GOOD_INDEX_USED , CONST_CS | CONST_PERSISTENT ) ;
REGISTER_LONG_CONSTANT ( " MYSQLI_SERVER_QUERY_NO_INDEX_USED " , SERVER_QUERY_NO_INDEX_USED , CONST_CS | CONST_PERSISTENT ) ;
# ifdef SERVER_QUERY_WAS_SLOW
REGISTER_LONG_CONSTANT ( " MYSQLI_SERVER_QUERY_WAS_SLOW " , SERVER_QUERY_WAS_SLOW , CONST_CS | CONST_PERSISTENT ) ;
# endif
2003-02-12 08:45:53 +08:00
return SUCCESS ;
}
/* }}} */
/* {{{ PHP_MSHUTDOWN_FUNCTION
*/
PHP_MSHUTDOWN_FUNCTION ( mysqli )
{
2008-03-11 04:15:38 +08:00
# ifndef MYSQLI_USE_MYSQLND
2007-10-06 05:23:56 +08:00
# if MYSQL_VERSION_ID >= 40000
2007-06-26 00:01:30 +08:00
# ifdef PHP_WIN32
2007-09-12 17:12:56 +08:00
unsigned long client_ver = mysql_get_client_version ( ) ;
2007-10-06 05:23:56 +08:00
/*
2008-03-08 23:00:50 +08:00
Can ' t call mysql_server_end ( ) multiple times prior to 5.0 .46 on Windows .
2007-10-06 05:23:56 +08:00
PHP bug # 41350 MySQL bug # 25621
*/
2008-03-08 23:00:50 +08:00
if ( ( client_ver > = 50046 & & client_ver < 50100 ) | | client_ver > 50122 ) {
2007-06-26 00:01:30 +08:00
mysql_server_end ( ) ;
}
# else
mysql_server_end ( ) ;
# endif
2007-10-06 05:23:56 +08:00
# endif
# else
mysqlnd_palloc_free_cache ( mysqli_mysqlnd_zval_cache ) ;
mysqlnd_qcache_free_cache_reference ( & mysqli_mysqlnd_qcache ) ;
# endif
2007-06-26 00:01:30 +08:00
2005-01-08 00:34:55 +08:00
zend_hash_destroy ( & mysqli_driver_properties ) ;
2003-12-10 18:06:07 +08:00
zend_hash_destroy ( & mysqli_result_properties ) ;
zend_hash_destroy ( & mysqli_stmt_properties ) ;
2005-01-07 22:59:59 +08:00
zend_hash_destroy ( & mysqli_warning_properties ) ;
zend_hash_destroy ( & mysqli_link_properties ) ;
- Added multiquery support:
mysqli_multi_query
mysqli_more_results
mysqli_next_results
- added read-only properties (and removed methods)
object mysql
affected_rows
client_flags
client_version
errno, error,
host, host_info, info
server_capabilities, server_version
sqlstate, port, protocol_version,
server_language
thread_id, user, warning_count
object result
current_field, field_count,
lengths, num_rows, type
object stmt
query, param_count, field_count,
id, errno, error, sqlstate
- added constructor
- minor fixes, prototypes
2003-11-23 05:20:07 +08:00
zend_hash_destroy ( & classes ) ;
2003-02-12 08:45:53 +08:00
UNREGISTER_INI_ENTRIES ( ) ;
return SUCCESS ;
}
/* }}} */
/* {{{ PHP_RINIT_FUNCTION
*/
PHP_RINIT_FUNCTION ( mysqli )
{
2008-03-11 04:15:38 +08:00
# if !defined(MYSQLI_USE_MYSQLND) && defined(ZTS) && MYSQL_VERSION_ID >= 40000
2007-06-26 00:01:30 +08:00
if ( mysql_thread_init ( ) ) {
return FAILURE ;
}
# endif
2003-02-15 00:49:09 +08:00
MyG ( error_msg ) = NULL ;
MyG ( error_no ) = 0 ;
2008-03-11 04:15:38 +08:00
# ifdef MYSQLI_USE_MYSQLND
2007-10-06 05:23:56 +08:00
MyG ( mysqlnd_thd_zval_cache ) = mysqlnd_palloc_rinit ( mysqli_mysqlnd_zval_cache ) ;
# endif
2003-02-15 00:49:09 +08:00
2003-02-12 08:45:53 +08:00
return SUCCESS ;
}
/* }}} */
2008-06-25 06:22:48 +08:00
# ifdef MYSQLI_USE_MYSQLND
static void php_mysqli_persistent_helper_for_every ( void * p )
{
TSRMLS_FETCH ( ) ;
mysqlnd_end_psession ( ( MYSQLND * ) p ) ;
} /* }}} */
static int php_mysqli_persistent_helper_once ( zend_rsrc_list_entry * le TSRMLS_DC )
{
if ( le - > type = = php_le_pmysqli ( ) ) {
mysqli_plist_entry * plist = ( mysqli_plist_entry * ) le - > ptr ;
zend_ptr_stack_apply ( & plist - > free_links , php_mysqli_persistent_helper_for_every ) ;
}
return ZEND_HASH_APPLY_KEEP ;
} /* }}} */
# endif
2003-02-12 08:45:53 +08:00
/* {{{ PHP_RSHUTDOWN_FUNCTION
*/
PHP_RSHUTDOWN_FUNCTION ( mysqli )
{
2007-10-06 05:23:56 +08:00
/* check persistent connections, move used to free */
2008-03-11 04:15:38 +08:00
# if !defined(MYSQLI_USE_MYSQLND) && defined(ZTS) && MYSQL_VERSION_ID >= 40000
2007-06-26 00:01:30 +08:00
mysql_thread_end ( ) ;
# endif
2003-02-15 00:49:09 +08:00
if ( MyG ( error_msg ) ) {
efree ( MyG ( error_msg ) ) ;
}
2008-03-11 04:15:38 +08:00
# ifdef MYSQLI_USE_MYSQLND
2008-06-25 06:22:48 +08:00
zend_hash_apply ( & EG ( persistent_list ) , ( apply_func_t ) php_mysqli_persistent_helper_once TSRMLS_CC ) ;
2007-10-06 05:23:56 +08:00
mysqlnd_palloc_rshutdown ( MyG ( mysqlnd_thd_zval_cache ) ) ;
# endif
2003-02-12 08:45:53 +08:00
return SUCCESS ;
}
/* }}} */
2007-10-06 05:23:56 +08:00
2003-02-12 08:45:53 +08:00
/* {{{ PHP_MINFO_FUNCTION
*/
PHP_MINFO_FUNCTION ( mysqli )
{
2007-10-06 05:23:56 +08:00
char buf [ 32 ] ;
2003-02-12 08:45:53 +08:00
php_info_print_table_start ( ) ;
php_info_print_table_header ( 2 , " MysqlI Support " , " enabled " ) ;
2006-04-02 17:40:19 +08:00
php_info_print_table_row ( 2 , " Client API library version " , mysql_get_client_info ( ) ) ;
2007-10-06 05:23:56 +08:00
snprintf ( buf , sizeof ( buf ) , " %ld " , MyG ( num_active_persistent ) ) ;
php_info_print_table_row ( 2 , " Active Persistent Links " , buf ) ;
snprintf ( buf , sizeof ( buf ) , " %ld " , MyG ( num_inactive_persistent ) ) ;
php_info_print_table_row ( 2 , " Inactive Persistent Links " , buf ) ;
snprintf ( buf , sizeof ( buf ) , " %ld " , MyG ( num_links ) ) ;
php_info_print_table_row ( 2 , " Active Links " , buf ) ;
2008-03-11 04:15:38 +08:00
# if !defined(MYSQLI_USE_MYSQLND)
2006-04-02 17:40:19 +08:00
php_info_print_table_row ( 2 , " Client API header version " , MYSQL_SERVER_VERSION ) ;
2003-02-12 08:45:53 +08:00
php_info_print_table_row ( 2 , " MYSQLI_SOCKET " , MYSQL_UNIX_ADDR ) ;
2007-10-06 05:23:56 +08:00
# else
{
zval values ;
php_info_print_table_header ( 2 , " Persistent cache " , mysqli_mysqlnd_zval_cache ? " enabled " : " disabled " ) ;
if ( mysqli_mysqlnd_zval_cache ) {
/* Now report cache status */
mysqlnd_palloc_stats ( mysqli_mysqlnd_zval_cache , & values ) ;
mysqlnd_minfo_print_hash ( & values ) ;
zval_dtor ( & values ) ;
}
}
# endif
2003-02-12 08:45:53 +08:00
php_info_print_table_end ( ) ;
DISPLAY_INI_ENTRIES ( ) ;
}
/* }}} */
2004-12-26 21:16:40 +08:00
/* {{{ mixed mysqli_stmt_construct()
constructor for statement object .
Parameters :
2006-03-24 17:32:24 +08:00
object - > mysqli_stmt_init
2004-12-26 21:16:40 +08:00
object , query - > mysqli_prepare
*/
2008-03-19 00:57:31 +08:00
PHP_FUNCTION ( mysqli_stmt_construct )
2004-12-26 21:16:40 +08:00
{
MY_MYSQL * mysql ;
2007-10-06 05:23:56 +08:00
zval * mysql_link ;
2004-12-26 21:16:40 +08:00
MY_STMT * stmt ;
2007-10-06 05:23:56 +08:00
MYSQLI_RESOURCE * mysqli_resource ;
2005-10-11 04:03:00 +08:00
char * statement ;
2007-10-06 05:23:56 +08:00
int statement_len ;
2004-12-26 21:16:40 +08:00
switch ( ZEND_NUM_ARGS ( ) )
{
case 1 : /* mysql_stmt_init */
2007-10-06 05:23:56 +08:00
if ( zend_parse_parameters ( 1 TSRMLS_CC , " O " , & mysql_link , mysqli_link_class_entry ) = = FAILURE ) {
2004-12-26 21:16:40 +08:00
return ;
}
2006-03-24 17:32:24 +08:00
MYSQLI_FETCH_RESOURCE ( mysql , MY_MYSQL * , & mysql_link , " mysqli_link " , MYSQLI_STATUS_VALID ) ;
2004-12-26 21:16:40 +08:00
stmt = ( MY_STMT * ) ecalloc ( 1 , sizeof ( MY_STMT ) ) ;
stmt - > stmt = mysql_stmt_init ( mysql - > mysql ) ;
break ;
case 2 :
2007-10-06 05:23:56 +08:00
if ( zend_parse_parameters ( 2 TSRMLS_CC , " Os " , & mysql_link , mysqli_link_class_entry , & statement , & statement_len ) = = FAILURE ) {
2004-12-26 21:16:40 +08:00
return ;
}
2006-03-24 17:32:24 +08:00
MYSQLI_FETCH_RESOURCE ( mysql , MY_MYSQL * , & mysql_link , " mysqli_link " , MYSQLI_STATUS_VALID ) ;
2004-12-26 21:16:40 +08:00
stmt = ( MY_STMT * ) ecalloc ( 1 , sizeof ( MY_STMT ) ) ;
2007-10-06 05:23:56 +08:00
2004-12-26 21:16:40 +08:00
if ( ( stmt - > stmt = mysql_stmt_init ( mysql - > mysql ) ) ) {
2008-03-19 00:57:31 +08:00
mysql_stmt_prepare ( stmt - > stmt , ( char * ) statement , statement_len ) ;
2004-12-26 21:16:40 +08:00
}
break ;
default :
WRONG_PARAM_COUNT ;
break ;
}
if ( ! stmt - > stmt ) {
efree ( stmt ) ;
RETURN_FALSE ;
}
mysqli_resource = ( MYSQLI_RESOURCE * ) ecalloc ( 1 , sizeof ( MYSQLI_RESOURCE ) ) ;
mysqli_resource - > ptr = ( void * ) stmt ;
2006-03-24 17:32:24 +08:00
mysqli_resource - > status = ( ZEND_NUM_ARGS ( ) = = 1 ) ? MYSQLI_STATUS_INITIALIZED : MYSQLI_STATUS_VALID ;
2004-12-26 21:16:40 +08:00
( ( mysqli_object * ) zend_object_store_get_object ( getThis ( ) TSRMLS_CC ) ) - > ptr = mysqli_resource ;
}
/* }}} */
/* {{{ mixed mysqli_result_construct()
constructor for result object .
Parameters :
object [ , mode ] - > mysqli_store / use_result
*/
2008-03-19 00:57:31 +08:00
PHP_FUNCTION ( mysqli_result_construct )
2004-12-26 21:16:40 +08:00
{
MY_MYSQL * mysql ;
2008-01-29 02:25:50 +08:00
MYSQL_RES * result = NULL ;
2005-10-11 04:03:00 +08:00
zval * mysql_link ;
2007-10-06 05:23:56 +08:00
MYSQLI_RESOURCE * mysqli_resource ;
2005-10-11 04:03:00 +08:00
long resmode = MYSQLI_STORE_RESULT ;
2004-12-26 21:16:40 +08:00
switch ( ZEND_NUM_ARGS ( ) ) {
case 1 :
2007-10-06 05:23:56 +08:00
if ( zend_parse_parameters ( 1 TSRMLS_CC , " O " , & mysql_link , mysqli_link_class_entry ) = = FAILURE ) {
2004-12-26 21:16:40 +08:00
return ;
}
2007-10-06 05:23:56 +08:00
break ;
2004-12-26 21:16:40 +08:00
case 2 :
2007-10-06 05:23:56 +08:00
if ( zend_parse_parameters ( 2 TSRMLS_CC , " Ol " , & mysql_link , mysqli_link_class_entry , & resmode ) = = FAILURE ) {
2004-12-26 21:16:40 +08:00
return ;
}
2007-10-06 05:23:56 +08:00
break ;
2004-12-26 21:16:40 +08:00
default :
WRONG_PARAM_COUNT ;
}
2006-03-24 17:32:24 +08:00
MYSQLI_FETCH_RESOURCE ( mysql , MY_MYSQL * , & mysql_link , " mysqli_link " , MYSQLI_STATUS_VALID ) ;
2004-12-26 21:16:40 +08:00
2008-01-29 02:25:50 +08:00
switch ( resmode ) {
case MYSQLI_STORE_RESULT :
result = mysql_store_result ( mysql - > mysql ) ;
break ;
case MYSQLI_USE_RESULT :
result = mysql_use_result ( mysql - > mysql ) ;
break ;
2008-03-11 04:15:38 +08:00
# if defined(MYSQLI_USE_MYSQLND) && defined(MYSQLND_THREADED)
2008-01-29 02:25:50 +08:00
case MYSQLI_BG_STORE_RESULT :
result = mysqli_bg_store_result ( mysql - > mysql ) ;
break ;
# endif
default :
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Invalid value for resultmode " ) ;
}
2004-12-26 21:16:40 +08:00
if ( ! result ) {
RETURN_FALSE ;
}
mysqli_resource = ( MYSQLI_RESOURCE * ) ecalloc ( 1 , sizeof ( MYSQLI_RESOURCE ) ) ;
mysqli_resource - > ptr = ( void * ) result ;
2006-03-24 17:32:24 +08:00
mysqli_resource - > status = MYSQLI_STATUS_VALID ;
2007-10-06 05:23:56 +08:00
2004-12-26 21:16:40 +08:00
( ( mysqli_object * ) zend_object_store_get_object ( getThis ( ) TSRMLS_CC ) ) - > ptr = mysqli_resource ;
}
/* }}} */
2003-02-12 08:45:53 +08:00
/* {{{ php_mysqli_fetch_into_hash
*/
2003-09-07 03:34:48 +08:00
void php_mysqli_fetch_into_hash ( INTERNAL_FUNCTION_PARAMETERS , int override_flags , int into_object )
2003-02-12 08:45:53 +08:00
{
2003-03-09 07:33:12 +08:00
MYSQL_RES * result ;
zval * mysql_result ;
2005-04-06 14:47:12 +08:00
long fetchtype ;
2007-10-06 05:23:56 +08:00
zval * ctor_params = NULL ;
zend_class_entry * ce = NULL ;
2008-03-11 04:15:38 +08:00
# if !defined(MYSQLI_USE_MYSQLND)
2003-03-09 07:33:12 +08:00
unsigned int i ;
MYSQL_FIELD * fields ;
MYSQL_ROW row ;
unsigned long * field_len ;
2007-10-06 05:23:56 +08:00
# endif
2003-02-12 08:45:53 +08:00
2003-09-07 03:34:48 +08:00
if ( into_object ) {
char * class_name ;
int class_name_len ;
2003-02-12 08:45:53 +08:00
2003-09-07 03:34:48 +08:00
if ( zend_parse_method_parameters ( ZEND_NUM_ARGS ( ) TSRMLS_CC , getThis ( ) , " O|sz " , & mysql_result , mysqli_result_class_entry , & class_name , & class_name_len , & ctor_params ) = = FAILURE ) {
return ;
}
if ( ZEND_NUM_ARGS ( ) < ( getThis ( ) ? 1 : 2 ) ) {
ce = zend_standard_class_def ;
} else {
ce = zend_fetch_class ( class_name , class_name_len , ZEND_FETCH_CLASS_AUTO TSRMLS_CC ) ;
}
if ( ! ce ) {
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " Could not find class '%s' " , class_name ) ;
return ;
}
fetchtype = MYSQLI_ASSOC ;
} else {
if ( override_flags ) {
if ( zend_parse_method_parameters ( ZEND_NUM_ARGS ( ) TSRMLS_CC , getThis ( ) , " O " , & mysql_result , mysqli_result_class_entry ) = = FAILURE ) {
return ;
}
fetchtype = override_flags ;
} else {
2004-08-15 13:48:16 +08:00
fetchtype = MYSQLI_BOTH ;
2003-09-07 03:34:48 +08:00
if ( zend_parse_method_parameters ( ZEND_NUM_ARGS ( ) TSRMLS_CC , getThis ( ) , " O|l " , & mysql_result , mysqli_result_class_entry , & fetchtype ) = = FAILURE ) {
return ;
}
}
2003-02-12 08:45:53 +08:00
}
2006-03-24 17:32:24 +08:00
MYSQLI_FETCH_RESOURCE ( result , MYSQL_RES * , & mysql_result , " mysqli_result " , MYSQLI_STATUS_VALID ) ;
2003-02-12 08:45:53 +08:00
2007-10-06 05:23:56 +08:00
if ( fetchtype < MYSQLI_ASSOC | | fetchtype > MYSQLI_BOTH ) {
2005-01-27 22:41:48 +08:00
php_error_docref ( NULL TSRMLS_CC , E_WARNING , " The result type should be either MYSQLI_NUM, MYSQLI_ASSOC or MYSQLI_BOTH " ) ;
RETURN_FALSE ;
}
2008-03-11 04:15:38 +08:00
# if !defined(MYSQLI_USE_MYSQLND)
2003-02-22 15:31:01 +08:00
if ( ! ( row = mysql_fetch_row ( result ) ) ) {
- Added multiquery support:
mysqli_multi_query
mysqli_more_results
mysqli_next_results
- added read-only properties (and removed methods)
object mysql
affected_rows
client_flags
client_version
errno, error,
host, host_info, info
server_capabilities, server_version
sqlstate, port, protocol_version,
server_language
thread_id, user, warning_count
object result
current_field, field_count,
lengths, num_rows, type
object stmt
query, param_count, field_count,
id, errno, error, sqlstate
- added constructor
- minor fixes, prototypes
2003-11-23 05:20:07 +08:00
RETURN_NULL ( ) ;
2003-02-22 15:31:01 +08:00
}
2003-03-09 07:33:12 +08:00
2003-12-13 08:28:21 +08:00
if ( fetchtype & MYSQLI_ASSOC ) {
fields = mysql_fetch_fields ( result ) ;
}
2003-02-22 15:31:01 +08:00
array_init ( return_value ) ;
2003-02-12 08:45:53 +08:00
field_len = mysql_fetch_lengths ( result ) ;
2003-02-15 00:49:09 +08:00
for ( i = 0 ; i < mysql_num_fields ( result ) ; i + + ) {
2003-02-12 08:45:53 +08:00
if ( row [ i ] ) {
2003-11-08 01:20:49 +08:00
zval * res ;
MAKE_STD_ZVAL ( res ) ;
2003-02-12 08:45:53 +08:00
/* check if we need magic quotes */
if ( PG ( magic_quotes_runtime ) ) {
2003-11-08 01:20:49 +08:00
Z_TYPE_P ( res ) = IS_STRING ;
Z_STRVAL_P ( res ) = php_addslashes ( row [ i ] , field_len [ i ] , & Z_STRLEN_P ( res ) , 0 TSRMLS_CC ) ;
2003-02-15 00:49:09 +08:00
} else {
2003-11-08 01:20:49 +08:00
ZVAL_STRINGL ( res , row [ i ] , field_len [ i ] , 1 ) ;
2003-02-12 08:45:53 +08:00
}
2003-11-08 01:20:49 +08:00
2003-02-12 08:45:53 +08:00
if ( fetchtype & MYSQLI_NUM ) {
2003-11-08 01:20:49 +08:00
add_index_zval ( return_value , i , res ) ;
2003-02-12 08:45:53 +08:00
}
if ( fetchtype & MYSQLI_ASSOC ) {
2003-11-08 01:20:49 +08:00
if ( fetchtype & MYSQLI_NUM ) {
2007-10-07 13:22:07 +08:00
Z_ADDREF_P ( res ) ;
2003-11-08 01:20:49 +08:00
}
add_assoc_zval ( return_value , fields [ i ] . name , res ) ;
2003-02-12 08:45:53 +08:00
}
2003-02-15 00:49:09 +08:00
} else {
2003-02-12 08:45:53 +08:00
if ( fetchtype & MYSQLI_NUM ) {
add_index_null ( return_value , i ) ;
}
if ( fetchtype & MYSQLI_ASSOC ) {
add_assoc_null ( return_value , fields [ i ] . name ) ;
}
}
}
2007-10-06 05:23:56 +08:00
# else
mysqlnd_fetch_into ( result , MYSQLND_FETCH_ASSOC , return_value , MYSQLND_MYSQLI ) ;
# endif
2003-03-09 07:33:12 +08:00
2007-10-06 05:23:56 +08:00
if ( into_object & & Z_TYPE_P ( return_value ) ! = IS_NULL ) {
2003-09-07 03:34:48 +08:00
zval dataset = * return_value ;
zend_fcall_info fci ;
zend_fcall_info_cache fcc ;
zval * retval_ptr ;
2007-10-06 05:23:56 +08:00
2003-09-07 03:34:48 +08:00
object_and_properties_init ( return_value , ce , NULL ) ;
zend_merge_properties ( return_value , Z_ARRVAL ( dataset ) , 1 TSRMLS_CC ) ;
2007-10-06 05:23:56 +08:00
2003-09-07 03:34:48 +08:00
if ( ce - > constructor ) {
fci . size = sizeof ( fci ) ;
fci . function_table = & ce - > function_table ;
fci . function_name = NULL ;
fci . symbol_table = NULL ;
fci . object_pp = & return_value ;
fci . retval_ptr_ptr = & retval_ptr ;
if ( ctor_params & & Z_TYPE_P ( ctor_params ) ! = IS_NULL ) {
if ( Z_TYPE_P ( ctor_params ) = = IS_ARRAY ) {
HashTable * ht = Z_ARRVAL_P ( ctor_params ) ;
Bucket * p ;
2007-10-06 05:23:56 +08:00
2003-09-07 03:34:48 +08:00
fci . param_count = 0 ;
2004-01-01 03:45:46 +08:00
fci . params = safe_emalloc ( sizeof ( zval * ) , ht - > nNumOfElements , 0 ) ;
2003-09-07 03:34:48 +08:00
p = ht - > pListHead ;
while ( p ! = NULL ) {
fci . params [ fci . param_count + + ] = ( zval * * ) p - > pData ;
p = p - > pListNext ;
}
} else {
/* Two problems why we throw exceptions here: PHP is typeless
* and hence passing one argument that ' s not an array could be
* by mistake and the other way round is possible , too . The
* single value is an array . Also we ' d have to make that one
* argument passed by reference .
*/
2006-05-10 08:00:13 +08:00
zend_throw_exception ( zend_exception_get_default ( TSRMLS_C ) , " Parameter ctor_params must be an array " , 0 TSRMLS_CC ) ;
2003-09-07 03:34:48 +08:00
return ;
}
} else {
fci . param_count = 0 ;
fci . params = NULL ;
}
fci . no_separation = 1 ;
fcc . initialized = 1 ;
fcc . function_handler = ce - > constructor ;
fcc . calling_scope = EG ( scope ) ;
2008-07-25 16:23:07 +08:00
fcc . called_scope = Z_OBJCE_P ( return_value ) ;
2003-09-07 03:34:48 +08:00
fcc . object_pp = & return_value ;
2007-10-06 05:23:56 +08:00
2003-09-07 03:34:48 +08:00
if ( zend_call_function ( & fci , & fcc TSRMLS_CC ) = = FAILURE ) {
2006-05-10 08:00:13 +08:00
zend_throw_exception_ex ( zend_exception_get_default ( TSRMLS_C ) , 0 TSRMLS_CC , " Could not execute %s::%s() " , ce - > name , ce - > constructor - > common . function_name ) ;
2003-09-07 03:34:48 +08:00
} else {
if ( retval_ptr ) {
zval_ptr_dtor ( & retval_ptr ) ;
}
}
if ( fci . params ) {
efree ( fci . params ) ;
}
} else if ( ctor_params ) {
2006-05-10 08:00:13 +08:00
zend_throw_exception_ex ( zend_exception_get_default ( TSRMLS_C ) , 0 TSRMLS_CC , " Class %s does not have a constructor hence you cannot use ctor_params " , ce - > name ) ;
2003-09-07 03:34:48 +08:00
}
}
2003-02-12 08:45:53 +08:00
}
/* }}} */
2003-02-15 00:49:09 +08:00
2008-03-11 04:15:38 +08:00
# if !defined(MYSQLI_USE_MYSQLND)
2007-10-06 05:23:56 +08:00
2004-06-06 02:31:56 +08:00
# define ALLOC_CALLBACK_ARGS(a, b, c)\
if ( c ) { \
a = ( zval * * * ) safe_emalloc ( c , sizeof ( zval * * ) , 0 ) ; \
for ( i = b ; i < c ; i + + ) { \
a [ i ] = emalloc ( sizeof ( zval * ) ) ; \
MAKE_STD_ZVAL ( * a [ i ] ) ; \
} \
}
# define FREE_CALLBACK_ARGS(a, b, c)\
if ( a ) { \
for ( i = b ; i < c ; i + + ) { \
zval_ptr_dtor ( a [ i ] ) ; \
efree ( a [ i ] ) ; \
} \
efree ( a ) ; \
}
# define LOCAL_INFILE_ERROR_MSG(source,dest)\
2008-03-19 00:57:31 +08:00
memset ( source , 0 , LOCAL_INFILE_ERROR_LEN ) ; \
memcpy ( source , dest , MIN ( strlen ( dest ) , LOCAL_INFILE_ERROR_LEN - 1 ) ) ; \
php_error_docref ( NULL TSRMLS_CC , E_WARNING , dest ) ;
2004-06-06 02:31:56 +08:00
2004-08-25 21:57:35 +08:00
2004-06-06 02:31:56 +08:00
/* {{{ php_local_infile_init
*/
2008-03-19 00:57:31 +08:00
static int php_local_infile_init ( void * * ptr , const char * filename , void * userdata )
2004-06-06 02:31:56 +08:00
{
mysqli_local_infile * data ;
2008-03-19 00:57:31 +08:00
MY_MYSQL * mysql ;
2007-10-06 05:23:56 +08:00
php_stream_context * context = NULL ;
2004-06-06 02:31:56 +08:00
2004-06-06 14:40:19 +08:00
TSRMLS_FETCH ( ) ;
2004-06-06 02:31:56 +08:00
/* save pointer to MY_MYSQL structure (userdata) */
if ( ! ( * ptr = data = ( ( mysqli_local_infile * ) calloc ( 1 , sizeof ( mysqli_local_infile ) ) ) ) ) {
return 1 ;
}
2004-08-25 21:57:35 +08:00
if ( ! ( mysql = ( MY_MYSQL * ) userdata ) ) {
2004-06-06 02:31:56 +08:00
LOCAL_INFILE_ERROR_MSG ( data - > error_msg , ER ( CR_UNKNOWN_ERROR ) ) ;
return 1 ;
}
2004-08-25 21:57:35 +08:00
/* check open_basedir */
if ( PG ( open_basedir ) ) {
if ( php_check_open_basedir_ex ( filename , 0 TSRMLS_CC ) = = - 1 ) {
LOCAL_INFILE_ERROR_MSG ( data - > error_msg , " open_basedir restriction in effect. Unable to open file " ) ;
return 1 ;
}
}
2004-06-06 02:31:56 +08:00
2004-08-25 21:57:35 +08:00
mysql - > li_stream = php_stream_open_wrapper_ex ( ( char * ) filename , " r " , 0 , NULL , context ) ;
2004-06-06 02:31:56 +08:00
2004-08-25 21:57:35 +08:00
if ( mysql - > li_stream = = NULL ) {
2007-02-24 10:17:47 +08:00
snprintf ( ( char * ) data - > error_msg , sizeof ( data - > error_msg ) , " Can't find file '%-.64s'. " , filename ) ;
2004-08-25 21:57:35 +08:00
return 1 ;
2004-06-06 02:31:56 +08:00
}
2004-08-25 21:57:35 +08:00
data - > userdata = mysql ;
2004-06-06 02:31:56 +08:00
2004-08-25 21:57:35 +08:00
return 0 ;
2004-06-06 02:31:56 +08:00
}
/* }}} */
2005-01-07 22:59:59 +08:00
/* {{{ int php_local_infile_read */
2008-03-19 00:57:31 +08:00
static int php_local_infile_read ( void * ptr , char * buf , uint buf_len )
2004-06-06 02:31:56 +08:00
{
2008-03-19 00:57:31 +08:00
mysqli_local_infile * data ;
2007-10-06 05:23:56 +08:00
MY_MYSQL * mysql ;
2004-06-06 02:31:56 +08:00
zval * * * callback_args ;
2004-08-25 21:57:35 +08:00
zval * retval ;
zval * fp ;
2004-06-06 02:31:56 +08:00
int argc = 4 ;
int i ;
long rc ;
2004-06-06 14:40:19 +08:00
TSRMLS_FETCH ( ) ;
2004-06-06 02:31:56 +08:00
data = ( mysqli_local_infile * ) ptr ;
mysql = data - > userdata ;
2004-08-25 21:57:35 +08:00
/* default processing */
if ( ! mysql - > li_read ) {
2007-10-06 05:23:56 +08:00
int count = ( int ) php_stream_read ( mysql - > li_stream , buf , buf_len ) ;
2004-08-25 21:57:35 +08:00
if ( count < 0 ) {
LOCAL_INFILE_ERROR_MSG ( data - > error_msg , ER ( 2 ) ) ;
}
return count ;
}
2004-06-06 02:31:56 +08:00
ALLOC_CALLBACK_ARGS ( callback_args , 1 , argc ) ;
2007-10-06 05:23:56 +08:00
2004-06-06 02:31:56 +08:00
/* set parameters: filepointer, buffer, buffer_len, errormsg */
2004-08-25 21:57:35 +08:00
MAKE_STD_ZVAL ( fp ) ;
php_stream_to_zval ( mysql - > li_stream , fp ) ;
callback_args [ 0 ] = & fp ;
2007-10-06 05:23:56 +08:00
ZVAL_STRING ( * callback_args [ 1 ] , " " , 1 ) ;
ZVAL_LONG ( * callback_args [ 2 ] , buf_len ) ;
ZVAL_STRING ( * callback_args [ 3 ] , " " , 1 ) ;
2008-03-19 00:57:31 +08:00
2004-06-06 02:31:56 +08:00
if ( call_user_function_ex ( EG ( function_table ) ,
NULL ,
2004-08-25 21:57:35 +08:00
mysql - > li_read ,
2004-06-06 02:31:56 +08:00
& retval ,
2007-10-06 05:23:56 +08:00
argc ,
2004-06-06 02:31:56 +08:00
callback_args ,
0 ,
NULL TSRMLS_CC ) = = SUCCESS ) {
rc = Z_LVAL_P ( retval ) ;
zval_ptr_dtor ( & retval ) ;
if ( rc > 0 ) {
2007-10-06 05:23:56 +08:00
if ( rc > = 0 & & rc ! = Z_STRLEN_P ( * callback_args [ 1 ] ) ) {
LOCAL_INFILE_ERROR_MSG ( data - > error_msg ,
" Mismatch between the return value of the callback and the content "
" length of the buffer. " ) ;
rc = - 1 ;
} else if ( rc > buf_len ) {
2004-06-06 02:31:56 +08:00
/* check buffer overflow */
2007-10-06 05:23:56 +08:00
LOCAL_INFILE_ERROR_MSG ( data - > error_msg , " Too much data returned " ) ;
2004-06-06 02:31:56 +08:00
rc = - 1 ;
} else {
2007-10-06 05:23:56 +08:00
memcpy ( buf , Z_STRVAL_P ( * callback_args [ 1 ] ) , MIN ( rc , Z_STRLEN_P ( * callback_args [ 1 ] ) ) ) ;
2004-06-06 02:31:56 +08:00
}
2007-10-06 05:23:56 +08:00
} else if ( rc < 0 ) {
2004-06-06 02:31:56 +08:00
LOCAL_INFILE_ERROR_MSG ( data - > error_msg , Z_STRVAL_P ( * callback_args [ 3 ] ) ) ;
}
} else {
LOCAL_INFILE_ERROR_MSG ( data - > error_msg , " Can't execute load data local init callback function " ) ;
rc = - 1 ;
}
2007-10-06 05:23:56 +08:00
/*
If the ( ab ) user has closed the file handle we should
not try to use it anymore or even close it
*/
if ( ! zend_rsrc_list_get_rsrc_type ( Z_LVAL_P ( fp ) TSRMLS_CC ) ) {
LOCAL_INFILE_ERROR_MSG ( data - > error_msg , " File handle closed " ) ;
rc = - 1 ;
/* Thus the end handler won't try to free already freed memory */
mysql - > li_stream = NULL ;
}
2004-06-06 02:31:56 +08:00
FREE_CALLBACK_ARGS ( callback_args , 1 , argc ) ;
2004-08-25 21:57:35 +08:00
efree ( fp ) ;
2004-06-06 02:31:56 +08:00
return rc ;
}
2005-01-07 22:59:59 +08:00
/* }}} */
2004-06-06 02:31:56 +08:00
/* {{{ php_local_infile_error
*/
2008-03-19 00:57:31 +08:00
static int php_local_infile_error ( void * ptr , char * error_msg , uint error_msg_len )
2004-06-06 02:31:56 +08:00
{
mysqli_local_infile * data = ( mysqli_local_infile * ) ptr ;
2004-08-25 21:57:35 +08:00
2004-06-06 02:31:56 +08:00
if ( data ) {
2007-02-17 02:48:53 +08:00
strlcpy ( error_msg , data - > error_msg , error_msg_len ) ;
2004-06-06 02:31:56 +08:00
return 2000 ;
2007-10-06 05:23:56 +08:00
}
2007-02-17 02:48:53 +08:00
strlcpy ( error_msg , ER ( CR_OUT_OF_MEMORY ) , error_msg_len ) ;
2004-06-06 02:31:56 +08:00
return CR_OUT_OF_MEMORY ;
}
/* }}} */
/* {{{ php_local_infile_end
*/
2008-03-19 00:57:31 +08:00
static void php_local_infile_end ( void * ptr )
2004-06-06 02:31:56 +08:00
{
2007-10-06 05:23:56 +08:00
mysqli_local_infile * data ;
MY_MYSQL * mysql ;
2004-06-06 02:31:56 +08:00
2004-06-06 14:40:19 +08:00
TSRMLS_FETCH ( ) ;
2004-06-06 02:31:56 +08:00
data = ( mysqli_local_infile * ) ptr ;
2006-07-27 18:53:15 +08:00
if ( ! data | | ! ( mysql = data - > userdata ) ) {
if ( data ) {
free ( data ) ;
}
2004-08-25 21:57:35 +08:00
return ;
2004-06-06 02:31:56 +08:00
}
2008-02-18 21:28:48 +08:00
if ( mysql - > li_stream ) {
php_stream_close ( mysql - > li_stream ) ;
}
2006-07-27 18:53:15 +08:00
free ( data ) ;
2007-10-06 05:23:56 +08:00
return ;
2004-06-06 02:31:56 +08:00
}
/* }}} */
2008-03-19 00:57:31 +08:00
/* {{{ void php_set_local_infile_handler_default
*/
void php_set_local_infile_handler_default ( MY_MYSQL * mysql ) {
/* register internal callback functions */
mysql_set_local_infile_handler ( mysql - > mysql , & php_local_infile_init , & php_local_infile_read ,
& php_local_infile_end , & php_local_infile_error , ( void * ) mysql ) ;
if ( mysql - > li_read ) {
zval_ptr_dtor ( & mysql - > li_read ) ;
mysql - > li_read = NULL ;
}
}
/* }}} */
2007-10-06 05:23:56 +08:00
# endif
2004-06-06 02:31:56 +08:00
2003-02-12 08:45:53 +08: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
*/