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

Reply via email to