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