Annotation of embedaddon/php/ext/mysqli/tests/mysqli_fetch_array_large.phpt, revision 1.1.1.2

1.1       misho       1: --TEST--
                      2: mysqli_fetch_array() - large packages (to test compression)
                      3: --SKIPIF--
                      4: <?php
                      5: require_once('skipif.inc');
                      6: require_once('skipifconnectfailure.inc');
                      7: ?>
1.1.1.2 ! misho       8: --INI--
        !             9: memory_limit=-1
1.1       misho      10: --FILE--
                     11: <?php
                     12:        require_once("connect.inc");
                     13: 
                     14:        function mysqli_fetch_array_large($offset, $link, $package_size) {
                     15: 
                     16:                /* we are aiming for maximum compression to test MYSQLI_CLIENT_COMPRESS */
                     17:                $random_char = str_repeat('a', 255);
                     18:                $sql = "INSERT INTO test(label) VALUES ";
                     19: 
                     20:                while (strlen($sql) < ($package_size - 259))
                     21:                        $sql .= sprintf("('%s'), ", $random_char);
                     22: 
                     23:                $sql = substr($sql, 0, -2);
                     24:                $len = strlen($sql);
                     25:                assert($len < $package_size);
                     26: 
                     27:                if (!@mysqli_query($link, $sql)) {
                     28:                        if (1153 == mysqli_errno($link) || 2006 == mysqli_errno($link) || stristr(mysqli_error($link), 'max_allowed_packet'))
                     29:                                /*
                     30:                                        myslqnd - [1153] Got a packet bigger than 'max_allowed_packet' bytes
                     31:                                        libmysql -[2006] MySQL server has gone away
                     32:                                */
                     33:                                return false;
                     34: 
                     35:                        printf("[%03d + 1] len = %d, [%d] %s\n", $offset, $len, mysqli_errno($link), mysqli_error($link));
                     36:                        return false;
                     37:                }
                     38: 
                     39:                /* buffered result set - let's hope we do not run into PHP memory limit... */
                     40:                if (!$res = mysqli_query($link, "SELECT id, label FROM test")) {
                     41:                        printf("[%03d + 2] len = %d, [%d] %s\n", $offset, $len, mysqli_errno($link), mysqli_error($link));
                     42:                        return false;
                     43:                }
                     44: 
                     45:                while ($row = mysqli_fetch_assoc($res)) {
                     46:                        if ($row['label'] != $random_char) {
                     47:                                printf("[%03d + 3] Wrong results - expecting '%s' got '%s', len = %d, [%d] %s\n",
                     48:                                        $offset, $random_char, $row['label'], $len, mysqli_errno($link), mysqli_error($link));
                     49:                                return false;
                     50:                        }
                     51:                }
                     52:                mysqli_free_result($res);
                     53: 
                     54:                if (!$stmt = mysqli_prepare($link, "SELECT id, label FROM test")) {
                     55:                        printf("[%03d + 4] len = %d, [%d] %s\n", $offset, $len, mysqli_errno($link), mysqli_error($link));
                     56:                        return false;
                     57:                }
                     58: 
                     59:                /* unbuffered result set */
                     60:                if (!mysqli_stmt_execute($stmt)) {
                     61:                        printf("[%03d + 5] len = %d, [%d] %s, [%d] %s\n", $offset, $len, mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt), mysqli_errno($link), mysqli_error($link));
                     62:                        return false;
                     63:                }
                     64: 
                     65:                $id = $label = NULL;
                     66:                if (!mysqli_stmt_bind_result($stmt, $id, $label)) {
                     67:                        printf("[%03d + 6] len = %d, [%d] %s, [%d] %s\n", $offset, $len, mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt), mysqli_errno($link), mysqli_error($link));
                     68:                        return false;
                     69:                }
                     70: 
                     71:                while (mysqli_stmt_fetch($stmt)) {
                     72:                        if ($label != $random_char) {
                     73:                                printf("[%03d + 7] Wrong results - expecting '%s' got '%s', len = %d, [%d] %s\n",
                     74:                                        $offset, $random_char, $label, $len, mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
                     75:                                return false;
                     76:                        }
                     77:                }
                     78: 
                     79:                mysqli_stmt_free_result($stmt);
                     80:                mysqli_stmt_close($stmt);
                     81: 
                     82:                return true;
                     83:        }
                     84: 
                     85:        function parse_memory_limit($limit) {
                     86: 
                     87:                $val = trim($limit);
                     88:                $last = strtolower($val[strlen($val)-1]);
                     89: 
                     90:                switch($last) {
                     91:                                // The 'G' modifier is available since PHP 5.1.0
                     92:                                case 'g':
                     93:                                        $val *= 1024;
                     94:                                case 'm':
                     95:                                        $val *= 1024;
                     96:                                case 'k':
                     97:                                        $val *= 1024;
                     98:                                default:
                     99:                                        break;
                    100:        }
                    101:                        return $val;
                    102:        }
                    103: 
                    104: 
                    105:        function test_fetch($host, $user, $passwd, $db, $port, $socket, $engine, $flags = null) {
                    106: 
                    107:                $link = mysqli_init();
                    108:                if (!my_mysqli_real_connect($link, $host, $user, $passwd, $db, $port, $socket, $flags)) {
                    109:                        printf("[001] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n",
                    110:                        $host, $user, $db, $port, $socket);
                    111:                        return false;
                    112:                }
                    113: 
                    114:                if (!mysqli_query($link, "DROP TABLE IF EXISTS test") ||
                    115:                        !mysqli_query($link, sprintf("CREATE TABLE test(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, label VARCHAR(255)) ENGINE = %s", $engine))) {
                    116:                        printf("[002] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
                    117:                        return false;
                    118:                }
                    119: 
                    120:                $package_size = 524288;
                    121:                $offset = 3;
                    122:                $limit = (ini_get('memory_limit') > 0) ? parse_memory_limit(ini_get('memory_limit')) : pow(2, 32);
                    123: 
                    124:                /* try to respect php.ini but make run time a soft limit */
                    125:                $max_runtime = (ini_get('max_execution_time') > 0) ? ini_get('max_execution_time') : 30;
                    126:                set_time_limit(0);
                    127: 
                    128:                do {
                    129:                        if ($package_size > $limit) {
                    130:                                printf("stop: memory limit - %s vs. %s\n", $package_size, $limit);
                    131:                                break;
                    132:                        }
                    133: 
                    134:                        $start = microtime(true);
                    135:                        if (!mysqli_fetch_array_large($offset++, $link, $package_size)) {
                    136:                                printf("stop: packet size - %d\n", $package_size);
                    137:                                break;
                    138:                        }
                    139: 
                    140:                        $duration = microtime(true) - $start;
                    141:                        $max_runtime -= $duration;
                    142:                        if ($max_runtime < ($duration * 3)) {
                    143:                                /* likely the next iteration will not be within max_execution_time */
                    144:                                printf("stop: time limit - %2.2fs\n", $max_runtime);
                    145:                                break;
                    146:                        }
                    147: 
                    148:                        $package_size += $package_size;
                    149: 
                    150:                } while (true);
                    151: 
                    152: 
                    153:                mysqli_close($link);
                    154:                return true;
                    155:        }
                    156: 
                    157: 
                    158:        test_fetch($host, $user, $passwd, $db, $port, $socket, $engine, null);
                    159:        test_fetch($host, $user, $passwd, $db, $port, $socket, $engine, MYSQLI_CLIENT_COMPRESS);
                    160:        print "done!";
                    161: ?>
                    162: --CLEAN--
                    163: <?php
                    164:        require_once("clean_table.inc");
                    165: ?>
                    166: --EXPECTF--
                    167: stop: %s
                    168: stop: %s
1.1.1.2 ! misho     169: done!

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>