xref: /php-src/ext/pdo/tests/pdo_test.inc (revision d6a0b3af)
1<?php
2# PDO test framework utilities
3
4if (getenv('PDOTEST_DSN') === false) {
5    $common = '';
6    $append = false;
7    foreach(file(dirname($_SERVER['PHP_SELF']).'/common.phpt') as $line) {
8        if ($append) {
9            $common .= $line;
10        } elseif (trim($line) == '--REDIRECTTEST--') {
11            $append = true;
12        }
13    }
14    $conf = eval($common);
15    foreach($conf['ENV'] as $n=>$v) putenv("$n=$v");
16}
17
18class PDOTest {
19    // create an instance of the PDO driver, based on
20    // the current environment
21    static function factory($classname = PDO::class) {
22        $dsn = getenv('PDOTEST_DSN');
23        $user = getenv('PDOTEST_USER');
24        $pass = getenv('PDOTEST_PASS');
25        $attr = getenv('PDOTEST_ATTR');
26        if (is_string($attr) && strlen($attr)) {
27            $attr = unserialize($attr);
28        } else {
29            $attr = null;
30        }
31
32        if ($user === false) $user = NULL;
33        if ($pass === false) $pass = NULL;
34
35        $db = new $classname($dsn, $user, $pass, $attr);
36
37        if (!$db) {
38            die("Could not create PDO object (DSN=$dsn, user=$user)\n");
39        }
40        // Ignore errors about non-existent tables
41        $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
42
43        $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
44        $db->setAttribute(PDO::ATTR_CASE, PDO::CASE_LOWER);
45        $db->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, true);
46        return $db;
47    }
48
49    static function skip() {
50        try {
51            $db = PDOTest::factory();
52        } catch (PDOException $e) {
53            die("skip " . $e->getMessage());
54        }
55    }
56
57    static function test_factory($file, $classname = PDO::class) {
58        $config = self::get_config($file);
59        foreach ($config['ENV'] as $k => $v) {
60            putenv("$k=$v");
61        }
62        return self::factory($classname);
63    }
64
65    static function get_config($file) {
66        $data = file_get_contents($file);
67        $data = preg_replace('/^.*--REDIRECTTEST--/s', '', $data);
68        $config = eval($data);
69
70        return $config;
71    }
72
73    public static function dropTableIfExists(PDO $db, string $tableName): void {
74        if (getenv('PDOTEST_DSN') === "sqlite::memory:") {
75            return;
76        }
77
78        match ($db->getAttribute(PDO::ATTR_DRIVER_NAME)) {
79            "oci" => $db->exec(<<<SQL
80                 BEGIN
81                     EXECUTE IMMEDIATE 'DROP TABLE $tableName';
82                 EXCEPTION
83                     WHEN OTHERS THEN
84                         IF SQLCODE != -942 THEN
85                             RAISE;
86                         END IF;
87                    END;
88                SQL
89            ),
90            "firebird" => @$db->exec("DROP TABLE $tableName"),
91            default => $db->exec("DROP TABLE IF EXISTS $tableName"),
92        };
93    }
94}
95?>
96