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

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

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