Skip to content
Snippets Groups Projects
Commit e034e146 authored by Laurent Lecluse's avatar Laurent Lecluse
Browse files

Séparation des processus pour la MAJ de la BDD, afin de bénéficier des...

Séparation des processus pour la MAJ de la BDD, afin de bénéficier des dernières versions de tous les fichiers pour l'exécution de la MAJ BDD
parent e543759e
Branches
Tags
No related merge requests found
...@@ -13,6 +13,8 @@ $actions = [ ...@@ -13,6 +13,8 @@ $actions = [
"test-bdd" => "Test d'accès à la base de données", "test-bdd" => "Test d'accès à la base de données",
]; ];
$c->printMainTitle("OSE", 15);
$c->println('Actions possibles :'); $c->println('Actions possibles :');
foreach ($actions as $a => $l) { foreach ($actions as $a => $l) {
$c->print($a, $c::COLOR_BLACK, $c::BG_LIGHT_GRAY); $c->print($a, $c::COLOR_BLACK, $c::BG_LIGHT_GRAY);
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Script provisoire : il aura disparu à la prochaine version!!! // Script provisoire : il aura disparu à la prochaine version!!!
$c->println('Mise à jour automatique de la base de données', $c::COLOR_LIGHT_CYAN); $c->println('Mise à jour automatique de la base de données', $c::COLOR_LIGHT_CYAN);
$oa->run('update-bdd');
$oa->getBdd()->exec('ALTER TABLE "DOSSIER" MODIFY ("EMAIL" NULL)'); $oa->migration('pre');
$oa->getBdd()->exec('ALTER TABLE "UTILISATEUR" ADD ("PASSWORD_RESET_TOKEN" VARCHAR2(256 CHAR) DEFAULT null)'); $oa->run('update-bdd');
\ No newline at end of file $oa->migration('post');
\ No newline at end of file
<?php <?php
var_dump( $oa->bddIsOk() ); $oldVersion = '8.1.2';
\ No newline at end of file $newVersion = '8.1.3';
$oa->oldVersion = $oldVersion;
$oa->version = $newVersion;
$oa->migration('post');
...@@ -3,6 +3,9 @@ ...@@ -3,6 +3,9 @@
$bdd = $oa->getBdd(); $bdd = $oa->getBdd();
$schema = new \BddAdmin\Schema($bdd); $schema = new \BddAdmin\Schema($bdd);
$c->println("\nMise à jour de la base de données", $c::COLOR_LIGHT_CYAN);
$oa->migration('pre');
$c->println("\n".'Mise à jour des définitions de la base de données', $c::COLOR_LIGHT_PURPLE); $c->println("\n".'Mise à jour des définitions de la base de données', $c::COLOR_LIGHT_PURPLE);
/* Récupération du schéma de référence */ /* Récupération du schéma de référence */
...@@ -22,10 +25,10 @@ $ddlConfig = [ ...@@ -22,10 +25,10 @@ $ddlConfig = [
\BddAdmin\Ddl\DdlTrigger::class => $ddlConfig[\BddAdmin\Ddl\DdlTrigger::class], \BddAdmin\Ddl\DdlTrigger::class => $ddlConfig[\BddAdmin\Ddl\DdlTrigger::class],
]; // Pour le moment, travail uniquement sur ces 3 structures de données. Pour les autres, cela viendra plus tard. ]; // Pour le moment, travail uniquement sur ces 3 structures de données. Pour les autres, cela viendra plus tard.
//$ddlConfig[\BddAdmin\Ddl\DdlView::class]['includes'] = [ $ddlConfig[\BddAdmin\Ddl\DdlView::class]['includes'] = [ // afin d'être sûr qu'elles seront supprimées, car devenues inutiles
// 'V_FORMULE_LOCAL_I_PARAMS', 'V_FORMULE_LOCAL_I_PARAMS',
// 'V_FORMULE_LOCAL_VH_PARAMS', 'V_FORMULE_LOCAL_VH_PARAMS',
//]; ];
/* Mise en place du logging en mode console */ /* Mise en place du logging en mode console */
...@@ -39,10 +42,11 @@ $schema->alter($ref, $ddlConfig, true); ...@@ -39,10 +42,11 @@ $schema->alter($ref, $ddlConfig, true);
$c->println('Fin de mise à jour des définitions'); $c->println('Fin de mise à jour des définitions');
// On teste que la méthode existe, car au moment de la MAJ l'objet chargé est la version antérieure à celle de ce sccript // On teste que la méthode existe, car au moment de la MAJ l'objet chargé est la version antérieure à celle de ce sccript
if (method_exists($oa,'majPrivileges')) { if (method_exists($oa,'majPrivileges')) { /** @deprecated > 8.2 */
$c->println('Mise à jour des privilèges', $c::COLOR_LIGHT_PURPLE); $c->println('Mise à jour des privilèges', $c::COLOR_LIGHT_PURPLE);
$oa->majPrivileges(); $oa->majPrivileges();
$c->println('Fin de la mise à jour des privilèges'); $c->println('Fin de la mise à jour des privilèges');
} }
$oa->migration('post');
$c->println(''); $c->println('');
\ No newline at end of file
...@@ -23,17 +23,16 @@ $tags = $oa->getTags(); ...@@ -23,17 +23,16 @@ $tags = $oa->getTags();
foreach ($tags as $tag) { foreach ($tags as $tag) {
$c->println($tag); $c->println($tag);
} }
$ok = false;
while (!$ok) {
// Choix de la version
$c->print("Veuillez choisir une version à déployer: "); $c->print("Veuillez choisir une version à déployer: ");
$version = $c->getInput(); $version = $c->getInput();
if ($oa->tagIsValid($version)) { if (!$oa->tagIsValid($version)) {
$ok = true; $c->printDie("$version n'est pas dans la liste des versions disponibles.");
} else {
$c->println("$version n'est pas dans la liste des versions disponibles.");
}
} }
// Récupération des sources // Récupération des sources
$c->println("\nMise à jour des fichiers à partir de GIT", $c::COLOR_LIGHT_CYAN); $c->println("\nMise à jour des fichiers à partir de GIT", $c::COLOR_LIGHT_CYAN);
$c->passthru([ $c->passthru([
...@@ -41,6 +40,7 @@ $c->passthru([ ...@@ -41,6 +40,7 @@ $c->passthru([
"git checkout tags/$version", "git checkout tags/$version",
]); ]);
// Récupération des dépendances // Récupération des dépendances
$c->println("\nMise à jour des dépendances à l'aide de Composer", $c::COLOR_LIGHT_CYAN); $c->println("\nMise à jour des dépendances à l'aide de Composer", $c::COLOR_LIGHT_CYAN);
$c->passthru([ $c->passthru([
...@@ -49,22 +49,19 @@ $c->passthru([ ...@@ -49,22 +49,19 @@ $c->passthru([
"php composer.phar install", "php composer.phar install",
]); ]);
// Mise à jour des liens vers les répertoires publics des dépendances // Mise à jour des liens vers les répertoires publics des dépendances
$c->println("\nMise à jour des liens vers les répertoires publics des dépendances", $c::COLOR_LIGHT_CYAN); $c->println("\nMise à jour des liens vers les répertoires publics des dépendances", $c::COLOR_LIGHT_CYAN);
$res = $oa->majUnicaenSymLinks($osedir); $res = $oa->majUnicaenSymLinks($osedir);
$c->println($res ? 'Liens mis à jour' : 'Liens déjà à jour', $c::COLOR_GREEN); $c->println($res ? 'Liens mis à jour' : 'Liens déjà à jour', $c::COLOR_GREEN);
// Conclusion // Conclusion
$oa->writeVersion($version); $oa->writeVersion($version);
$c->println("\nMise à jour des fichiers OK : la version installée est désormais la ".$version, $c::COLOR_LIGHT_GREEN); $c->println("\nMise à jour des fichiers OK : la version installée est désormais la ".$version, $c::COLOR_LIGHT_GREEN);
$c->println("\nMise à jour de la base de données", $c::COLOR_LIGHT_CYAN); // Mise à jour de la base de données à partir d'un nouveau processus
$oa->migration('pre'); $oa->run('update-bdd', true);
$oa->run('update-bdd');
$oa->migration('post');
// Néttoyage des caches et mise à jour des proxies
$oa->run('clear-cache');
$c->println("\nFin de la mise à jour. N'oubliez pas de sortir du mode maintenance!"); $c->println("\nFin de la mise à jour. N'oubliez pas de sortir du mode maintenance!");
$c->println(''); $c->println('');
\ No newline at end of file
...@@ -52,6 +52,13 @@ class OseAdmin ...@@ -52,6 +52,13 @@ class OseAdmin
{ {
$this->version = $this->currentVersion(); $this->version = $this->currentVersion();
$this->oldVersion = $this->version; $this->oldVersion = $this->version;
if ($this->console->hasOption('oa-old-version')){
$this->oldVersion = $this->console->getOption('oa-old-version');
}
if ($this->console->hasOption('oa-version')){
$this->version = $this->console->getOption('oa-version');
}
} }
...@@ -159,15 +166,22 @@ class OseAdmin ...@@ -159,15 +166,22 @@ class OseAdmin
/** /**
* @param string $action * @param string $action
*/ */
public function run(string $action) public function run(string $action, $newProcess=false)
{ {
if (file_exists($this->getOseDir() . 'admin/actions/' . $action . '.php')) {
if ($newProcess){
$this->console->passthru(
"php " . $this->getOseDir() . "/bin/ose " . $action
.' --oa-old-version='.$this->oldVersion
.' --oa-version='.$this->version
);
}else{
$oa = $this; $oa = $this;
$c = $this->console; $c = $this->console;
if (file_exists($this->getOseDir() . 'admin/actions/' . $action . '.php')) {
require_once $this->getOseDir() . 'admin/actions/' . $action . '.php'; require_once $this->getOseDir() . 'admin/actions/' . $action . '.php';
}
} else { } else {
$c->println('Action "' . $action . '" inconnue.', $c::COLOR_RED); $this->console->println('Action "' . $action . '" inconnue.', $this->console::COLOR_RED);
require_once $this->getOseDir() . 'admin/actions/help.php'; require_once $this->getOseDir() . 'admin/actions/help.php';
} }
} }
...@@ -189,64 +203,35 @@ class OseAdmin ...@@ -189,64 +203,35 @@ class OseAdmin
/** protected function getMigrationFilesToExecute(string $oldVersion, string $newVersion, string $prePost = 'pre'): array
* Lancement des scripts éventuels liés à des migrations pour des versions spécifiques
*
* @param string $prePost
*
* @return bool
* @throws \BddAdmin\Exception\BddCompileException
* @throws \BddAdmin\Exception\BddException
* @throws \BddAdmin\Exception\BddIndexExistsException
*/
public function migration(string $prePost = 'pre'): bool
{ {
$this->console->println('Exécution des scripts de ' . $prePost . '-migration', $this->console::COLOR_LIGHT_PURPLE);
$execs = 0;
$tags = $this->getTags(1); $tags = $this->getTags(1);
foreach ($tags as $i => $tag) { foreach ($tags as $i => $tag) {
$tags[$i] = $this->purgerVersion($tag); $tags[$i] = $this->purgerVersion($tag);
} }
$tags = array_unique($tags); $tags = array_unique($tags);
$oldIndex = array_search($this->purgerVersion($this->oldVersion), $tags); $oldIndex = array_search($this->purgerVersion($oldVersion), $tags);
$newIndex = array_search($this->purgerVersion($this->version), $tags); $newIndex = array_search($this->purgerVersion($newVersion), $tags);
$scripts = [];
if ($oldIndex !== false && $newIndex !== false && $oldIndex < $newIndex) { if ($oldIndex !== false && $newIndex !== false && $oldIndex < $newIndex) {
for ($i = $oldIndex + 1; $i <= $newIndex; $i++) { for ($i = $oldIndex + 1; $i <= $newIndex; $i++) {
$phpMigr = $this->getOseDir() . 'admin/migration/' . $tags[$i] . '-' . $prePost . '.php'; $phpMigr = $this->getOseDir() . 'admin/migration/' . $tags[$i] . '-' . $prePost . '.php';
$sqlMigr = $this->getOseDir() . 'admin/migration/' . $tags[$i] . '-' . $prePost . '.sql'; $sqlMigr = $this->getOseDir() . 'admin/migration/' . $tags[$i] . '-' . $prePost . '.sql';
if (file_exists($sqlMigr)) { if (file_exists($sqlMigr)) {
$this->console->println('Exécution du script de ' . $prePost . '-migration SQL de la version ' . $tags[$i], $this->console::COLOR_LIGHT_BLUE); $scripts[] = $sqlMigr;
$errors = $this->getBdd()->execFile($sqlMigr);
$execs++;
if (!empty($errors)) {
$this->console->println('Des erreurs ont été rencontrées durant l\'exécution du script de migration :', $this->console::BG_RED);
foreach ($errors as $e) {
$this->console->println($e->getMessage(), $this->console::COLOR_RED);
}
}
} }
if (file_exists($phpMigr)) { if (file_exists($phpMigr)) {
$execs++; $scripts[] = $phpMigr;
$this->console->println('Exécution du script de ' . $prePost . '-migration PHP de la version ' . $tags[$i], $this->console::COLOR_LIGHT_BLUE);
try {
require_once $phpMigr;
} catch (\Exception $e) {
$this->console->println($e->getMessage(), $this->console::COLOR_RED);
}
}
} }
if ($execs > 0) {
$this->console->println("Scripts de $prePost-migration exécutés");
} else {
$this->console->println("Aucun script de $prePost-migration à exécuter");
} }
return true; return $scripts;
} else { } else {
if ($prePost == 'pre') { // on n'avertit qu'une seule fois! if ($prePost == 'pre') { // on n'avertit qu'une seule fois!
$this->console->println('Attention : les scripts de migration automatiques n\'ont pas pu être déclenchés :', $this->console::BG_RED); $this->console->println('Attention : les scripts de migration automatiques n\'ont pas pu être déclenchés :', $this->console::BG_RED);
...@@ -268,8 +253,75 @@ class OseAdmin ...@@ -268,8 +253,75 @@ class OseAdmin
); );
} }
return false; return [];
}
}
protected function runMigrationPhpScript(string $filename)
{
$this->console->println('Exécution du script de migration ' . basename($filename), $this->console::COLOR_YELLOW);
try {
$oa = $this;
$c = $this->console;
require_once $filename;
} catch (\Exception $e) {
$this->console->println($e->getMessage(), $this->console::COLOR_RED);
}
} }
protected function runMigrationSqlScript(string $filename)
{
$this->console->println('Exécution du script de migration ' . basename($filename), $this->console::COLOR_YELLOW);
$errors = $this->getBdd()->execFile($filename);
if (!empty($errors)) {
$this->console->println('Des erreurs ont été rencontrées durant l\'exécution du script de migration :', $this->console::BG_RED);
foreach ($errors as $e) {
$this->console->println($e->getMessage(), $this->console::COLOR_RED);
}
}
}
/**
* Lancement des scripts éventuels liés à des migrations pour des versions spécifiques
*
* @param string $prePost
*
* @return bool
* @throws \BddAdmin\Exception\BddCompileException
* @throws \BddAdmin\Exception\BddException
* @throws \BddAdmin\Exception\BddIndexExistsException
*/
public function migration(string $prePost = 'pre'): bool
{
$this->console->println('Exécution des scripts de ' . $prePost . '-migration', $this->console::COLOR_LIGHT_PURPLE);
$scripts = $this->getMigrationFilesToExecute($this->oldVersion, $this->version, $prePost);
foreach( $scripts as $script ){
$ext = substr($script, -3);
switch($ext){
case 'php':
$this->runMigrationPhpScript($script);
break;
case 'sql':
$this->runMigrationSqlScript($script);
break;
}
}
if (count($scripts) > 0) {
$this->console->println("Scripts de $prePost-migration exécutés");
} else {
$this->console->println("Aucun script de $prePost-migration à exécuter");
}
return true;
} }
......
...@@ -12,8 +12,4 @@ $c = new Console(); ...@@ -12,8 +12,4 @@ $c = new Console();
$oa = new OseAdmin($c); $oa = new OseAdmin($c);
$oa->init(); $oa->init();
$c->printMainTitle("OSE", 15);
$oa->run($c->getArg(1) ?: 'help'); $oa->run($c->getArg(1) ?: 'help');
\ No newline at end of file
$c->println('Traitement terminé.', $c::BG_YELLOW);
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment