diff options
Diffstat (limited to 'vendor/gipfl/db-migration/src/Migration.php')
-rw-r--r-- | vendor/gipfl/db-migration/src/Migration.php | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/vendor/gipfl/db-migration/src/Migration.php b/vendor/gipfl/db-migration/src/Migration.php new file mode 100644 index 0000000..2e6c586 --- /dev/null +++ b/vendor/gipfl/db-migration/src/Migration.php @@ -0,0 +1,73 @@ +<?php + +namespace gipfl\DbMigration; + +use Exception; +use gipfl\ZfDb\Adapter\Pdo\PdoAdapter as Db; +use InvalidArgumentException; +use RuntimeException; +use Zend_Db_Adapter_Pdo_Abstract as ZfDb; + +class Migration +{ + /** + * @var string + */ + protected $sql; + + /** + * @var int + */ + protected $version; + + public function __construct($version, $sql) + { + $this->version = $version; + $this->sql = $sql; + } + + /** + * @param Db|ZfDb $db + * @return $this + */ + public function apply($db) + { + if (! ($db instanceof Db || $db instanceof ZfDb)) { + throw new InvalidArgumentException('$db must be an valid Zend_Db PDO adapter'); + } + // TODO: this is fragile and depends on accordingly written schema files: + $sql = preg_replace('/-- .*$/m', '', $this->sql); + $queries = preg_split( + '/[\n\s\t]*;[\n\s\t]+/s', + $sql, + -1, + PREG_SPLIT_NO_EMPTY + ); + + if (empty($queries)) { + throw new RuntimeException(sprintf( + 'Migration %d has no queries', + $this->version + )); + } + + try { + foreach ($queries as $query) { + if (preg_match('/^(?:OPTIMIZE|EXECUTE) /i', $query)) { + $db->query($query); + } else { + $db->exec($query); + } + } + } catch (Exception $e) { + throw new RuntimeException(sprintf( + 'Migration %d failed (%s) while running %s', + $this->version, + $e->getMessage(), + $query + )); + } + + return $this; + } +} |