sqlmig: support des fichiers spécifique au mode devel

This commit is contained in:
Jephté Clain 2018-05-06 00:25:47 +04:00
parent e493b49811
commit 174c08759e
1 changed files with 44 additions and 2 deletions

46
sqlmig
View File

@ -6,6 +6,39 @@ urequire DEFAULTS install
function display_help() { function display_help() {
uecho "$scriptname: gérer les mises à jour sur une base de données uecho "$scriptname: gérer les mises à jour sur une base de données
Les mises à jours sont dans un répertoire UPDATEDIR, qui contient un répertoire
pour chaque base de données à gérer. Ces répertoires sont des DATABASEDIR. Les
fichiers sql peuvent être placés dans le répertoire UPDATEDIR pour les mises à
jour administratives, ou dans DATABASEDIR pour les mises à jour de la base de
données.
Les fichiers sql peuvent contenir dans les premières lignes du fichier un tag
@sqlmig sous forme de commentaire. On peut avoir:
-- @sqlmig drop
identifie une suite de requêtes à exécuter pour supprimer la base de données
et recommencer à zéro
-- @sqlmig create
identifie une suite de requêtes à exécuter pour créer la base de données.
-- @sqlmig admin
identifie une mise à jour administrative. Les fichiers situés dans UPADTEDIR
sont automatiquement considérés comme des mises à jour administratives même
en l'absence de ce tag.
Les mises à jour administratives sont exécutées avec les paramètres du fichier
my.cnf (resp. ora.conf) et sont typiquement utilisées pour créer les comptes
utilisateurs pour la connexion à la base de données et leur attribuer des droits
d'accès. Ces mises à jour sont exécutées sans sélectionner une base de données
en particulier.
Les mises à jour utilisateurs sont exécutées avec les paramètres du fichier
my.cnf (resp. ora.conf) augmenté du fichier my-DBNAME.cnf (res. ora-DBNAME.conf)
Elles sont exécutées avec la base de données concernée sélectionnée.
Il y a deux modes d'exécution: prod ou devel. En mode prod, la suppression de
base de données est interdite. De plus, tous les fichiers de mise à jour de la
forme *.devel.sql sont ignorés. Cela permet de fignoler une mise à jour sans
risquer de l'exécuter en production.
USAGE USAGE
$scriptname [options] $scriptname [options]
@ -733,8 +766,8 @@ args=(
-d:,--databasedir: dbdir= -d:,--databasedir: dbdir=
-n:,--database: dbname= -n:,--database: dbname=
--force,--continue-on-error force=1 --force,--continue-on-error force=1
--prod-dangerous mode=prod --prod-mode-dangerous mode=prod
--devel mode=devel --devel-mode mode=devel
-Z,--recreate drop=1 -Z,--recreate drop=1
--drop-only '$drop=1; drop_only=1' --drop-only '$drop=1; drop_only=1'
--create-only create_only=1 --create-only create_only=1
@ -942,6 +975,7 @@ if [ -n "$updatedir" ]; then
array_lsfiles updates "$updatedir" "*.sql" array_lsfiles updates "$updatedir" "*.sql"
if [ ${#updates[*]} -gt 0 ]; then if [ ${#updates[*]} -gt 0 ]; then
ensure_dbtype "$updatedir" "$type" ensure_dbtype "$updatedir" "$type"
ensure_dbmode "$dbtype" "$mode"
if [ "$dbtype" == mysql ]; then if [ "$dbtype" == mysql ]; then
# construire les paramètres pour mysql # construire les paramètres pour mysql
mysql_set_adminargs "$updatedir" mysql_set_adminargs "$updatedir"
@ -951,6 +985,7 @@ if [ -n "$updatedir" ]; then
etitled "Mises à jour admin" etitled "Mises à jour admin"
for update in "${updates[@]}"; do for update in "${updates[@]}"; do
setx name=basename "$update" setx name=basename "$update"
[ "$dbmode" == devel -o "${name%.devel.sql}" == "$name" ] || continue
mysql_admin_update "$name" "$update" mysql_admin_update "$name" "$update"
done done
eend; eclearp eend; eclearp
@ -964,6 +999,7 @@ if [ -n "$updatedir" ]; then
etitled "Mises à jour" etitled "Mises à jour"
for update in "${updates[@]}"; do for update in "${updates[@]}"; do
setx name=basename "$update" setx name=basename "$update"
[ "$dbmode" == devel -o "${name%.devel.sql}" == "$name" ] || continue
oracle_admin_update "$name" "$update" oracle_admin_update "$name" "$update"
done done
eend; eclearp eend; eclearp
@ -1013,6 +1049,7 @@ for dbdir in "${dbdirs[@]}"; do
fi fi
for drop in "${drops[@]}"; do for drop in "${drops[@]}"; do
setx name=basename "$drop" setx name=basename "$drop"
[ "$dbmode" == devel -o "${name%.devel.sql}" == "$name" ] || continue
estep "$name" estep "$name"
sed "s/@@database@@/$dbname/g" "$drop" | mysql_admin_qe || abort_on_error "drop: $name" sed "s/@@database@@/$dbname/g" "$drop" | mysql_admin_qe || abort_on_error "drop: $name"
done done
@ -1025,6 +1062,7 @@ for dbdir in "${dbdirs[@]}"; do
etitled "Création" etitled "Création"
for create in "${creates[@]}"; do for create in "${creates[@]}"; do
setx name=basename "$create" setx name=basename "$create"
[ "$dbmode" == devel -o "${name%.devel.sql}" == "$name" ] || continue
estep "$name" estep "$name"
sed "s/@@database@@/$dbname/g" "$create" | mysql_admin_qe || abort_on_error "create: $name" sed "s/@@database@@/$dbname/g" "$create" | mysql_admin_qe || abort_on_error "create: $name"
done done
@ -1037,6 +1075,7 @@ for dbdir in "${dbdirs[@]}"; do
mysql_tbconf "$dbname" mysql_tbconf "$dbname"
for update in "${updates[@]}"; do for update in "${updates[@]}"; do
setx name=basename "$update" setx name=basename "$update"
[ "$dbmode" == devel -o "${name%.devel.sql}" == "$name" ] || continue
if have_tag admin "$update"; then if have_tag admin "$update"; then
mysql_admin_update "$name" "$update" mysql_admin_update "$name" "$update"
else else
@ -1063,6 +1102,7 @@ for dbdir in "${dbdirs[@]}"; do
fi fi
for drop in "${drops[@]}"; do for drop in "${drops[@]}"; do
setx name=basename "$drop" setx name=basename "$drop"
[ "$dbmode" == devel -o "${name%.devel.sql}" == "$name" ] || continue
estep "$name" estep "$name"
sed "s/@@database@@/$dbname/g" "$drop" | oracle_admin_ve || abort_on_error "drop: $name" sed "s/@@database@@/$dbname/g" "$drop" | oracle_admin_ve || abort_on_error "drop: $name"
done done
@ -1075,6 +1115,7 @@ for dbdir in "${dbdirs[@]}"; do
etitled "Création" etitled "Création"
for create in "${creates[@]}"; do for create in "${creates[@]}"; do
setx name=basename "$create" setx name=basename "$create"
[ "$dbmode" == devel -o "${name%.devel.sql}" == "$name" ] || continue
estep "$name" estep "$name"
sed "s/@@database@@/$dbname/g" "$create" | oracle_admin_ve || abort_on_error "create: $name" sed "s/@@database@@/$dbname/g" "$create" | oracle_admin_ve || abort_on_error "create: $name"
done done
@ -1087,6 +1128,7 @@ for dbdir in "${dbdirs[@]}"; do
oracle_tbconf "$dbname" oracle_tbconf "$dbname"
for update in "${updates[@]}"; do for update in "${updates[@]}"; do
setx name=basename "$update" setx name=basename "$update"
[ "$dbmode" == devel -o "${name%.devel.sql}" == "$name" ] || continue
if have_tag admin "$update"; then if have_tag admin "$update"; then
oracle_admin_update "$name" "$update" oracle_admin_update "$name" "$update"
else else