Miglioramento delle procedure di aggiornamento

This commit is contained in:
Thomas Zilio 2018-09-18 17:35:04 +02:00
parent 0c1d9c43d2
commit 06ab3b0558
3 changed files with 96 additions and 54 deletions

View File

@ -11,7 +11,7 @@ $scriptValue = $updateRate * 5;
if (filter('action') == 'do_update') {
// Aggiornamento in progresso
if (Update::isUpdateAvailable()) {
$update = Update::getUpdate();
$update = Update::getCurrentUpdate();
$result = Update::doUpdate($updateRate);
@ -19,7 +19,7 @@ if (filter('action') == 'do_update') {
// Aggiunta del messaggio generico riguardante l'aggiornamento
echo '
<script>
addVersion("'.$update['version'].'");
addVersion("'.$update['name'].'");
</script>';
if (is_array($result)) {
@ -178,7 +178,7 @@ if (filter('action') == 'do_update') {
<div id="result"></div>';
$total = 0;
$updates = Update::getTodos();
$updates = Update::getTodoUpdates();
foreach ($updates as $update) {
if ($update['sql'] && (!empty($update['done']) || is_null($update['done']))) {

View File

@ -9,6 +9,11 @@ class Update
{
/** @var array Elenco degli aggiornamenti da completare */
protected static $updates;
/** @var array Percorsi da controllare per gli aggiornamenti */
protected static $directories = [
'modules',
'plugins'
];
/**
* Controlla la presenza di aggiornamenti e prepara il database per la procedura.
@ -19,25 +24,27 @@ class Update
$database_ready = $database->isConnected() && $database->tableExists('updates');
// Individuazione di tutti gli aggiornamenti fisicamente presenti
// Individuazione di tutti gli aggiornamenti presenti
// Aggiornamenti del gestionale
$core = self::getCoreUpdates();
// Aggiornamenti dei moduli
$modules = self::getModulesUpdates();
// Aggiornamenti supportati
$modules = self::getCustomUpdates();
$results = array_merge($core, $modules);
$paths = array_column($results, 'path');
// Individuazione di tutti gli aggiornamenti inseriti
// Individuazione di tutti gli aggiornamenti inseriti nel database
$updates = ($database_ready) ? $database->fetchArray('SELECT * FROM `updates`') : [];
$versions = array_column($updates, 'version');
$versions = [];
foreach ($updates as $update) {
$versions[] = self::findUpdatePath($update);
}
$reset = count(array_intersect($results, $versions)) != count($results);
$reset = count(array_intersect($paths, $versions)) != count($results);
// Memorizzazione degli aggiornamenti
if ($reset && $database->isConnected()) {
// Individua le versioni che sono state installate, anche solo parzialmente
$done = ($database_ready) ? $database->fetchArray('SELECT version, done FROM updates WHERE `done` IS NOT NULL') : [];
// Reimpostazione della tabella degli aggiornamenti
$create = DOCROOT.'/update/create_updates.sql';
if (file_exists($create)) {
@ -48,17 +55,21 @@ class Update
// Inserimento degli aggiornamenti individuati
foreach ($results as $result) {
// Individuazione di script e sql
$temp = explode('_', $result);
$file = DOCROOT.((str_contains($result, '_')) ? '/modules/'.implode('_', explode('_', $result, -1)) : '').'/update/'.str_replace('.', '_', end($temp));
$sql = file_exists($file.'.sql') ? 1 : 0;
$script = file_exists($file.'.php') ? 1 : 0;
$sql = file_exists($result['path'].'.sql') ? 1 : 0;
$script = file_exists($result['path'].'.php') ? 1 : 0;
// Reimpostazione degli stati per gli aggiornamenti precedentemente presenti
$pos = array_search($result, $versions);
$done = ($pos !== false) ? prepare($updates[$pos]['done']) : 'NULL';
$pos = array_search($result['path'], $versions);
$done = ($pos !== false) ? $updates[$pos]['done'] : null;
$database->query('INSERT INTO `updates` (`version`, `sql`, `script`, `done`) VALUES ('.prepare($result).', '.prepare($sql).', '.prepare($script).', '.$done.')');
$directory = explode('update/', $result['path'])[0];
$database->insert('updates', [
'directory' => rtrim($directory, '/'),
'version' => $result['version'],
'sql' => $sql,
'script' => $script,
'done' => $done,
]);
}
// Normalizzazione di charset e collation
@ -72,62 +83,92 @@ class Update
* @return array
*/
protected static function getCoreUpdates()
{
return self::getUpdates(DOCROOT.'/update');
}
/**
* Restituisce l'elenco degli aggiornamento nel percorso indicato.
*
* @param string $directory
*
* @return array
*/
protected static function getUpdates($directory)
{
$results = [];
$previous = [];
// Aggiornamenti del gestionale
$core = glob(DOCROOT.'/update/*.{php,sql}', GLOB_BRACE);
foreach ($core as $value) {
$infos = pathinfo($value);
$value = str_replace('_', '.', $infos['filename']);
$files = glob($directory.'/*.{php,sql}', GLOB_BRACE);
foreach ($files as $file) {
$infos = pathinfo($file);
$version = str_replace('_', '.', $infos['filename']);
if (self::isVersion($value)) {
$results[] = $value;
if (array_search($version, $previous) === false && self::isVersion($version)) {
$path = ltrim($infos['dirname'].'/'.$infos['filename'], DOCROOT);
$path = ltrim($path, '/');
$results[] = [
'path' => $path,
'version' => $version,
];
$previous[] = $version;
}
}
$results = array_unique($results);
asort($results);
return $results;
}
/**
* Restituisce l'elenco degli aggiornamento dei moduli, presenti nella cartella <b>update<b> dei singoli moduli.
* Restituisce l'elenco degli aggiornamento delle strutture supportate, presenti nella cartella <b>update<b>.
*
* @return array
*/
protected static function getModulesUpdates()
protected static function getCustomUpdates()
{
$results = [];
// Aggiornamenti dei moduli
$modules = glob(DOCROOT.'/modules/*/update/*.{php,sql}', GLOB_BRACE);
foreach ($modules as $value) {
$infos = pathinfo($value);
foreach (self::$directories as $dir) {
$folders = glob(DOCROOT.'/'.$dir.'/*/update', GLOB_ONLYDIR);
$temp = explode('/', dirname($infos['dirname']));
$module = end($temp);
$value = str_replace('_', '.', $infos['filename']);
if (self::isVersion($value)) {
$results[] = $module.'_'.$value;
foreach ($folders as $folder) {
$results = array_merge($results, self::getUpdates($folder));
}
}
$results = array_unique($results);
asort($results);
return $results;
}
protected static function findUpdatePath($update)
{
$version = str_replace('.', '_', $update['version']);
$old_standard = str_contains($update['version'], '_');
if (empty($update['directory']) && !$old_standard) {
return 'update/'.$version;
}
if ($old_standard) {
$module = implode('_', explode('_', $update['version'], -1));
$version = explode('_', $update['version']);
$version = end($version);
$version = str_replace('.', '_', $version);
return 'modules/'.$module.'/update/'.$version;
}
return $update['directory'].'/update/'.$version;
}
/**
* Restituisce l'elenco degli aggiornamento incompleti o non ancora effettuati.
*
* @return array
*/
public static function getTodos()
public static function getTodoUpdates()
{
if (!is_array(self::$updates)) {
self::prepareToUpdate();
@ -137,12 +178,12 @@ class Update
$updates = $database->isConnected() ? $database->fetchArray('SELECT * FROM `updates` WHERE `done` != 1 OR `done` IS NULL ORDER BY `done` DESC, `id` ASC') : [];
foreach ($updates as $key => $value) {
$updates[$key]['name'] = ucwords(str_replace('_', ' ', $value['version']));
$name = explode('/', $value['directory']);
$updates[$key]['name'] = ucwords(end($name)).' '.$value['version'];
$temp = explode('_', $value['version']);
$updates[$key]['filename'] = str_replace('.', '_', end($temp));
$updates[$key]['filename'] = str_replace('.', '_', $value['version']);
$updates[$key]['directory'] = ((str_contains($value['version'], '_')) ? '/modules/'.implode('_', explode('_', $value['version'], -1)) : '').'/update/';
$updates[$key]['directory'] = $value['directory'].'/update/';
}
self::$updates = $updates;
@ -156,9 +197,9 @@ class Update
*
* @return array
*/
public static function getUpdate()
public static function getCurrentUpdate()
{
$todos = self::getTodos();
$todos = self::getTodoUpdates();
return !empty($todos) ? $todos[0] : null;
}
@ -182,7 +223,7 @@ class Update
*/
public static function isUpdateAvailable()
{
$todos = self::getTodos();
$todos = self::getTodoUpdates();
return !empty($todos);
}
@ -204,7 +245,7 @@ class Update
*/
public static function isUpdateLocked()
{
$todos = array_column(self::getTodos(), 'done');
$todos = array_column(self::getTodoUpdates(), 'done');
foreach ($todos as $todo) {
if ($todo !== null && $todo !== 1) {
return true;
@ -331,7 +372,7 @@ class Update
ignore_user_abort(true);
if (!self::isUpdateCompleted()) {
$update = self::getUpdate();
$update = self::getCurrentUpdate();
$file = DOCROOT.$update['directory'].$update['filename'];

View File

@ -1,5 +1,6 @@
CREATE TABLE `updates` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`directory` varchar(255),
`version` varchar(255) NOT NULL,
`sql` boolean NOT NULL,
`script` boolean NOT NULL,