georg Sat Sep 4 10:19:20 2004 EDT
Added files: (Branch: PHP_5_0)
/php-src/ext/mysqli/tests 061.csv 061.phpt
Modified files:
/php-src/ext/mysqli mysqli_api.c mysqli.c mysqli_nonapi.c
php_mysqli.h
Log:
MFH: LOAD DATA INFILE now uses PHP's fopen wrapper
http://cvs.php.net/diff.php/php-src/ext/mysqli/mysqli_api.c?r1=1.87.2.3&r2=1.87.2.4&ty=u
Index: php-src/ext/mysqli/mysqli_api.c
diff -u php-src/ext/mysqli/mysqli_api.c:1.87.2.3
php-src/ext/mysqli/mysqli_api.c:1.87.2.4
--- php-src/ext/mysqli/mysqli_api.c:1.87.2.3 Thu Sep 2 00:52:07 2004
+++ php-src/ext/mysqli/mysqli_api.c Sat Sep 4 10:19:20 2004
@@ -15,7 +15,7 @@
| Author: Georg Richter <[EMAIL PROTECTED]> |
+----------------------------------------------------------------------+
- $Id: mysqli_api.c,v 1.87.2.3 2004/09/02 04:52:07 georg Exp $
+ $Id: mysqli_api.c,v 1.87.2.4 2004/09/04 14:19:20 georg Exp $
*/
#ifdef HAVE_CONFIG_H
@@ -258,7 +258,6 @@
for (i=start; i < var_cnt + start ; i++) {
ofs = i - start;
stmt->result.is_null[ofs] = 0;
-
col_type = (stmt->stmt->fields) ? stmt->stmt->fields[ofs].type :
MYSQL_TYPE_STRING;
switch (col_type) {
@@ -406,7 +405,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;
}
@@ -906,7 +905,7 @@
}
MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
- RETURN_STRING((mysql->mysql->host_info) ? mysql->mysql->host_info :
empty_string, 1);
+ RETURN_STRING((mysql->mysql->host_info) ? mysql->mysql->host_info : "", 1);
}
/* }}} */
@@ -971,7 +970,7 @@
}
MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
- RETURN_STRING((mysql->mysql->info) ? mysql->mysql->info : empty_string, 1);
+ RETURN_STRING((mysql->mysql->info) ? mysql->mysql->info : "", 1);
}
/* }}} */
@@ -1036,7 +1035,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 +1042,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 +1311,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.43.2.5&r2=1.43.2.6&ty=u
Index: php-src/ext/mysqli/mysqli.c
diff -u php-src/ext/mysqli/mysqli.c:1.43.2.5 php-src/ext/mysqli/mysqli.c:1.43.2.6
--- php-src/ext/mysqli/mysqli.c:1.43.2.5 Sun Aug 15 01:50:29 2004
+++ php-src/ext/mysqli/mysqli.c Sat Sep 4 10:19:20 2004
@@ -15,7 +15,7 @@
| Author: Georg Richter <[EMAIL PROTECTED]> |
+----------------------------------------------------------------------+
- $Id: mysqli.c,v 1.43.2.5 2004/08/15 05:50:29 georg Exp $
+ $Id: mysqli.c,v 1.43.2.6 2004/09/04 14:19:20 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;
}
}
/* }}} */
@@ -200,6 +195,7 @@
ret = zend_hash_find(obj->prop_handler, Z_STRVAL_P(member),
Z_STRLEN_P(member)+1, (void **) &hnd);
}
if (ret == SUCCESS) {
+
/* check if mysqli object is still valid */
if (!strcmp(obj->zo.ce->name, "mysqli")) {
if (!obj->ptr ||
@@ -290,7 +286,7 @@
{
mysqli_object *obj = (mysqli_object *)zend_objects_get_address(object
TSRMLS_CC);
- if (obj->zo.ce != mysqli_link_class_entry && obj->zo.ce->constructor) {
+ if (obj->zo.ce != mysqli_link_class_entry) {
return obj->zo.ce->constructor;
} else {
static zend_internal_function f;
@@ -461,6 +457,14 @@
/* for mysqli_stmt_set_attr */
REGISTER_LONG_CONSTANT("MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH",
STMT_ATTR_UPDATE_MAX_LENGTH, CONST_CS | CONST_PERSISTENT);
+
+#ifdef STMT_ATTR_CURSOR_TYPE
+ 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
/* column information */
REGISTER_LONG_CONSTANT("MYSQLI_NOT_NULL_FLAG", NOT_NULL_FLAG, CONST_CS |
CONST_PERSISTENT);
@@ -765,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();
@@ -782,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;
}
/* }}} */
@@ -829,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;
@@ -837,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,
@@ -879,6 +889,7 @@
}
FREE_CALLBACK_ARGS(callback_args, 1, argc);
+ efree(fp);
return rc;
}
@@ -887,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;
@@ -902,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.34.2.1&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.34.2.1
--- php-src/ext/mysqli/mysqli_nonapi.c:1.34 Sat Jun 5 14:31:56 2004
+++ php-src/ext/mysqli/mysqli_nonapi.c Sat Sep 4 10:19:20 2004
@@ -15,7 +15,7 @@
| Author: Georg Richter <[EMAIL PROTECTED]> |
+----------------------------------------------------------------------+
- $Id: mysqli_nonapi.c,v 1.34 2004/06/05 18:31:56 georg Exp $
+ $Id: mysqli_nonapi.c,v 1.34.2.1 2004/09/04 14:19:20 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.2.1&r2=1.38.2.2&ty=u
Index: php-src/ext/mysqli/php_mysqli.h
diff -u php-src/ext/mysqli/php_mysqli.h:1.38.2.1
php-src/ext/mysqli/php_mysqli.h:1.38.2.2
--- php-src/ext/mysqli/php_mysqli.h:1.38.2.1 Thu Sep 2 00:52:07 2004
+++ php-src/ext/mysqli/php_mysqli.h Sat Sep 4 10:19:20 2004
@@ -15,7 +15,7 @@
| Author: Georg Richter <[EMAIL PROTECTED]> |
+----------------------------------------------------------------------+
- $Id: php_mysqli.h,v 1.38.2.1 2004/09/02 04:52:07 georg Exp $
+ $Id: php_mysqli.h,v 1.38.2.2 2004/09/04 14:19:20 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;
@@ -180,7 +181,7 @@
} \
__ptr = (__type)my_res->ptr; \
if (!strcmp((char *)__name, "mysqli_stmt")) {\
- if (! ((MY_STMT *)__ptr)->stmt->mysql) {\
+ if (!((MY_STMT *)__ptr)->stmt->mysql) {\
php_error(E_WARNING, "Statement isn't valid anymore");\
RETURN_NULL();\
}\
http://cvs.php.net/co.php/php-src/ext/mysqli/tests/061.csv?r=1.1&p=1
Index: php-src/ext/mysqli/tests/061.csv
+++ php-src/ext/mysqli/tests/061.csv
http://cvs.php.net/co.php/php-src/ext/mysqli/tests/061.phpt?r=1.1&p=1
Index: php-src/ext/mysqli/tests/061.phpt
+++ php-src/ext/mysqli/tests/061.phpt
--TEST--
local infile handler
--FILE--
<?php
include "connect.inc";
function my_read($fp, &$buffer, $buflen, &$error) {
$buffer = strrev(fread($fp, $buflen));
return(strlen($buffer));
}
/*** test mysqli_connect 127.0.0.1 ***/
$link = mysqli_connect("localhost", $user, $passwd, "test");
/* create temporary file */
$fp = fopen("061.csv", "w");
fwrite($fp, "foo;bar");
fclose($fp);
mysqli_query($link,"DROP TABLE IF EXISTS t_061");
mysqli_query($link,"CREATE TABLE t_061 (c1 varchar(10), c2 varchar(10))");
mysqli_query($link, "LOAD DATA LOCAL INFILE '061.csv' INTO TABLE t_061 FIELDS
TERMINATED BY ';'");
mysqli_set_local_infile_handler($link, "my_read");
mysqli_query($link, "LOAD DATA LOCAL INFILE '061.csv' INTO TABLE t_061 FIELDS
TERMINATED BY ';'");
if ($result = mysqli_query($link, "SELECT c1,c2 FROM t_061")) {
while (($row = mysqli_fetch_row($result))) {
printf("%s-%s\n", $row[0], $row[1]);
}
mysqli_free_result($result);
}
mysqli_close($link);
?>
--EXPECT--
foo-bar
rab-oof
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php