From: andrey Date: Thu, 3 May 2012 10:55:03 +0000 (+0200) Subject: Remove support for local infile handler in mysqli from 5.5 X-Git-Tag: php-5.5.0alpha1~239 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=522595086b8d654a2fd954977f7f443f2578de22;p=php Remove support for local infile handler in mysqli from 5.5 This removes the following functions from the API: mysqli_set_local_infile_default() mysqli_set_local_infile_handler() Using these functions is known to be lead to stability problems in mysqli. It was only enabled when compiling against libmysql. mysqlnd doesn't have this support for local infile. However, with mysqlnd it can be emulated by using stream handlers like in: $c->query("LOAD DATA LOCAL INFILE "http://example.com/import.csv" INTO ...") All available protocols, as well as user implemented ones can be added. --- diff --git a/ext/mysqli/mysqli.c b/ext/mysqli/mysqli.c index f18a503b5e..54c9574492 100644 --- a/ext/mysqli/mysqli.c +++ b/ext/mysqli/mysqli.c @@ -1321,218 +1321,6 @@ void php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAMETERS, int override_flags } /* }}} */ - -#if !defined(MYSQLI_USE_MYSQLND) - -#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)\ - 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, "%s", dest); - - -/* {{{ php_local_infile_init - */ -static int php_local_infile_init(void **ptr, const char *filename, void *userdata) -{ - mysqli_local_infile *data; - MY_MYSQL *mysql; - php_stream_context *context = NULL; - - TSRMLS_FETCH(); - - /* save pointer to MY_MYSQL structure (userdata) */ - if (!(*ptr= data= ((mysqli_local_infile *)calloc(1, sizeof(mysqli_local_infile))))) { - return 1; - } - - if (!(mysql = (MY_MYSQL *)userdata)) { - LOCAL_INFILE_ERROR_MSG(data->error_msg, ER(CR_UNKNOWN_ERROR)); - return 1; - } - - /* 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; - } - } - - mysql->li_stream = php_stream_open_wrapper_ex((char *)filename, "r", 0, NULL, context); - - if (mysql->li_stream == NULL) { - snprintf((char *)data->error_msg, sizeof(data->error_msg), "Can't find file '%-.64s'.", filename); - return 1; - } - - data->userdata = mysql; - - return 0; -} -/* }}} */ - -/* {{{ int php_local_infile_read */ -static int php_local_infile_read(void *ptr, char *buf, uint buf_len) -{ - mysqli_local_infile *data; - MY_MYSQL *mysql; - zval ***callback_args; - zval *retval; - zval *fp; - int argc = 4; - int i; - long rc; - - TSRMLS_FETCH(); - - data= (mysqli_local_infile *)ptr; - mysql = data->userdata; - - /* default processing */ - if (!mysql->li_read) { - int 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 */ - - 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->li_read, - &retval, - argc, - callback_args, - 0, - NULL TSRMLS_CC) == SUCCESS) { - - rc = Z_LVAL_P(retval); - zval_ptr_dtor(&retval); - - if (rc > 0) { - 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) { - /* check buffer overflow */ - LOCAL_INFILE_ERROR_MSG(data->error_msg, "Too much data returned"); - rc = -1; - } else { - memcpy(buf, Z_STRVAL_P(*callback_args[1]), MIN(rc, Z_STRLEN_P(*callback_args[1]))); - } - } else if (rc < 0) { - 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; - } - /* - 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; - } - - FREE_CALLBACK_ARGS(callback_args, 1, argc); - efree(fp); - return rc; -} -/* }}} */ - -/* {{{ php_local_infile_error - */ -static int php_local_infile_error(void *ptr, char *error_msg, uint error_msg_len) -{ - mysqli_local_infile *data = (mysqli_local_infile *) ptr; - - if (data) { - strlcpy(error_msg, data->error_msg, error_msg_len); - return 2000; - } - strlcpy(error_msg, ER(CR_OUT_OF_MEMORY), error_msg_len); - return CR_OUT_OF_MEMORY; -} -/* }}} */ - -/* {{{ php_local_infile_end - */ -static void php_local_infile_end(void *ptr) -{ - mysqli_local_infile *data; - MY_MYSQL *mysql; - - TSRMLS_FETCH(); - - data= (mysqli_local_infile *)ptr; - - if (!data || !(mysql = data->userdata)) { - if (data) { - free(data); - } - return; - } - - if (mysql->li_stream) { - php_stream_close(mysql->li_stream); - } - free(data); - return; -} -/* }}} */ - - -/* {{{ 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; - } -} -/* }}} */ -#endif - /* * Local variables: * tab-width: 4 diff --git a/ext/mysqli/mysqli_api.c b/ext/mysqli/mysqli_api.c index ce7588ecbf..22eae7ee1c 100644 --- a/ext/mysqli/mysqli_api.c +++ b/ext/mysqli/mysqli_api.c @@ -1456,64 +1456,6 @@ PHP_FUNCTION(mysqli_kill) } /* }}} */ -/* {{{ proto void mysqli_set_local_infile_default(object link) - unsets user defined handler for load local infile command */ -#if !defined(MYSQLI_USE_MYSQLND) -PHP_FUNCTION(mysqli_set_local_infile_default) -{ - MY_MYSQL *mysql; - zval *mysql_link; - - if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) { - return; - } - - MYSQLI_FETCH_RESOURCE_CONN(mysql, &mysql_link, MYSQLI_STATUS_VALID); - - if (mysql->li_read) { - zval_ptr_dtor(&(mysql->li_read)); - mysql->li_read = NULL; - } -} -/* }}} */ - -/* {{{ 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; - - 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_CONN(mysql, &mysql_link, MYSQLI_STATUS_VALID); - - /* check callback function */ - if (!zend_is_callable(callback_func, 0, &callback_name TSRMLS_CC)) { - 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 function */ - if (!mysql->li_read) { - MAKE_STD_ZVAL(mysql->li_read); - } else { - zval_dtor(mysql->li_read); - } - ZVAL_ZVAL(mysql->li_read, callback_func, 1, 0); - - RETURN_TRUE; -} -#endif -/* }}} */ - /* {{{ proto bool mysqli_more_results(object link) check if there any more query results from a multi query */ PHP_FUNCTION(mysqli_more_results) diff --git a/ext/mysqli/mysqli_fe.c b/ext/mysqli/mysqli_fe.c index 9ebb9352fe..80ae848f95 100644 --- a/ext/mysqli/mysqli_fe.c +++ b/ext/mysqli/mysqli_fe.c @@ -200,16 +200,6 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_mysqli_kill, 0, 0, 1) ZEND_ARG_INFO(0, connection_id) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_mysqli_set_local_infile_handler, 0, 0, 2) - MYSQLI_ZEND_ARG_OBJ_INFO_LINK() - ZEND_ARG_INFO(0, read_callback) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_class_mysqli_set_local_infile_handler, 0, 0, 1) - MYSQLI_ZEND_ARG_OBJ_INFO_LINK() - ZEND_ARG_INFO(0, read_callback) -ZEND_END_ARG_INFO() - ZEND_BEGIN_ARG_INFO_EX(arginfo_mysqli_query, 0, 0, 2) MYSQLI_ZEND_ARG_OBJ_INFO_LINK() ZEND_ARG_INFO(0, query) @@ -388,10 +378,6 @@ const zend_function_entry mysqli_functions[] = { PHP_FE(mysqli_info, arginfo_mysqli_only_link) PHP_FE(mysqli_insert_id, arginfo_mysqli_only_link) PHP_FE(mysqli_kill, arginfo_mysqli_kill) -#if !defined(MYSQLI_USE_MYSQLND) - PHP_FE(mysqli_set_local_infile_default, arginfo_mysqli_only_link) - PHP_FE(mysqli_set_local_infile_handler, arginfo_mysqli_set_local_infile_handler) -#endif PHP_FE(mysqli_more_results, arginfo_mysqli_only_link) PHP_FE(mysqli_multi_query, arginfo_mysqli_query) PHP_FE(mysqli_next_result, arginfo_mysqli_only_link) @@ -490,10 +476,6 @@ const zend_function_entry mysqli_link_methods[] = { PHP_FALIAS(get_warnings, mysqli_get_warnings, arginfo_mysqli_no_params) PHP_FALIAS(init,mysqli_init, arginfo_mysqli_no_params) PHP_FALIAS(kill,mysqli_kill, arginfo_class_mysqli_kill) -#if !defined(MYSQLI_USE_MYSQLND) - PHP_FALIAS(set_local_infile_default, mysqli_set_local_infile_default, arginfo_mysqli_no_params) - PHP_FALIAS(set_local_infile_handler, mysqli_set_local_infile_handler, arginfo_class_mysqli_set_local_infile_handler) -#endif PHP_FALIAS(multi_query, mysqli_multi_query, arginfo_class_mysqli_query) PHP_FALIAS(mysqli, mysqli_link_construct, arginfo_mysqli_connect) PHP_FALIAS(more_results, mysqli_more_results, arginfo_mysqli_no_params) diff --git a/ext/mysqli/mysqli_nonapi.c b/ext/mysqli/mysqli_nonapi.c index 0cc1240208..fee65ee290 100644 --- a/ext/mysqli/mysqli_nonapi.c +++ b/ext/mysqli/mysqli_nonapi.c @@ -259,9 +259,6 @@ void mysqli_common_connect(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_real_conne #if !defined(MYSQLI_USE_MYSQLND) mysql->mysql->reconnect = MyG(reconnect); - - /* set our own local_infile handler */ - php_set_local_infile_handler_default(mysql); #endif mysql_options(mysql->mysql, MYSQL_OPT_LOCAL_INFILE, (char *)&MyG(allow_local_infile)); diff --git a/ext/mysqli/mysqli_priv.h b/ext/mysqli/mysqli_priv.h index 9dd11117d1..ecbdacb4ea 100644 --- a/ext/mysqli/mysqli_priv.h +++ b/ext/mysqli/mysqli_priv.h @@ -76,7 +76,6 @@ extern void php_clear_warnings(MYSQLI_WARNING *w); extern void php_free_stmt_bind_buffer(BIND_BUFFER bbuf, int type); extern void php_mysqli_report_error(const char *sqlstate, int errorno, const char *error TSRMLS_DC); extern void php_mysqli_report_index(const char *query, unsigned int status TSRMLS_DC); -extern void php_set_local_infile_handler_default(MY_MYSQL *); extern void php_mysqli_throw_sql_exception(char *sqlstate, int errorno TSRMLS_DC, char *format, ...); #ifdef HAVE_SPL diff --git a/ext/mysqli/php_mysqli_structs.h b/ext/mysqli/php_mysqli_structs.h index 32e3e1e8a5..1d363ab245 100644 --- a/ext/mysqli/php_mysqli_structs.h +++ b/ext/mysqli/php_mysqli_structs.h @@ -158,12 +158,6 @@ typedef struct _mysqli_property_entry { int (*w_func)(mysqli_object *obj, zval *value TSRMLS_DC); } mysqli_property_entry; -#if !defined(MYSQLI_USE_MYSQLND) -typedef struct { - char error_msg[LOCAL_INFILE_ERROR_LEN]; - void *userdata; -} mysqli_local_infile; -#endif typedef struct { zend_ptr_stack free_links; diff --git a/ext/mysqli/tests/local_infile_tools.inc b/ext/mysqli/tests/local_infile_tools.inc deleted file mode 100644 index bb9872f1ab..0000000000 --- a/ext/mysqli/tests/local_infile_tools.inc +++ /dev/null @@ -1,156 +0,0 @@ -errno) { - return $link->error; - } - } - mysqli_query($link, sprintf('DROP TABLE IF EXISTS %s', $table_name)); - return ""; - } - - function create_standard_csv($offset, $verbose = true) { - // create a CVS file - $file = tempnam(sys_get_temp_dir(), 'mysqli_test'); - if (!$fp = fopen($file, 'w')) { - if ($verbose) - printf("[%03d + 1] Cannot create CVS file '%s'\n", $offset, $file); - return NULL; - } else { - /* Looks ugly? No, handy if you have crashes... */ - register_shutdown_function("shutdown_clean", $file); - } - - if ((version_compare(PHP_VERSION, '5.9.9', '>') == 1)) { - if (!fwrite($fp, (binary)"'97';'x';\n") || - !fwrite($fp, (binary)"'98';'y';\n") || - !fwrite($fp, (binary)"99;'z';\n")) { - if ($verbose) - printf("[%03d + 2] Cannot write CVS file '%s'\n", $offset, $file); - return NULL; - } - } else { - if (!fwrite($fp, "97;'x';\n") || - !fwrite($fp, "98;'y';\n") || - !fwrite($fp, "99;'z';\n")) { - if ($verbose) - printf("[%03d + 3] Cannot write CVS file '%s'\n", $offset, $file); - return NULL; - } - } - - fclose($fp); - - if (!chmod($file, 0644)) { - if ($verbose) - printf("[%03d + 4] Cannot change the file perms of '%s' from 0600 to 0644, MySQL might not be able to read it\n", - $offset, $file); - return NULL; - } - return $file; - } - - function try_handler($offset, $link, $file, $handler, $expected = null) { - - if ('default' == $handler) { - mysqli_set_local_infile_default($link); - } else if (!mysqli_set_local_infile_handler($link, $handler)) { - printf("[%03d] Cannot set infile handler to '%s'\n", $offset, $handler); - return false; - } - printf("Callback set to '%s'\n", $handler); - - if (!mysqli_query($link, sprintf("DELETE FROM test"))) { - printf("[%03d] Cannot remove records, [%d] %s\n", $offset + 1, mysqli_errno($link), mysqli_error($link)); - return false; - } - - if (!@mysqli_query($link, sprintf("LOAD DATA LOCAL INFILE '%s' - INTO TABLE test - FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '\'' - LINES TERMINATED BY '\n'", - mysqli_real_escape_string($link, $file)))) { - printf("[%03d] LOAD DATA failed, [%d] %s\n", - $offset + 2, - mysqli_errno($link), mysqli_error($link)); - } - - if (!$res = mysqli_query($link, "SELECT id, label FROM test ORDER BY id")) { - printf("[%03d] [%d] %s\n", $offset + 3, mysqli_errno($link), mysqli_error($link)); - return false; - } - - if (!is_array($expected)) - return true; - - foreach ($expected as $k => $values) { - if (!$tmp = mysqli_fetch_assoc($res)) { - printf("[%03d/%d] [%d] '%s'\n", $offset + 4, $k, mysqli_errno($link), mysqli_error($link)); - return false; - } - if ($values['id'] != $tmp['id']) { - printf("[%03d/%d] Expecting %s got %s\n", - $offset + 5, $k, - $values['id'], $tmp['id']); - return false; - } - if ($values['label'] != $tmp['label']) { - printf("[%03d/%d] Expecting %s got %s\n", - $offset + 6, $k, - $values['label'], $tmp['label']); - return false; - } - } - - if ($res && $tmp = mysqli_fetch_assoc($res)) { - printf("[%03d] More results than expected!\n", $offset + 7); - do { - var_dump($tmp); - } while ($tmp = mysqli_fetch_assoc($res)); - return false; - } - - if ($res) - mysqli_free_result($res); - - return true; - } -?> \ No newline at end of file diff --git a/ext/mysqli/tests/mysqli_class_mysqli_interface.phpt b/ext/mysqli/tests/mysqli_class_mysqli_interface.phpt index c6d4e7cc32..139325a3f1 100644 --- a/ext/mysqli/tests/mysqli_class_mysqli_interface.phpt +++ b/ext/mysqli/tests/mysqli_class_mysqli_interface.phpt @@ -67,12 +67,6 @@ require_once('skipifconnectfailure.inc'); $expected_methods['get_connection_stats'] = true; $expected_methods['reap_async_query'] = true; $expected_methods['poll'] = true; - } else { - // libmysql only - if (function_exists('mysqli_ssl_set')) - $expected_methods['ssl_set'] = true; - $expected_methods['set_local_infile_default'] = true; - $expected_methods['set_local_infile_handler'] = true; } /* we should add ruled when to expect them */ diff --git a/ext/mysqli/tests/mysqli_query_local_infile_large.phpt b/ext/mysqli/tests/mysqli_query_local_infile_large.phpt deleted file mode 100644 index 76bc415d8b..0000000000 --- a/ext/mysqli/tests/mysqli_query_local_infile_large.phpt +++ /dev/null @@ -1,103 +0,0 @@ ---TEST-- -mysql_query(LOAD DATA LOCAL INFILE) with large data set (10MB) ---SKIPIF-- -errno, $link->error)); - -mysqli_close($link); -?> ---INI-- -mysqli.allow_local_infile=1 ---FILE-- -') == 1)) - $bytes += fwrite($fp, (binary)(++$rowno . ";" . $data)); - else - $bytes += fwrite($fp, ++$rowno . ";" . $data); - } - fclose($fp); - printf("Filesize in bytes: %d\nRows: %d\n", $bytes, $rowno); - - require_once("connect.inc"); - if (!($link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket))) - printf("[002] [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()); - - if (!mysqli_query($link, "DROP TABLE IF EXISTS test") || - !mysqli_query($link, "CREATE TABLE test(id INT, col1 VARCHAR(255), col2 VARCHAR(255)) ENGINE = " . $engine)) - printf("[003] [%d] %s\n", mysqli_errno($link), mysqli_error($link)); - - if (!mysqli_query($link, sprintf("LOAD DATA LOCAL INFILE '%s' INTO TABLE test FIELDS TERMINATED BY ';'", mysqli_real_escape_string($link, $file)))) - printf("[004] [%d] %s\n", mysqli_errno($link), mysqli_error($link)); - - if ((!is_string(mysqli_info($link))) || ('' == mysqli_info($link))) { - printf("[005] [%d] %s, mysqli_info not set \n", mysqli_errno($link), mysqli_error($link)); - } - - if (!($res = mysqli_query($link, "SELECT COUNT(*) AS _num FROM test"))) - printf("[006] [%d] %s\n", mysqli_errno($link), mysqli_error($link)); - - $row = mysqli_fetch_assoc($res); - if (($row["_num"] != $rowno)) - printf("[007] Expecting %d rows, found %d\n", $rowno, $row["_num"]); - - mysqli_free_result($res); - - $random = mt_rand(1, $rowno); - if (!$res = mysqli_query($link, "SELECT id, col1, col2 FROM test WHERE id = " . $random)) - printf("[008] [%d] %s\n", mysqli_errno($link), mysqli_error($link)); - - $row = mysqli_fetch_assoc($res); - var_dump($row); - mysqli_free_result($res); - - mysqli_close($link); - print "done!"; -?> ---CLEAN-- - ---EXPECTF-- -Filesize in bytes: %d -Rows: %d -array(3) { - [%u|b%"id"]=> - %unicode|string%(%d) "%d" - [%u|b%"col1"]=> - %unicode|string%(127) "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" - [%u|b%"col2"]=> - %unicode|string%(127) "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" -} -done! \ No newline at end of file diff --git a/ext/mysqli/tests/mysqli_set_local_infile_default.phpt b/ext/mysqli/tests/mysqli_set_local_infile_default.phpt deleted file mode 100644 index 0348b01f6a..0000000000 --- a/ext/mysqli/tests/mysqli_set_local_infile_default.phpt +++ /dev/null @@ -1,132 +0,0 @@ ---TEST-- -mysqli_set_local_infile_default() ---SKIPIF-- -errno, $link->error)); - -mysqli_close($link); -?> ---INI-- -mysqli.allow_local_infile=1 ---FILE-- - 0) { - printf("[014] Test is too simple to handle a buffer of size %d that cannot hold all lines\n", $buflen); - $error = 'Parser too simple'; - } - - $buffer = ''; - foreach ($lines as $k => $line) { - if ('' === trim($line)) - continue; - - $columns = explode(';', $line); - if (empty($columns)) { - printf("[015] Cannot parse columns\n"); - $error = 'Cannot parse columns'; - } - - // increase id column value - $columns[0] += 1; - $buffer .= implode(';', $columns); - $buffer .= "\n"; - } - - return strlen($buffer); - } - - $file = create_standard_csv(4); - $expected = array( - array('id' => 98, 'label' => 'x'), - array('id' => 99, 'label' => 'y'), - array('id' => 100, 'label' => 'z'), - ); - try_handler(10, $link, $file, 'callback_simple', $expected); - - $expected = array( - array('id' => 97, 'label' => 'x'), - array('id' => 98, 'label' => 'y'), - array('id' => 99, 'label' => 'z'), - ); - try_handler(20, $link, $file, 'default', $expected); - - $expected = array( - array('id' => 98, 'label' => 'x'), - array('id' => 99, 'label' => 'y'), - array('id' => 100, 'label' => 'z'), - ); - try_handler(30, $link, $file, 'callback_simple', $expected); - - mysqli_close($link); - - if (!is_null($tmp = @mysqli_set_local_infile_default($link))) - printf("[300] Expecting NULL/NULL got %s/%s\n", $tmp, gettype($tmp)); - - print "done!"; -?> ---CLEAN-- - ---EXPECTF-- -Callback set to 'callback_simple' -Callback: 0 -Callback: 1 -Callback set to 'default' -Callback set to 'callback_simple' -Callback: 2 -Callback: 3 -done! \ No newline at end of file diff --git a/ext/mysqli/tests/mysqli_set_local_infile_handler.phpt b/ext/mysqli/tests/mysqli_set_local_infile_handler.phpt deleted file mode 100644 index 58f4c70351..0000000000 --- a/ext/mysqli/tests/mysqli_set_local_infile_handler.phpt +++ /dev/null @@ -1,196 +0,0 @@ ---TEST-- -mysqli_set_local_infile_handler() ---SKIPIF-- -errno, $link->error)); - -mysqli_close($link); -?> ---INI-- -mysqli.allow_local_infile=1 ---FILE-- - 0) { - printf("[014] Test is too simple to handle a buffer of size %d that cannot hold all lines\n", $buflen); - $error = 'Parser too simple'; - } - - $buffer = ''; - foreach ($lines as $k => $line) { - if ('' === trim($line)) - continue; - - $columns = explode(';', $line); - if (empty($columns)) { - printf("[015] Cannot parse columns\n"); - $error = 'Cannot parse columns'; - } - - // increase id column value - $columns[0] += 1; - $buffer .= implode(';', $columns); - $buffer .= "\n"; - } - - return strlen($buffer); - } - - function callback_fclose($fp, &$buffer, $buflen, &$error) { - static $invocation = 0; - - printf("Callback: %d\n", $invocation++); - - fclose($fp); - return strlen($buffer); - } - - function callback_closefile($fp, &$buffer, $buflen, &$error) { - static $invocation = 0; - - printf("Callback: %d\n", $invocation++); - flush(); - if (is_resource($fp)) - fclose($fp); - $buffer = "1;'a';\n"; - if ($invocation > 10) - return 0; - - return strlen($buffer); - } - - function callback_invalid_args($fp, &$buffer, $buflen) { - static $invocation = 0; - - printf("Callback: %d\n", $invocation++); - $buffer = fread($fp, $buflen); - - return strlen($buffer); - } - - function callback_error($fp, &$buffer, $buflen, &$error) { - static $invocation = 0; - - printf("Callback: %d\n", $invocation++); - $buffer = fread($fp, $buflen); - $error = 'How to access this error?'; - - return -1; - } - - if (!is_null($tmp = @mysqli_set_local_infile_handler())) - printf("[001] Expecting NULL/NULL got %s/%s\n", $tmp, gettype($tmp)); - - $handle = null; - if (!is_null($tmp = @mysqli_set_local_infile_handler($handle))) - printf("[002] Expecting NULL/NULL got %s/%s\n", $tmp, gettype($tmp)); - - $handle = @new mysqli(); - if (!is_null($tmp = @mysqli_set_local_infile_handler($handle, 'callback_simple'))) - printf("[003] Expecting NULL/NULL got %s/%s\n", $tmp, gettype($tmp)); - - if (false !== ($tmp = @mysqli_set_local_infile_handler($link, 'unknown'))) - printf("[004] Expecting false/boolean got %s/%s\n", $tmp, gettype($tmp)); - - $file = create_standard_csv(5); - - $expected = array( - array('id' => 98, 'label' => 'x'), - array('id' => 99, 'label' => 'y'), - array('id' => 100, 'label' => 'z'), - ); - try_handler(10, $link, $file, 'callback_simple', $expected); - - $expected = array(); - try_handler(20, $link, $file, 'callback_fclose', $expected); - - // FIXME - TODO - KLUDGE - - // IMHO this is wrong. ext/mysqli should bail as the function signature - // is not complete. That's a BC break, OK, but it makes perfectly sense. - $expected = array(); - try_handler(30, $link, $file, 'callback_invalid_args', $expected); - - $expected = array(); - try_handler(40, $link, $file, 'callback_error', $expected); - - - mysqli_close($link); - - if (!is_null($tmp = @mysqli_set_local_infile_handler($link, 'callback_simple'))) - printf("[300] Expecting NULL/NULL got %s/%s\n", $tmp, gettype($tmp)); - - print "done!"; -?> ---CLEAN-- - ---EXPECTF-- -Callback set to 'callback_simple' -Callback: 0 -Callback: 1 -Callback set to 'callback_fclose' -Callback: 0 -[022] LOAD DATA failed, [2000] File handle close%s -Callback set to 'callback_invalid_args' -Callback: 0 -Callback: 1 -[037] More results than expected! -array(2) { - [%u|b%"id"]=> - %unicode|string%(2) "97" - [%u|b%"label"]=> - %unicode|string%(1) "x" -} -array(2) { - [%u|b%"id"]=> - %unicode|string%(2) "98" - [%u|b%"label"]=> - %unicode|string%(1) "y" -} -array(2) { - [%u|b%"id"]=> - %unicode|string%(2) "99" - [%u|b%"label"]=> - %unicode|string%(1) "z" -} -Callback set to 'callback_error' -Callback: 0 -[042] LOAD DATA failed, [2000] How to access this error? -done! \ No newline at end of file diff --git a/ext/mysqli/tests/mysqli_set_local_infile_handler_bad_character.phpt b/ext/mysqli/tests/mysqli_set_local_infile_handler_bad_character.phpt deleted file mode 100644 index b8f51c214f..0000000000 --- a/ext/mysqli/tests/mysqli_set_local_infile_handler_bad_character.phpt +++ /dev/null @@ -1,82 +0,0 @@ ---TEST-- -mysqli_set_local_infile_handler() - random ASCII character including \0 ---SKIPIF-- -errno, $link->error)); - -mysqli_close($link); -?> ---INI-- -mysqli.allow_local_infile=1 ---FILE-- -') == 1) ? (floor($buflen / 2) - 10) : ($buflen - 5); - $part1 = floor($num_chars / 2); - $part2 = $num_chars - $part1; - - $buffer = ''; - for ($i = 0; $i < $part1; $i++) - $buffer .= chr(mt_rand(0, 255)); - - $buffer .= ';"'; - - for ($i = 0; $i < $part2; $i++) - $buffer .= chr(mt_rand(0, 255)); - - $buffer .= '";'; - if ($invocation > 10) - return 0; - - return strlen($buffer); - } - - $file = create_standard_csv(5); - /* we feed the handler with random data, therefore we cannot specify and expected rows */ - try_handler(20, $link, $file, 'callback_bad_character'); - - mysqli_close($link); - print "done!"; -?> ---CLEAN-- - ---EXPECTF-- -Callback set to 'callback_bad_character' -Callback: 0 -Callback: 1 -Callback: 2 -Callback: 3 -Callback: 4 -Callback: 5 -Callback: 6 -Callback: 7 -Callback: 8 -Callback: 9 -Callback: 10 -done! \ No newline at end of file diff --git a/ext/mysqli/tests/mysqli_set_local_infile_handler_buffer_overflow.phpt b/ext/mysqli/tests/mysqli_set_local_infile_handler_buffer_overflow.phpt deleted file mode 100644 index a3c8801023..0000000000 --- a/ext/mysqli/tests/mysqli_set_local_infile_handler_buffer_overflow.phpt +++ /dev/null @@ -1,60 +0,0 @@ ---TEST-- -mysqli_set_local_infile_handler() - buffer overflow ---SKIPIF-- -errno, $link->error)); - -mysqli_close($link); -?> ---INI-- -mysqli.allow_local_infile=1 ---FILE-- - ---CLEAN-- - ---EXPECTF-- -Callback set to 'callback_buffer_overflow' -Callback: 0 - -Warning: mysqli_query(): Too much data returned in %s on line %d -[022] LOAD DATA failed, [%d] Too much data returned -done! \ No newline at end of file diff --git a/ext/mysqli/tests/mysqli_set_local_infile_handler_close_link.phpt b/ext/mysqli/tests/mysqli_set_local_infile_handler_close_link.phpt deleted file mode 100644 index 408bb29ec4..0000000000 --- a/ext/mysqli/tests/mysqli_set_local_infile_handler_close_link.phpt +++ /dev/null @@ -1,61 +0,0 @@ ---TEST-- -mysqli_set_local_infile_handler() - close database link ---SKIPIF-- -errno, $link->error)); - -mysqli_close($link); -?> ---INI-- -mysqli.allow_local_infile=1 ---FILE-- - 10) - return 0; - - return strlen($buffer); - } - - $file = create_standard_csv(1); - $expected = array(array('id' => 1, 'label' => 'a')); - try_handler(20, $link, $file, 'callback_close_link', $expected); - mysqli_close($link); - print "done!"; -?> ---CLEAN-- - ---EXPECTF-- -Callback set to 'callback_close_link' -Callback: 0 -done! \ No newline at end of file diff --git a/ext/mysqli/tests/mysqli_set_local_infile_handler_closefile.phpt b/ext/mysqli/tests/mysqli_set_local_infile_handler_closefile.phpt deleted file mode 100644 index 168cbc1358..0000000000 --- a/ext/mysqli/tests/mysqli_set_local_infile_handler_closefile.phpt +++ /dev/null @@ -1,70 +0,0 @@ ---TEST-- -mysqli_set_local_infile_handler() - do not use the file pointer ---SKIPIF-- -errno, $link->error)); - -mysqli_close($link); -?> ---INI-- -mysqli.allow_local_infile=1 ---FILE-- - 10) - return 0; - - return strlen($buffer); - } - - $file = create_standard_csv(1); - $expected = array(array('id' => 1, 'label' => 'a')); - try_handler(20, $link, $file, 'callback_closefile', $expected); - - mysqli_close($link); - print "done!"; -?> ---CLEAN-- - ---EXPECTF-- -Callback set to 'callback_closefile' -Callback: 0 -Callback: 1 -Callback: 2 -Callback: 3 -Callback: 4 -Callback: 5 -Callback: 6 -Callback: 7 -Callback: 8 -Callback: 9 -Callback: 10 -done! \ No newline at end of file diff --git a/ext/mysqli/tests/mysqli_set_local_infile_handler_closures.phpt b/ext/mysqli/tests/mysqli_set_local_infile_handler_closures.phpt deleted file mode 100755 index ad7ab32c1c..0000000000 --- a/ext/mysqli/tests/mysqli_set_local_infile_handler_closures.phpt +++ /dev/null @@ -1,62 +0,0 @@ ---TEST-- -mysqli_set_local_infile_handler() - use closures as handler ---SKIPIF-- -errno, $link->error)); - -mysqli_close($link); -?> ---INI-- -mysqli.allow_local_infile=1 ---FILE-- - 10) - return 0; - - return strlen($buffer); - }; - - $file = create_standard_csv(1); - if (!try_handler(20, $link, $file, $callback_replace_buffer, null)) - printf("[008] Failure\n"); - - mysqli_close($link); - print "done!"; -?> ---CLEAN-- - ---EXPECTF-- -Callback set to 'Closure object' -Callback: 0 -Callback: 1 -done! \ No newline at end of file diff --git a/ext/mysqli/tests/mysqli_set_local_infile_handler_kill_link.phpt b/ext/mysqli/tests/mysqli_set_local_infile_handler_kill_link.phpt deleted file mode 100644 index b2b42a22e5..0000000000 --- a/ext/mysqli/tests/mysqli_set_local_infile_handler_kill_link.phpt +++ /dev/null @@ -1,61 +0,0 @@ ---TEST-- -mysqli_set_local_infile_handler() - kill database link ---SKIPIF-- -errno, $link->error)); - -mysqli_close($link); -?> ---INI-- -mysqli.allow_local_infile=1 ---FILE-- - 10) - return 0; - - mysqli_set_local_infile_default($link); - return strlen($buffer); - } - - $file = create_standard_csv(1); - $expected = array(array('id' => 1, 'label' => 'a')); - try_handler(20, $link, $file, 'callback_kill_link', $expected); - - mysqli_close($link); - print "done!"; -?> ---CLEAN-- - ---EXPECTF-- -Callback set to 'callback_kill_link' -Callback: 0 -[022] LOAD DATA failed, [2000] Can't execute load data local init callback function -done! \ No newline at end of file diff --git a/ext/mysqli/tests/mysqli_set_local_infile_handler_negative_len.phpt b/ext/mysqli/tests/mysqli_set_local_infile_handler_negative_len.phpt deleted file mode 100644 index 16e38c5fa2..0000000000 --- a/ext/mysqli/tests/mysqli_set_local_infile_handler_negative_len.phpt +++ /dev/null @@ -1,58 +0,0 @@ ---TEST-- -mysqli_set_local_infile_handler() - negative return value/buflen to indicate an error ---SKIPIF-- -errno, $link->error)); - -mysqli_close($link); -?> ---INI-- -mysqli.allow_local_infile=1 ---FILE-- - ---CLEAN-- - ---EXPECTF-- -Callback set to 'callback_negative_len' -Callback: 0 -[022] LOAD DATA failed, [2000] negative length means error -done! \ No newline at end of file diff --git a/ext/mysqli/tests/mysqli_set_local_infile_handler_nested_call.phpt b/ext/mysqli/tests/mysqli_set_local_infile_handler_nested_call.phpt deleted file mode 100644 index 4663fe236e..0000000000 --- a/ext/mysqli/tests/mysqli_set_local_infile_handler_nested_call.phpt +++ /dev/null @@ -1,107 +0,0 @@ ---TEST-- -mysqli_set_local_infile_handler() - nested calls ---SKIPIF-- -errno, $link->error)); - -mysqli_close($link); -?> ---INI-- -mysqli.allow_local_infile=1 ---FILE-- - 0) { - printf("[014] Test is too simple to handle a buffer of size %d that cannot hold all lines\n", $buflen); - $error = 'Parser too simple'; - } - - $buffer = ''; - foreach ($lines as $k => $line) { - if ('' === trim($line)) - continue; - - $columns = explode(';', $line); - if (empty($columns)) { - printf("[015] Cannot parse columns\n"); - $error = 'Cannot parse columns'; - } - - // increase id column value - $columns[0] += 1; - $buffer .= implode(';', $columns); - $buffer .= "\n"; - } - - /* report the wrong length */ - return strlen($buffer); - } - - function callback_report_short_len($fp, &$buffer, $buflen, &$error) { - static $invocation = 0; - - printf("Callback - report_short_len(): %d\n", $invocation++); - return callback_simple($fp, $buffer, $buflen, $error); - } - - $file = create_standard_csv(1); - $expected = array( - array('id' => 98, 'label' => 'x'), - array('id' => 99, 'label' => 'y'), - array('id' => 100, 'label' => 'z'), - ); - try_handler(20, $link, $file, 'callback_report_short_len', $expected); - - mysqli_close($link); - print "done!"; -?> ---CLEAN-- - ---EXPECTF-- -Callback set to 'callback_report_short_len' -Callback - report_short_len(): 0 -Callback - callback_simple(): 0 -Callback - report_short_len(): 1 -Callback - callback_simple(): 1 -done! \ No newline at end of file diff --git a/ext/mysqli/tests/mysqli_set_local_infile_handler_new_query.phpt b/ext/mysqli/tests/mysqli_set_local_infile_handler_new_query.phpt deleted file mode 100644 index ca06435c5e..0000000000 --- a/ext/mysqli/tests/mysqli_set_local_infile_handler_new_query.phpt +++ /dev/null @@ -1,71 +0,0 @@ ---TEST-- -mysqli_set_local_infile_handler() - run new query on db link ---SKIPIF-- -errno, $link->error)); - -mysqli_close($link); -?> ---INI-- -mysqli.allow_local_infile=1 ---FILE-- - 10) - return 0; - - mysqli_set_local_infile_default($link); - return strlen($buffer); - } - - $file = create_standard_csv(1); - $expected = array(array('id' => 1, 'label' => 'a')); - try_handler(20, $link, $file, 'callback_new_query', $expected); - - mysqli_close($link); - print "done!"; -?> ---CLEAN-- - ---EXPECTF-- -Callback set to 'callback_new_query' -Callback: 0 -[Callback 001 - 001] Cannot run query, [2014] Commands out of sync; you can't run this command now -[022] LOAD DATA failed, [2000] Can't execute load data local init callback function -done! \ No newline at end of file diff --git a/ext/mysqli/tests/mysqli_set_local_infile_handler_nofileop.phpt b/ext/mysqli/tests/mysqli_set_local_infile_handler_nofileop.phpt deleted file mode 100644 index 601a09e12c..0000000000 --- a/ext/mysqli/tests/mysqli_set_local_infile_handler_nofileop.phpt +++ /dev/null @@ -1,70 +0,0 @@ ---TEST-- -mysqli_set_local_infile_handler() - do not use the file pointer ---SKIPIF-- -errno, $link->error)); - -mysqli_close($link); -?> ---INI-- -mysqli.allow_local_infile=1 ---FILE-- - 10) - return 0; - - return strlen($buffer); - } - - $file = create_standard_csv(1); - $expected = array(array('id' => 1, 'label' => 'a')); - try_handler(20, $link, $file, 'callback_nofileop', $expected); - - mysqli_close($link); - print "done!"; -?> ---CLEAN-- - ---EXPECTF-- -Callback set to 'callback_nofileop' -Callback: 0 -Callback: 1 -Callback: 2 -Callback: 3 -Callback: 4 -Callback: 5 -Callback: 6 -Callback: 7 -Callback: 8 -Callback: 9 -Callback: 10 -done! \ No newline at end of file diff --git a/ext/mysqli/tests/mysqli_set_local_infile_handler_openbasedir.phpt b/ext/mysqli/tests/mysqli_set_local_infile_handler_openbasedir.phpt deleted file mode 100644 index 7163aca10d..0000000000 --- a/ext/mysqli/tests/mysqli_set_local_infile_handler_openbasedir.phpt +++ /dev/null @@ -1,115 +0,0 @@ ---TEST-- -mysqli_set_local_infile_handler() - open basedir restrictions ---SKIPIF-- -errno, $link->error)); - -mysqli_close($link); -?> ---INI-- -open_basedir="." ---FILE-- - 0) { - printf("[014] Test is too simple to handle a buffer of size %d that cannot hold all lines\n", $buflen); - $error = 'Parser too simple'; - } - - $buffer = ''; - foreach ($lines as $k => $line) { - if ('' === trim($line)) - continue; - - $columns = explode(';', $line); - if (empty($columns)) { - printf("[015] Cannot parse columns\n"); - $error = 'Cannot parse columns'; - } - - // increase id column value - $columns[0] += 1; - $buffer .= implode(';', $columns); - $buffer .= "\n"; - } - - return strlen($buffer); - } - - $file = create_standard_csv(5); - $expected = array( - array('id' => 98, 'label' => 'x'), - array('id' => 99, 'label' => 'y'), - array('id' => 100, 'label' => 'z'), - ); - try_handler(10, $link, $file, 'callback_simple', $expected); - mysqli_close($link); - print "done!"; -?> ---CLEAN-- - ---EXPECTF-- -Warning: tempnam(): open_basedir restriction in effect. File(%s) is not within the allowed path(s): (%s) in %s on line %d -[005 + 1] Cannot create CVS file '' -Callback set to 'callback_simple' -[012] LOAD DATA failed, [%d] %s -[014/0] [0] '' -done! \ No newline at end of file diff --git a/ext/mysqli/tests/mysqli_set_local_infile_handler_replace_buffer.phpt b/ext/mysqli/tests/mysqli_set_local_infile_handler_replace_buffer.phpt deleted file mode 100644 index 0d4024e528..0000000000 --- a/ext/mysqli/tests/mysqli_set_local_infile_handler_replace_buffer.phpt +++ /dev/null @@ -1,78 +0,0 @@ ---TEST-- -mysqli_set_local_infile_handler() - replace buffer pointer ---SKIPIF-- -errno, $link->error)); - -mysqli_close($link); -?> ---INI-- -mysqli.allow_local_infile=1 ---FILE-- -') == 1)) ? floor($buflen / 2) : $buflen; - assert(strlen($buffer) < $num_chars); - - if ($invocation > 10) - return 0; - - return strlen($buffer); - } - - $file = create_standard_csv(1); - $expected = array(array('id' => 1, 'label' => 'a')); - if (!try_handler(20, $link, $file, 'callback_replace_buffer', $expected)) - printf("[008] Failure\n"); - - mysqli_close($link); - print "done!"; -?> ---CLEAN-- - ---EXPECTF-- -Callback set to 'callback_replace_buffer' -Callback: 0 -Callback: 1 -Callback: 2 -Callback: 3 -Callback: 4 -Callback: 5 -Callback: 6 -Callback: 7 -Callback: 8 -Callback: 9 -Callback: 10 -done! \ No newline at end of file diff --git a/ext/mysqli/tests/mysqli_set_local_infile_handler_short_len.phpt b/ext/mysqli/tests/mysqli_set_local_infile_handler_short_len.phpt deleted file mode 100644 index b3144e430e..0000000000 --- a/ext/mysqli/tests/mysqli_set_local_infile_handler_short_len.phpt +++ /dev/null @@ -1,101 +0,0 @@ ---TEST-- -mysqli_set_local_infile_handler() - report shorter buffer ---SKIPIF-- -errno, $link->error)); - -mysqli_close($link); -?> ---INI-- -mysqli.allow_local_infile=1 ---FILE-- - 0) { - printf("[014] Test is too simple to handle a buffer of size %d that cannot hold all lines\n", $buflen); - $error = 'Parser too simple'; - } - - $buffer = ''; - foreach ($lines as $k => $line) { - if ('' === trim($line)) - continue; - - $columns = explode(';', $line); - if (empty($columns)) { - printf("[015] Cannot parse columns\n"); - $error = 'Cannot parse columns'; - } - - // increase id column value - $columns[0] += 1; - $buffer .= implode(';', $columns); - $buffer .= "\n"; - } - - /* report the wrong length */ - return strlen($buffer) - 1; - } - - $file = create_standard_csv(1); - $expected = array( - array('id' => 98, 'label' => 'x'), - array('id' => 99, 'label' => 'y'), - array('id' => 100, 'label' => 'z'), - ); - try_handler(20, $link, $file, 'callback_short_len', $expected); - - mysqli_close($link); - print "done!"; -?> ---CLEAN-- - ---EXPECTF-- -Callback set to 'callback_short_len' -Callback: 0 - -Warning: mysqli_query(): Mismatch between the return value of the callback and the content length of the buffer. in %s on line %d -[022] LOAD DATA failed, [2000] Mismatch between the return value of the callback and the content length of the buffer. -[024/0] [0] '' -done! \ No newline at end of file diff --git a/ext/mysqli/tests/mysqli_set_local_infile_handler_unregister.phpt b/ext/mysqli/tests/mysqli_set_local_infile_handler_unregister.phpt deleted file mode 100644 index f287f4d874..0000000000 --- a/ext/mysqli/tests/mysqli_set_local_infile_handler_unregister.phpt +++ /dev/null @@ -1,64 +0,0 @@ ---TEST-- -mysqli_set_local_infile_handler() - do not use the file pointer ---SKIPIF-- -errno, $link->error)); - -mysqli_close($link); -?> ---INI-- -mysqli.allow_local_infile=1 ---FILE-- - 10) - return 0; - - mysqli_set_local_infile_default($link); - return strlen($buffer); - } - - $file = create_standard_csv(1); - $expected = array(array('id' => 1, 'label' => 'a')); - try_handler(20, $link, $file, 'callback_unregister', $expected); - - mysqli_close($link); - print "done!"; -?> ---CLEAN-- - ---EXPECTF-- -Callback set to 'callback_unregister' -Callback: 0 - -Warning: mysqli_query(): File handle closed in %s on line %d -[022] LOAD DATA failed, [2000] File handle closed -[024/0] [0] '' -done!