1
0
mirror of https://github.com/devcode-it/openstamanager.git synced 2025-06-05 22:09:38 +02:00

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') { if (filter('action') == 'do_update') {
// Aggiornamento in progresso // Aggiornamento in progresso
if (Update::isUpdateAvailable()) { if (Update::isUpdateAvailable()) {
$update = Update::getUpdate(); $update = Update::getCurrentUpdate();
$result = Update::doUpdate($updateRate); $result = Update::doUpdate($updateRate);
@@ -19,7 +19,7 @@ if (filter('action') == 'do_update') {
// Aggiunta del messaggio generico riguardante l'aggiornamento // Aggiunta del messaggio generico riguardante l'aggiornamento
echo ' echo '
<script> <script>
addVersion("'.$update['version'].'"); addVersion("'.$update['name'].'");
</script>'; </script>';
if (is_array($result)) { if (is_array($result)) {
@@ -178,7 +178,7 @@ if (filter('action') == 'do_update') {
<div id="result"></div>'; <div id="result"></div>';
$total = 0; $total = 0;
$updates = Update::getTodos(); $updates = Update::getTodoUpdates();
foreach ($updates as $update) { foreach ($updates as $update) {
if ($update['sql'] && (!empty($update['done']) || is_null($update['done']))) { 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 */ /** @var array Elenco degli aggiornamenti da completare */
protected static $updates; 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. * 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'); $database_ready = $database->isConnected() && $database->tableExists('updates');
// Individuazione di tutti gli aggiornamenti fisicamente presenti // Individuazione di tutti gli aggiornamenti presenti
// Aggiornamenti del gestionale // Aggiornamenti del gestionale
$core = self::getCoreUpdates(); $core = self::getCoreUpdates();
// Aggiornamenti dei moduli
$modules = self::getModulesUpdates(); // Aggiornamenti supportati
$modules = self::getCustomUpdates();
$results = array_merge($core, $modules); $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`') : []; $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 // Memorizzazione degli aggiornamenti
if ($reset && $database->isConnected()) { 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 // Reimpostazione della tabella degli aggiornamenti
$create = DOCROOT.'/update/create_updates.sql'; $create = DOCROOT.'/update/create_updates.sql';
if (file_exists($create)) { if (file_exists($create)) {
@@ -48,17 +55,21 @@ class Update
// Inserimento degli aggiornamenti individuati // Inserimento degli aggiornamenti individuati
foreach ($results as $result) { foreach ($results as $result) {
// Individuazione di script e sql // Individuazione di script e sql
$temp = explode('_', $result); $sql = file_exists($result['path'].'.sql') ? 1 : 0;
$file = DOCROOT.((str_contains($result, '_')) ? '/modules/'.implode('_', explode('_', $result, -1)) : '').'/update/'.str_replace('.', '_', end($temp)); $script = file_exists($result['path'].'.php') ? 1 : 0;
$sql = file_exists($file.'.sql') ? 1 : 0;
$script = file_exists($file.'.php') ? 1 : 0;
// Reimpostazione degli stati per gli aggiornamenti precedentemente presenti // Reimpostazione degli stati per gli aggiornamenti precedentemente presenti
$pos = array_search($result, $versions); $pos = array_search($result['path'], $versions);
$done = ($pos !== false) ? prepare($updates[$pos]['done']) : 'NULL'; $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 // Normalizzazione di charset e collation
@@ -72,62 +83,92 @@ class Update
* @return array * @return array
*/ */
protected static function getCoreUpdates() 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 = []; $results = [];
$previous = [];
// Aggiornamenti del gestionale $files = glob($directory.'/*.{php,sql}', GLOB_BRACE);
$core = glob(DOCROOT.'/update/*.{php,sql}', GLOB_BRACE); foreach ($files as $file) {
foreach ($core as $value) { $infos = pathinfo($file);
$infos = pathinfo($value); $version = str_replace('_', '.', $infos['filename']);
$value = str_replace('_', '.', $infos['filename']);
if (self::isVersion($value)) { if (array_search($version, $previous) === false && self::isVersion($version)) {
$results[] = $value; $path = ltrim($infos['dirname'].'/'.$infos['filename'], DOCROOT);
$path = ltrim($path, '/');
$results[] = [
'path' => $path,
'version' => $version,
];
$previous[] = $version;
} }
} }
$results = array_unique($results);
asort($results); asort($results);
return $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 * @return array
*/ */
protected static function getModulesUpdates() protected static function getCustomUpdates()
{ {
$results = []; $results = [];
// Aggiornamenti dei moduli foreach (self::$directories as $dir) {
$modules = glob(DOCROOT.'/modules/*/update/*.{php,sql}', GLOB_BRACE); $folders = glob(DOCROOT.'/'.$dir.'/*/update', GLOB_ONLYDIR);
foreach ($modules as $value) {
$infos = pathinfo($value);
$temp = explode('/', dirname($infos['dirname'])); foreach ($folders as $folder) {
$module = end($temp); $results = array_merge($results, self::getUpdates($folder));
$value = str_replace('_', '.', $infos['filename']);
if (self::isVersion($value)) {
$results[] = $module.'_'.$value;
} }
} }
$results = array_unique($results);
asort($results);
return $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. * Restituisce l'elenco degli aggiornamento incompleti o non ancora effettuati.
* *
* @return array * @return array
*/ */
public static function getTodos() public static function getTodoUpdates()
{ {
if (!is_array(self::$updates)) { if (!is_array(self::$updates)) {
self::prepareToUpdate(); 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') : []; $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) { 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('.', '_', $value['version']);
$updates[$key]['filename'] = str_replace('.', '_', end($temp));
$updates[$key]['directory'] = ((str_contains($value['version'], '_')) ? '/modules/'.implode('_', explode('_', $value['version'], -1)) : '').'/update/'; $updates[$key]['directory'] = $value['directory'].'/update/';
} }
self::$updates = $updates; self::$updates = $updates;
@@ -156,9 +197,9 @@ class Update
* *
* @return array * @return array
*/ */
public static function getUpdate() public static function getCurrentUpdate()
{ {
$todos = self::getTodos(); $todos = self::getTodoUpdates();
return !empty($todos) ? $todos[0] : null; return !empty($todos) ? $todos[0] : null;
} }
@@ -182,7 +223,7 @@ class Update
*/ */
public static function isUpdateAvailable() public static function isUpdateAvailable()
{ {
$todos = self::getTodos(); $todos = self::getTodoUpdates();
return !empty($todos); return !empty($todos);
} }
@@ -204,7 +245,7 @@ class Update
*/ */
public static function isUpdateLocked() public static function isUpdateLocked()
{ {
$todos = array_column(self::getTodos(), 'done'); $todos = array_column(self::getTodoUpdates(), 'done');
foreach ($todos as $todo) { foreach ($todos as $todo) {
if ($todo !== null && $todo !== 1) { if ($todo !== null && $todo !== 1) {
return true; return true;
@@ -331,7 +372,7 @@ class Update
ignore_user_abort(true); ignore_user_abort(true);
if (!self::isUpdateCompleted()) { if (!self::isUpdateCompleted()) {
$update = self::getUpdate(); $update = self::getCurrentUpdate();
$file = DOCROOT.$update['directory'].$update['filename']; $file = DOCROOT.$update['directory'].$update['filename'];

View File

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