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