| | <?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); |
| | } |
| | } |
| |
|