diff options
author | Andrew Dolgov <[email protected]> | 2021-03-02 15:03:01 +0300 |
---|---|---|
committer | Andrew Dolgov <[email protected]> | 2021-03-02 15:03:01 +0300 |
commit | d6629ed18863f797d34ebdc65815d7af21cb8332 (patch) | |
tree | a72a114c576f2aa15710d18a8090a9bced9c56ba /classes/db | |
parent | 86b12fc06c33fe742ac4035a031716674bdb6462 (diff) |
move dbupdater to db/updater; move base SCHEMA_VERSION constant inside db/updater class
Diffstat (limited to 'classes/db')
-rw-r--r-- | classes/db/updater.php | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/classes/db/updater.php b/classes/db/updater.php new file mode 100644 index 000000000..9d27c94d9 --- /dev/null +++ b/classes/db/updater.php @@ -0,0 +1,82 @@ +<?php +class Db_Updater { + const SCHEMA_VERSION = 142; + + private $pdo; + private $db_type; + + function __construct($pdo, $db_type) { + $this->pdo = $pdo; + $this->db_type = $db_type; + } + + /** always returns actual (=uncached) value */ + private static function get_schema_version() { + return Config::get_schema_version(true); + } + + static function is_update_required() { + return self::get_schema_version() < self::SCHEMA_VERSION; + } + + function get_schema_lines($version) { + $filename = "schema/versions/".$this->db_type."/$version.sql"; + + if (file_exists($filename)) { + return explode(";", (string)preg_replace("/[\r\n]/", "", (string)file_get_contents($filename))); + } else { + user_error("DB Updater: schema file for version $version is not found."); + return false; + } + } + + function update_to($version, $html_output = true) { + if ($this->get_schema_version() == $version - 1) { + + $lines = $this->get_schema_lines($version); + + if (is_array($lines)) { + + $this->pdo->beginTransaction(); + + foreach ($lines as $line) { + if (strpos($line, "--") !== 0 && $line) { + + if ($html_output) + print "<pre>$line</pre>"; + else + Debug::log("> $line"); + + try { + $this->pdo->query($line); // PDO returns errors as exceptions now + } catch (PDOException $e) { + if ($html_output) { + print "<div class='text-error'>Error: " . $e->getMessage() . "</div>"; + } else { + Debug::log("Error: " . $e->getMessage()); + } + + $this->pdo->rollBack(); + return false; + } + } + } + + $db_version = self::get_schema_version(); + + if ($db_version == $version) { + $this->pdo->commit(); + return true; + } else { + $this->pdo->rollBack(); + return false; + } + } else { + return false; + } + } else { + return false; + } + } + +} |