diff options
author | Dmitry Stogov <dmitry@php.net> | 2008-07-17 09:53:42 +0000 |
---|---|---|
committer | Dmitry Stogov <dmitry@php.net> | 2008-07-17 09:53:42 +0000 |
commit | 833a2295d143c67295dd94e20a56883b4f2d0787 (patch) | |
tree | ae1e5acb20381bbdda96ad813b8772f497329de5 /ext/mysqli | |
parent | 47e6c5d017c8e0451003f9eddcfa01db89857bd6 (diff) | |
download | php-git-833a2295d143c67295dd94e20a56883b4f2d0787.tar.gz |
Support for closures
Diffstat (limited to 'ext/mysqli')
-rw-r--r-- | ext/mysqli/mysqli_api.c | 3 | ||||
-rwxr-xr-x | ext/mysqli/tests/mysqli_set_local_infile_handler_closures.phpt | 65 |
2 files changed, 67 insertions, 1 deletions
diff --git a/ext/mysqli/mysqli_api.c b/ext/mysqli/mysqli_api.c index a8c376cf46..b95584b554 100644 --- a/ext/mysqli/mysqli_api.c +++ b/ext/mysqli/mysqli_api.c @@ -1420,6 +1420,7 @@ PHP_FUNCTION(mysqli_set_local_infile_handler) efree(callback_name); RETURN_FALSE; } + efree(callback_name); /* save callback function */ if (!mysql->li_read) { @@ -1427,7 +1428,7 @@ PHP_FUNCTION(mysqli_set_local_infile_handler) } else { zval_dtor(mysql->li_read); } - ZVAL_STRING(mysql->li_read, callback_name, 0); + ZVAL_ZVAL(mysql->li_read, callback_func, 1, 0); RETURN_TRUE; } diff --git a/ext/mysqli/tests/mysqli_set_local_infile_handler_closures.phpt b/ext/mysqli/tests/mysqli_set_local_infile_handler_closures.phpt new file mode 100755 index 0000000000..3bdf6bb78b --- /dev/null +++ b/ext/mysqli/tests/mysqli_set_local_infile_handler_closures.phpt @@ -0,0 +1,65 @@ +--TEST-- +mysqli_set_local_infile_handler() - use closures as handler +--SKIPIF-- +<?php +require_once('skipif.inc'); +require_once('skipifemb.inc'); +require_once('skipifconnectfailure.inc'); + +if (!function_exists('mysqli_set_local_infile_handler')) + die("skip - function not available."); + +require_once('connect.inc'); +if (!$TEST_EXPERIMENTAL) + die("skip - experimental (= unsupported) feature"); + +if (!$link = mysqli_connect($host, $user, $passwb, $db, $port, $socket)) + die("skip Cannot connect to MySQL"); + +if (!$res = mysqli_query($link, 'SHOW VARIABLES LIKE "local_infile"')) { + mysqli_close($link); + die("skip Cannot check if Server variable 'local_infile' is set to 'ON'"); +} + +$row = mysqli_fetch_assoc($res); +mysqli_free_result($res); +mysqli_close($link); + +if ('ON' != $row['Value']) + die(sprintf("skip Server variable 'local_infile' seems not set to 'ON', found '%s'", + $row['Value'])); +?> +--INI-- +mysqli.allow_local_infile=1 +--FILE-- +<?php + require_once('connect.inc'); + require_once('local_infile_tools.inc'); + require_once('table.inc'); + + $callback_replace_buffer = function ($fp, &$buffer, $buflen, &$error) { + static $invocation = 0; + + printf("Callback: %d\n", $invocation++); + flush(); + + $buffer = fread($fp, $buflen); + + if ($invocation > 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!"; +?> +--EXPECTF-- +Callback set to 'Closure object' +Callback: 0 +Callback: 1 +done!
\ No newline at end of file |