Add config parameter to toggle automatic SQL migrations

- Add two command line opterations to show schema version
and to execute SQL migrations
- Add new configuration parameter to enable or disable
SQL migrations
This commit is contained in:
Frederic Guillot
2016-12-02 19:16:50 -05:00
parent b5671a2dc0
commit f2fd5d75d9
6 changed files with 97 additions and 5 deletions

View File

@@ -0,0 +1,23 @@
<?php
namespace Kanboard\Console;
use Kanboard\ServiceProvider\DatabaseProvider;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
class DatabaseMigrationCommand extends DatabaseVersionCommand
{
protected function configure()
{
$this
->setName('db:migrate')
->setDescription('Execute SQL migrations');
}
protected function execute(InputInterface $input, OutputInterface $output)
{
parent::execute($input, $output);
DatabaseProvider::runMigrations($this->container['db']);
}
}

View File

@@ -0,0 +1,23 @@
<?php
namespace Kanboard\Console;
use Kanboard\ServiceProvider\DatabaseProvider;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
class DatabaseVersionCommand extends BaseCommand
{
protected function configure()
{
$this
->setName('db:version')
->setDescription('Show database schema version');
}
protected function execute(InputInterface $input, OutputInterface $output)
{
$output->writeln('<info>Current version: '.DatabaseProvider::getSchemaVersion($this->container['db']).'</info>');
$output->writeln('<info>Last version: '.\Schema\VERSION.'</info>');
}
}

View File

@@ -3,6 +3,8 @@
namespace Kanboard\ServiceProvider; namespace Kanboard\ServiceProvider;
use Kanboard\Console\CronjobCommand; use Kanboard\Console\CronjobCommand;
use Kanboard\Console\DatabaseMigrationCommand;
use Kanboard\Console\DatabaseVersionCommand;
use Kanboard\Console\LocaleComparatorCommand; use Kanboard\Console\LocaleComparatorCommand;
use Kanboard\Console\LocaleSyncCommand; use Kanboard\Console\LocaleSyncCommand;
use Kanboard\Console\PluginInstallCommand; use Kanboard\Console\PluginInstallCommand;
@@ -55,6 +57,8 @@ class CommandProvider implements ServiceProviderInterface
$application->add(new PluginUpgradeCommand($container)); $application->add(new PluginUpgradeCommand($container));
$application->add(new PluginInstallCommand($container)); $application->add(new PluginInstallCommand($container));
$application->add(new PluginUninstallCommand($container)); $application->add(new PluginUninstallCommand($container));
$application->add(new DatabaseMigrationCommand($container));
$application->add(new DatabaseVersionCommand($container));
$container['cli'] = $application; $container['cli'] = $application;
return $container; return $container;

View File

@@ -27,6 +27,10 @@ class DatabaseProvider implements ServiceProviderInterface
{ {
$container['db'] = $this->getInstance(); $container['db'] = $this->getInstance();
if (DB_RUN_MIGRATIONS) {
self::runMigrations($container['db']);
}
if (DEBUG) { if (DEBUG) {
$container['db']->getStatementHandler() $container['db']->getStatementHandler()
->withLogging() ->withLogging()
@@ -38,7 +42,7 @@ class DatabaseProvider implements ServiceProviderInterface
} }
/** /**
* Setup the database driver and execute schema migration * Setup the database driver
* *
* @access public * @access public
* @return \PicoDb\Database * @return \PicoDb\Database
@@ -59,12 +63,39 @@ class DatabaseProvider implements ServiceProviderInterface
throw new LogicException('Database driver not supported'); throw new LogicException('Database driver not supported');
} }
if ($db->schema()->check(\Schema\VERSION)) { return $db;
return $db; }
} else {
/**
* Get current database version
*
* @static
* @access public
* @param Database $db
* @return int
*/
public static function getSchemaVersion(Database $db)
{
return $db->getDriver()->getSchemaVersion();
}
/**
* Execute database migrations
*
* @static
* @access public
* @throws RuntimeException
* @param Database $db
* @return bool
*/
public static function runMigrations(Database $db)
{
if (! $db->schema()->check(\Schema\VERSION)) {
$messages = $db->getLogMessages(); $messages = $db->getLogMessages();
throw new RuntimeException('Unable to run SQL migrations: '.implode(', ', $messages).' (You may have to fix it manually)'); throw new RuntimeException('Unable to run SQL migrations: '.implode(', ', $messages).' (You may have to fix it manually)');
} }
return true;
} }
/** /**
@@ -79,7 +110,7 @@ class DatabaseProvider implements ServiceProviderInterface
return new Database(array( return new Database(array(
'driver' => 'sqlite', 'driver' => 'sqlite',
'filename' => DB_FILENAME 'filename' => DB_FILENAME,
)); ));
} }

View File

@@ -35,6 +35,9 @@ defined('LOG_FILE') or define('LOG_FILE', DATA_DIR.DIRECTORY_SEPARATOR.'debug.lo
// Application version // Application version
defined('APP_VERSION') or define('APP_VERSION', build_app_version('$Format:%d$', '$Format:%H$')); defined('APP_VERSION') or define('APP_VERSION', build_app_version('$Format:%d$', '$Format:%H$'));
// Run automatically database migrations
defined('DB_RUN_MIGRATIONS') or define('DB_RUN_MIGRATIONS', true);
// Database driver: sqlite, mysql or postgres // Database driver: sqlite, mysql or postgres
defined('DB_DRIVER') or define('DB_DRIVER', 'sqlite'); defined('DB_DRIVER') or define('DB_DRIVER', 'sqlite');

View File

@@ -50,6 +50,11 @@ define('MAIL_SMTP_ENCRYPTION', null); // Valid values are "null", "ssl" or "tls"
// Sendmail command to use when the transport is "sendmail" // Sendmail command to use when the transport is "sendmail"
define('MAIL_SENDMAIL_COMMAND', '/usr/sbin/sendmail -bs'); define('MAIL_SENDMAIL_COMMAND', '/usr/sbin/sendmail -bs');
// Run automatically database migrations
// If set to false, you will have to run manually the SQL migrations from the CLI during the next Kanboard upgrade
// Do not run the migrations from multiple processes at the same time (example: web page + background worker)
define('DB_RUN_MIGRATIONS', true);
// Database driver: sqlite, mysql or postgres (sqlite by default) // Database driver: sqlite, mysql or postgres (sqlite by default)
define('DB_DRIVER', 'sqlite'); define('DB_DRIVER', 'sqlite');
@@ -226,3 +231,6 @@ define('HTTP_PROXY_PASSWORD', '');
// Set to false to allow self-signed certificates // Set to false to allow self-signed certificates
define('HTTP_VERIFY_SSL_CERTIFICATE', true); define('HTTP_VERIFY_SSL_CERTIFICATE', true);
// TOTP (2FA) issuer name
define('TOTP_ISSUER', 'Kanboard');