165 lines
5.8 KiB
PHP
165 lines
5.8 KiB
PHP
<?php
|
|
namespace nur\m\cli;
|
|
|
|
use nur\A;
|
|
use nur\b\ValueException;
|
|
use nur\cli\Application;
|
|
use nur\data\types\Metadata;
|
|
|
|
abstract class UpdateMigrationsApp extends Application {
|
|
function trace(string $line): void {
|
|
echo "$line\n";
|
|
}
|
|
|
|
/**
|
|
* @var string répertoire de base pour la génération des fichiers (i.e chemin
|
|
* du projet)
|
|
*/
|
|
const BASEDIR = null;
|
|
|
|
/** @var Metadata */
|
|
private static $database_md;
|
|
|
|
private static function database_md(): Metadata {
|
|
if (self::$database_md === null) {
|
|
self::$database_md = new Metadata([
|
|
"class" => ["?string", null, "classe de migration qui contient les définitions"],
|
|
"sql_dir" => ["?string", null, "chemin relatif dans lequel générer les migrations SQL e.g. 'config/sqlmig/DATABASE'"],
|
|
"sql_prefix" => ["bool", null, ""],
|
|
"doc_dir" => ["?string", null, "chemin relatif dans lequel générer la doc e.g. 'doc'"],
|
|
"class_dir" => ["?string", null, "chemin relatif dans lequel générer les classes de DAO e.g. 'src/m'"],
|
|
"class_package" => ["?string", null, "package des classes DAO, exprimé relativement au package de la classe qui contient les définitions"],
|
|
"class_baserow" => ["?string", null, "classe de base pour les classes DAO"],
|
|
]);
|
|
}
|
|
return self::$database_md;
|
|
}
|
|
|
|
/** @var array base de données dont il faut faire la migration */
|
|
const DATABASE = null;
|
|
/**
|
|
* @var array liste des bases de données supplémentaires dont il faut faire la
|
|
* migration
|
|
*/
|
|
const DATABASES = null;
|
|
|
|
/** @var bool valeur par défaut de $doSql si aucun argument n'est spécifié */
|
|
const DO_SQL = true;
|
|
|
|
/** @var bool valeur par défaut de $doClass si aucun argument n'est spécifié */
|
|
const DO_CLASS = true;
|
|
|
|
/** @var bool valeur par défaut de $doDoc si aucun argument n'est spécifié */
|
|
const DO_DOC = true;
|
|
|
|
const MIGRATE_PARAMS_SCHEMA = [
|
|
"basedir" => ["?string", null, "chemin absolu du projet"],
|
|
"overwrite" => ["?bool", null, "faut-il regénérer les fichier?"],
|
|
"verbose" => ["bool", null, "faut-il activer l'affichage verbeux"],
|
|
"class" => ["?string", null, "cf database_schema"],
|
|
"do_sql" => ["bool", null, "faut-il générer les fichiers SQL"],
|
|
"sql_dir" => ["?string", null, "cf database_schema"],
|
|
"sql_prefix" => ["bool", null, "cf database_schema"],
|
|
"class_dir" => ["?string", null, "cf database_schema"],
|
|
"class_package" => ["?string", null, "cf database_schema"],
|
|
"class_baserow" => ["?string", null, "cf database_schema"],
|
|
"do_doc" => ["bool", null, "faut-il générer la documentation"],
|
|
"doc_dir" => ["?string", null, "cf database_schema"],
|
|
"do_class" => ["bool", null, "faut-il générer les classes DAO"],
|
|
];
|
|
|
|
protected abstract function migrate(array $params);
|
|
|
|
const ARGS = [
|
|
["group",
|
|
["-o", "--overwrite", "name" => "overwrite", "value" => true,
|
|
"help" => "forcer (resp. interdire) l'écrasement des fichier générés",
|
|
],
|
|
["-k", "--keep", "name" => "overwrite", "value" => false],
|
|
],
|
|
["-v", "--verbose", "name" => "verbose", "value" => true,
|
|
"help" => "mode verbeux",
|
|
],
|
|
["-b", "--basedir", "arg" => "dir",
|
|
"help" => "répertoire de base pour la génération des fichiers",
|
|
],
|
|
["-s", "--sql-only", "name" => "do_sql", "value" => true,
|
|
"help" => "ne faire que la génération des fichiers SQL",
|
|
],
|
|
["-c", "--class-only", "name" => "do_class", "value" => true,
|
|
"help" => "ne faire que la génération des fichiers DAO",
|
|
],
|
|
["-d", "--doc-only", "name" => "do_doc", "value" => true,
|
|
"help" => "ne faire que la génération de la documentation",
|
|
],
|
|
["group",
|
|
["-l", "--select", "arg" => "value", "name" => "select",
|
|
"help" => "sélectionner une base de données en particulier"
|
|
],
|
|
["-1", "--first", "name" => "select", "value" => 1],
|
|
["-2", "--second", "name" => "select", "value" => 2],
|
|
],
|
|
];
|
|
|
|
/** @var ?string */
|
|
protected $overwrite = null;
|
|
protected $verbose = false;
|
|
protected $basedir;
|
|
protected $doSql = null;
|
|
protected $doClass = null;
|
|
protected $doDoc = null;
|
|
protected $select;
|
|
|
|
function main() {
|
|
$overwrite = $this->overwrite;
|
|
$verbose = $this->verbose;
|
|
$basedir = $this->basedir;
|
|
if ($basedir === null) $basedir = static::BASEDIR;
|
|
if ($basedir === null) throw new ValueException("Vous devez spécifier --basedir");
|
|
|
|
$doSql = $this->doSql;
|
|
$doClass = $this->doClass;
|
|
$doDoc = $this->doDoc;
|
|
if ($doSql === null && $doDoc === null && $doClass === null) {
|
|
$doSql = static::DO_SQL;
|
|
$doClass = static::DO_CLASS;
|
|
$doDoc = static::DO_DOC;
|
|
}
|
|
|
|
$databases = [];
|
|
A::append_nn($databases, static::DATABASE);
|
|
A::merge_nn($databases, static::DATABASES);
|
|
$select = $this->select;
|
|
if ($select !== null) {
|
|
if (is_numeric($select)) {
|
|
$index = $select - 1;
|
|
$database = A::nth($databases, $index);
|
|
if ($database === null) throw new ValueException("$select: index invalide");
|
|
} else {
|
|
$database = A::get($databases, $select);
|
|
if ($database === null) throw new ValueException("$select: base de donnée invalide");
|
|
}
|
|
$databases = [$database];
|
|
}
|
|
self::database_md()->eachEnsureSchema($databases);
|
|
|
|
foreach ($databases as $database) {
|
|
$this->migrate([
|
|
"class" => $database["class"],
|
|
"overwrite" => $overwrite,
|
|
"verbose" => $verbose,
|
|
"basedir" => $basedir,
|
|
"do_sql" => $doSql,
|
|
"sql_dir" => $database["sql_dir"],
|
|
"sql_prefix" => $database["sql_prefix"],
|
|
"do_class" => $doClass,
|
|
"class_dir" => $database["class_dir"],
|
|
"class_package" => $database["class_package"],
|
|
"class_baserow" => $database["class_baserow"],
|
|
"do_doc" => $doDoc,
|
|
"doc_dir" => $database["doc_dir"],
|
|
]);
|
|
}
|
|
}
|
|
}
|