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

Mise à jour globale du module de mise à jour et d'administration de la BDD :

- Meilleur contrôle des mises à jour
- Possibilité de mettre en place des scripts d'automatisation en pre et post-maj
- Logs de MAJ de BDD
- MAJ automatique de la BDD
parent d88a7d55
Branches
Tags
No related merge requests found
Showing
with 329 additions and 108 deletions
<?php
$bdd = $oa->getBdd();
$schema = new \BddAdmin\Schema($bdd);
/* Récupération du schéma de référence */
$ref = $schema->loadFromFile($oa->getOseDir().'bdd/ddl.php');
/* Construction de la config de DDL pour filtrer */
$ddlConfig = [];
// On me met à jour que les objets présents dans le schéma par défaut
foreach( $ref as $ddlClass => $config ){
$ddlConfig[$ddlClass] = ['includes' => array_keys($config)];
}
$ddlConfig = [\BddAdmin\Ddl\DdlSequence::class => $ddlConfig[\BddAdmin\Ddl\DdlSequence::class]];
$ddlConfig = [
'explicit' => true,
\BddAdmin\Ddl\DdlView::class => $ddlConfig[\BddAdmin\Ddl\DdlView::class],
\BddAdmin\Ddl\DdlPackage::class => $ddlConfig[\BddAdmin\Ddl\DdlPackage::class],
\BddAdmin\Ddl\DdlTrigger::class => $ddlConfig[\BddAdmin\Ddl\DdlTrigger::class],
];
$ddlConfig[\BddAdmin\Ddl\DdlView::class]['excludes'] = [
'V_FORMULE_LOCAL_VH_PARAMS'
];
/* Mise en place du logging en mode console */
$scl = new \BddAdmin\SchemaConsoleLogger();
$scl->console = $c;
$schema->setLogger($scl);
$r = $schema->alter($ref, $ddlConfig, false);
//var_dump($r);
/* Mise à jour de la BDD */
$r = $schema->alter($ref, $ddlConfig, true);
<?php
$bdd = $oa->getBdd();
$schema = new \BddAdmin\Schema($bdd);
/* Récupération du schéma de référence */
$ref = $schema->loadFromFile($oa->getOseDir() . 'bdd/ddl.php');
/* Construction de la config de DDL pour filtrer */
$ddlConfig = [];
// On me met à jour que les objets présents dans le schéma par défaut
foreach ($ref as $ddlClass => $config) {
$ddlConfig[$ddlClass] = ['includes' => array_keys($config)];
}
$ddlConfig = [
'explicit' => true,
\BddAdmin\Ddl\DdlView::class => $ddlConfig[\BddAdmin\Ddl\DdlView::class],
\BddAdmin\Ddl\DdlPackage::class => $ddlConfig[\BddAdmin\Ddl\DdlPackage::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.
$ddlConfig[\BddAdmin\Ddl\DdlView::class]['excludes'] = [
'V_FORMULE_LOCAL_I_PARAMS',
'V_FORMULE_LOCAL_VH_PARAMS',
];
/* Mise en place du logging en mode console */
$scl = new \BddAdmin\SchemaConsoleLogger();
$scl->console = $c;
$schema->setLogger($scl);
/* Mise à jour de la BDD */
$r = $schema->alter($ref, $ddlConfig, true);
\ No newline at end of file
<?php
$osedir = $oa->getOseDir();
// Choix de la version
$c->println("Mise à jour de OSE");
$c->println("Assurez-vous bien d'avoir mis OSE en mode maintenance avant de démarrer\n(pressez Entrée pour continuer)...");
$c->getInput();
$osedir = $oa->getOseDir();
$c->exec([
"cd $osedir",
"git fetch --all --tags --prune",
], false);
$oldVersion = $oa->currentVersion($osedir);
$c->println("Sélection de la version à déployer", $c::COLOR_LIGHT_CYAN);
$c->println("La version actuellement installée est la " . $oldVersion);
$c->println("La version actuellement installée est la " . $oa->oldVersion);
$c->println("Voici la liste des versions de OSE disponibles:");
$tags = $oa->getTags();
foreach ($tags as $tag) {
......@@ -49,11 +47,7 @@ $c->passthru([
]);
// Néttoyage des caches et mise à jour des proxies, lancement du script de migration éventuel
clearCache($c, $oa);
$c->exec([
"cd $osedir",
"php bin/ose migration $oldVersion $version",
]);
$oa->run('clear-cache');
// 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);
......@@ -62,6 +56,11 @@ $c->println($res ? 'Liens mis à jour' : 'Liens déjà à jour', $c::COLOR_LIGHT
// Conclusion
$c->println("\nFin de la mise à jour des fichiers", $c::COLOR_LIGHT_GREEN);
$c->println("Il reste encore votre base de données à mettre à jour.");
$c->println("\nMise à jour de la base de données", $c::COLOR_LIGHT_CYAN);
$oa->migration('pre');
$oa->run('update-bdd');
$oa->migration('post');
$c->println("N'oubliez pas de sortir du mode maintenance!");
$c->println('');
\ No newline at end of file
......@@ -5,6 +5,7 @@ namespace BddAdmin;
use BddAdmin\Exception\BddCompileException;
use BddAdmin\Exception\BddException;
use BddAdmin\Exception\BddIndexExistsException;
use mysql_xdevapi\Exception;
class Bdd
{
......@@ -214,6 +215,40 @@ class Bdd
/**
* @param string $filename
*
* @return \Exception[]
* @throws BddCompileException
* @throws BddException
* @throws BddIndexExistsException
*/
public function execFile(string $filename): array
{
if (!file_exists($filename)) {
throw new Exception('Le fichier ' . $filename . ' n \'existe pas.');
}
$file = file_get_contents($filename);
$queries = explode("/--", $file);
$errors = [];
foreach ($queries as $q) {
$q = trim($q);
if (substr($q, -1) == ';') {
$q = substr($q, 0, -1);
}
try {
$this->exec($q);
} catch (\Exception $e) {
$errors[] = $e;
}
}
return $errors;
}
/**
* @param string $sql
* @param array $params
......
......@@ -4,6 +4,8 @@ namespace BddAdmin\Ddl;
use BddAdmin\Bdd;
use BddAdmin\Exception\BddCompileException;
use BddAdmin\SchemaConsoleLogger;
use BddAdmin\SchemaLoggerInterface;
use Exception;
......@@ -104,20 +106,28 @@ abstract class DdlAbstract
protected function addQuery($sql) // (?string $sql)
protected function addQuery(string $sql, string $description = null) // (?string $sql)
{
if ($sql) {
$this->queries[] = $sql;
$this->queries[$sql] = $description;
}
}
/**
* @param SchemaLoggerInterface|null $logger
*
* @return string[]
*/
public function getQueries(): array
public function getQueries($logger = null): array
{
if ($logger) {
foreach ($this->queries as $sql => $description) {
$logger->log($description);
}
}
return $this->queries;
}
......@@ -131,13 +141,18 @@ abstract class DdlAbstract
/**
* @return Exception[]
* @param SchemaLoggerInterface|null $logger
*
* @return array
*/
public function execQueries(): array
public function execQueries($logger = null): array
{
$errors = [];
foreach ($this->queries as $sql) {
foreach ($this->queries as $sql => $description) {
try {
if ($logger) {
$logger->log($description);
}
$this->bdd->exec($sql);
} catch (Exception $e) {
if (!$e instanceof BddCompileException) {
......
......@@ -66,14 +66,14 @@ class DdlIndex extends DdlAbstract
public function create(array $data)
{
$sql = $this->makeCreate($data);
$this->addQuery($sql);
$this->addQuery($sql, 'Ajout de l\'index '.$data['name']);
}
public function drop(string $name)
{
$this->addQuery("DROP INDEX $name");
$this->addQuery("DROP INDEX $name", 'Suppression de l\'index '.$name);
}
......@@ -93,7 +93,7 @@ class DdlIndex extends DdlAbstract
$newName = $new['name'];
$sql = "ALTER INDEX \"$oldName\" RENAME TO \"$newName\"";
$this->addQuery($sql);
$this->addQuery($sql, 'Renommage de l\'index '.$oldName.' en '.$new);
}
}
\ No newline at end of file
......@@ -40,14 +40,14 @@ class DdlMaterializedView extends DdlAbstract
{
$sql = 'CREATE MATERIALIZED VIEW '.$data['name']." AS\n";
$sql .= $data['definition'];
$this->addQuery($sql);
$this->addQuery($sql, 'Ajout de la vue matérialisée '.$data['name']);
}
public function drop(string $name)
{
$this->addQuery("DROP MATERIALIZED VIEW " . $name);
$this->addQuery("DROP MATERIALIZED VIEW " . $name, 'Suppression de la vue matérialisée '.$name);
}
......
......@@ -65,12 +65,12 @@ class DdlPackage extends DdlAbstract
public function create(array $data)
{
if ($this->hasOption('definition')) {
$this->addQuery($data['definition']);
$this->addQuery($data['definition'], 'Ajout/modification de la définition du package '.$data['name']);
} elseif ($this->hasOption('body')) {
$this->addQuery($data['body']);
$this->addQuery($data['body'], 'Ajout/modification du corps du package '.$data['name']);
} else {
$this->addQuery($data['definition']);
$this->addQuery($data['body']);
$this->addQuery($data['definition'], 'Ajout/modification de la définition du package '.$data['name']);
$this->addQuery($data['body'], 'Ajout/modification du corps du package '.$data['name']);
}
}
......@@ -78,7 +78,7 @@ class DdlPackage extends DdlAbstract
public function drop(string $name)
{
$this->addQuery("DROP PACKAGE $name");
$this->addQuery("DROP PACKAGE $name", 'Suppression du package '.$name);
}
......
......@@ -80,7 +80,7 @@ class DdlPrimaryConstraint extends DdlAbstract
public function create(array $data)
{
$sql = $this->makeCreate($data);
$this->addQuery($sql);
$this->addQuery($sql, 'Création de la clé primaine '.$data['name']);
}
......@@ -91,7 +91,7 @@ class DdlPrimaryConstraint extends DdlAbstract
$d = $this->bdd->select($sql, compact('name'));
$tableName = $d[0]['TABLE_NAME'];
$this->addQuery("ALTER TABLE $tableName DROP CONSTRAINT $name");
$this->addQuery("ALTER TABLE $tableName DROP CONSTRAINT $name", 'Suppression de la clé primaire '.$name);
}
......@@ -122,7 +122,7 @@ class DdlPrimaryConstraint extends DdlAbstract
$newName = $new['name'];
$sql = "ALTER TABLE \"$tableName\" RENAME CONSTRAINT \"$oldName\" TO \"$newName\"";
$this->addQuery($sql);
$this->addQuery($sql, 'Renommage de la clé primaire '.$oldName.' en '.$newName);
}
}
\ No newline at end of file
......@@ -89,7 +89,7 @@ class DdlRefConstraint extends DdlAbstract
public function create(array $data)
{
$sql = $this->makeCreate($data);
$this->addQuery($sql);
$this->addQuery($sql, 'Ajout de la clé étrangère '.$data['name']);
}
......@@ -100,7 +100,7 @@ class DdlRefConstraint extends DdlAbstract
$d = $this->bdd->select($sql, compact('name'));
$tableName = $d[0]['TABLE_NAME'];
$this->addQuery("ALTER TABLE $tableName DROP CONSTRAINT $name");
$this->addQuery("ALTER TABLE $tableName DROP CONSTRAINT $name", 'Suppression de la clé étrangère '.$name);
}
......@@ -121,6 +121,6 @@ class DdlRefConstraint extends DdlAbstract
$newName = $new['name'];
$sql = "ALTER TABLE \"$tableName\" RENAME CONSTRAINT \"$oldName\" TO \"$newName\"";
$this->addQuery($sql);
$this->addQuery($sql, 'Renommage de la clé étrangère '.$oldName.' en '.$newName);
}
}
\ No newline at end of file
......@@ -26,7 +26,7 @@ class DdlSequence extends DdlAbstract
public function create(array $data)
{
$sql = "CREATE SEQUENCE " . $data['name'] . " INCREMENT BY 1 MINVALUE 1 NOCACHE";
$this->addQuery($sql);
$this->addQuery($sql, 'Ajout de la séquence '.$data['name']);
}
......@@ -34,7 +34,7 @@ class DdlSequence extends DdlAbstract
public function drop(string $name)
{
$sql = "DROP SEQUENCE $name";
$this->addQuery($sql);
$this->addQuery($sql, 'Suppression de la séquence '.$name);
}
......
......@@ -237,15 +237,15 @@ class DdlTable extends DdlAbstract
public function create(array $data)
{
$this->addQuery($this->makeCreate($data));
$this->addQuery($this->makeCreateComm($data));
$this->addQuery($this->makeCreate($data), 'Ajout de la table '.$data['name']);
$this->addQuery($this->makeCreateComm($data), 'Ajout de commentaire sur la table '.$data['name']);
}
public function drop(string $name)
{
$this->addQuery("DROP TABLE $name");
$this->addQuery("DROP TABLE $name", 'Suppression de la table '.$name);
}
......@@ -258,7 +258,7 @@ BEGIN
EXECUTE IMMEDIATE \'DROP SEQUENCE ' . $data['sequence'] . '\';
EXECUTE IMMEDIATE \'CREATE SEQUENCE ' . $data['sequence'] . ' INCREMENT BY 1 MINVALUE \' || seqId || \' NOCACHE\';
END';
$this->addQuery($sql);
$this->addQuery($sql, 'Mise à jour de la séquence '.$data['sequence']);
}
......@@ -328,7 +328,7 @@ END';
if ($old['logging'] !== $new['logging']) {
$log = $new['logging'] ? 'LOGGING' : 'NOLOGGING';
$this->addQuery("ALTER TABLE \"$name\" $log");
$this->addQuery("ALTER TABLE \"$name\" $log", 'Modification du logging de la table '.$new['name']);
}
$newCols = array_diff(array_keys($new['columns']), array_keys($old['columns']));
......@@ -354,7 +354,7 @@ END';
}
if ($old['commentaire'] !== $new['commentaire']) {
$this->addQuery($this->makeCreateComm($new));
$this->addQuery($this->makeCreateComm($new), 'Modification du commentaire de la table '.$new['name']);
}
}
}
......@@ -373,7 +373,7 @@ END';
}
$sql = "ALTER TABLE \"$table\" ADD (" . implode(" ", $cp) . ")";
$this->addQuery($sql);
$this->addQuery($sql, 'Ajout de la colonne '.$column['name'].' sur la table '.$table);
}
......@@ -381,7 +381,10 @@ END';
private function dropColumn(string $table, array $column)
{
$column = $column['name'];
$this->addQuery("ALTER TABLE \"$table\" DROP COLUMN \"$column\"");
$this->addQuery(
"ALTER TABLE \"$table\" DROP COLUMN \"$column\"",
'Suppression de la colonne '.$column.' sur la table '.$table
);
}
......@@ -391,7 +394,7 @@ END';
$column = $new['name'];
if ($this->isColDiffType($old, $new)) {
$sql = "ALTER TABLE \"$table\" MODIFY (\"$column\" " . $this->makeColumnType($new) . ")";
$this->addQuery($sql);
$this->addQuery($sql,'Changement du type de la colonne '.$column.' de la table '.$table);
}
}
......@@ -402,7 +405,7 @@ END';
$column = $new['name'];
if ($this->isColDiffNullable($old, $new)) {
$sql = "ALTER TABLE \"$table\" MODIFY (\"$column\" " . ($new['nullable'] ? '' : 'NOT ') . "NULL)";
$this->addQuery($sql);
$this->addQuery($sql,'Changement d\'état de la colonne '.$column.' de la table '.$table);
}
}
......@@ -415,7 +418,7 @@ END';
$default = $new['default'];
if (null === $default) $default = 'NULL';
$sql = "ALTER TABLE \"$table\" MODIFY (\"$column\" DEFAULT $default )";
$this->addQuery($sql);
$this->addQuery($sql,'Changement de valeur par défaut de la colonne '.$column.' de la table '.$table);
}
}
......@@ -426,6 +429,6 @@ END';
$newName = $new['name'];
$sql = "ALTER TABLE \"$oldName\" RENAME TO \"$newName\"";
$this->addQuery($sql);
$this->addQuery($sql, 'Renommage de la table '.$oldName.' en '.$newName);
}
}
\ No newline at end of file
......@@ -44,14 +44,14 @@ class DdlTrigger extends DdlAbstract
public function create(array $data)
{
$this->addQuery($data['definition']);
$this->addQuery($data['definition'], 'Ajout/modification du trigger '.$data['name']);
}
public function drop(string $name)
{
$this->addQuery("DROP TRIGGER $name");
$this->addQuery("DROP TRIGGER $name", 'Suppression du trigger '.$name);
}
......@@ -61,7 +61,7 @@ class DdlTrigger extends DdlAbstract
*/
public function enable(string $name)
{
$this->addQuery("alter trigger $name enable");
$this->addQuery("alter trigger $name enable", 'Activation du trigger '.$name);
}
......@@ -71,7 +71,7 @@ class DdlTrigger extends DdlAbstract
*/
public function disable(string $name)
{
$this->addQuery("alter trigger $name disable");
$this->addQuery("alter trigger $name disable", 'Désactivation du trigger '.$name);
}
......@@ -91,7 +91,7 @@ class DdlTrigger extends DdlAbstract
$newName = $new['name'];
$sql = "ALTER TRIGGER \"$oldName\" RENAME TO \"$newName\"";
$this->addQuery($sql);
$this->addQuery($sql, 'Renommage du trigger '.$oldName.' en '.$newName);
}
}
\ No newline at end of file
......@@ -89,7 +89,7 @@ class DdlUniqueConstraint extends DdlAbstract
public function create(array $data)
{
$sql = $this->makeCreate($data);
$this->addQuery($sql);
$this->addQuery($sql, 'Ajout de la contrainte d\'unicité '.$data['name']);
}
......@@ -100,7 +100,7 @@ class DdlUniqueConstraint extends DdlAbstract
$d = $this->bdd->select($sql, compact('name'));
$tableName = $d[0]['TABLE_NAME'];
$this->addQuery("ALTER TABLE $tableName DROP CONSTRAINT $name");
$this->addQuery("ALTER TABLE $tableName DROP CONSTRAINT $name", 'Suppression de la contrainte d\'unicité '.$name);
}
......@@ -121,6 +121,6 @@ class DdlUniqueConstraint extends DdlAbstract
$newName = $new['name'];
$sql = "ALTER TABLE \"$tableName\" RENAME CONSTRAINT \"$oldName\" TO \"$newName\"";
$this->addQuery($sql);
$this->addQuery($sql, 'Renommage de la contrainte d\'unicité '.$oldName.' en '.$newName);
}
}
\ No newline at end of file
......@@ -40,14 +40,14 @@ class DdlView extends DdlAbstract
public function create(array $data)
{
$this->addQuery($data['definition']);
$this->addQuery($data['definition'], 'Ajout/modification de la vue '.$data['name']);
}
public function drop(string $name)
{
$this->addQuery("DROP VIEW " . $name);
$this->addQuery("DROP VIEW " . $name, 'Suppression de la vue '.$name);
}
......
......@@ -13,6 +13,7 @@ use BddAdmin\Ddl\DdlTable;
use BddAdmin\Ddl\DdlTrigger;
use BddAdmin\Ddl\DdlUniqueConstraint;
use BddAdmin\Ddl\DdlView;
use BddAdmin\Exception\BddCompileException;
class Schema
......@@ -223,7 +224,7 @@ class Schema
unset($ddl[$ddlClass]);
}else {
foreach ($ddlConf as $name => $config) {
if (!$this->ddlFilterObject($name, $this->ddlConfigGet($ddlConfig, $ddlClass, $name))) {
if (!$this->ddlFilterObject($name, $this->ddlConfigGet($ddlConfig, $ddlClass))) {
unset($ddl[$ddlClass][$name]);
}
}
......@@ -237,15 +238,6 @@ class Schema
private function ddlFilterObject(string $name, array $filter): bool
{
if (isset($filter['includes'])) {
$includes = (array)$filter['includes'];
foreach ($includes as $include) {
if (!preg_match('/^' . str_replace('%', '.*', $include) . '$/', $name, $out)) {
return false;
}
}
}
if (isset($filter['excludes'])) {
$excludes = (array)$filter['excludes'];
foreach ($excludes as $exclude) {
......@@ -255,6 +247,16 @@ class Schema
}
}
if (isset($filter['includes'])) {
$includes = (array)$filter['includes'];
foreach ($includes as $include) {
if (preg_match('/^' . str_replace('%', '.*', $include) . '$/', $name, $out)) {
return true;
}
}
return false;
}
return true;
}
......@@ -413,44 +415,35 @@ class Schema
foreach ($names as $oldName => $name) {
switch ($action) {
case 'rename':
if ($this->logger) {
$this->logger->log($ddlObject, 'rename', $oldName);
}
$ddlObject->rename($oldName, $name);
break;
case 'drop':
if (!(isset($options['noDrop']) && $options['noDrop'])) {
if ($this->logger) {
$this->logger->log($ddlObject, 'drop', $name);
}
$ddlObject->drop($name);
}
break;
case 'alter':
if ($this->logger) {
$this->logger->log($ddlObject, 'alter', $name);
}
$ddlObject->alter($kold[$name], $knew[$name]);
break;
case 'create':
if ($this->logger) {
$this->logger->log($ddlObject, 'create', $name);
}
$ddlObject->create($knew[$name]);
break;
}
}
if ($ddlObject->getQueries()) {
if ($autoExecute) {
$res[$changement] = $ddlObject->execQueries();
$res[$changement] = $ddlObject->execQueries($this->logger);
} else {
$res[$changement] = $ddlObject->getQueries();
$res[$changement] = $ddlObject->getQueries($this->logger);
}
}
}
}
if ($mode != 'drop' && $autoExecute) { // create ou alter
if ($this->logger){
$this->logger->logTitle('Compilation de tous les objets de la BDD');
}
$this->compilerTout();
}
......@@ -511,7 +504,14 @@ class Schema
public function queriesToSql(array $queries, $title = null) // (array $queries, ?string $title = null)
/**
* @param array $queries
* @param null $title
* @param bool $reduce
*
* @return string
*/
public function queriesToSql(array $queries, $title = null, $onlyFirstLine = false) // (array $queries, ?string $title = null)
{
$sql = '';
if ($title) {
......@@ -536,6 +536,10 @@ class Schema
$sql .= '-- ' . $label . "\n";
$sql .= '--------------------------------------------------' . "\n\n";
foreach ($qs as $name => $qr) {
if ($onlyFirstLine && false !== strpos($qr,"\n")){
$qr = substr($qr,0,strpos($qr,"\n"));
}
if (substr(trim($qr), -1) != ';') {
$qr .= ';';
}
......@@ -606,6 +610,9 @@ class Schema
}
} catch (BddCompileException $e) {
$errors[$type][$name] = $e->getMessage();
if($this->logger){
$this->logger->log($type.' '.$name.' : Erreur de compilation');
}
}
}
......
......@@ -2,17 +2,29 @@
namespace BddAdmin;
class SchemaConsoleLogger implements SchemaLoggerInterface {
class SchemaConsoleLogger implements SchemaLoggerInterface
{
/**
* @var \Console
*/
public $console;
function log(Ddl\DdlAbstract $object, string $action, string $name)
public function log(string $message)
{
if ($this->console) {
$this->console->println($message);
}
}
public function logTitle(string $title)
{
if ($this->console) {
$this->console->println($action.' '.$object::ALIAS.' '.$name);
$this->console->println($title, $this->console::COLOR_LIGHT_PURPLE);
}
}
......
......@@ -4,6 +4,8 @@ namespace BddAdmin;
interface SchemaLoggerInterface {
function log( Ddl\DdlAbstract $object, string $action, string $name );
function log(string $message );
function logTitle(string $title);
}
\ No newline at end of file
<?php
class OseAdmin
{
const OSE_ORIGIN = 'https://git.unicaen.fr/open-source/OSE';
const MIN_VERSION = 8; // version minimum installable
/**
* @var Console
......@@ -19,6 +24,16 @@ class OseAdmin
*/
private $tags = false;
/**
* @var string
*/
public $oldVersion;
/**
* @var string
*/
public $version;
/**
......@@ -80,7 +95,7 @@ class OseAdmin
public function getTags(): array
public function getTags($minVersion = self::MIN_VERSION): array
{
if (false === $this->tags) {
$this->tags = [];
......@@ -91,7 +106,6 @@ class OseAdmin
}
}
$minVersion = 8;
foreach ($this->tags as $i => $tag) {
$version = (int)substr($tag, 0, strpos($tag, '.'));
if ($version < $minVersion) unset($this->tags[$i]);
......@@ -129,6 +143,7 @@ class OseAdmin
public function writeVersion(string $version)
{
$vf = $this->getVersionFile();
$this->version = $version;
file_put_contents($vf, $version);
}
......@@ -141,6 +156,96 @@ class OseAdmin
/**
* @param string $action
*/
public function run(string $action)
{
$oa = $this;
$c = $this->console;
if (file_exists($this->getOseDir() . 'admin/actions/' . $action . '.php')) {
require_once $this->getOseDir() . 'admin/actions/' . $action . '.php';
} else {
require_once $this->getOseDir() . 'admin/actions/help.php';
}
}
/**
* 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'): boolean
{
$tags = $this->getTags(1);
foreach ($tags as $i => $tag) {
$tag = strtolower($tag);
if (false !== ($p = strpos($tag, 'alpha'))) {
$tags[$i] = trim(substr($tag, 0, $p));
}
if (false !== ($p = strpos($tag, 'beta'))) {
$tags[$i] = trim(substr($tag, 0, $p));
}
}
$tags = array_unique($tags);
$oldIndex = array_search($this->oldVersion, $tags);
$newIndex = array_search($this->version, $tags);
if ($oldIndex !== false && $newIndex !== false && $oldIndex < $newIndex) {
for ($i = $oldIndex + 1; $i <= $newIndex; $i++) {
$phpMigr = $this->getOseDir() . 'admin/migration/' . $tags[$i] . '-' . $prePost . '.php';
$sqlMigr = $this->getOseDir() . 'admin/migration/' . $tags[$i] . '-' . $prePost . '.sql';
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);
$errors = $this->getBdd()->execFile($sqlMigr);
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)) {
$this->console->println('Exécution du script de ' . $prePost . '-migration PHP de la version ' . $tags[$i], $this->console::COLOR_LIGHT_BLUE);
require_once $phpMigr;
}
}
return true;
} else {
$this->console->println('Attention : les scripts de migration automatiques n\'ont pas pu être déclenchés :', $this->console::BG_RED);
if ($oldIndex === false) {
$this->console->println('La version précédente de OSE n\'a pas pu être clairement identifiée.', $this->console::BG_RED);
}
if ($newIndex === false) {
$this->console->println('La version cible de OSE n\'a pas pu être clairement identifiée.', $this->console::BG_RED);
}
if ($oldIndex == $newIndex) {
$this->console->println('La version cible est identique à celle déjà installée.', $this->console::BG_RED);
}
if ($oldIndex > $newIndex) {
$this->console->println('L\'installation d\'une version plus ancienne n\'est pas supportée par le système de mises à jours automatiques', $this->console::BG_RED);
}
$this->console->println("Afin d'effectuer vous-mêmes les opérations de migration, merci d'aller dans le répertoire /actions/migration de OSE et exéminer puis exécuter les scripts nécessaires manuellement."
. " Ces scripts sont nommés selon la version à laquelle ils correspondent, suivis de -pre s'ils sont à exécuter AVANT la mise ) jour de la DDL de la base de données, et -post s'il sont à exécuter après."
. " Enfin, leur extension renseigne s'il s'agit de code PHP à exécuter ou bien de code SQL (à exécuter dans SQLDeveloper par exemple)."
);
return false;
}
}
public function exec($args)
{
$this->console->passthru("php " . $this->getOseDir() . "/public/index.php " . $args);
......
......@@ -10,13 +10,10 @@ spl_autoload_register(function ($class) {
$c = new Console();
$oa = new OseAdmin($c);
$oa->oldVersion = $oa->version = $oa->currentVersion($osedir);
$c->printMainTitle("OSE", 15);
if (file_exists($oa->getOseDir().'admin/actions/'.$c->getArg(1).'.php')){
require_once $oa->getOseDir().'admin/actions/'.$c->getArg(1).'.php';
}else{
require_once $oa->getOseDir().'admin/actions/help.php';
}
$oa->run($c->getArg(1));
$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