icingaweb2-module-director/library/Director/Db/Migrations.php

162 lines
3.6 KiB
PHP

<?php
namespace Icinga\Module\Director\Db;
use DirectoryIterator;
use Exception;
use Icinga\Module\Director\Db;
class Migrations
{
/**
* @var \Zend_Db_Adapter_Abstract
*/
protected $db;
/**
* @var Db
*/
protected $connection;
protected $migrationsDir;
public function __construct(Db $connection)
{
$this->connection = $connection;
$this->db = $connection->getDbAdapter();
}
public function getLastMigrationNumber()
{
try {
$query = $this->db->select()->from(
array('m' => 'director_schema_migration'),
array('schema_version' => 'MAX(schema_version)')
);
return (int) $this->db->fetchOne($query);
} catch (Exception $e) {
return 0;
}
}
public function hasSchema()
{
return $this->listPendingMigrations() !== array(0);
}
public function hasPendingMigrations()
{
return $this->countPendingMigrations() > 0;
}
public function countPendingMigrations()
{
return count($this->listPendingMigrations());
}
public function getPendingMigrations()
{
$migrations = array();
foreach ($this->listPendingMigrations() as $version) {
$migrations[] = new Migration(
$version,
$this->loadMigrationFile($version)
);
}
return $migrations;
}
public function applyPendingMigrations()
{
foreach ($this->getPendingMigrations() as $migration) {
$migration->apply($this->connection);
}
return $this;
}
public function listPendingMigrations()
{
$lastMigration = $this->getLastMigrationNumber();
if ($lastMigration === 0) {
return array(0);
}
return $this->listMigrationsAfter($this->getLastMigrationNumber());
}
public function listAllMigrations()
{
$dir = $this->getMigrationsDir();
if (! is_readable($dir)) {
return array();
}
$versions = array();
foreach (new DirectoryIterator($this->getMigrationsDir()) as $file) {
if ($file->isDot()) {
continue;
}
$filename = $file->getFilename();
if (preg_match('/^upgrade_(\d+)\.sql$/', $filename, $match)) {
$versions[] = $match[1];
}
}
sort($versions);
return $versions;
}
public function loadMigrationFile($version)
{
if ($version === 0) {
$filename = $this->getFullSchemaFile();
} else {
$filename = sprintf(
'%s/upgrade_%d.sql',
$this->getMigrationsDir(),
$version
);
}
return file_get_contents($filename);
}
protected function listMigrationsAfter($version)
{
$filtered = array();
foreach ($this->listAllMigrations() as $available) {
if ($available > $version) {
$filtered[] = $available;
}
}
return $filtered;
}
protected function getMigrationsDir()
{
if ($this->migrationsDir === null) {
$this->migrationsDir = dirname(dirname(dirname(__DIR__)))
. '/schema/'
. $this->connection->getDbType()
. '-migrations';
}
return $this->migrationsDir;
}
protected function getFullSchemaFile()
{
return dirname(dirname(dirname(__DIR__)))
. '/schema/'
. $this->connection->getDbType()
. '.sql';
}
}