J. King
2 years ago
18 changed files with 236 additions and 211 deletions
@ -0,0 +1,60 @@ |
|||||
|
<?php |
||||
|
/** @license MIT |
||||
|
* Copyright 2017 J. King, Dustin Wilson et al. |
||||
|
* See LICENSE and AUTHORS files for details */ |
||||
|
|
||||
|
declare(strict_types=1); |
||||
|
namespace JKingWeb\Arsse\Test\DatabaseDrivers; |
||||
|
|
||||
|
use JKingWeb\Arsse\Db\Driver; |
||||
|
|
||||
|
trait MySQLCommon { |
||||
|
public static function dbTableList($db): array { |
||||
|
$listTables = "SELECT table_name as name from information_schema.tables where table_schema = database() and table_name like 'arsse_%'"; |
||||
|
if ($db instanceof Driver) { |
||||
|
$tables = $db->query($listTables)->getAll(); |
||||
|
} elseif ($db instanceof \PDO) { |
||||
|
$tables = $db->query($listTables)->fetchAll(\PDO::FETCH_ASSOC); |
||||
|
} else { |
||||
|
$tables = $db->query($listTables)->fetch_all(\MYSQLI_ASSOC); |
||||
|
} |
||||
|
$tables = sizeof($tables) ? array_column($tables, "name") : []; |
||||
|
return $tables; |
||||
|
} |
||||
|
|
||||
|
public static function dbTruncate($db, array $afterStatements = []): void { |
||||
|
// rollback any pending transaction |
||||
|
try { |
||||
|
$db->query("UNLOCK TABLES; ROLLBACK"); |
||||
|
} catch (\Throwable $e) { |
||||
|
} |
||||
|
$db->query("SET FOREIGN_KEY_CHECKS=0"); |
||||
|
foreach (self::dbTableList($db) as $table) { |
||||
|
if ($table === "arsse_meta") { |
||||
|
$db->query("DELETE FROM $table where `key` <> 'schema_version'"); |
||||
|
} else { |
||||
|
$db->query("TRUNCATE TABLE $table"); |
||||
|
} |
||||
|
} |
||||
|
foreach ($afterStatements as $st) { |
||||
|
$db->query($st); |
||||
|
} |
||||
|
$db->query("SET FOREIGN_KEY_CHECKS=1"); |
||||
|
} |
||||
|
|
||||
|
public static function dbRaze($db, array $afterStatements = []): void { |
||||
|
// rollback any pending transaction |
||||
|
try { |
||||
|
$db->query("UNLOCK TABLES; ROLLBACK"); |
||||
|
} catch (\Throwable $e) { |
||||
|
} |
||||
|
$db->query("SET FOREIGN_KEY_CHECKS=0"); |
||||
|
foreach (self::dbTableList($db) as $table) { |
||||
|
$db->query("DROP TABLE IF EXISTS $table"); |
||||
|
} |
||||
|
foreach ($afterStatements as $st) { |
||||
|
$db->query($st); |
||||
|
} |
||||
|
$db->query("SET FOREIGN_KEY_CHECKS=1"); |
||||
|
} |
||||
|
} |
@ -0,0 +1,69 @@ |
|||||
|
<?php |
||||
|
/** @license MIT |
||||
|
* Copyright 2017 J. King, Dustin Wilson et al. |
||||
|
* See LICENSE and AUTHORS files for details */ |
||||
|
|
||||
|
declare(strict_types=1); |
||||
|
namespace JKingWeb\Arsse\Test\DatabaseDrivers; |
||||
|
|
||||
|
use JKingWeb\Arsse\Arsse; |
||||
|
use JKingWeb\Arsse\Db\Driver; |
||||
|
|
||||
|
trait PostgreSQLCommon { |
||||
|
public static function dbExec($db, $q): void { |
||||
|
if ($db instanceof Driver) { |
||||
|
$db->exec($q); |
||||
|
} elseif ($db instanceof \PDO) { |
||||
|
$db->exec($q); |
||||
|
} else { |
||||
|
pg_query($db, $q); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public static function dbTableList($db): array { |
||||
|
$listObjects = "SELECT table_name as name, 'TABLE' as type from information_schema.tables where table_schema = current_schema() and table_name like 'arsse_%' union SELECT collation_name as name, 'COLLATION' as type from information_schema.collations where collation_schema = current_schema()"; |
||||
|
if ($db instanceof Driver) { |
||||
|
return $db->query($listObjects)->getAll(); |
||||
|
} elseif ($db instanceof \PDO) { |
||||
|
return $db->query($listObjects)->fetchAll(\PDO::FETCH_ASSOC); |
||||
|
} else { |
||||
|
$r = @pg_query($db, $listObjects); |
||||
|
$out = $r ? pg_fetch_all($r) : false; |
||||
|
return $out ? $out : []; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public static function dbTruncate($db, array $afterStatements = []): void { |
||||
|
// rollback any pending transaction |
||||
|
try { |
||||
|
@self::dbExec($db, "ROLLBACK"); |
||||
|
} catch (\Throwable $e) { |
||||
|
} |
||||
|
foreach (self::dbTableList($db) as $obj) { |
||||
|
if ($obj['type'] !== "TABLE") { |
||||
|
continue; |
||||
|
} elseif ($obj['name'] === "arsse_meta") { |
||||
|
self::dbExec($db, "DELETE FROM {$obj['name']} where key <> 'schema_version'"); |
||||
|
} else { |
||||
|
self::dbExec($db, "TRUNCATE TABLE {$obj['name']} restart identity cascade"); |
||||
|
} |
||||
|
} |
||||
|
foreach ($afterStatements as $st) { |
||||
|
self::dbExec($db, $st); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public static function dbRaze($db, array $afterStatements = []): void { |
||||
|
// rollback any pending transaction |
||||
|
try { |
||||
|
@self::dbExec($db, "ROLLBACK"); |
||||
|
} catch (\Throwable $e) { |
||||
|
} |
||||
|
foreach (self::dbTableList($db) as $obj) { |
||||
|
self::dbExec($db, "DROP {$obj['type']} IF EXISTS {$obj['name']} cascade"); |
||||
|
} |
||||
|
foreach ($afterStatements as $st) { |
||||
|
self::dbExec($db, $st); |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,70 @@ |
|||||
|
<?php |
||||
|
/** @license MIT |
||||
|
* Copyright 2017 J. King, Dustin Wilson et al. |
||||
|
* See LICENSE and AUTHORS files for details */ |
||||
|
|
||||
|
declare(strict_types=1); |
||||
|
namespace JKingWeb\Arsse\Test\DatabaseDrivers; |
||||
|
|
||||
|
use JKingWeb\Arsse\Db\Driver; |
||||
|
|
||||
|
trait SQLite3Common { |
||||
|
public static function dbTableList($db): array { |
||||
|
$listTables = "SELECT name from sqlite_master where type = 'table' and name like 'arsse^_%' escape '^'"; |
||||
|
if ($db instanceof Driver) { |
||||
|
$tables = $db->query($listTables)->getAll(); |
||||
|
$tables = sizeof($tables) ? array_column($tables, "name") : []; |
||||
|
} elseif ($db instanceof \PDO) { |
||||
|
retry: |
||||
|
try { |
||||
|
$tables = $db->query($listTables)->fetchAll(\PDO::FETCH_ASSOC); |
||||
|
} catch (\PDOException $e) { |
||||
|
goto retry; |
||||
|
} |
||||
|
$tables = sizeof($tables) ? array_column($tables, "name") : []; |
||||
|
} else { |
||||
|
$tables = []; |
||||
|
$result = $db->query($listTables); |
||||
|
while ($r = $result->fetchArray(\SQLITE3_ASSOC)) { |
||||
|
$tables[] = $r['name']; |
||||
|
} |
||||
|
$result->finalize(); |
||||
|
} |
||||
|
return $tables; |
||||
|
} |
||||
|
|
||||
|
public static function dbTruncate($db, array $afterStatements = []): void { |
||||
|
// rollback any pending transaction |
||||
|
try { |
||||
|
$db->exec("ROLLBACK"); |
||||
|
} catch (\Throwable $e) { |
||||
|
} |
||||
|
foreach (self::dbTableList($db) as $table) { |
||||
|
if ($table === "arsse_meta") { |
||||
|
$db->exec("DELETE FROM $table where key <> 'schema_version'"); |
||||
|
} else { |
||||
|
$db->exec("DELETE FROM $table"); |
||||
|
} |
||||
|
} |
||||
|
foreach ($afterStatements as $st) { |
||||
|
$db->exec($st); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public static function dbRaze($db, array $afterStatements = []): void { |
||||
|
// rollback any pending transaction |
||||
|
try { |
||||
|
$db->exec("ROLLBACK"); |
||||
|
} catch (\Throwable $e) { |
||||
|
} |
||||
|
$db->exec("PRAGMA foreign_keys=0"); |
||||
|
foreach (self::dbTableList($db) as $table) { |
||||
|
$db->exec("DROP TABLE IF EXISTS $table"); |
||||
|
} |
||||
|
$db->exec("PRAGMA user_version=0"); |
||||
|
$db->exec("PRAGMA foreign_keys=1"); |
||||
|
foreach ($afterStatements as $st) { |
||||
|
$db->exec($st); |
||||
|
} |
||||
|
} |
||||
|
} |
Loading…
Reference in new issue