From 174c08759ed8aecd4100b29282705e5efe95e560 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Sun, 6 May 2018 00:25:47 +0400 Subject: [PATCH] =?UTF-8?q?sqlmig:=20support=20des=20fichiers=20sp=C3=A9ci?= =?UTF-8?q?fique=20au=20mode=20devel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sqlmig | 46 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git a/sqlmig b/sqlmig index eb2a05f..2725d91 100755 --- a/sqlmig +++ b/sqlmig @@ -6,6 +6,39 @@ urequire DEFAULTS install function display_help() { 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 $scriptname [options] @@ -733,8 +766,8 @@ args=( -d:,--databasedir: dbdir= -n:,--database: dbname= --force,--continue-on-error force=1 - --prod-dangerous mode=prod - --devel mode=devel + --prod-mode-dangerous mode=prod + --devel-mode mode=devel -Z,--recreate drop=1 --drop-only '$drop=1; drop_only=1' --create-only create_only=1 @@ -942,6 +975,7 @@ if [ -n "$updatedir" ]; then array_lsfiles updates "$updatedir" "*.sql" if [ ${#updates[*]} -gt 0 ]; then ensure_dbtype "$updatedir" "$type" + ensure_dbmode "$dbtype" "$mode" if [ "$dbtype" == mysql ]; then # construire les paramètres pour mysql mysql_set_adminargs "$updatedir" @@ -951,6 +985,7 @@ if [ -n "$updatedir" ]; then etitled "Mises à jour admin" for update in "${updates[@]}"; do setx name=basename "$update" + [ "$dbmode" == devel -o "${name%.devel.sql}" == "$name" ] || continue mysql_admin_update "$name" "$update" done eend; eclearp @@ -964,6 +999,7 @@ if [ -n "$updatedir" ]; then etitled "Mises à jour" for update in "${updates[@]}"; do setx name=basename "$update" + [ "$dbmode" == devel -o "${name%.devel.sql}" == "$name" ] || continue oracle_admin_update "$name" "$update" done eend; eclearp @@ -1013,6 +1049,7 @@ for dbdir in "${dbdirs[@]}"; do fi for drop in "${drops[@]}"; do setx name=basename "$drop" + [ "$dbmode" == devel -o "${name%.devel.sql}" == "$name" ] || continue estep "$name" sed "s/@@database@@/$dbname/g" "$drop" | mysql_admin_qe || abort_on_error "drop: $name" done @@ -1025,6 +1062,7 @@ for dbdir in "${dbdirs[@]}"; do etitled "Création" for create in "${creates[@]}"; do setx name=basename "$create" + [ "$dbmode" == devel -o "${name%.devel.sql}" == "$name" ] || continue estep "$name" sed "s/@@database@@/$dbname/g" "$create" | mysql_admin_qe || abort_on_error "create: $name" done @@ -1037,6 +1075,7 @@ for dbdir in "${dbdirs[@]}"; do mysql_tbconf "$dbname" for update in "${updates[@]}"; do setx name=basename "$update" + [ "$dbmode" == devel -o "${name%.devel.sql}" == "$name" ] || continue if have_tag admin "$update"; then mysql_admin_update "$name" "$update" else @@ -1063,6 +1102,7 @@ for dbdir in "${dbdirs[@]}"; do fi for drop in "${drops[@]}"; do setx name=basename "$drop" + [ "$dbmode" == devel -o "${name%.devel.sql}" == "$name" ] || continue estep "$name" sed "s/@@database@@/$dbname/g" "$drop" | oracle_admin_ve || abort_on_error "drop: $name" done @@ -1075,6 +1115,7 @@ for dbdir in "${dbdirs[@]}"; do etitled "Création" for create in "${creates[@]}"; do setx name=basename "$create" + [ "$dbmode" == devel -o "${name%.devel.sql}" == "$name" ] || continue estep "$name" sed "s/@@database@@/$dbname/g" "$create" | oracle_admin_ve || abort_on_error "create: $name" done @@ -1087,6 +1128,7 @@ for dbdir in "${dbdirs[@]}"; do oracle_tbconf "$dbname" for update in "${updates[@]}"; do setx name=basename "$update" + [ "$dbmode" == devel -o "${name%.devel.sql}" == "$name" ] || continue if have_tag admin "$update"; then oracle_admin_update "$name" "$update" else