| <?php |
|
|
| namespace Kanboard\Core\Plugin; |
|
|
| use PDOException; |
| use RuntimeException; |
|
|
| |
| |
| |
| |
| |
| |
| class SchemaHandler extends \Kanboard\Core\Base |
| { |
| |
| |
| |
| |
| |
| const TABLE_SCHEMA = 'plugin_schema_versions'; |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| public static function getSchemaFilename($pluginName) |
| { |
| return PLUGINS_DIR.'/'.$pluginName.'/Schema/'.ucfirst(DB_DRIVER).'.php'; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| public static function hasSchema($pluginName) |
| { |
| return file_exists(self::getSchemaFilename($pluginName)); |
| } |
|
|
| |
| |
| |
| |
| |
| |
| public function loadSchema($pluginName) |
| { |
| require_once self::getSchemaFilename($pluginName); |
| $this->migrateSchema($pluginName); |
| } |
|
|
| |
| |
| |
| |
| |
| |
| public function migrateSchema($pluginName) |
| { |
| $lastVersion = constant('\Kanboard\Plugin\\'.$pluginName.'\Schema\VERSION'); |
| $currentVersion = $this->getSchemaVersion($pluginName); |
|
|
| try { |
| $this->db->startTransaction(); |
| $this->db->getDriver()->disableForeignKeys(); |
|
|
| for ($i = $currentVersion + 1; $i <= $lastVersion; $i++) { |
| $functionName = '\Kanboard\Plugin\\'.$pluginName.'\Schema\version_'.$i; |
|
|
| if (function_exists($functionName)) { |
| call_user_func($functionName, $this->db->getConnection()); |
| } |
| } |
|
|
| $this->db->getDriver()->enableForeignKeys(); |
| $this->db->closeTransaction(); |
| $this->setSchemaVersion($pluginName, $i - 1); |
| } catch (PDOException $e) { |
| $this->db->cancelTransaction(); |
| $this->db->getDriver()->enableForeignKeys(); |
| throw new RuntimeException('Unable to migrate schema for the plugin: '.$pluginName.' => '.$e->getMessage()); |
| } |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| public function getSchemaVersion($plugin) |
| { |
| return (int) $this->db->table(self::TABLE_SCHEMA)->eq('plugin', strtolower($plugin))->findOneColumn('version'); |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| public function setSchemaVersion($plugin, $version) |
| { |
| $dictionary = array( |
| strtolower($plugin) => $version |
| ); |
|
|
| return $this->db->getDriver()->upsert(self::TABLE_SCHEMA, 'plugin', 'version', $dictionary); |
| } |
| } |
|
|