Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
60.00% covered (warning)
60.00%
3 / 5
CRAP
64.29% covered (warning)
64.29%
27 / 42
Migrator
0.00% covered (danger)
0.00%
0 / 1
60.00% covered (warning)
60.00%
3 / 5
16.51
64.29% covered (warning)
64.29%
27 / 42
 __construct
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 setLogger
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 setup
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
5 / 5
 migrateDirect
0.00% covered (danger)
0.00%
0 / 1
6.04
90.00% covered (success)
90.00%
18 / 20
 migrateToSQLFile
0.00% covered (danger)
0.00%
0 / 1
6
0.00% covered (danger)
0.00%
0 / 13
<?php
declare(strict_types = 1);
namespace Siesta\Migration;
use Psr\Log\LoggerAwareInterface;
use Psr\Log\LoggerInterface;
use Siesta\Database\Connection;
use Siesta\Database\Exception\SQLException;
use Siesta\Database\MetaData\DatabaseMetaData;
use Siesta\Logger\NullLogger;
use Siesta\Model\DataModel;
use Siesta\Util\File;
/**
 * @author Gregor Müller
 */
class Migrator implements LoggerAwareInterface
{
    /**
     * @var DataModel
     */
    protected $dataModel;
    /**
     * @var DatabaseMetaData
     */
    protected $databaseMetaData;
    /**
     * @var DatabaseMigrator
     */
    protected $databaseMigrator;
    /**
     * @var Connection
     */
    protected $connection;
    /**
     * @var LoggerInterface
     */
    protected $logger;
    /**
     * Migrator constructor.
     */
    public function __construct()
    {
        $this->logger = new NullLogger();
    }
    /**
     * @param LoggerInterface $logger
     */
    public function setLogger(LoggerInterface $logger)
    {
        $this->logger = $logger;
    }
    /**
     * @param DataModel $dataModel
     * @param Connection $connection
     */
    protected function setup(DataModel $dataModel, Connection $connection)
    {
        $this->connection = $connection;
        $this->dataModel = $dataModel;
        $this->databaseMetaData = $connection->getDatabaseMetaData();
        $this->databaseMigrator = new DatabaseMigrator($dataModel, $this->connection);
    }
    /**
     * @param DataModel $dataModel
     * @param Connection $connection
     * @param bool $dropUnusedTables
     */
    public function migrateDirect(DataModel $dataModel, Connection $connection, bool $dropUnusedTables = true)
    {
        $this->setup($dataModel, $connection);
        $dropping = $dropUnusedTables ? " dropping unused tables " : " not dropping unused tables";
        $datbase = $this->connection->getDatabase();
        $this->logger->info("Direct migration of database " . $datbase . $dropping);
        $this->databaseMigrator->createAlterStatementList($dropUnusedTables);
        $this->connection->disableForeignKeyChecks();
        try {
            foreach ($this->databaseMigrator->getDropStoredProcedureStatementList() as $statement) {
                $this->logger->debug("Executing " . $statement);
                $this->connection->execute($statement);
            }
            foreach ($this->databaseMigrator->getAlterStatementList() as $statement) {
                $this->logger->info("Altering " . $statement);
                $this->connection->query($statement);
            }
            foreach ($this->databaseMigrator->getCreateStoredProcedureStatementList() as $statement) {
                $this->logger->debug("Executing " . $statement);
                $this->connection->query($statement);
            }
        } catch (SQLException $e) {
            $this->logger->error("SQL Exception : " . $e->getMessage() . " (" . $e->getCode() . ")");
            $this->logger->error("Query : " . $e->getSQL());
        }
        $this->connection->enableForeignKeyChecks();
    }
    /**
     * @param DataModel $dataModel
     * @param Connection $connection
     * @param File $targetFile
     * @param bool $dropUnusedTables
     */
    public function migrateToSQLFile(DataModel $dataModel, Connection $connection, File $targetFile, bool $dropUnusedTables = true)
    {
        $targetFile->createDirForFile();
        $this->setup($dataModel, $connection);
        $dropping = $dropUnusedTables ? " dropping unused tables " : " not dropping unused tables";
        $datbase = $this->connection->getDatabase();
        $this->logger->info("Storing alter statements for database " . $datbase . $dropping);
        $this->logger->info("Used file " . $targetFile->getAbsoluteFileName());
        $this->databaseMigrator->createAlterStatementList($dropUnusedTables);
        $dropProcedureStatementList = $this->databaseMigrator->getDropStoredProcedureStatementList();
        $alterStatementList = $this->databaseMigrator->getAlterStatementList();
        $statementList = $this->databaseMigrator->getCreateStoredProcedureStatementList();
        $statementList = array_merge($dropProcedureStatementList, $alterStatementList, $statementList);
        $targetFile->putContents(implode(";" . PHP_EOL, $statementList));
    }
}