drupal-civicrm/sites/all/modules/civicrm/Civi/Test/Schema.php

129 lines
3 KiB
PHP
Raw Permalink Normal View History

2018-01-14 15:10:16 +02:00
<?php
namespace Civi\Test;
use RuntimeException;
/**
* Class Schema
*
* Manage the entire database. This is useful for destroying or loading the schema.
*/
class Schema {
/**
* @param string $type
* 'BASE TABLE' or 'VIEW'.
* @return array
*/
public function getTables($type) {
$pdo = \Civi\Test::pdo();
// only consider real tables and not views
$query = sprintf(
"SELECT table_name FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = %s AND TABLE_TYPE = %s",
$pdo->quote(\Civi\Test::dsn('database')),
$pdo->quote($type)
);
$tables = $pdo->query($query);
$result = array();
foreach ($tables as $table) {
$result[] = $table['table_name'];
}
return $result;
}
public function setStrict($checks) {
$dbName = \Civi\Test::dsn('database');
if ($checks) {
$queries = array(
"USE {$dbName};",
"SET global innodb_flush_log_at_trx_commit = 1;",
"SET SQL_MODE='STRICT_ALL_TABLES';",
"SET foreign_key_checks = 1;",
);
}
else {
$queries = array(
"USE {$dbName};",
"SET foreign_key_checks = 0",
"SET SQL_MODE='STRICT_ALL_TABLES';",
"SET global innodb_flush_log_at_trx_commit = 2;",
);
}
foreach ($queries as $query) {
if (\Civi\Test::execute($query) === FALSE) {
throw new RuntimeException("Query failed: $query");
}
}
return $this;
}
public function dropAll() {
$queries = array();
foreach ($this->getTables('VIEW') as $table) {
if (preg_match('/^(civicrm_|log_)/', $table)) {
$queries[] = "DROP VIEW $table";
}
}
foreach ($this->getTables('BASE TABLE') as $table) {
if (preg_match('/^(civicrm_|log_)/', $table)) {
$queries[] = "DROP TABLE $table";
}
}
$this->setStrict(FALSE);
foreach ($queries as $query) {
if (\Civi\Test::execute($query) === FALSE) {
throw new RuntimeException("dropSchema: Query failed: $query");
}
}
$this->setStrict(TRUE);
return $this;
}
/**
* @return Schema
*/
public function truncateAll() {
$tables = \Civi\Test::schema()->getTables('BASE TABLE');
$truncates = array();
$drops = array();
foreach ($tables as $table) {
// skip log tables
if (substr($table, 0, 4) == 'log_') {
continue;
}
// don't change list of installed extensions
if ($table == 'civicrm_extension') {
continue;
}
if (substr($table, 0, 14) == 'civicrm_value_') {
$drops[] = 'DROP TABLE ' . $table . ';';
}
elseif (substr($table, 0, 9) == 'civitest_') {
// ignore
}
else {
$truncates[] = 'TRUNCATE ' . $table . ';';
}
}
\Civi\Test::schema()->setStrict(FALSE);
$queries = array_merge($truncates, $drops);
foreach ($queries as $query) {
if (\Civi\Test::execute($query) === FALSE) {
throw new RuntimeException("Query failed: $query");
}
}
\Civi\Test::schema()->setStrict(TRUE);
return $this;
}
}