Add vchamilo upgrade instance option

pull/2487/head
jmontoyaa 9 years ago
parent 5ff3481e61
commit 46cc928740
  1. 18
      main/inc/lib/database.lib.php
  2. 97
      main/install/index.php
  3. 119
      main/install/install.lib.php
  4. 74
      plugin/vchamilo/lib/Virtual.php
  5. 8
      plugin/vchamilo/views/editinstance.php
  6. 4
      plugin/vchamilo/views/manage.controller.php
  7. 10
      plugin/vchamilo/views/manage.php
  8. 61
      plugin/vchamilo/views/upgrade.php

@ -125,13 +125,20 @@ class Database
* @param array $params
* @param string $sysPath
* @param string $entityRootPath
* @param bool $returnConnection
* @param bool $returnManager
*
* @throws \Doctrine\ORM\ORMException
*
* @return
*/
public function connect($params = array(), $sysPath = '', $entityRootPath = '', $returnConnection = false)
{
public function connect(
$params = array(),
$sysPath = '',
$entityRootPath = '',
$returnConnection = false,
$returnManager = false
) {
$config = self::getDoctrineConfig($entityRootPath);
$config->setAutoGenerateProxyClasses(true);
@ -180,10 +187,17 @@ class Database
$entityManager->getEventManager()->addEventSubscriber($listener);
$connection = $entityManager->getConnection();
$connection->executeQuery('SET sql_mode = "";');
if ($returnConnection) {
return $connection;
}
if ($returnManager) {
return $entityManager;
}
$this->setConnection($connection);
$this->setManager($entityManager);
}

@ -680,102 +680,7 @@ if (@$_POST['step2']) {
$perm = api_get_permissions_for_new_directories();
$perm_file = api_get_permissions_for_new_files();
error_log('Starting migration process from '.$my_old_version.' ('.date('Y-m-d H:i:s').')');
echo '<a class="btn btn-default" href="javascript:void(0)" id="details_button">'.get_lang('Details').'</a><br />';
echo '<div id="details" style="display:none">';
switch ($my_old_version) {
case '1.9.0':
case '1.9.2':
case '1.9.4':
case '1.9.6':
case '1.9.6.1':
case '1.9.8':
case '1.9.8.1':
case '1.9.8.2':
case '1.9.10':
case '1.9.10.2':
case '1.9.10.4':
// Fix type "enum" before running the migration with Doctrine
Database::query("ALTER TABLE course_category MODIFY COLUMN auth_course_child VARCHAR(40) DEFAULT 'TRUE'");
Database::query("ALTER TABLE course_category MODIFY COLUMN auth_cat_child VARCHAR(40) DEFAULT 'TRUE'");
Database::query("ALTER TABLE c_quiz_answer MODIFY COLUMN hotspot_type varchar(40) default NULL");
Database::query("ALTER TABLE c_tool MODIFY COLUMN target varchar(20) NOT NULL default '_self'");
Database::query("ALTER TABLE c_link MODIFY COLUMN on_homepage char(10) NOT NULL default '0'");
Database::query("ALTER TABLE c_blog_rating MODIFY COLUMN rating_type char(40) NOT NULL default 'post'");
Database::query("ALTER TABLE c_survey MODIFY COLUMN anonymous char(10) NOT NULL default '0'");
Database::query("ALTER TABLE c_document MODIFY COLUMN filetype char(10) NOT NULL default 'file'");
Database::query("ALTER TABLE c_student_publication MODIFY COLUMN filetype char(10) NOT NULL default 'file'");
// Migrate using the migration files located in:
// src/Chamilo/CoreBundle/Migrations/Schema/V110
$result = migrate(
110,
$manager
);
if ($result) {
error_log('Migrations files were executed.');
fixIds($manager);
include 'update-files-1.9.0-1.10.0.inc.php';
// Only updates the configuration.inc.php with the new version
include 'update-configuration.inc.php';
$configurationFiles = array(
'mail.conf.php',
'profile.conf.php',
'course_info.conf.php',
'add_course.conf.php',
'events.conf.php',
'auth.conf.php',
'portfolio.conf.php'
);
error_log('Copy conf files');
foreach ($configurationFiles as $file) {
if (file_exists(api_get_path(SYS_CODE_PATH) . 'inc/conf/'.$file)) {
copy(
api_get_path(SYS_CODE_PATH).'inc/conf/'.$file,
api_get_path(CONFIGURATION_PATH).$file
);
}
}
error_log('Upgrade 1.10.x process concluded! ('.date('Y-m-d H:i:s').')');
} else {
error_log('There was an error during running migrations. Check error.log');
break;
}
case '1.10.0':
// no break
case '1.10.2':
// no break
case '1.10.4':
// no break
case '1.10.6':
// Migrate using the migration files located in:
// src/Chamilo/CoreBundle/Migrations/Schema/V111
$result = migrate(
111,
$manager
);
if ($result) {
error_log('Migrations files were executed.');
include 'update-files-1.10.0-1.11.0.inc.php';
error_log('Upgrade 1.11.x process concluded! ('.date('Y-m-d H:i:s').')');
} else {
error_log('There was an error during running migrations. Check error.log');
}
break;
default:
break;
}
echo '</div>';
migrateSwitch($my_old_version, $manager);
} else {
set_file_folder_permissions();

@ -2875,4 +2875,123 @@ function get_group_picture_path_by_id($id, $type = 'web', $preview = false, $ano
}
return array('dir' => $dir, 'file' => $picture_filename);
}
/**
* @param string $fromVersion
* @param EntityManager $manager
* @param bool $processFiles
*/
function migrateSwitch($fromVersion, $manager, $processFiles = true)
{
error_log('Starting migration process from '.$fromVersion.' ('.date('Y-m-d H:i:s').')');
echo '<a class="btn btn-default" href="javascript:void(0)" id="details_button">'.get_lang('Details').'</a><br />';
echo '<div id="details" style="display:none">';
$connection = $manager->getConnection();
switch ($fromVersion) {
case '1.9.0':
case '1.9.2':
case '1.9.4':
case '1.9.6':
case '1.9.6.1':
case '1.9.8':
case '1.9.8.1':
case '1.9.8.2':
case '1.9.10':
case '1.9.10.2':
case '1.9.10.4':
// Fix type "enum" before running the migration with Doctrine
$connection->executeQuery("ALTER TABLE course_category MODIFY COLUMN auth_course_child VARCHAR(40) DEFAULT 'TRUE'");
$connection->executeQuery("ALTER TABLE course_category MODIFY COLUMN auth_cat_child VARCHAR(40) DEFAULT 'TRUE'");
$connection->executeQuery("ALTER TABLE c_quiz_answer MODIFY COLUMN hotspot_type varchar(40) default NULL");
$connection->executeQuery("ALTER TABLE c_tool MODIFY COLUMN target varchar(20) NOT NULL default '_self'");
$connection->executeQuery("ALTER TABLE c_link MODIFY COLUMN on_homepage char(10) NOT NULL default '0'");
$connection->executeQuery("ALTER TABLE c_blog_rating MODIFY COLUMN rating_type char(40) NOT NULL default 'post'");
$connection->executeQuery("ALTER TABLE c_survey MODIFY COLUMN anonymous char(10) NOT NULL default '0'");
$connection->executeQuery("ALTER TABLE c_document MODIFY COLUMN filetype char(10) NOT NULL default 'file'");
$connection->executeQuery("ALTER TABLE c_student_publication MODIFY COLUMN filetype char(10) NOT NULL default 'file'");
// Migrate using the migration files located in:
// src/Chamilo/CoreBundle/Migrations/Schema/V110
$result = migrate(
110,
$manager
);
if ($result) {
error_log('Migrations files were executed.');
fixIds($manager);
$connection->executeQuery("UPDATE settings_current SET selected_value = '1.10.0' WHERE variable = 'chamilo_database_version'");
if ($processFiles) {
include __DIR__.'update-files-1.9.0-1.10.0.inc.php';
// Only updates the configuration.inc.php with the new version
include __DIR__.'update-configuration.inc.php';
$configurationFiles = array(
'mail.conf.php',
'profile.conf.php',
'course_info.conf.php',
'add_course.conf.php',
'events.conf.php',
'auth.conf.php',
'portfolio.conf.php'
);
error_log('Copy conf files');
foreach ($configurationFiles as $file) {
if (file_exists(api_get_path(SYS_CODE_PATH).'inc/conf/'.$file)) {
copy(
api_get_path(SYS_CODE_PATH).'inc/conf/'.$file,
api_get_path(CONFIGURATION_PATH).$file
);
}
}
}
error_log('Upgrade 1.10.x process concluded! ('.date('Y-m-d H:i:s').')');
} else {
error_log('There was an error during running migrations. Check error.log');
break;
}
case '1.10.0':
// no break
case '1.10.2':
// no break
case '1.10.4':
// no break
case '1.10.6':
// Migrate using the migration files located in:
// src/Chamilo/CoreBundle/Migrations/Schema/V111
$result = migrate(
111,
$manager
);
if ($result) {
$connection->executeQuery("UPDATE settings_current SET selected_value = '1.11.0' WHERE variable = 'chamilo_database_version'");
error_log('Migrations files were executed.');
if ($processFiles) {
include __DIR__.'update-files-1.10.0-1.11.0.inc.php';
}
error_log('Upgrade 1.11.x process concluded! ('.date('Y-m-d H:i:s').')');
} else {
error_log('There was an error during running migrations. Check error.log');
}
break;
default:
break;
}
echo '</div>';
return true;
}

@ -739,6 +739,7 @@ class Virtual
if (empty($coursePath) || empty($homePath) || empty($archivePath) || empty($cmdSql)|| empty($cmdMySql)) {
api_not_allowed(true, 'You have to complete all plugin settings.');
}
$separator = DIRECTORY_SEPARATOR;
$templatePath = api_get_path(SYS_PATH).'plugin'.$separator.'vchamilo'.$separator.'templates';
@ -762,7 +763,7 @@ class Virtual
* @param object $instance
* @return \Doctrine\DBAL\Connection
*/
public static function getConnectionFromInstance($instance)
public static function getConnectionFromInstance($instance, $getManager = false)
{
$dbParams = array(
'driver' => 'pdo_mysql',
@ -782,14 +783,20 @@ class Virtual
try {
$database = new \Database();
$connection = $database->connect(
$manager = $database->connect(
$dbParams,
api_get_configuration_value('root_sys'),
api_get_configuration_value('root_sys'),
false,
true
);
return $connection;
if ($getManager) {
return $manager;
}
return $manager->getConnection();
} catch (Exception $e) {
echo $e->getMessage();
@ -875,10 +882,8 @@ class Virtual
} else {
// Deploy template database
self::ctrace("Creating databases from template '$template'");
var_dump($data);
Virtual::createDatabase($data);
self::ctrace("Loading data template '$template'");
var_dump($data);
Virtual::loadDbTemplate($data, $template);
self::ctrace("Coying files from template '$template'");
Virtual::loadFilesFromTemplate($data, $template);
@ -905,7 +910,7 @@ class Virtual
}
/**
* @param $data
* @param stdClass $data
*/
public static function importInstance($data)
{
@ -1052,6 +1057,19 @@ class Virtual
self::ctrace("Finished");
}
/**
* @param stdClass $params
*/
public static function upgradeInstance($params)
{
$connection = Virtual::getConnectionFromInstance($params);
$statement = $connection->query('SELECT * FROM settings_current');
$settings = $statement->fetchAll();
$settings = array_column($settings, 'selected_value', 'variable');
$settings['data_base'];
}
/**
* @param string $slug
*
@ -1130,5 +1148,49 @@ class Virtual
}
*/
}
/**
* @param $id
* @return array|mixed
*/
public static function getInstance($id)
{
$vhost = new stdClass();
if ($id) {
$id = (int) $id;
$sql = "SELECT * FROM vchamilo WHERE id = $id";
$result = Database::query($sql);
$vhost = (object) Database::fetch_array($result, 'ASSOC');
}
return $vhost;
}
/**
* @param stdClass $instance
*
* @return bool|string returns the original version of the app
*/
public static function canBeUpgraded($instance)
{
$connection = Virtual::getConnectionFromInstance($instance);
$statement = $connection->query('SELECT * FROM settings_current WHERE variable = "chamilo_database_version"');
$settings = $statement->fetchAll();
$settings = array_column($settings, 'selected_value', 'variable');
$version = $settings['chamilo_database_version'];
$versionParts = explode('.', $version);
$version = implode('.', [$versionParts[0], $versionParts[1], '0']);
$currentVersion = api_get_setting('chamilo_database_version');
$versionParts = explode('.', $currentVersion);
$currentVersion = implode('.', [$versionParts[0], $versionParts[1], '0']);
if (version_compare($version, $currentVersion, '<')) {
return $version;
}
return false;
}
}

@ -1,4 +1,5 @@
<?php
/* For licensing terms, see /license.txt */
$cidReset = true;
define('CHAMILO_INTERNAL', true);
@ -28,12 +29,7 @@ if ($id) {
$mode = $registeronly ? 'register' : 'add' ;
}
$vhost = [];
if ($id) {
$sql = "SELECT * FROM vchamilo WHERE id = $id";
$result = Database::query($sql);
$vhost = Database::fetch_array($result, 'ASSOC');
}
$vhost = Virtual::getInstance($id);
$form = new InstanceForm($plugin, $mode, $vhost);

@ -1,4 +1,5 @@
<?php
/* For licensing terms, see /license.txt */
$table = Database::get_main_table('vchamilo');
@ -9,6 +10,9 @@ if (!defined('CHAMILO_INTERNAL')) {
$vidlist = isset($_REQUEST['vids']) ? implode("','", array_map('intval', $_REQUEST['vids'])) : '';
switch ($action) {
case 'upgrade':
Virtual::redirect(api_get_path(WEB_PLUGIN_PATH).'vchamilo/views/upgrade.php?vid='.$vidlist);
break;
case 'import':
Virtual::redirect(api_get_path(WEB_PLUGIN_PATH).'vchamilo/views/import.php');
break;

@ -27,7 +27,7 @@ while ($instance = Database::fetch_object($result)) {
$instances[$instance->id] = $instance;
}
$templates = Virtual::getAvailableTemplates(false);
$templates = Virtual::getAvailableTemplates();
if (empty($templates)) {
$url = api_get_path(WEB_PLUGIN_PATH).'vchamilo/views/manage.php?what=snapshotinstance';
@ -73,14 +73,18 @@ foreach ($instances as $instance) {
$cmd .= '&nbsp;<a href="'.$thisurl.'?what=snapshotinstance&vid='.$instance->id.'" title="'.$plugin->get_lang('snapshotinstance').'">
'.Display::returnFontAwesomeIcon('camera').'</a>';
$cmd .= '<a href="'.$thisurl.'?what=upgrade&vids[]='.$instance->id.'" title="'.$plugin->get_lang('Upgrade').'">
&nbsp;'.Display::returnFontAwesomeIcon('wrench').' </a>';
if (!$instance->visible) {
$cmd .= '<a href="'.$thisurl.'?what=fulldeleteinstances&vids[]='.$instance->id.'" title="'.$plugin->get_lang('destroyinstances').'">
&nbsp;'.Display::returnFontAwesomeIcon('trash').' </a>';
&nbsp;'.Display::returnFontAwesomeIcon('remove').' </a>';
} else {
$cmd .= '<a href="'.$thisurl.'?what=deleteinstances&vids[]='.$instance->id.'" title="'.$plugin->get_lang('deleteinstances').'">
&nbsp;'.Display::returnFontAwesomeIcon('trash').' </a>';
&nbsp;'.Display::returnFontAwesomeIcon('remove').' </a>';
}
$crondate = $instance->lastcron ? date('r', $instance->lastcron) : '';
$data = array(
$checkbox,

@ -0,0 +1,61 @@
<?php
/* For licensing terms, see /license.txt */
$cidReset = true;
require_once '../../../main/inc/global.inc.php';
$interbreadcrumb[] = array('url' => 'manage.php', 'name' => get_lang('VChamilo'));
// Security
api_protect_admin_script();
Virtual::checkSettings();
$plugin = VChamiloPlugin::create();
$id = isset($_REQUEST['vid']) ? (int) $_REQUEST['vid'] : 0;
$instance = Virtual::getInstance($id);
$canBeUpgraded = Virtual::canBeUpgraded($instance);
$form = new FormValidator('upgrade', 'post', api_get_self().'?vid='.$id);
// Database host.
$form->addHeader(get_lang('Upgrade'));
$form->addText('root_web', $plugin->get_lang('rootweb'));
$form->addText('db_host', $plugin->get_lang('dbhost'));
$form->addText('db_user', $plugin->get_lang('dbuser'));
$form->addText('main_database', [$plugin->get_lang('maindatabase')]);
$form->setDefaults((array) $instance);
if ($canBeUpgraded) {
$form->addLabel(get_lang('From'), $canBeUpgraded);
$form->addLabel(get_lang('To'), api_get_setting('chamilo_database_version'));
$form->addButtonSave(get_lang('Upgrade'));
} else {
Display::addFlash(Display::return_message(get_lang('NothingToUpgrade')));
}
$form->freeze();
$content = $form->returnForm();
if ($form->validate() && $canBeUpgraded) {
$values = $form->getSubmitValues();
require_once api_get_path(SYS_CODE_PATH).'install/install.lib.php';
$manager = Virtual::getConnectionFromInstance($instance, true);
ob_start();
$result = migrateSwitch($canBeUpgraded, $manager, false);
$data = ob_get_clean();
if ($result) {
Display::addFlash(Display::return_message(get_lang('Upgraded')));
} else {
Display::addFlash(Display::return_message(get_lang('Error')));
}
$content = $data;
}
$tpl = new Template(get_lang('Upgrade'), true, true, false, true, false);
$tpl->assign('content', $content);
$tpl->display_one_col_template();
Loading…
Cancel
Save