diff options
Diffstat (limited to 'ext/pdo_mysql/tests/mysql_pdo_test.inc')
-rw-r--r-- | ext/pdo_mysql/tests/mysql_pdo_test.inc | 177 |
1 files changed, 177 insertions, 0 deletions
diff --git a/ext/pdo_mysql/tests/mysql_pdo_test.inc b/ext/pdo_mysql/tests/mysql_pdo_test.inc new file mode 100644 index 0000000..115aead --- /dev/null +++ b/ext/pdo_mysql/tests/mysql_pdo_test.inc @@ -0,0 +1,177 @@ +<?php +require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'config.inc'); +require_once(dirname(__FILE__) . '/../../../ext/pdo/tests/pdo_test.inc'); + +class MySQLPDOTest extends PDOTest { + + static function factory($classname = 'PDO', $drop_test_tables = false, $myattr = null, $mydsn = null) { + + $dsn = self::getDSN($mydsn); + $user = PDO_MYSQL_TEST_USER; + $pass = PDO_MYSQL_TEST_PASS; + $attr = getenv('PDOTEST_ATTR'); + + if (is_string($attr) && strlen($attr)) { + $attr = unserialize($attr); + } else { + $attr = null; + } + if ($user === false) + $user = NULL; + if ($pass === false) + $pass = NULL; + + $db = new $classname($dsn, $user, $pass, $attr); + if (!$db) { + die("Could not create PDO object (DSN=$dsn, user=$user)\n"); + } + + $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); + $db->setAttribute(PDO::ATTR_CASE, PDO::CASE_LOWER); + + return $db; + } + + static function createTestTable($db, $engine = null) { + if (!$engine) + $engine = PDO_MYSQL_TEST_ENGINE; + + $db->exec('DROP TABLE IF EXISTS test'); + $db->exec('CREATE TABLE test(id INT, label CHAR(1), PRIMARY KEY(id)) ENGINE=' . $engine); + $db->exec("INSERT INTO test(id, label) VALUES (1, 'a'), (2, 'b'), (3, 'c'), (4, 'd'), (5, 'e'), (6, 'f')"); + } + + static function getTableEngine() { + return PDO_MYSQL_TEST_ENGINE; + } + + + static function getDSN($new_options = null, $addition = '') { + if (!$new_options) + return PDO_MYSQL_TEST_DSN . $addition; + + $old_options = array(); + $dsn = substr(PDO_MYSQL_TEST_DSN, + strpos(PDO_MYSQL_TEST_DSN, ':') + 1, + strlen(PDO_MYSQL_TEST_DSN)); + + // no real parser - any excotic setting can fool us + $parts = explode(';', $dsn); + foreach ($parts as $k => $v) { + $tmp = explode('=', $v); + if (count($tmp) == 2) + $old_options[$tmp[0]] = $tmp[1]; + } + + $options = $old_options; + foreach ($new_options as $k => $v) + $options[$k] = $v; + + $dsn = 'mysql:'; + foreach ($options as $k => $v) + $dsn .= sprintf('%s=%s;', $k, $v); + + if ($addition) + $dsn .= $addition; + else + $dsn = substr($dsn, 0, strlen($dsn) -1); + + return $dsn; + } + + static function getClientVersion($db) { + return self::extractVersion($db->getAttribute(PDO::ATTR_CLIENT_VERSION)); + } + + static function getServerVersion($db) { + return self::extractVersion($db->getAttribute(PDO::ATTR_SERVER_VERSION)); + } + + static function extractVersion($version_string) { + /* + TODO: + We're a bit in trouble: PDO_MYSQL returns version strings. + That's wrong according to the manual. According to the manual + integers should be returned. However, this code needs to work + with stinky PDO_MYSQL and hopefully better PDO_MYSQLND. + */ + + // already an int value? + if (is_int($version_string)) + return $version_string; + + // string but int value? + $tmp = (int)$version_string; + if (((string)$tmp) === $version_string) + return $tmp; + + // stinky string which we need to parse + $parts = explode('.', $version_string); + if (count($parts) != 3) + return -1; + + $version = (int)$parts[0] * 10000; + $version+= (int)$parts[1] * 100; + $version+= (int)$parts[2]; + + return $version; + } + + static function getTempDir() { + + if (!function_exists('sys_get_temp_dir')) { + + if (!empty($_ENV['TMP'])) + return realpath( $_ENV['TMP'] ); + if (!empty($_ENV['TMPDIR'])) + return realpath( $_ENV['TMPDIR'] ); + if (!empty($_ENV['TEMP'])) + return realpath( $_ENV['TEMP'] ); + + $temp_file = tempnam(md5(uniqid(rand(), TRUE)), ''); + if ($temp_file) { + $temp_dir = realpath(dirname($temp_file)); + unlink($temp_file); + return $temp_dir; + } + return FALSE; + } else { + return sys_get_temp_dir(); + } + + } + + static function detect_transactional_mysql_engine($db) { + foreach ($db->query("show variables like 'have%'") as $row) { + if (!empty($row) && $row[1] == 'YES' && ($row[0] == 'have_innodb' || $row[0] == 'have_bdb')) { + return str_replace("have_", "", $row[0]); + } + } + /* MySQL 5.6.1+ */ + foreach ($db->query("SHOW ENGINES") as $row) { + if (isset($row['engine']) && isset($row['support'])) { + if ('InnoDB' == $row['engine'] && ('YES' == $row['support'] || 'DEFAULT' == $row['support'])) + return 'innodb'; + } + } + return false; + } + + static function isPDOMySQLnd() { + ob_start(); + phpinfo(); + $tmp = ob_get_contents(); + ob_end_clean(); + $tmp = stristr($tmp, "PDO Driver for MySQL => enabled"); + return (bool)preg_match('/Client API version.*mysqlnd/', $tmp); + } + + static function dropTestTable($db = NULL) { + if (is_null($db)) + $db = self::factory(); + + $db->exec('DROP TABLE IF EXISTS test'); + } + +} +?>
\ No newline at end of file |