1<?php 2 /* 3 Default values are "localhost", "root", 4 database "stest" and empty password. 5 Change the MYSQL_TEST environment values 6 if you want to use another configuration 7 */ 8 9 $driver = new mysqli_driver; 10 11 $host = getenv("MYSQL_TEST_HOST") ? getenv("MYSQL_TEST_HOST") : "localhost"; 12 $port = getenv("MYSQL_TEST_PORT") ? getenv("MYSQL_TEST_PORT") : 3306; 13 $user = getenv("MYSQL_TEST_USER") ? getenv("MYSQL_TEST_USER") : "root"; 14 $passwd = getenv("MYSQL_TEST_PASSWD") ? getenv("MYSQL_TEST_PASSWD") : ""; 15 $db = getenv("MYSQL_TEST_DB") ? getenv("MYSQL_TEST_DB") : "test"; 16 $engine = getenv("MYSQL_TEST_ENGINE") ? getenv("MYSQL_TEST_ENGINE") : "MyISAM"; 17 $socket = getenv("MYSQL_TEST_SOCKET") ? getenv("MYSQL_TEST_SOCKET") : null; 18 $skip_on_connect_failure = getenv("MYSQL_TEST_SKIP_CONNECT_FAILURE") ? getenv("MYSQL_TEST_SKIP_CONNECT_FAILURE") : true; 19 $connect_flags = getenv("MYSQL_TEST_CONNECT_FLAGS") ? (int)getenv("MYSQL_TEST_CONNECT_FLAGS") : 0; 20 if ($socket) { 21 ini_set('mysqli.default_socket', $socket); 22 } 23 24 /* Development setting: test experimal features and/or feature requests that never worked before? */ 25 $TEST_EXPERIMENTAL = (in_array(getenv("MYSQL_TEST_EXPERIMENTAL"), array(0, 1))) ? 26 ((1 == getenv("MYSQL_TEST_EXPERIMENTAL")) ? true : false) : 27 false; 28 29 $IS_MYSQLND = stristr(mysqli_get_client_info(), "mysqlnd"); 30 if (!$IS_MYSQLND) { 31 $MYSQLND_VERSION = NULL; 32 } else { 33 /* 34 The formatting of the version reported by mysqli_get_client_info() 35 has changed significantly in the past. To get tests working properly 36 with PHP 5.3.0 and up, we set everything that looks like prior to 37 PHP 5.3.0 to version 5.0.4 = 5 * 10000 + 0 * 100 + 4 = 50004. 38 PHP 5.3.0 reports mysqlnd 5.0.5 dev (= 5 * 10000 + 0 * 100 + 5 = 50005. 39 */ 40 if (preg_match('@Revision:\s+(\d+)\s*\$@ism', mysqli_get_client_info(), $matches)) { 41 /* something prior to PHP 5.3.0 */ 42 $MYSQLND_VERSION = 50004; 43 } else if (preg_match('@^mysqlnd (\d+)\.(\d+)\.(\d+).*@ism', mysqli_get_client_info(), $matches)) { 44 /* formatting schema used by PHP 5.3.0 */ 45 $MYSQLND_VERSION = (int)$matches[1] * 10000 + (int)$matches[2] * 100 + (int)$matches[3]; 46 } else if (preg_match('@^mysqlnd/PHP 6.0.0-dev@ism', mysqli_get_client_info(), $matches)) { 47 /* 48 PHP 6.0 at the time of the first PHP 5.3.0 release. 49 HEAD and 5.3 have been in sync when 5.3.0 was released. 50 It is at least 5.0.5-dev. 51 */ 52 $MYSQLND_VERSION = 50005; 53 } else { 54 /* unknown */ 55 $MYSQLND_VERSION = -1; 56 } 57 58 } 59 60 if (!function_exists('sys_get_temp_dir')) { 61 function sys_get_temp_dir() { 62 63 if (!empty($_ENV['TMP'])) 64 return realpath( $_ENV['TMP'] ); 65 if (!empty($_ENV['TMPDIR'])) 66 return realpath( $_ENV['TMPDIR'] ); 67 if (!empty($_ENV['TEMP'])) 68 return realpath( $_ENV['TEMP'] ); 69 70 $temp_file = tempnam(md5(uniqid(rand(), TRUE)), ''); 71 if ($temp_file) { 72 $temp_dir = realpath(dirname($temp_file)); 73 unlink($temp_file); 74 return $temp_dir; 75 } 76 return FALSE; 77 } 78 } 79 80 if (!function_exists('my_mysqli_connect')) { 81 82 /** 83 * Whenever possible, please use this wrapper to make testing ot MYSQLI_CLIENT_COMPRESS (and potentially SSL) possible 84 * 85 * @param enable_env_flags Enable setting of connection flags through env(MYSQL_TEST_CONNECT_FLAGS)? 86 */ 87 function my_mysqli_connect($host, $user, $passwd, $db, $port, $socket, $enable_env_flags = true) { 88 global $connect_flags; 89 90 $flags = ($enable_env_flags) ? $connect_flags : false; 91 92 if ($flags !== false) { 93 $link = mysqli_init(); 94 if (!mysqli_real_connect($link, $host, $user, $passwd, $db, $port, $socket, $flags)) 95 $link = false; 96 } else { 97 $link = mysqli_connect($host, $user, $passwd, $db, $port, $socket); 98 } 99 100 return $link; 101 } 102 103 /** 104 * Whenever possible, please use this wrapper to make testing ot MYSQLI_CLIENT_COMPRESS (and potentially SSL) possible 105 * 106 * @param enable_env_flags Enable setting of connection flags through env(MYSQL_TEST_CONNECT_FLAGS) 107 */ 108 function my_mysqli_real_connect($link, $host, $user, $passwd, $db, $port, $socket, $flags = 0, $enable_env_flags = true) { 109 global $connect_flags; 110 111 if ($enable_env_flags) 112 $flags & $connect_flags; 113 114 return mysqli_real_connect($link, $host, $user, $passwd, $db, $port, $socket, $flags); 115 } 116 117 class my_mysqli extends mysqli { 118 public function __construct($host, $user, $passwd, $db, $port, $socket, $enable_env_flags = true) { 119 global $connect_flags; 120 121 $flags = ($enable_env_flags) ? $connect_flags : false; 122 123 if ($flags !== false) { 124 parent::init(); 125 $this->real_connect($host, $user, $passwd, $db, $port, $socket, $flags); 126 } else { 127 parent::__construct($host, $user, $passwd, $db, $port, $socket); 128 } 129 } 130 } 131 132 function my_get_charsets($link) { 133 134 /* Those tree are set by SET NAMES */ 135 $charsets = array( 136 'client' => NULL, 137 'results' => NULL, 138 'connection' => NULL, 139 ); 140 141 if (!($res = mysqli_query($link, "SHOW VARIABLES LIKE '%character%'"))) { 142 printf("[%d] %s\n", mysqli_errno($link), mysqli_error($link)); 143 return $charsets; 144 } 145 146 $names = array(); 147 while ($row = mysqli_fetch_assoc($res)) { 148 $names[$row['Variable_name']] = $row['Value']; 149 } 150 mysqli_free_result($res); 151 152 if (!($res = mysqli_query($link, sprintf("SHOW CHARACTER SET LIKE '%s'", $names['character_set_client']))) || 153 !($details = mysqli_fetch_assoc($res))) { 154 printf("[%d] %s\n", mysqli_errno($link), mysqli_error($link)); 155 return $charsets; 156 } 157 mysqli_free_result($res); 158 159 $charsets['client'] = array( 160 'charset' => $details['Charset'], 161 'desc' => $details['Description'], 162 'collation' => $details['Default collation'], 163 'maxlen' => $details['Maxlen'], 164 'nr' => NULL, 165 ); 166 167 if (!($res = mysqli_query($link, sprintf("SHOW COLLATION LIKE '%s'", $details['Default collation']))) || 168 !($collation = mysqli_fetch_assoc($res))) { 169 printf("[%d] %s\n", mysqli_errno($link), mysqli_error($link)); 170 return $charsets; 171 } 172 mysqli_free_result($res); 173 $charsets['client']['nr'] = $collation['Id']; 174 175 if (!($res = mysqli_query($link, sprintf("SHOW CHARACTER SET LIKE '%s'", $names['character_set_results']))) || 176 !($details = mysqli_fetch_assoc($res))) { 177 printf("[%d] %s\n", mysqli_errno($link), mysqli_error($link)); 178 return $charsets; 179 } 180 mysqli_free_result($res); 181 182 $charsets['results'] = array( 183 'charset' => $details['Charset'], 184 'desc' => $details['Description'], 185 'collation' => $details['Default collation'], 186 'maxlen' => $details['Maxlen'], 187 'nr' => NULL, 188 ); 189 190 if (!($res = mysqli_query($link, sprintf("SHOW COLLATION LIKE '%s'", $details['Default collation']))) || 191 !($collation = mysqli_fetch_assoc($res))) { 192 printf("[%d] %s\n", mysqli_errno($link), mysqli_error($link)); 193 return $charsets; 194 } 195 mysqli_free_result($res); 196 $charsets['results']['nr'] = $collation['Id']; 197 198 199 if (!($res = mysqli_query($link, sprintf("SHOW CHARACTER SET LIKE '%s'", $names['character_set_connection']))) || 200 !($details = mysqli_fetch_assoc($res))) { 201 printf("[%d] %s\n", mysqli_errno($link), mysqli_error($link)); 202 return $charsets; 203 } 204 mysqli_free_result($res); 205 206 $charsets['connection'] = array( 207 'charset' => $details['Charset'], 208 'desc' => $details['Description'], 209 'collation' => $details['Default collation'], 210 'maxlen' => $details['Maxlen'], 211 'nr' => NULL, 212 ); 213 214 if (!($res = mysqli_query($link, sprintf("SHOW COLLATION LIKE '%s'", $details['Default collation']))) || 215 !($collation = mysqli_fetch_assoc($res))) { 216 printf("[%d] %s\n", mysqli_errno($link), mysqli_error($link)); 217 return $charsets; 218 } 219 mysqli_free_result($res); 220 $charsets['connection']['nr'] = $collation['Id']; 221 222 return $charsets; 223 } 224 225 function have_innodb($link) { 226 if (($res = $link->query("SHOW VARIABLES LIKE 'have_innodb'")) && 227 ($row = $res->fetch_row()) && 228 !empty($row)) { 229 if ($row[1] == "DISABLED" || $row[1] == "NO") { 230 return false; 231 } 232 return true; 233 } else { 234 /* MySQL 5.6.1+ */ 235 if ($res = $link->query("SHOW ENGINES")) { 236 while ($row = $res->fetch_assoc()) { 237 if (!isset($row['Engine']) || !isset($row['Support'])) 238 return false; 239 240 if (('InnoDB' == $row['Engine']) && 241 (('YES' == $row['Support']) || ('DEFAULT' == $row['Support'])) 242 ) { 243 return true; 244 } 245 } 246 return false; 247 } else { 248 return false; 249 } 250 } 251 return false; 252 } 253 254 } else { 255 printf("skip Eeeek/BUG/FIXME - connect.inc included twice! skipif bug?\n"); 256 } 257 258 function handle_catchable_fatal($errno, $error, $file, $line) { 259 static $errcodes = array(); 260 if (empty($errcodes)) { 261 $constants = get_defined_constants(); 262 foreach ($constants as $name => $value) { 263 if (substr($name, 0, 2) == "E_") 264 $errcodes[$value] = $name; 265 } 266 } 267 printf("[%s] %s in %s on line %s\n", 268 (isset($errcodes[$errno])) ? $errcodes[$errno] : $errno, 269 $error, $file, $line); 270 271 return true; 272 } 273?> 274