PageRenderTime 72ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 0ms

/hphp/test/zend/bad/ext/mysqli/tests/mysqli_fetch_array_large.php

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