1--TEST--
2mysqli_debug() - mysqlnd only control strings
3--EXTENSIONS--
4mysqli
5--SKIPIF--
6<?php
7require_once('skipifconnectfailure.inc');
8require_once('connect.inc');
9
10if (!function_exists('mysqli_debug'))
11    die("skip mysqli_debug() not available");
12
13if (!defined('MYSQLI_DEBUG_TRACE_ENABLED'))
14    die("skip: can't say for sure if mysqli_debug works");
15
16if (defined('MYSQLI_DEBUG_TRACE_ENABLED') && !MYSQLI_DEBUG_TRACE_ENABLED)
17    die("skip: debug functionality not enabled");
18
19if (!$IS_MYSQLND)
20    die("skip mysqlnd only test");
21?>
22--FILE--
23<?php
24    require_once('connect.inc');
25    require_once('table.inc');
26
27    function try_control_string($link, $control_string, $trace_file, $offset) {
28
29        @unlink($trace_file);
30        if (true !== ($tmp = @mysqli_debug($control_string))) {
31            printf("[%03d][control string '%s'] Expecting boolean/true, got %s/%s.\n",
32                $offset + 1,
33                $control_string,
34                gettype($tmp),
35                $tmp);
36            return false;
37        }
38
39        if (!$res = mysqli_query($link, 'SELECT * FROM test')) {
40            printf("[%03d][control string '%s'] [%d] %s.\n",
41                $offset + 2,
42                $control_string,
43                mysqli_errno($link),
44                mysqli_error($link));
45            return false;
46        }
47        while ($row = mysqli_fetch_assoc($res))
48            ;
49        mysqli_free_result($res);
50
51        clearstatcache();
52        if (!file_exists($trace_file)) {
53            printf("[%03d][control string '%s'] Trace file has not been written.\n",
54                $offset + 3,
55                $control_string,
56                gettype($tmp),
57                $tmp);
58            return false;
59        }
60
61        return trim(substr(file_get_contents($trace_file), 0, 100024));
62    }
63
64    $memory_funcs = array(
65        '_mysqlnd_ecalloc',
66        '_mysqlnd_emalloc',
67        '_mysqlnd_palloc_free_thd_cache_reference',
68        '_mysqlnd_pecalloc',
69        '_mysqlnd_pefree',
70        '_mysqlnd_pemalloc',
71        '_mysqlnd_perealloc',
72    );
73    $trace_file = sprintf('%s%s%s', sys_get_temp_dir(), DIRECTORY_SEPARATOR, 'mysqli_debug_phpt.trace');
74
75    $trace = try_control_string($link, 't:m:O,' . $trace_file, $trace_file, 10);
76    if (!strstr($trace, 'SELECT * FROM test') && !strstr($trace, 'mysql_real_query'))
77        printf("[015] SELECT query cannot be found in trace. Trace contents seems wrong.\n");
78
79    $lines_trace = explode("\n", $trace);
80    $functions_trace = array();
81    foreach ($lines_trace as $k => $line) {
82        $line = trim($line);
83        if (preg_match("@^[|\s]*>([\w:]+)@ism", $line, $matches)) {
84            $functions_trace[$matches[1]] = $matches[1];
85        }
86    }
87
88    $found = 0;
89    foreach ($memory_funcs as $k => $name)
90        if (isset($functions_trace[$name]))
91            $found++;
92
93    if ($found < 1) {
94        printf("[016] Only %d memory functions have been found, expecting at least %d.\n",
95            $found, 1);
96        var_dump($trace);
97    }
98
99    $trace = try_control_string($link, 't:O,' . $trace_file, $trace_file, 20);
100    if (!strstr($trace, 'SELECT * FROM test') && !strstr($trace, 'mysql_real_query'))
101        printf("[025] SELECT query cannot be found in trace. Trace contents seems wrong.\n");
102
103    $lines_trace = explode("\n", $trace);
104    $functions_trace = array();
105    foreach ($lines_trace as $k => $line) {
106        $line = trim($line);
107        if (preg_match("@^[|\s]*>([\w:]+)@ism", $line, $matches)) {
108            $functions_trace[$matches[1]] = $matches[1];
109        }
110    }
111
112    $found = 0;
113    foreach ($memory_funcs as $k => $name)
114        if (isset($functions_trace[$name]))
115            $found++;
116
117    if ($found > 2) {
118        printf("[026] More than %d memory functions have been recorded, that's strange.\n",
119            $found);
120        var_dump($trace);
121    }
122
123    mysqli_close($link);
124    @unlink($trace_file);
125    print "done!";
126?>
127--CLEAN--
128<?php
129    require_once("clean_table.inc");
130?>
131--EXPECT--
132done!
133