cvs: php-src /ext/mysqli mysqli.c mysqli_api.c mysqli_nonapi.c php_mysqli.h
| From: | Georg Richter | Date: | Wed, 25 Aug 2004 13:57:35 +0000 |
| Subject: | cvs: php-src /ext/mysqli mysqli.c mysqli_api.c mysqli_nonapi.c php_mysqli.h | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-28449@lists.php.net to get a copy of this message | ||
georg Wed Aug 25 09:57:35 2004 EDT
Modified files:
/php-src/ext/mysqli mysqli_api.c mysqli.c mysqli_nonapi.c
php_mysqli.h
Log:
changed local_infile_handler:
mysql client lib now uses php_local_infile functions by default, which allows
to use php_fopen_wrapper: e.g. LOAD DATA LOCAL INFILE 'http://foo.com/bar.csv' ...
mysql_set_local_infile_handler now only supports a callback function for read.
http://cvs.php.net/diff.php/php-src/ext/mysqli/mysqli_api.c?r1=1.91&r2=1.92&ty=u Index: php-src/ext/mysqli/mysqli_api.c diff -u php-src/ext/mysqli/mysqli_api.c:1.91 php-src/ext/mysqli/mysqli_api.c:1.92 --- php-src/ext/mysqli/mysqli_api.c:1.91 Thu Aug 12 18:14:06 2004 +++ php-src/ext/mysqli/mysqli_api.c Wed Aug 25 09:57:35 2004 @@ -15,7 +15,7 @@ | Author: Georg Richter <georg@php.net> | +----------------------------------------------------------------------+ - $Id: mysqli_api.c,v 1.91 2004/08/12 22:14:06 georg Exp $ + $Id: mysqli_api.c,v 1.92 2004/08/25 13:57:35 georg Exp $ */ #ifdef HAVE_CONFIG_H @@ -258,7 +258,7 @@ for (i=start; i < var_cnt + start ; i++) { ofs = i - start; stmt->result.is_null[ofs] = 0; - + //bind[ofs].truncated = NULL; col_type = (stmt->stmt->fields) ? stmt->stmt->fields[ofs].type : MYSQL_TYPE_STRING; switch (col_type) { @@ -406,7 +406,7 @@ MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link"); mysql_close(mysql->mysql); - + php_clear_mysql(mysql); MYSQLI_CLEAR_RESOURCE(&mysql_link); RETURN_TRUE; } @@ -1036,7 +1036,6 @@ { MY_MYSQL *mysql; zval *mysql_link; - int i; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) { return; @@ -1044,52 +1043,41 @@ MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link"); - for (i=0; i < 3; i++) { - if (&mysql->callback_func[i]) { - zval_dtor(&mysql->callback_func[i]); - } + if (mysql->li_read) { + efree(Z_STRVAL_P(mysql->li_read)); + zval_dtor(mysql->li_read); + mysql->li_read = NULL; } - - mysql_set_local_infile_default(mysql->mysql); } /* }}} */ -/* {{{ proto bool mysqli_set_local_infile_handler(object link, callback init_func, - callback read_func, callback end_func) +/* {{{ proto bool mysqli_set_local_infile_handler(object link, callback read_func) Set callback functions for LOAD DATA LOCAL INFILE */ PHP_FUNCTION(mysqli_set_local_infile_handler) { MY_MYSQL *mysql; zval *mysql_link; char *callback_name; - zval *callback_func[4]; - int i; + zval *callback_func; - if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Ozzzz", &mysql_link, mysqli_link_class_entry, - &callback_func[0], &callback_func[1], &callback_func[2], &callback_func[3]) == FAILURE) { + if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Oz", &mysql_link, mysqli_link_class_entry, + &callback_func) == FAILURE) { return; } MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link"); - /* check callback functions */ - for (i=0; i < 3; i++) { - if (!zend_is_callable(callback_func[i], 0, &callback_name)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Not a valid callback function %s", callback_name); - efree(callback_name); - RETURN_FALSE; - } + /* check callback function */ + if (!zend_is_callable(callback_func, 0, &callback_name)) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Not a valid callback function %s", callback_name); efree(callback_name); + RETURN_FALSE; } + efree(callback_name); - /* save callback functions */ - for (i=0; i < 3; i++) { - ZVAL_STRING(&mysql->callback_func[i], callback_func[i]->value.str.val, 1); - } - - /* 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); + /* save callback function */ + ALLOC_ZVAL(mysql->li_read); + ZVAL_STRING(mysql->li_read, callback_func->value.str.val, 1); } /* }}} */ @@ -1324,6 +1312,9 @@ php_mysqli_set_error(mysql_errno(mysql->mysql), (char *)mysql_error(mysql->mysql) TSRMLS_CC); mysql->mysql->reconnect = MyG(reconnect); + + /* set our own local_infile handler */ + php_set_local_infile_handler_default(mysql); if (object) { ((mysqli_object *) zend_object_store_get_object(object TSRMLS_CC))->valid = 1; http://cvs.php.net/diff.php/php-src/ext/mysqli/mysqli.c?r1=1.51&r2=1.52&ty=u Index: php-src/ext/mysqli/mysqli.c diff -u php-src/ext/mysqli/mysqli.c:1.51 php-src/ext/mysqli/mysqli.c:1.52 --- php-src/ext/mysqli/mysqli.c:1.51 Sun Aug 15 01:48:16 2004 +++ php-src/ext/mysqli/mysqli.c Wed Aug 25 09:57:35 2004 @@ -15,7 +15,7 @@ | Author: Georg Richter <georg@php.net> | +----------------------------------------------------------------------+ - $Id: mysqli.c,v 1.51 2004/08/15 05:48:16 georg Exp $ + $Id: mysqli.c,v 1.52 2004/08/25 13:57:35 georg Exp $ */ #ifdef HAVE_CONFIG_H @@ -107,16 +107,11 @@ /* {{{ php_clear_mysql */ void php_clear_mysql(MY_MYSQL *mysql) { - int i; - - for (i=0; i < 3; i++) { - if (&mysql->callback_func[i]) { - zval_dtor(&mysql->callback_func[i]); - } - } - - if (mysql->local_infile) { - zval_ptr_dtor(&mysql->local_infile); + if (mysql->li_read) { + printf("freeing...\n"); + efree(Z_STRVAL_P(mysql->li_read)); + FREE_ZVAL(mysql->li_read); + mysql->li_read = NULL; } } /* }}} */ @@ -774,15 +769,23 @@ memset(source, 0, LOCAL_INFILE_ERROR_LEN);\ memcpy(source, dest, LOCAL_INFILE_ERROR_LEN-1); +/* {{{ 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); + mysql->li_read = NULL; +} +/* }}} */ + /* {{{ php_local_infile_init */ int php_local_infile_init(void **ptr, const char *filename, void *userdata) { mysqli_local_infile *data; MY_MYSQL *mysql; - zval ***callback_args; - int argc = 2; - int i, rc = 0; + php_stream_context *context = NULL; TSRMLS_FETCH(); @@ -791,45 +794,28 @@ return 1; } - if (!(mysql = data->userdata = userdata)) { + if (!(mysql = (MY_MYSQL *)userdata)) { LOCAL_INFILE_ERROR_MSG(data->error_msg, ER(CR_UNKNOWN_ERROR)); return 1; } - ALLOC_CALLBACK_ARGS(callback_args, 0, argc); - - ZVAL_STRING(*callback_args[0], (char *)filename, 1); - ZVAL_STRING(*callback_args[1], "", 1); - - if (call_user_function_ex(EG(function_table), - NULL, - &mysql->callback_func[0], - &mysql->local_infile, - argc, - callback_args, - 0, - NULL TSRMLS_CC) == SUCCESS) { + /* 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; + } + } - /* check if user callback function returned a valid filehandle */ - convert_to_string_ex(callback_args[1]); + mysql->li_stream = php_stream_open_wrapper_ex((char *)filename, "r", 0, NULL, context); - if (Z_TYPE_P(mysql->local_infile) != IS_RESOURCE) { - if (!strlen(Z_STRVAL_P(*callback_args[1]))) { - LOCAL_INFILE_ERROR_MSG(data->error_msg, ER(CR_UNKNOWN_ERROR)); - } else { - LOCAL_INFILE_ERROR_MSG(data->error_msg, Z_STRVAL_P(*callback_args[1])); - } - rc = 1; - } else { - } - } else { - LOCAL_INFILE_ERROR_MSG(data->error_msg, "Can't execute load data local init callback function"); - rc = 1; + if (mysql->li_stream == NULL) { + return 1; } - FREE_CALLBACK_ARGS(callback_args, 0, argc); + data->userdata = mysql; - return rc; + return 0; } /* }}} */ @@ -838,7 +824,8 @@ mysqli_local_infile *data; MY_MYSQL *mysql; zval ***callback_args; - zval *retval; + zval *retval; + zval *fp; int argc = 4; int i; long rc; @@ -846,21 +833,35 @@ TSRMLS_FETCH(); data= (mysqli_local_infile *)ptr; - mysql = data->userdata; + /* default processing */ + if (!mysql->li_read) { + int count; + + count = (int)php_stream_read(mysql->li_stream, buf, buf_len); + + if (count < 0) { + LOCAL_INFILE_ERROR_MSG(data->error_msg, ER(2)); + } + + return count; + } + ALLOC_CALLBACK_ARGS(callback_args, 1, argc); /* set parameters: filepointer, buffer, buffer_len, errormsg */ - callback_args[0] = &mysql->local_infile; + MAKE_STD_ZVAL(fp); + php_stream_to_zval(mysql->li_stream, fp); + callback_args[0] = &fp; ZVAL_STRING(*callback_args[1], "", 1); ZVAL_LONG(*callback_args[2], buf_len); ZVAL_STRING(*callback_args[3], "", 1); if (call_user_function_ex(EG(function_table), NULL, - &mysql->callback_func[1], + mysql->li_read, &retval, argc, callback_args, @@ -888,6 +889,7 @@ } FREE_CALLBACK_ARGS(callback_args, 1, argc); + efree(fp); return rc; } @@ -896,6 +898,7 @@ int php_local_infile_error(void *ptr, char *error_msg, uint error_msg_len) { mysqli_local_infile *data = (mysqli_local_infile *) ptr; + if (data) { strcpy(error_msg, data->error_msg); return 2000; @@ -911,42 +914,19 @@ { mysqli_local_infile *data; MY_MYSQL *mysql; - zval ***callback_args; - zval *retval; - int argc = 1; - int i; TSRMLS_FETCH(); data= (mysqli_local_infile *)ptr; - mysql = data->userdata; - - ALLOC_CALLBACK_ARGS(callback_args, 1, argc); - - /* set parameters: filepointer, buffer, buffer_len, errormsg */ - - callback_args[0] = &mysql->local_infile; - - call_user_function_ex(EG(function_table), - NULL, - &mysql->callback_func[2], - &retval, - argc, - callback_args, - 0, - NULL TSRMLS_CC); - - if (retval) { - zval_ptr_dtor(&retval); - } - - if (mysql->local_infile) { - zval_ptr_dtor(&mysql->local_infile); + if (!(mysql = data->userdata)) { + efree(data); + return; } - FREE_CALLBACK_ARGS(callback_args, 1, argc); -// efree(data); + php_stream_close(mysql->li_stream); + //efree(data); + return; } /* }}} */ http://cvs.php.net/diff.php/php-src/ext/mysqli/mysqli_nonapi.c?r1=1.34&r2=1.35&ty=u Index: php-src/ext/mysqli/mysqli_nonapi.c diff -u php-src/ext/mysqli/mysqli_nonapi.c:1.34 php-src/ext/mysqli/mysqli_nonapi.c:1.35 --- php-src/ext/mysqli/mysqli_nonapi.c:1.34 Sat Jun 5 14:31:56 2004 +++ php-src/ext/mysqli/mysqli_nonapi.c Wed Aug 25 09:57:35 2004 @@ -15,7 +15,7 @@ | Author: Georg Richter <georg@php.net> | +----------------------------------------------------------------------+ - $Id: mysqli_nonapi.c,v 1.34 2004/06/05 18:31:56 georg Exp $ + $Id: mysqli_nonapi.c,v 1.35 2004/08/25 13:57:35 georg Exp $ */ #ifdef HAVE_CONFIG_H @@ -40,7 +40,6 @@ unsigned int hostname_len, username_len, passwd_len, dbname_len, socket_len; long port=0; - if (getThis() && !ZEND_NUM_ARGS()) { RETURN_NULL(); } @@ -90,6 +89,9 @@ mysql->mysql->reconnect = MyG(reconnect); + /* set our own local_infile handler */ + php_set_local_infile_handler_default(mysql); + mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE)); mysqli_resource->ptr = (void *)mysql; @@ -246,7 +248,6 @@ MYSQLI_REPORT_MYSQL_ERROR(mysql->mysql); RETURN_FALSE; } - if (!mysql_field_count(mysql->mysql)) { if (MyG(report_mode) & MYSQLI_REPORT_INDEX) { http://cvs.php.net/diff.php/php-src/ext/mysqli/php_mysqli.h?r1=1.38&r2=1.39&ty=u Index: php-src/ext/mysqli/php_mysqli.h diff -u php-src/ext/mysqli/php_mysqli.h:1.38 php-src/ext/mysqli/php_mysqli.h:1.39 --- php-src/ext/mysqli/php_mysqli.h:1.38 Wed Jul 7 04:02:27 2004 +++ php-src/ext/mysqli/php_mysqli.h Wed Aug 25 09:57:35 2004 @@ -15,7 +15,7 @@ | Author: Georg Richter <georg@php.net> | +----------------------------------------------------------------------+ - $Id: php_mysqli.h,v 1.38 2004/07/07 08:02:27 georg Exp $ + $Id: php_mysqli.h,v 1.39 2004/08/25 13:57:35 georg Exp $ */ /* A little hack to prevent build break, when mysql is used together with @@ -53,9 +53,8 @@ typedef struct { MYSQL *mysql; - /* callback functions for load data local infile support */ - zval callback_func[3]; - zval *local_infile; + zval *li_read; + php_stream *li_stream; } MY_MYSQL; typedef struct { @@ -112,6 +111,7 @@ extern void php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAMETERS, int override_flag, int into_object); extern void php_clear_stmt_bind(MY_STMT *stmt); +void php_clear_mysql(MY_MYSQL *); extern void php_free_stmt_bind_buffer(BIND_BUFFER bbuf, int type); extern void php_mysqli_report_error(char *sqlstate, int errorno, char *error TSRMLS_DC); extern void php_mysqli_report_index(char *query, unsigned int status TSRMLS_DC); @@ -119,6 +119,7 @@ extern int php_local_infile_read(void *, char *, uint); extern void php_local_infile_end(void *); extern int php_local_infile_error(void *, char *, uint); +extern void php_set_local_infile_handler_default(MY_MYSQL *); zend_class_entry *mysqli_link_class_entry; zend_class_entry *mysqli_stmt_class_entry;
http://cvs.php.net/diff.php/php-src/ext/mysqli/mysqli_api.c?r1=1.91&r2=1.92&ty=u Index: php-src/ext/mysqli/mysqli_api.c diff -u php-src/ext/mysqli/mysqli_api.c:1.91 php-src/ext/mysqli/mysqli_api.c:1.92 --- php-src/ext/mysqli/mysqli_api.c:1.91 Thu Aug 12 18:14:06 2004 +++ php-src/ext/mysqli/mysqli_api.c Wed Aug 25 09:57:35 2004 @@ -15,7 +15,7 @@ | Author: Georg Richter <georg@php.net> | +----------------------------------------------------------------------+ - $Id: mysqli_api.c,v 1.91 2004/08/12 22:14:06 georg Exp $ + $Id: mysqli_api.c,v 1.92 2004/08/25 13:57:35 georg Exp $ */ #ifdef HAVE_CONFIG_H @@ -258,7 +258,7 @@ for (i=start; i < var_cnt + start ; i++) { ofs = i - start; stmt->result.is_null[ofs] = 0; - + //bind[ofs].truncated = NULL; col_type = (stmt->stmt->fields) ? stmt->stmt->fields[ofs].type : MYSQL_TYPE_STRING; switch (col_type) { @@ -406,7 +406,7 @@ MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link"); mysql_close(mysql->mysql); - + php_clear_mysql(mysql); MYSQLI_CLEAR_RESOURCE(&mysql_link); RETURN_TRUE; } @@ -1036,7 +1036,6 @@ { MY_MYSQL *mysql; zval *mysql_link; - int i; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) { return; @@ -1044,52 +1043,41 @@ MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link"); - for (i=0; i < 3; i++) { - if (&mysql->callback_func[i]) { - zval_dtor(&mysql->callback_func[i]); - } + if (mysql->li_read) { + efree(Z_STRVAL_P(mysql->li_read)); + zval_dtor(mysql->li_read); + mysql->li_read = NULL; } - - mysql_set_local_infile_default(mysql->mysql); } /* }}} */ -/* {{{ proto bool mysqli_set_local_infile_handler(object link, callback init_func, - callback read_func, callback end_func) +/* {{{ proto bool mysqli_set_local_infile_handler(object link, callback read_func) Set callback functions for LOAD DATA LOCAL INFILE */ PHP_FUNCTION(mysqli_set_local_infile_handler) { MY_MYSQL *mysql; zval *mysql_link; char *callback_name; - zval *callback_func[4]; - int i; + zval *callback_func; - if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Ozzzz", &mysql_link, mysqli_link_class_entry, - &callback_func[0], &callback_func[1], &callback_func[2], &callback_func[3]) == FAILURE) { + if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Oz", &mysql_link, mysqli_link_class_entry, + &callback_func) == FAILURE) { return; } MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link"); - /* check callback functions */ - for (i=0; i < 3; i++) { - if (!zend_is_callable(callback_func[i], 0, &callback_name)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Not a valid callback function %s", callback_name); - efree(callback_name); - RETURN_FALSE; - } + /* check callback function */ + if (!zend_is_callable(callback_func, 0, &callback_name)) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Not a valid callback function %s", callback_name); efree(callback_name); + RETURN_FALSE; } + efree(callback_name); - /* save callback functions */ - for (i=0; i < 3; i++) { - ZVAL_STRING(&mysql->callback_func[i], callback_func[i]->value.str.val, 1); - } - - /* 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); + /* save callback function */ + ALLOC_ZVAL(mysql->li_read); + ZVAL_STRING(mysql->li_read, callback_func->value.str.val, 1); } /* }}} */ @@ -1324,6 +1312,9 @@ php_mysqli_set_error(mysql_errno(mysql->mysql), (char *)mysql_error(mysql->mysql) TSRMLS_CC); mysql->mysql->reconnect = MyG(reconnect); + + /* set our own local_infile handler */ + php_set_local_infile_handler_default(mysql); if (object) { ((mysqli_object *) zend_object_store_get_object(object TSRMLS_CC))->valid = 1; http://cvs.php.net/diff.php/php-src/ext/mysqli/mysqli.c?r1=1.51&r2=1.52&ty=u Index: php-src/ext/mysqli/mysqli.c diff -u php-src/ext/mysqli/mysqli.c:1.51 php-src/ext/mysqli/mysqli.c:1.52 --- php-src/ext/mysqli/mysqli.c:1.51 Sun Aug 15 01:48:16 2004 +++ php-src/ext/mysqli/mysqli.c Wed Aug 25 09:57:35 2004 @@ -15,7 +15,7 @@ | Author: Georg Richter <georg@php.net> | +----------------------------------------------------------------------+ - $Id: mysqli.c,v 1.51 2004/08/15 05:48:16 georg Exp $ + $Id: mysqli.c,v 1.52 2004/08/25 13:57:35 georg Exp $ */ #ifdef HAVE_CONFIG_H @@ -107,16 +107,11 @@ /* {{{ php_clear_mysql */ void php_clear_mysql(MY_MYSQL *mysql) { - int i; - - for (i=0; i < 3; i++) { - if (&mysql->callback_func[i]) { - zval_dtor(&mysql->callback_func[i]); - } - } - - if (mysql->local_infile) { - zval_ptr_dtor(&mysql->local_infile); + if (mysql->li_read) { + printf("freeing...\n"); + efree(Z_STRVAL_P(mysql->li_read)); + FREE_ZVAL(mysql->li_read); + mysql->li_read = NULL; } } /* }}} */ @@ -774,15 +769,23 @@ memset(source, 0, LOCAL_INFILE_ERROR_LEN);\ memcpy(source, dest, LOCAL_INFILE_ERROR_LEN-1); +/* {{{ 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); + mysql->li_read = NULL; +} +/* }}} */ + /* {{{ php_local_infile_init */ int php_local_infile_init(void **ptr, const char *filename, void *userdata) { mysqli_local_infile *data; MY_MYSQL *mysql; - zval ***callback_args; - int argc = 2; - int i, rc = 0; + php_stream_context *context = NULL; TSRMLS_FETCH(); @@ -791,45 +794,28 @@ return 1; } - if (!(mysql = data->userdata = userdata)) { + if (!(mysql = (MY_MYSQL *)userdata)) { LOCAL_INFILE_ERROR_MSG(data->error_msg, ER(CR_UNKNOWN_ERROR)); return 1; } - ALLOC_CALLBACK_ARGS(callback_args, 0, argc); - - ZVAL_STRING(*callback_args[0], (char *)filename, 1); - ZVAL_STRING(*callback_args[1], "", 1); - - if (call_user_function_ex(EG(function_table), - NULL, - &mysql->callback_func[0], - &mysql->local_infile, - argc, - callback_args, - 0, - NULL TSRMLS_CC) == SUCCESS) { + /* 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; + } + } - /* check if user callback function returned a valid filehandle */ - convert_to_string_ex(callback_args[1]); + mysql->li_stream = php_stream_open_wrapper_ex((char *)filename, "r", 0, NULL, context); - if (Z_TYPE_P(mysql->local_infile) != IS_RESOURCE) { - if (!strlen(Z_STRVAL_P(*callback_args[1]))) { - LOCAL_INFILE_ERROR_MSG(data->error_msg, ER(CR_UNKNOWN_ERROR)); - } else { - LOCAL_INFILE_ERROR_MSG(data->error_msg, Z_STRVAL_P(*callback_args[1])); - } - rc = 1; - } else { - } - } else { - LOCAL_INFILE_ERROR_MSG(data->error_msg, "Can't execute load data local init callback function"); - rc = 1; + if (mysql->li_stream == NULL) { + return 1; } - FREE_CALLBACK_ARGS(callback_args, 0, argc); + data->userdata = mysql; - return rc; + return 0; } /* }}} */ @@ -838,7 +824,8 @@ mysqli_local_infile *data; MY_MYSQL *mysql; zval ***callback_args; - zval *retval; + zval *retval; + zval *fp; int argc = 4; int i; long rc; @@ -846,21 +833,35 @@ TSRMLS_FETCH(); data= (mysqli_local_infile *)ptr; - mysql = data->userdata; + /* default processing */ + if (!mysql->li_read) { + int count; + + count = (int)php_stream_read(mysql->li_stream, buf, buf_len); + + if (count < 0) { + LOCAL_INFILE_ERROR_MSG(data->error_msg, ER(2)); + } + + return count; + } + ALLOC_CALLBACK_ARGS(callback_args, 1, argc); /* set parameters: filepointer, buffer, buffer_len, errormsg */ - callback_args[0] = &mysql->local_infile; + MAKE_STD_ZVAL(fp); + php_stream_to_zval(mysql->li_stream, fp); + callback_args[0] = &fp; ZVAL_STRING(*callback_args[1], "", 1); ZVAL_LONG(*callback_args[2], buf_len); ZVAL_STRING(*callback_args[3], "", 1); if (call_user_function_ex(EG(function_table), NULL, - &mysql->callback_func[1], + mysql->li_read, &retval, argc, callback_args, @@ -888,6 +889,7 @@ } FREE_CALLBACK_ARGS(callback_args, 1, argc); + efree(fp); return rc; } @@ -896,6 +898,7 @@ int php_local_infile_error(void *ptr, char *error_msg, uint error_msg_len) { mysqli_local_infile *data = (mysqli_local_infile *) ptr; + if (data) { strcpy(error_msg, data->error_msg); return 2000; @@ -911,42 +914,19 @@ { mysqli_local_infile *data; MY_MYSQL *mysql; - zval ***callback_args; - zval *retval; - int argc = 1; - int i; TSRMLS_FETCH(); data= (mysqli_local_infile *)ptr; - mysql = data->userdata; - - ALLOC_CALLBACK_ARGS(callback_args, 1, argc); - - /* set parameters: filepointer, buffer, buffer_len, errormsg */ - - callback_args[0] = &mysql->local_infile; - - call_user_function_ex(EG(function_table), - NULL, - &mysql->callback_func[2], - &retval, - argc, - callback_args, - 0, - NULL TSRMLS_CC); - - if (retval) { - zval_ptr_dtor(&retval); - } - - if (mysql->local_infile) { - zval_ptr_dtor(&mysql->local_infile); + if (!(mysql = data->userdata)) { + efree(data); + return; } - FREE_CALLBACK_ARGS(callback_args, 1, argc); -// efree(data); + php_stream_close(mysql->li_stream); + //efree(data); + return; } /* }}} */ http://cvs.php.net/diff.php/php-src/ext/mysqli/mysqli_nonapi.c?r1=1.34&r2=1.35&ty=u Index: php-src/ext/mysqli/mysqli_nonapi.c diff -u php-src/ext/mysqli/mysqli_nonapi.c:1.34 php-src/ext/mysqli/mysqli_nonapi.c:1.35 --- php-src/ext/mysqli/mysqli_nonapi.c:1.34 Sat Jun 5 14:31:56 2004 +++ php-src/ext/mysqli/mysqli_nonapi.c Wed Aug 25 09:57:35 2004 @@ -15,7 +15,7 @@ | Author: Georg Richter <georg@php.net> | +----------------------------------------------------------------------+ - $Id: mysqli_nonapi.c,v 1.34 2004/06/05 18:31:56 georg Exp $ + $Id: mysqli_nonapi.c,v 1.35 2004/08/25 13:57:35 georg Exp $ */ #ifdef HAVE_CONFIG_H @@ -40,7 +40,6 @@ unsigned int hostname_len, username_len, passwd_len, dbname_len, socket_len; long port=0; - if (getThis() && !ZEND_NUM_ARGS()) { RETURN_NULL(); } @@ -90,6 +89,9 @@ mysql->mysql->reconnect = MyG(reconnect); + /* set our own local_infile handler */ + php_set_local_infile_handler_default(mysql); + mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE)); mysqli_resource->ptr = (void *)mysql; @@ -246,7 +248,6 @@ MYSQLI_REPORT_MYSQL_ERROR(mysql->mysql); RETURN_FALSE; } - if (!mysql_field_count(mysql->mysql)) { if (MyG(report_mode) & MYSQLI_REPORT_INDEX) { http://cvs.php.net/diff.php/php-src/ext/mysqli/php_mysqli.h?r1=1.38&r2=1.39&ty=u Index: php-src/ext/mysqli/php_mysqli.h diff -u php-src/ext/mysqli/php_mysqli.h:1.38 php-src/ext/mysqli/php_mysqli.h:1.39 --- php-src/ext/mysqli/php_mysqli.h:1.38 Wed Jul 7 04:02:27 2004 +++ php-src/ext/mysqli/php_mysqli.h Wed Aug 25 09:57:35 2004 @@ -15,7 +15,7 @@ | Author: Georg Richter <georg@php.net> | +----------------------------------------------------------------------+ - $Id: php_mysqli.h,v 1.38 2004/07/07 08:02:27 georg Exp $ + $Id: php_mysqli.h,v 1.39 2004/08/25 13:57:35 georg Exp $ */ /* A little hack to prevent build break, when mysql is used together with @@ -53,9 +53,8 @@ typedef struct { MYSQL *mysql; - /* callback functions for load data local infile support */ - zval callback_func[3]; - zval *local_infile; + zval *li_read; + php_stream *li_stream; } MY_MYSQL; typedef struct { @@ -112,6 +111,7 @@ extern void php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAMETERS, int override_flag, int into_object); extern void php_clear_stmt_bind(MY_STMT *stmt); +void php_clear_mysql(MY_MYSQL *); extern void php_free_stmt_bind_buffer(BIND_BUFFER bbuf, int type); extern void php_mysqli_report_error(char *sqlstate, int errorno, char *error TSRMLS_DC); extern void php_mysqli_report_index(char *query, unsigned int status TSRMLS_DC); @@ -119,6 +119,7 @@ extern int php_local_infile_read(void *, char *, uint); extern void php_local_infile_end(void *); extern int php_local_infile_error(void *, char *, uint); +extern void php_set_local_infile_handler_default(MY_MYSQL *); zend_class_entry *mysqli_link_class_entry; zend_class_entry *mysqli_stmt_class_entry;