Adding some fixes when executing chamilo:install 1.8.8.4 and then executing chamilo:upgrade 1.10 course tables are not yet migrated. See BT#5572

skala
Julio Montoya 12 years ago
parent 4089c29083
commit 6eb7213cf7
  1. 52
      main/inc/global.inc.php
  2. 2
      main/install/configuration.dist.yml.php
  3. 3
      main/install/install.lib.php
  4. 207
      src/ChamiloLMS/Command/Database/InstallCommand.php
  5. 12
      src/ChamiloLMS/Command/Database/UpgradeCommand.php
  6. 6
      src/ChamiloLMS/Migrations/Version10.php
  7. 23
      src/ChamiloLMS/Migrations/Version11.php
  8. 2
      src/ChamiloLMS/Migrations/Version8.php
  9. 6
      src/ChamiloLMS/Migrations/Version9.php
  10. 33
      tests/doctrine_console/cli-config.php

@ -16,7 +16,6 @@
* This script returns a $app Application instance so you have access to all the services.
*
* @package chamilo.include
* @todo isn't configuration.php renamed to configuration.inc.php yet?
* @todo use the $_configuration array for all the needed variables
*
*/
@ -38,6 +37,7 @@ $includePath = dirname(__FILE__);
// @todo Isn't this file renamed to configuration.inc.php yet?
// Include the main Chamilo platform configuration file.
$main_configuration_file_path = $includePath.'/conf/configuration.php';
$configurationYML = $includePath.'/conf/configuration.yml';
$already_installed = false;
if (file_exists($main_configuration_file_path)) {
@ -47,6 +47,10 @@ if (file_exists($main_configuration_file_path)) {
$_configuration = array();
}
if (file_exists($configurationYML)) {
$already_installed = true;
}
//Redirects to the main/install/ page
/*
if (!$already_installed) {
@ -56,23 +60,6 @@ if (!$already_installed) {
die();
}*/
// Ensure that _configuration is in the global scope before loading
// main_api.lib.php. This is particularly helpful for unit tests
if (!isset($GLOBALS['_configuration'])) {
$GLOBALS['_configuration'] = $_configuration;
}
// Code for trnasitional purposes, it can be removed right before the 1.8.7 release.
if (empty($_configuration['system_version'])) {
$_configuration['system_version'] = (!empty($_configuration['dokeos_version']) ? $_configuration['dokeos_version'] : '');
$_configuration['system_stable'] = (!empty($_configuration['dokeos_stable']) ? $_configuration['dokeos_stable'] : '');
$_configuration['software_url'] = 'http://www.chamilo.org/';
}
// For backward compatibility.
$_configuration['dokeos_version'] = $_configuration['system_version'];
$_configuration['dokeos_stable'] = $_configuration['system_stable'];
$userPasswordCrypted = (!empty($_configuration['password_encryption']) ? $_configuration['password_encryption'] : 'sha1');
// Include the main Chamilo platform library file.
require_once $includePath.'/lib/main_api.lib.php';
@ -121,15 +108,31 @@ use Symfony\Component\Yaml\Parser;
$app = new Application();
//Overwriting $_configuration
$configurationYML = $includePath.'/conf/configuration.yml';
if (file_exists($configurationYML)) {
$yaml = new Parser();
$_configuration = $yaml->parse(file_get_contents($configurationYML));
}
// Ensure that _configuration is in the global scope before loading
// main_api.lib.php. This is particularly helpful for unit tests
if (!isset($GLOBALS['_configuration'])) {
$GLOBALS['_configuration'] = $_configuration;
}
// Code for trnasitional purposes, it can be removed right before the 1.8.7 release.
if (empty($_configuration['system_version'])) {
$_configuration['system_version'] = (!empty($_configuration['dokeos_version']) ? $_configuration['dokeos_version'] : '');
$_configuration['system_stable'] = (!empty($_configuration['dokeos_stable']) ? $_configuration['dokeos_stable'] : '');
$_configuration['software_url'] = 'http://www.chamilo.org/';
}
// For backward compatibility.
$_configuration['dokeos_version'] = $_configuration['system_version'];
$_configuration['dokeos_stable'] = $_configuration['system_stable'];
$userPasswordCrypted = (!empty($_configuration['password_encryption']) ? $_configuration['password_encryption'] : 'sha1');
$app['configuration_file'] = $main_configuration_file_path;
$app['configuration_yml_file'] = $configurationYML;
$app['configuration'] = $_configuration;
$app['languages_file'] = array();
$app['installed'] = $already_installed;
@ -416,8 +419,6 @@ class ChamiloServiceProvider implements ServiceProviderInterface
{
public function register(Application $app)
{
//Template
$app['template'] = $app->share(function () use ($app) {
$template = new Template(null, $app);
@ -534,7 +535,6 @@ if (!empty($_configuration['multiple_access_urls'])) {
}
$charset = 'UTF-8';
$checkConnection = false;
if (isset($_configuration['main_database'])) {
@ -870,7 +870,7 @@ if (api_get_setting('server_type') == 'test') {
$app->before(
function () use ($app, $checkConnection) {
if (!file_exists($app['configuration_file'])) {
if (!file_exists($app['configuration_file']) && !file_exists($app['configuration_yml_file'])) {
return new RedirectResponse(api_get_path(WEB_CODE_PATH).'install');
$app->abort(500, "Incorrect PHP version");
}
@ -968,8 +968,6 @@ if (empty($default_quota)) {
define('DEFAULT_DOCUMENT_QUOTA', $default_quota);
$app['pages.controller'] = $app->share(function () use ($app) {
return new PagesController($app['pages.repository']);
});

@ -33,7 +33,7 @@ $_configuration['db_host'] = 'localhost';
// Your MySQL username
$_configuration['db_user'] = 'root';
// Your MySQL password
$_configuration['db_password'] = 'root';
$_configuration['db_password'] = 'dokeosla';
/**
* Database settings

@ -35,7 +35,8 @@ function is_already_installed_system()
}
$current_config_file = api_get_path(CONFIGURATION_PATH).'configuration.php';
if (!file_exists($current_config_file)) {
if (!file_exists($current_config_file) && !file_exists(api_get_path(CONFIGURATION_PATH).'configuration.yml')) {
return false; // Configuration file does not exist, install the system.
}
require $current_config_file;

@ -31,7 +31,7 @@ class InstallCommand extends AbstractCommand
*
* @return string
*/
public function getConfigurationFile()
public function getConfigurationPath()
{
return api_get_path(SYS_PATH).'main/inc/conf/';
}
@ -48,6 +48,13 @@ class InstallCommand extends AbstractCommand
return api_get_path(SYS_PATH).'main/install/'.$version.'/';
}
public function getAvailableVersions() {
return array(
'1.8.8.4',
'1.9.0',
'1.10'
);
}
/**
* Executes a command via CLI
@ -59,18 +66,19 @@ class InstallCommand extends AbstractCommand
*/
protected function execute(Console\Input\InputInterface $input, Console\Output\OutputInterface $output)
{
$configurationPath = $this->getConfigurationFile();
$configurationPath = $this->getConfigurationPath();
$dialog = $this->getHelperSet()->get('dialog');
$version = $input->getArgument('version');
$defaultVersion = $this->getLatestVersion();
if (empty($version)) {
$version = $defaultVersion;
}
$output->writeln("<comment>Welcome to the Chamilo installation process!</comment>");
$output->writeln("<comment>Welcome to the Chamilo installation process.</comment>");
if (!is_writable($configurationPath)) {
$output->writeln("<comment>Folder ".$configurationPath." must be writable</comment>");
@ -79,31 +87,32 @@ class InstallCommand extends AbstractCommand
$sqlFolder = $this->getInstallationPath($version);
if (!is_dir($sqlFolder)) {
$output->writeln("<comment>Sorry you can't install Chamilo :( Installation files for version $version does not exists: </comment><info>".$sqlFolder);
$output->writeln("<comment>Sorry you can't install that version of Chamilo :( Supported versions:</comment> <info>".implode(', ', $this->getAvailableVersions()));
return false;
}
/*if (!$dialog->askConfirmation(
$output,
'<comment>You are about to install Chamilo </comment><info>$version</info> <comment>here:</comment>'.$configurationPath.'</info> <question>Are you sure?</question>(y/N)',
false
)
) {
return;
}*/
/*
if (file_exists($configurationPath.'configuration.php') || file_exists($configurationPath.'configuration.yml')) {
if (!$dialog->askConfirmation(
$output,
'<question>There is a Chamilo installation located here:</question> '.$configurationPath.' <question>Are you sure you want to continue?</question>(y/N)',
false
)
) {
return;
}
}*/
if (file_exists($configurationPath.'configuration.php') || file_exists($configurationPath.'configuration.yml')) {
if (!$dialog->askConfirmation(
$output,
'<question>There is a Chamilo installation located here:</question> '.$configurationPath.' <question>Are you sure you want to continue?</question>(y/N)',
false
)
) {
return;
}
if (!$dialog->askConfirmation(
$output,
'<comment>This will be a fresh installation. Old databases and config files will be deleted. </comment></info> <question>Are you sure?</question>(y/N)',
false
)
) {
return;
}
$this->cleanInstallation($output);
}
//Getting default configuration parameters
require_once api_get_path(SYS_PATH).'main/install/configuration.dist.yml.php';
@ -142,16 +151,37 @@ class InstallCommand extends AbstractCommand
}
}
//Installing database
$result = $this->install($version, $newConfigurationArray, $output);
$configurationWasSaved = $this->writeConfiguration($newConfigurationArray, $version);
if ($result) {
$this->createAdminUser($newConfigurationArray, $output);
$this->writeConfiguration($newConfigurationArray, $version);
$output->writeln("<comment>Database installation finished!</comment>");
if ($configurationWasSaved) {
//Installing database
$result = $this->install($version, $newConfigurationArray, $output);
if ($result) {
$this->createAdminUser($newConfigurationArray, $output);
$output->writeln("<comment>Chamilo was successfully installed. Go to your browser and enter:</comment> <info>".$newConfigurationArray['root_web']);
}
}
}
/**
* Deletes configuration files
*/
function cleanInstallation($output)
{
$confPath = $this->getConfigurationPath();
if (file_exists($confPath.'configuration.yml')) {
unlink($confPath.'configuration.yml');
}
if (file_exists($confPath.'configuration.php')) {
unlink($confPath.'configuration.php');
}
$output->writeln("<comment>Config files were deleted.</comment>");
}
/**
*
* @param $newConfigurationArray
@ -163,8 +193,6 @@ class InstallCommand extends AbstractCommand
$dialog = $this->getHelperSet()->get('dialog');
//Creating admin user
$output->writeln("<comment>Chamilo was successfully installed visit: </comment> <info>".$newConfigurationArray['root_web']);
$adminUser = array(
'lastname' => 'Julio',
'firstname' => 'M',
@ -172,7 +200,6 @@ class InstallCommand extends AbstractCommand
'password' => 'admin',
'email' => 'admin@example.org'
);
$output->writeln("<comment>Creating an admin User</comment>");
$userInfo = array();
foreach ($adminUser as $key => $value) {
@ -183,9 +210,13 @@ class InstallCommand extends AbstractCommand
);
$userInfo[$key] = $data;
}
$userInfo = \UserManager::add($userInfo);
if ($userInfo && isset($userInfo['user_id'])) {
$userId = $userInfo['user_id'];
//By default admin is = 1 so we update it
$userId = $userInfo['user_id'] = 1;
$userInfo['auth_source'] = 'platform';
$userInfo['password'] = api_get_encrypted_password($userInfo['password']);
$result = \UserManager::update($userInfo);
if ($result) {
\UserManager::add_user_as_admin($userInfo['user_id']);
$output->writeln("<comment>User admin created with id: $userId</comment>");
@ -210,13 +241,55 @@ class InstallCommand extends AbstractCommand
*/
public function writeConfiguration($newConfigurationArray, $version)
{
$configurationPath = $this->getConfigurationFile();
$configurationPath = $this->getConfigurationPath();
$newConfigurationArray['system_version'] = $version;
$dumper = new Dumper();
$yaml = $dumper->dump($newConfigurationArray, 2); //inline
$newConfigurationFile = $configurationPath.'configuration.yml';
file_put_contents($newConfigurationFile, $yaml);
return file_exists($newConfigurationFile);
}
private function setDatabaseSettings($_configuration)
{
global $config;
$defaultConnection = array(
'driver' => 'pdo_mysql',
'dbname' => $_configuration['main_database'],
'user' => $_configuration['db_user'],
'password' => $_configuration['db_password'],
'host' => $_configuration['db_host'],
);
$em = \Doctrine\ORM\EntityManager::create($defaultConnection, $config);
//Fixes some errors
$platform = $em->getConnection()->getDatabasePlatform();
$platform->registerDoctrineTypeMapping('enum', 'string');
$platform->registerDoctrineTypeMapping('set', 'string');
$helpers = array(
'db' => new \Doctrine\DBAL\Tools\Console\Helper\ConnectionHelper($em->getConnection()),
'em' => new \Doctrine\ORM\Tools\Console\Helper\EntityManagerHelper($em),
);
foreach ($helpers as $name => $helper) {
$this->getApplication()->getHelperSet()->set($helper, $name);
}
$conn_return = @\Database::connect(
array(
'server' => $_configuration['db_host'],
'username' => $_configuration['db_user'],
'password' => $_configuration['db_password'],
// 'persistent' => $_configuration['db_persistent_connection']
// When $_configuration['db_persistent_connection'] is set, it is expected to be a boolean type.
));
global $database_connection;
$checkConnection = @\Database::select_db($_configuration['main_database'], $database_connection);
}
/**
@ -230,9 +303,23 @@ class InstallCommand extends AbstractCommand
public function install($version, $_configuration, $output)
{
$sqlFolder = $this->getInstallationPath($version);
$this->setDatabaseSettings($_configuration);
$output->writeln("<comment>Creating database ... </comment>");
$result = $this->createDatabase($_configuration);
$testConnection = $this->testDatabaseConnection($_configuration['db_host'], $_configuration['db_user'], $_configuration['db_password']);
if ($testConnection == 1) {
$output->writeln("<comment>Connection stablished with the DB</comment>");
} else {
$output->writeln("<error>No access to the database for user:</error><info>".$_configuration['db_user']."</info>");
exit;
}
$result = $this->dropAndCreateDatabase($_configuration);
//Importing files
if ($result) {
@ -250,12 +337,21 @@ class InstallCommand extends AbstractCommand
$input = new ArrayInput($arguments);
$command->run($input, $output);
//Getting extra information about the installation
$result = \Database::query("SELECT selected_value FROM ".\Database::get_main_table(TABLE_MAIN_SETTINGS_CURRENT)." WHERE variable = 'chamilo_database_version'");
$result = \Database::fetch_array($result);
$output->writeln("<comment>Showing chamilo_database_version value:</comment> ".$result['selected_value']);
api_set_setting('Institution', 'Portal');
api_set_setting('InstitutionUrl', 'Portal');
api_set_setting('siteName', 'Campus');
api_set_setting('emailAdministrator', 'admin@example.org');
api_set_setting('administratorSurname', 'M');
api_set_setting('administratorName', 'Julio');
api_set_setting('platformLanguage', 'english');
api_set_setting('allow_registration', '1');
api_set_setting('allow_registration_as_teacher', '1');
//Getting extra information about the installation
//$value = api_get_setting('chamilo_database_version');
//$output->writeln("<comment>Showing chamilo_database_version value:</comment> ".$value);
$output->writeln("<comment>Check your installation status with chamilo:status</comment>");
$output->writeln("<comment>Database process ended!</comment>");
return true;
}
}
@ -266,7 +362,7 @@ class InstallCommand extends AbstractCommand
*
* @return resource
*/
public function createDatabase($_configuration)
public function dropAndCreateDatabase($_configuration)
{
/*
$command = $this->getApplication()->find('orm:schema-tool:create');
@ -277,6 +373,31 @@ class InstallCommand extends AbstractCommand
$command->run($input, $output);
exit;
*/
\Database::query("DROP DATABASE ".mysql_real_escape_string($_configuration['main_database'])."");
return \Database::query("CREATE DATABASE IF NOT EXISTS ".mysql_real_escape_string($_configuration['main_database'])." DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci");
}
/**
* In step 3. Tests establishing connection to the database server.
* If it's a single database environment the function checks if the database exist.
* If the database doesn't exist we check the creation permissions.
*
* @return int 1 when there is no problem;
* 0 when a new database is impossible to be created, then the single/multiple database configuration is impossible too
* -1 when there is no connection established.
*/
public function testDatabaseConnection($dbHostForm, $dbUsernameForm, $dbPassForm)
{
$dbConnect = -1;
//Checking user credentials
if (@\Database::connect(
array('server' => $dbHostForm, 'username' => $dbUsernameForm, 'password' => $dbPassForm)
) !== false
) {
$dbConnect = 1;
} else {
$dbConnect = -1;
}
return $dbConnect; //return 1, if no problems, "0" if, in case we can't create a new DB and "-1" if there is no connection.
}
}

@ -227,13 +227,19 @@ class UpgradeCommand extends AbstractCommand
$oldVersion = $currentVersion;
foreach ($versionList as $versionItem => $versionInfo) {
if (version_compare($versionItem, $currentVersion, '>') && version_compare($versionItem, $version, '<=')) {
$output->writeln("----------------------------------------------------------------");
$output->writeln("<comment>Starting migration from version: </comment><info>$oldVersion</info><comment> to </comment><info>$versionItem ");
$output->writeln("");
if (isset($versionInfo['require_update']) && $versionInfo['require_update'] == true) {
//Greater than my current version
$this->startMigration($oldVersion, $versionItem, $dryRun, $output);
$oldVersion = $versionItem;
$output->writeln("----------------------------------------------------------------");
} else {
$output->writeln("<comment>Version <info>'$versionItem'</info> does not need a DB migration</comment>");
}
}
}
$output->writeln("<comment>wow! You just finish to migrate. Too check the current status of your platform. Execute:</comment><info>chamilo:status</info>");
@ -261,7 +267,6 @@ class UpgradeCommand extends AbstractCommand
*/
public function startMigration($fromVersion, $toVersion, $dryRun, $output)
{
$output->writeln("<comment>Starting migration from version: </comment><info>$fromVersion</info><comment> to </comment><info>$toVersion ");
$installPath = api_get_path(SYS_CODE_PATH).'install/';
$versionInfo = $this->getAvailableVersionInfo($toVersion);
@ -273,6 +278,7 @@ class UpgradeCommand extends AbstractCommand
$result = true;
$output->writeln("");
$output->writeln("<comment>Executing file: <info>'$sqlToInstall'</info>");
$output->writeln('');
$output->writeln("<comment>You have to select yes for the 'Chamilo Migrations'<comment>");
if ($result) {
@ -282,7 +288,11 @@ class UpgradeCommand extends AbstractCommand
'version' => $versionInfo['hook_to_version'],
'--configuration' => $this->getMigrationConfigurationFile()
);
$output->writeln("<comment>Executing migrations:migrate ".$versionInfo['hook_to_version']." --configuration=".$this->getMigrationConfigurationFile()."<comment>");
$input = new ArrayInput($arguments);
$command->run($input, $output);
$output->writeln("<comment>Migration ended succesfully</comment>");
}

@ -5,6 +5,10 @@ namespace ChamiloLMS\Controller\Migrations;
use Doctrine\DBAL\Migrations\AbstractMigration,
Doctrine\DBAL\Schema\Schema;
/**
* Manages the migration to Chamilo 1.10
* @package ChamiloLMS\Controller\Migrations
*/
class Version10 extends AbstractMigration
{
public function up(Schema $schema)
@ -14,6 +18,6 @@ class Version10 extends AbstractMigration
public function down(Schema $schema)
{
$this->addSql('UPDATE settings_current SET selected_value = "1.9" WHERE variable = "chamilo_database_version"');
}
}

@ -0,0 +1,23 @@
<?php
namespace ChamiloLMS\Controller\Migrations;
use Doctrine\DBAL\Migrations\AbstractMigration,
Doctrine\DBAL\Schema\Schema;
/**
* Manages the migration to Chamilo 1.11
* @package ChamiloLMS\Controller\Migrations
*/
class Version11 extends AbstractMigration
{
public function up(Schema $schema)
{
$this->addSql('UPDATE settings_current SET selected_value = "1.11" WHERE variable = "chamilo_database_version"');
}
public function down(Schema $schema)
{
$this->addSql('UPDATE settings_current SET selected_value = "1.10" WHERE variable = "chamilo_database_version"');
}
}

@ -14,6 +14,6 @@ class Version8 extends AbstractMigration
public function down(Schema $schema)
{
$this->addSql('UPDATE settings_current SET selected_value = "1.8.7" WHERE variable = "chamilo_database_version"');
}
}

@ -5,6 +5,10 @@ namespace ChamiloLMS\Controller\Migrations;
use Doctrine\DBAL\Migrations\AbstractMigration,
Doctrine\DBAL\Schema\Schema;
/**
* Manages the migration to version 1.9.0
* @package ChamiloLMS\Controller\Migrations
*/
class Version9 extends AbstractMigration
{
public function up(Schema $schema)
@ -14,6 +18,6 @@ class Version9 extends AbstractMigration
public function down(Schema $schema)
{
$this->addSql('UPDATE settings_current SET selected_value = "1.8.8.4" WHERE variable = "chamilo_database_version"');
}
}

@ -44,13 +44,15 @@ if (!empty($courseList)) {
}
}
$connectionOptions['main_database'] = array(
'driver' => 'pdo_mysql',
'dbname' => $_configuration['main_database'],
'user' => $_configuration['db_user'],
'password' => $_configuration['db_password'],
'host' => $_configuration['db_host'],
);
if (isset($connectionOptions['main_database'])) {
$connectionOptions['main_database'] = array(
'driver' => 'pdo_mysql',
'dbname' => $_configuration['main_database'],
'user' => $_configuration['db_user'],
'password' => $_configuration['db_password'],
'host' => $_configuration['db_host'],
);
}
if (isset($_configuration['statistics_database'])) {
$connectionOptions['statistics_database'] = array(
@ -73,13 +75,20 @@ if (isset($_configuration['user_personal_database'])) {
}
$defaultConnection = array(
'driver' => 'pdo_mysql',
'dbname' => $_configuration['main_database'],
'user' => $_configuration['db_user'],
'password' => $_configuration['db_password'],
'host' => $_configuration['db_host'],
'driver' => 'pdo_mysql',
);
if (isset($_configuration['main_database'])) {
$defaultConnection = array(
'driver' => 'pdo_mysql',
'dbname' => $_configuration['main_database'],
'user' => $_configuration['db_user'],
'password' => $_configuration['db_password'],
'host' => $_configuration['db_host'],
);
}
$em = \Doctrine\ORM\EntityManager::create($defaultConnection, $config);
//Fixes some errors

Loading…
Cancel
Save