diff options
| author | winter | 2024-12-09 21:31:54 +0000 |
|---|---|---|
| committer | winter | 2024-12-09 21:31:54 +0000 |
| commit | 4c7bde1400820f36caf8b2a5374007384c3018f3 (patch) | |
| tree | 83ed26ff368117b8e392f7bc28736482077fc2f4 /Digitigrade/Db/Migrator.php | |
| parent | 50edbd3907c26a2d4d616421de9bb51a4d083c1b (diff) | |
rename to Digitigrade / PawPub
:3
Diffstat (limited to 'Digitigrade/Db/Migrator.php')
| -rw-r--r-- | Digitigrade/Db/Migrator.php | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/Digitigrade/Db/Migrator.php b/Digitigrade/Db/Migrator.php new file mode 100644 index 0000000..a1b4e8b --- /dev/null +++ b/Digitigrade/Db/Migrator.php @@ -0,0 +1,52 @@ +<?php +namespace Digitigrade\Db; + +use Digitigrade\Db; +use Digitigrade\Singleton; + +class Migrator extends Singleton { + private array $migrations = []; + + public function register(int $newVersion, callable $fn) { + $this->migrations[$newVersion] = $fn; + } + + /** + * Runs all available migrations + * @return void + */ + public function migrate() { + $db = Db::getInstance(); + $currentVersion = null; + try { + $currentVersion = $db->getDbVersion(); + error_log('starting on version ' . $currentVersion); + } catch (\PDOException $e) { + if ($e->getCode() == '42P01') { // undefined table + error_log("initialising database because db version table doesn't exist"); + $db->runInitialSchema(); + $currentVersion = $db->getDbVersion(); + error_log('starting on version ' . $currentVersion); + } else + throw $e; + } + + // find migrations that haven't been run yet + $available = array_filter($this->migrations, function (int $key) use ($currentVersion) { + return $key > $currentVersion; + }, ARRAY_FILTER_USE_KEY); + + try { + // run them in order (at least they should be in order?) + foreach (array_keys($available) as $version) { + $fn = $available[$version]; + $filename = basename((new \ReflectionFunction($fn))->getFileName()); + error_log("running migration $filename"); + $available[$version]($db->getPdo()); + $db->setDbVersion($version); + } + } finally { + error_log('now on version ' . $db->getDbVersion()); + } + } +}
\ No newline at end of file |
