Annotation of embedaddon/php/ext/pdo_mysql/tests/mysql_pdo_test.inc, revision 1.1.1.1
1.1 misho 1: <?php
2: require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'config.inc');
3: require_once(dirname(__FILE__) . '/../../../ext/pdo/tests/pdo_test.inc');
4:
5: class MySQLPDOTest extends PDOTest {
6:
7: static function factory($classname = 'PDO', $drop_test_tables = false, $myattr = null, $mydsn = null) {
8:
9: $dsn = self::getDSN($mydsn);
10: $user = PDO_MYSQL_TEST_USER;
11: $pass = PDO_MYSQL_TEST_PASS;
12: $attr = getenv('PDOTEST_ATTR');
13:
14: if (is_string($attr) && strlen($attr)) {
15: $attr = unserialize($attr);
16: } else {
17: $attr = null;
18: }
19: if ($user === false)
20: $user = NULL;
21: if ($pass === false)
22: $pass = NULL;
23:
24: $db = new $classname($dsn, $user, $pass, $attr);
25: if (!$db) {
26: die("Could not create PDO object (DSN=$dsn, user=$user)\n");
27: }
28:
29: $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
30: $db->setAttribute(PDO::ATTR_CASE, PDO::CASE_LOWER);
31:
32: return $db;
33: }
34:
35: static function createTestTable($db, $engine = null) {
36: if (!$engine)
37: $engine = PDO_MYSQL_TEST_ENGINE;
38:
39: $db->exec('DROP TABLE IF EXISTS test');
40: $db->exec('CREATE TABLE test(id INT, label CHAR(1), PRIMARY KEY(id)) ENGINE=' . $engine);
41: $db->exec("INSERT INTO test(id, label) VALUES (1, 'a'), (2, 'b'), (3, 'c'), (4, 'd'), (5, 'e'), (6, 'f')");
42: }
43:
44: static function getTableEngine() {
45: return PDO_MYSQL_TEST_ENGINE;
46: }
47:
48:
49: static function getDSN($new_options = null, $addition = '') {
50: if (!$new_options)
51: return PDO_MYSQL_TEST_DSN . $addition;
52:
53: $old_options = array();
54: $dsn = substr(PDO_MYSQL_TEST_DSN,
55: strpos(PDO_MYSQL_TEST_DSN, ':') + 1,
56: strlen(PDO_MYSQL_TEST_DSN));
57:
58: // no real parser - any excotic setting can fool us
59: $parts = explode(';', $dsn);
60: foreach ($parts as $k => $v) {
61: $tmp = explode('=', $v);
62: if (count($tmp) == 2)
63: $old_options[$tmp[0]] = $tmp[1];
64: }
65:
66: $options = $old_options;
67: foreach ($new_options as $k => $v)
68: $options[$k] = $v;
69:
70: $dsn = 'mysql:';
71: foreach ($options as $k => $v)
72: $dsn .= sprintf('%s=%s;', $k, $v);
73:
74: if ($addition)
75: $dsn .= $addition;
76: else
77: $dsn = substr($dsn, 0, strlen($dsn) -1);
78:
79: return $dsn;
80: }
81:
82: static function getClientVersion($db) {
83: return self::extractVersion($db->getAttribute(PDO::ATTR_CLIENT_VERSION));
84: }
85:
86: static function getServerVersion($db) {
87: return self::extractVersion($db->getAttribute(PDO::ATTR_SERVER_VERSION));
88: }
89:
90: static function extractVersion($version_string) {
91: /*
92: TODO:
93: We're a bit in trouble: PDO_MYSQL returns version strings.
94: That's wrong according to the manual. According to the manual
95: integers should be returned. However, this code needs to work
96: with stinky PDO_MYSQL and hopefully better PDO_MYSQLND.
97: */
98:
99: // already an int value?
100: if (is_int($version_string))
101: return $version_string;
102:
103: // string but int value?
104: $tmp = (int)$version_string;
105: if (((string)$tmp) === $version_string)
106: return $tmp;
107:
108: // stinky string which we need to parse
109: $parts = explode('.', $version_string);
110: if (count($parts) != 3)
111: return -1;
112:
113: $version = (int)$parts[0] * 10000;
114: $version+= (int)$parts[1] * 100;
115: $version+= (int)$parts[2];
116:
117: return $version;
118: }
119:
120: static function getTempDir() {
121:
122: if (!function_exists('sys_get_temp_dir')) {
123:
124: if (!empty($_ENV['TMP']))
125: return realpath( $_ENV['TMP'] );
126: if (!empty($_ENV['TMPDIR']))
127: return realpath( $_ENV['TMPDIR'] );
128: if (!empty($_ENV['TEMP']))
129: return realpath( $_ENV['TEMP'] );
130:
131: $temp_file = tempnam(md5(uniqid(rand(), TRUE)), '');
132: if ($temp_file) {
133: $temp_dir = realpath(dirname($temp_file));
134: unlink($temp_file);
135: return $temp_dir;
136: }
137: return FALSE;
138: } else {
139: return sys_get_temp_dir();
140: }
141:
142: }
143:
144: static function detect_transactional_mysql_engine($db) {
145: foreach ($db->query("show variables like 'have%'") as $row) {
146: if (!empty($row) && $row[1] == 'YES' && ($row[0] == 'have_innodb' || $row[0] == 'have_bdb')) {
147: return str_replace("have_", "", $row[0]);
148: }
149: }
150: /* MySQL 5.6.1+ */
151: foreach ($db->query("SHOW ENGINES") as $row) {
152: if (isset($row['engine']) && isset($row['support'])) {
153: if ('InnoDB' == $row['engine'] && ('YES' == $row['support'] || 'DEFAULT' == $row['support']))
154: return 'innodb';
155: }
156: }
157: return false;
158: }
159:
160: static function isPDOMySQLnd() {
161: ob_start();
162: phpinfo();
163: $tmp = ob_get_contents();
164: ob_end_clean();
165: $tmp = stristr($tmp, "PDO Driver for MySQL => enabled");
166: return (bool)preg_match('/Client API version.*mysqlnd/', $tmp);
167: }
168:
169: static function dropTestTable($db = NULL) {
170: if (is_null($db))
171: $db = self::factory();
172:
173: $db->exec('DROP TABLE IF EXISTS test');
174: }
175:
176: }
177: ?>
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>